@@ -9,17 +9,29 @@ export Target,
99end
1010reftype (:: Type{Target} ) = API. LLVMTargetRef
1111
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)
2034 end
21-
22- return Target (out_ref[])
2335end
2436
2537name (t:: Target ) = unsafe_string (API. LLVMGetTargetName (ref (t)))
@@ -30,32 +42,23 @@ hasjit(t::Target) = convert(Core.Bool, API.LLVMTargetHasJIT(ref(t)))
3042hastargetmachine (t:: Target ) = convert (Core. Bool, API. LLVMTargetHasTargetMachine (ref (t)))
3143hasasmparser (t:: Target ) = convert (Core. Bool, API. LLVMTargetHasAsmBackend (ref (t)))
3244
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
3648
37- struct TargetSet end
3849
39- targets () = TargetSet ()
50+ # # target iteration
4051
41- Base . eltype ( :: TargetSet ) = Target
52+ export targets
4253
43- function Base. haskey (:: TargetSet , name:: String )
44- return API. LLVMGetTargetFromName (name) != C_NULL
45- end
54+ struct TargetIterator end
4655
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 ()
5157
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
5659
57- function Base. iterate (iter:: TargetSet , state= API. LLVMGetFirstTarget ())
60+ function Base. iterate (iter:: TargetIterator , state= API. LLVMGetFirstTarget ())
5861 state == C_NULL ? nothing : (Target (state), API. LLVMGetNextTarget (state))
5962end
6063
61- Base. IteratorSize (:: TargetSet ) = Base. SizeUnknown ()
64+ Base. IteratorSize (:: TargetIterator ) = Base. SizeUnknown ()
0 commit comments