7575        T_pint8 =  LLVM. PointerType (LLVM. Int8Type ())
7676        T_pint8a2 =  LLVM. PointerType (LLVM. Int8Type (), 2 )
7777
78+ 
79+ 
7880        #  create functions
7981        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 ))
8288
8389        #  generate IR
8490        @dispose  builder= IRBuilder () begin 
8591            entry =  BasicBlock (llvm_f, " entry"  )
8692            position! (builder, entry)
8793
8894            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__)
8998
9099            #  compute argsize
91100            argtypes =  LLVM. StructType (param_types)
@@ -103,16 +112,11 @@ end
103112            va_start_fty =  LLVM. FunctionType (T_void, [T_pint8])
104113            va_start =  LLVM. Function (mod, " llvm.va_start"  , va_start_fty)
105114            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)
113115
114116            arg_ptr =  load! (builder, T_pint8, alloc)
115117
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)
116120            call! (builder, os_log_fty, os_log, [subsystem_str, category_str, log_type, str, arg_ptr, arg_size])
117121
118122            va_end_fty =  LLVM. FunctionType (T_void, [T_pint8])
@@ -126,13 +130,11 @@ end
126130            ret! (builder)
127131        end 
128132
129-         wrapper_f, wrapper_ft =  create_function (T_void, param_types)
130- 
131133        @dispose  builder= IRBuilder () begin 
132134            entry =  BasicBlock (wrapper_f, " entry"  )
133135            position! (builder, entry)
134136
135-             #   call!(builder, llvm_ft, llvm_f, collect(parameters(wrapper_f)))
137+             call! (builder, llvm_ft, llvm_f, collect (parameters (wrapper_f)))
136138
137139            ret! (builder)
138140        end 
0 commit comments