-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
llvm.cr
109 lines (92 loc) · 2.69 KB
/
llvm.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
require "./llvm/**"
require "c/string"
module LLVM
@@initialized = false
def self.init_x86
return if @@initialized_x86
@@initialized_x86 = true
{% if LibLLVM::BUILT_TARGETS.includes?(:x86) %}
LibLLVM.initialize_x86_target_info
LibLLVM.initialize_x86_target
LibLLVM.initialize_x86_target_mc
LibLLVM.initialize_x86_asm_printer
LibLLVM.initialize_x86_asm_parser
# LibLLVM.link_in_jit
LibLLVM.link_in_mc_jit
{% else %}
raise "ERROR: LLVM was built without X86 target"
{% end %}
end
def self.init_aarch64
return if @@initialized_aarch64
@@initialized_aarch64 = true
{% if LibLLVM::BUILT_TARGETS.includes?(:aarch64) %}
LibLLVM.initialize_aarch64_target_info
LibLLVM.initialize_aarch64_target
LibLLVM.initialize_aarch64_target_mc
LibLLVM.initialize_aarch64_asm_printer
LibLLVM.initialize_aarch64_asm_parser
# LibLLVM.link_in_jit
LibLLVM.link_in_mc_jit
{% else %}
raise "ERROR: LLVM was built without AArch64 target"
{% end %}
end
def self.init_arm
return if @@initialized_arm
@@initialized_arm = true
{% if LibLLVM::BUILT_TARGETS.includes?(:arm) %}
LibLLVM.initialize_arm_target_info
LibLLVM.initialize_arm_target
LibLLVM.initialize_arm_target_mc
LibLLVM.initialize_arm_asm_printer
LibLLVM.initialize_arm_asm_parser
# LibLLVM.link_in_jit
LibLLVM.link_in_mc_jit
{% else %}
raise "ERROR: LLVM was built without ARM target"
{% end %}
end
def self.start_multithreaded : Bool
if multithreaded?
true
else
LibLLVM.start_multithreaded != 0
end
end
def self.stop_multithreaded
if multithreaded?
LibLLVM.stop_multithreaded
end
end
def self.multithreaded? : Bool
LibLLVM.is_multithreaded != 0
end
def self.default_target_triple : String
chars = LibLLVM.get_default_target_triple
triple = string_and_dispose(chars)
if triple =~ /x86_64-apple-macosx|x86_64-apple-darwin/
"x86_64-apple-macosx"
else
triple
end
end
def self.normalize_triple(triple : String)
normalized = LibLLVMExt.normalize_target_triple(triple)
normalized = LLVM.string_and_dispose(normalized)
# Fix LLVM not replacing empty triple parts with "unknown"
# This was fixed in LLVM 8
normalized = normalized.split('-').map { |c| c.empty? ? "unknown" : c }.join('-')
normalized
end
def self.to_io(chars, io)
io.write Slice.new(chars, LibC.strlen(chars))
LibLLVM.dispose_message(chars)
end
def self.string_and_dispose(chars) : String
string = String.new(chars)
LibLLVM.dispose_message(chars)
string
end
DEBUG_METADATA_VERSION = 3
end