diff --git a/src/analyze.cpp b/src/analyze.cpp index 35a4bd7d4a6c0e3698d3bcad1cae9d6f226e75a0..eb32e1014802df1fd6857441c01bffbd4159e169 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -8779,7 +8779,8 @@ static void resolve_llvm_types_fn_type(CodeGen *g, ZigType *fn_type) { fn_type->data.fn.raw_type_ref = LLVMFunctionType(get_llvm_type(g, gen_return_type), gen_param_types.items, (unsigned int)gen_param_types.length, fn_type_id->is_var_args); - fn_type->llvm_type = LLVMPointerType(fn_type->data.fn.raw_type_ref, 0); + const unsigned fn_addrspace = ZigLLVMDataLayoutGetProgramAddressSpace(g->target_data_ref); + fn_type->llvm_type = LLVMPointerType(fn_type->data.fn.raw_type_ref, fn_addrspace); fn_type->data.fn.raw_di_type = ZigLLVMCreateSubroutineType(g->dbuilder, param_di_types.items, (int)param_di_types.length, 0); fn_type->llvm_di_type = ZigLLVMCreateDebugPointerType(g->dbuilder, fn_type->data.fn.raw_di_type, LLVMStoreSizeOfType(g->target_data_ref, fn_type->llvm_type), @@ -8888,7 +8889,8 @@ static void resolve_llvm_types_any_frame(CodeGen *g, ZigType *any_frame_type, Re ZigType *result_type = any_frame_type->data.any_frame.result_type; ZigType *ptr_result_type = (result_type == nullptr) ? nullptr : get_pointer_to_type(g, result_type, false); - LLVMTypeRef ptr_fn_llvm_type = LLVMPointerType(fn_type, 0); + const unsigned fn_addrspace = ZigLLVMDataLayoutGetProgramAddressSpace(g->target_data_ref); + LLVMTypeRef ptr_fn_llvm_type = LLVMPointerType(fn_type, fn_addrspace); if (result_type == nullptr) { g->anyframe_fn_type = ptr_fn_llvm_type; } diff --git a/src/codegen.cpp b/src/codegen.cpp index 845375a25c076f07e77eaab547b5ecd3d381d5d5..45e6f867eb9407cda04b0f3a75b185835aad2de6 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -422,9 +422,10 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { LLVMTypeRef fn_llvm_type = fn->raw_type_ref; LLVMValueRef llvm_fn = nullptr; if (fn->body_node == nullptr) { + const unsigned fn_addrspace = ZigLLVMDataLayoutGetProgramAddressSpace(g->target_data_ref); LLVMValueRef existing_llvm_fn = LLVMGetNamedFunction(g->module, symbol_name); if (existing_llvm_fn) { - return LLVMConstBitCast(existing_llvm_fn, LLVMPointerType(fn_llvm_type, 0)); + return LLVMConstBitCast(existing_llvm_fn, LLVMPointerType(fn_llvm_type, fn_addrspace)); } else { Buf *buf_symbol_name = buf_create_from_str(symbol_name); auto entry = g->exported_symbol_names.maybe_get(buf_symbol_name); @@ -447,7 +448,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { resolve_llvm_types_fn(g, tld_fn->fn_entry); tld_fn->fn_entry->llvm_value = LLVMAddFunction(g->module, symbol_name, tld_fn->fn_entry->raw_type_ref); - llvm_fn = LLVMConstBitCast(tld_fn->fn_entry->llvm_value, LLVMPointerType(fn_llvm_type, 0)); + llvm_fn = LLVMConstBitCast(tld_fn->fn_entry->llvm_value, LLVMPointerType(fn_llvm_type, fn_addrspace)); return llvm_fn; } } diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 71d30e566c712a4e6f88ab23d5f94eda1b830d2c..852475c3c4b223eee86b3935e3115e0fe8cbd675 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -156,6 +156,10 @@ unsigned ZigLLVMDataLayoutGetStackAlignment(LLVMTargetDataRef TD) { return unwrap(TD)->getStackAlignment(); } +unsigned ZigLLVMDataLayoutGetProgramAddressSpace(LLVMTargetDataRef TD) { + return unwrap(TD)->getProgramAddressSpace(); +} + bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref, const char *filename, ZigLLVM_EmitOutputType output_type, char **error_message, bool is_debug, bool is_small, bool time_report) diff --git a/src/zig_llvm.h b/src/zig_llvm.h index 3376b0ec61802fc12109e3f8f6f6bebe29c7b4e5..0fad21a19bf6ee290ef5b3f87a701bbfa4c88580 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -475,5 +475,6 @@ ZIG_EXTERN_C void ZigLLVMGetNativeTarget(enum ZigLLVM_ArchType *arch_type, enum enum ZigLLVM_ObjectFormatType *oformat); ZIG_EXTERN_C unsigned ZigLLVMDataLayoutGetStackAlignment(LLVMTargetDataRef TD); +ZIG_EXTERN_C unsigned ZigLLVMDataLayoutGetProgramAddressSpace(LLVMTargetDataRef TD); #endif