75
75
T_pint8 = LLVM. PointerType (LLVM. Int8Type ())
76
76
T_pint8a2 = LLVM. PointerType (LLVM. Int8Type (), 2 )
77
77
78
+
79
+
78
80
# create functions
79
81
param_types = LLVMType[convert (LLVMType, typ) for typ in arg_types]
80
- llvm_f, llvm_ft = create_function (T_void, LLVMType[]; vararg= true )
81
- mod = LLVM. parent (llvm_f)
82
+ wrapper_f, wrapper_ft = create_function (T_void, param_types)
83
+ mod = LLVM. parent (wrapper_f)
84
+
85
+ llvm_ft = LLVM. FunctionType (T_void, LLVMType[]; vararg= true )
86
+ llvm_f = LLVM. Function (mod, " vararg" , llvm_ft)
87
+ push! (function_attributes (llvm_f), EnumAttribute (" alwaysinline" , 0 ))
82
88
83
89
# generate IR
84
90
@dispose builder= IRBuilder () begin
85
91
entry = BasicBlock (llvm_f, " entry" )
86
92
position! (builder, entry)
87
93
88
94
str = globalstring_ptr! (builder, String (fmt), addrspace= 2 )
95
+ subsystem_str = globalstring_ptr! (builder, MTLLOG_SUBSYSTEM, addrspace= 2 )
96
+ category_str = globalstring_ptr! (builder, MTLLOG_CATEGRORY, addrspace= 2 )
97
+ log_type = LLVM. ConstantInt (T_int32, __METAL_OS_LOG_TYPE_DEBUG__)
89
98
90
99
# compute argsize
91
100
argtypes = LLVM. StructType (param_types)
@@ -103,16 +112,11 @@ end
103
112
va_start_fty = LLVM. FunctionType (T_void, [T_pint8])
104
113
va_start = LLVM. Function (mod, " llvm.va_start" , va_start_fty)
105
114
call! (builder, va_start_fty, va_start, [buffer])
106
-
107
- # invoke @air.os_log and return
108
- subsystem_str = globalstring_ptr! (builder, MTLLOG_SUBSYSTEM, addrspace= 2 )
109
- category_str = globalstring_ptr! (builder, MTLLOG_CATEGRORY, addrspace= 2 )
110
- log_type = LLVM. ConstantInt (T_int32, __METAL_OS_LOG_TYPE_DEBUG__)
111
- os_log_fty = LLVM. FunctionType (T_void, [T_pint8a2, T_pint8a2, T_int32, T_pint8a2, T_pint8, T_int64])
112
- os_log = LLVM. Function (mod, " air.os_log" , os_log_fty)
113
115
114
116
arg_ptr = load! (builder, T_pint8, alloc)
115
117
118
+ os_log_fty = LLVM. FunctionType (T_void, [T_pint8a2, T_pint8a2, T_int32, T_pint8a2, T_pint8, T_int64])
119
+ os_log = LLVM. Function (mod, " air.os_log" , os_log_fty)
116
120
call! (builder, os_log_fty, os_log, [subsystem_str, category_str, log_type, str, arg_ptr, arg_size])
117
121
118
122
va_end_fty = LLVM. FunctionType (T_void, [T_pint8])
@@ -126,19 +130,17 @@ end
126
130
ret! (builder)
127
131
end
128
132
129
- wrapper_f, wrapper_ft = create_function (T_void, param_types)
130
-
131
- @dispose builder= IRBuilder () begin
132
- entry = BasicBlock (wrapper_f, " entry" )
133
- position! (builder, entry)
133
+ # @dispose builder=IRBuilder() begin
134
+ # entry = BasicBlock(wrapper_f, "entry")
135
+ # position!(builder, entry)
134
136
135
- # call!(builder, llvm_ft, llvm_f, collect(parameters(wrapper_f)))
137
+ # call!(builder, llvm_ft, llvm_f, collect(parameters(wrapper_f)))
136
138
137
- ret! (builder)
138
- end
139
+ # ret!(builder)
140
+ # end
139
141
140
142
141
- call_function (wrapper_f , Nothing, Tuple{arg_types... }, arg_exprs... )
143
+ call_function (llvm_f , Nothing, Tuple{arg_types... }, arg_exprs... )
142
144
end
143
145
end
144
146
0 commit comments