-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
target_machine.cr
72 lines (62 loc) · 1.78 KB
/
target_machine.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class LLVM::TargetMachine
def initialize(@unwrap : LibLLVM::TargetMachineRef)
end
def target
target = LibLLVM.get_target_machine_target(self)
target ? Target.new(target) : raise "Couldn't get target"
end
def data_layout : LLVM::TargetData
@layout ||= begin
layout = {% if LibLLVM::IS_38 %}
LibLLVM.get_target_machine_data(self)
{% else %}
# LLVM >= 3.9
LibLLVM.create_target_data_layout(self)
{% end %}
layout ? TargetData.new(layout) : raise "Missing layout for #{self}"
end
end
def triple : String
triple_c = LibLLVM.get_target_machine_triple(self)
LLVM.string_and_dispose(triple_c)
end
def emit_obj_to_file(llvm_mod, filename)
emit_to_file llvm_mod, filename, LLVM::CodeGenFileType::ObjectFile
end
def emit_asm_to_file(llvm_mod, filename)
emit_to_file llvm_mod, filename, LLVM::CodeGenFileType::AssemblyFile
end
def enable_global_isel=(enable : Bool)
LibLLVMExt.target_machine_enable_global_isel(self, enable)
end
private def emit_to_file(llvm_mod, filename, type)
status = LibLLVM.target_machine_emit_to_file(self, llvm_mod, filename, type, out error_msg)
unless status == 0
raise LLVM.string_and_dispose(error_msg)
end
true
end
def abi
triple = self.triple
case triple
when /x86_64.+windows-msvc/
ABI::X86_Win64.new(self)
when /x86_64|amd64/
ABI::X86_64.new(self)
when /i386|i486|i586|i686/
ABI::X86.new(self)
when /aarch64|arm64/
ABI::AArch64.new(self)
when /arm/
ABI::ARM.new(self)
else
raise "Unsupported ABI for target triple: #{triple}"
end
end
def to_unsafe
@unwrap
end
def finalize
LibLLVM.dispose_target_machine(@unwrap)
end
end