@@ -9,17 +9,29 @@ export Target,
9
9
end
10
10
reftype (:: Type{Target} ) = API. LLVMTargetRef
11
11
12
- function Target (triple:: String )
13
- out_ref = Ref {API.LLVMTargetRef} ()
14
- out_error = Ref {Cstring} ()
15
- status = convert (Core. Bool, API. LLVMGetTargetFromTriple (triple, out_ref, out_error))
16
-
17
- if status
18
- error = unsafe_message (out_error[])
19
- throw (LLVMException (error))
12
+ function Target (; name= nothing , triple= nothing )
13
+ (name != = nothing ) ⊻ (triple != = nothing ) ||
14
+ throw (ArgumentError (" Specify either name or triple." ))
15
+
16
+ if triple != = nothing
17
+ target_ref = Ref {API.LLVMTargetRef} (0 )
18
+ error_ref = Ref {Cstring} (C_NULL )
19
+ status = convert (Core. Bool, API. LLVMGetTargetFromTriple (triple, target_ref, error_ref))
20
+ if status && error_ref[] != = C_NULL
21
+ error = unsafe_message (error_ref[])
22
+ throw (ArgumentError (error))
23
+ elseif status
24
+ throw (ArgumentError (" Cannot find a target for triple '$triple '" ))
25
+ end
26
+ @assert target_ref[] != C_NULL
27
+ return Target (target_ref[])
28
+ elseif name != = nothing
29
+ target = API. LLVMGetTargetFromName (name)
30
+ if target == C_NULL
31
+ throw (ArgumentError (" Cannot find target '$triple '" ))
32
+ end
33
+ return Target (target)
20
34
end
21
-
22
- return Target (out_ref[])
23
35
end
24
36
25
37
name (t:: Target ) = unsafe_string (API. LLVMGetTargetName (ref (t)))
@@ -30,32 +42,23 @@ hasjit(t::Target) = convert(Core.Bool, API.LLVMTargetHasJIT(ref(t)))
30
42
hastargetmachine (t:: Target ) = convert (Core. Bool, API. LLVMTargetHasTargetMachine (ref (t)))
31
43
hasasmparser (t:: Target ) = convert (Core. Bool, API. LLVMTargetHasAsmBackend (ref (t)))
32
44
33
- # target iteration
34
-
35
- export targets
45
+ function Base . show (io :: IO , :: MIME"text/plain" , target :: Target )
46
+ print (io, " LLVM.Target( $( name (target)) ): $( description (target)) " )
47
+ end
36
48
37
- struct TargetSet end
38
49
39
- targets () = TargetSet ()
50
+ # # target iteration
40
51
41
- Base . eltype ( :: TargetSet ) = Target
52
+ export targets
42
53
43
- function Base. haskey (:: TargetSet , name:: String )
44
- return API. LLVMGetTargetFromName (name) != C_NULL
45
- end
54
+ struct TargetIterator end
46
55
47
- function Base. get (:: TargetSet , name:: String , default)
48
- objref = API. LLVMGetTargetFromName (name)
49
- return objref == C_NULL ? default : Target (objref)
50
- end
56
+ targets () = TargetIterator ()
51
57
52
- function Base. getindex (targetset:: TargetSet , name:: String )
53
- f = get (targetset, name, nothing )
54
- return f == nothing ? throw (KeyError (name)) : f
55
- end
58
+ Base. eltype (:: TargetIterator ) = Target
56
59
57
- function Base. iterate (iter:: TargetSet , state= API. LLVMGetFirstTarget ())
60
+ function Base. iterate (iter:: TargetIterator , state= API. LLVMGetFirstTarget ())
58
61
state == C_NULL ? nothing : (Target (state), API. LLVMGetNextTarget (state))
59
62
end
60
63
61
- Base. IteratorSize (:: TargetSet ) = Base. SizeUnknown ()
64
+ Base. IteratorSize (:: TargetIterator ) = Base. SizeUnknown ()
0 commit comments