diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 80c9f0d024..47b47cc807 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -2549,7 +2549,7 @@ pub const DeclGen = struct { const line_number = decl.src_line + 1; const is_internal_linkage = !dg.module.decl_exports.contains(decl_index); - const di_global = dib.createGlobalVariable( + const di_global = dib.createGlobalVariableExpression( di_file.toScope(), decl.name, global.getValueName(), @@ -2559,7 +2559,8 @@ pub const DeclGen = struct { is_internal_linkage, ); - try dg.object.di_map.put(dg.gpa, dg.decl, di_global.toNode()); + try dg.object.di_map.put(dg.gpa, dg.decl, di_global.getVariable().toNode()); + if (!is_internal_linkage) global.attachMetaData(di_global); } } } diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index c5a6d81ff3..63cac80db8 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -256,6 +256,9 @@ pub const Value = opaque { pub const addByValAttr = ZigLLVMAddByValAttr; extern fn ZigLLVMAddByValAttr(Fn: *Value, ArgNo: c_uint, type: *Type) void; + + pub const attachMetaData = ZigLLVMAttachMetaData; + extern fn ZigLLVMAttachMetaData(GlobalVar: *Value, DIG: *DIGlobalVariableExpression) void; }; pub const Type = opaque { @@ -1588,6 +1591,7 @@ pub const address_space = struct { pub const DIEnumerator = opaque {}; pub const DILocalVariable = opaque {}; pub const DILocation = opaque {}; +pub const DIGlobalExpression = opaque {}; pub const DIGlobalVariable = opaque { pub const toNode = ZigLLVMGlobalVariableToNode; @@ -1596,6 +1600,13 @@ pub const DIGlobalVariable = opaque { pub const replaceLinkageName = ZigLLVMGlobalVariableReplaceLinkageName; extern fn ZigLLVMGlobalVariableReplaceLinkageName(global_variable: *DIGlobalVariable, linkage_name: *MDString) void; }; +pub const DIGlobalVariableExpression = opaque { + pub const getVariable = ZigLLVMGlobalGetVariable; + extern fn ZigLLVMGlobalGetVariable(global_variable: *DIGlobalVariableExpression) *DIGlobalVariable; + + pub const getExpression = ZigLLVMGlobalGetExpression; + extern fn ZigLLVMGlobalGetExpression(global_variable: *DIGlobalVariableExpression) *DIGlobalExpression; +}; pub const DIType = opaque { pub const toScope = ZigLLVMTypeToScope; extern fn ZigLLVMTypeToScope(ty: *DIType) *DIScope; @@ -1803,8 +1814,8 @@ pub const DIBuilder = opaque { flags: c_uint, ) *DILocalVariable; - pub const createGlobalVariable = ZigLLVMCreateGlobalVariable; - extern fn ZigLLVMCreateGlobalVariable( + pub const createGlobalVariableExpression = ZigLLVMCreateGlobalVariableExpression; + extern fn ZigLLVMCreateGlobalVariableExpression( dib: *DIBuilder, scope: *DIScope, name: [*:0]const u8, @@ -1813,7 +1824,7 @@ pub const DIBuilder = opaque { line_no: c_uint, di_type: *DIType, is_local_to_unit: bool, - ) *DIGlobalVariable; + ) *DIGlobalVariableExpression; pub const createParameterVariable = ZigLLVMCreateParameterVariable; extern fn ZigLLVMCreateParameterVariable( diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index 4915bc862a..a884420422 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -870,19 +870,18 @@ ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(ZigLLVMDIBuilder *dbuilder, return reinterpret_cast(result); } -ZigLLVMDIGlobalVariable *ZigLLVMCreateGlobalVariable(ZigLLVMDIBuilder *dbuilder, +ZigLLVMDIGlobalVariableExpression *ZigLLVMCreateGlobalVariableExpression(ZigLLVMDIBuilder *dbuilder, ZigLLVMDIScope *scope, const char *name, const char *linkage_name, ZigLLVMDIFile *file, unsigned line_no, ZigLLVMDIType *di_type, bool is_local_to_unit) { - DIGlobalVariableExpression *result = reinterpret_cast(dbuilder)->createGlobalVariableExpression( + return reinterpret_cast(reinterpret_cast(dbuilder)->createGlobalVariableExpression( reinterpret_cast(scope), name, linkage_name, reinterpret_cast(file), line_no, reinterpret_cast(di_type), - is_local_to_unit); - return reinterpret_cast(result->getVariable()); + is_local_to_unit)); } ZigLLVMDILocalVariable *ZigLLVMCreateParameterVariable(ZigLLVMDIBuilder *dbuilder, @@ -1448,6 +1447,18 @@ void ZigLLVMTakeName(LLVMValueRef new_owner, LLVMValueRef victim) { unwrap(new_owner)->takeName(unwrap(victim)); } +ZigLLVMDIGlobalVariable* ZigLLVMGlobalGetVariable(ZigLLVMDIGlobalVariableExpression *global_variable_expression) { + return reinterpret_cast(reinterpret_cast(global_variable_expression)->getVariable()); +} + +ZigLLVMDIGlobalExpression* ZigLLVMGlobalGetExpression(ZigLLVMDIGlobalVariableExpression *global_variable_expression) { + return reinterpret_cast(reinterpret_cast(global_variable_expression)->getExpression()); +} + +void ZigLLVMAttachMetaData(LLVMValueRef Val, ZigLLVMDIGlobalVariableExpression *global_variable_expression) { + unwrap(Val)->addDebugInfo(reinterpret_cast(global_variable_expression)); +} + static_assert((Triple::ArchType)ZigLLVM_UnknownArch == Triple::UnknownArch, ""); static_assert((Triple::ArchType)ZigLLVM_arm == Triple::arm, ""); static_assert((Triple::ArchType)ZigLLVM_armeb == Triple::armeb, ""); diff --git a/src/zig_llvm.h b/src/zig_llvm.h index 6708804cad..e466be9e8c 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -34,7 +34,9 @@ struct ZigLLVMDILexicalBlock; struct ZigLLVMDISubprogram; struct ZigLLVMDISubroutineType; struct ZigLLVMDILocalVariable; +struct ZigLLVMDIGlobalVariableExpression; struct ZigLLVMDIGlobalVariable; +struct ZigLLVMDIGlobalExpression; struct ZigLLVMDILocation; struct ZigLLVMDIEnumerator; struct ZigLLVMInsertionPoint; @@ -271,7 +273,7 @@ ZIG_EXTERN_C struct ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(struct Zig struct ZigLLVMDIScope *scope, const char *name, struct ZigLLVMDIFile *file, unsigned line_no, struct ZigLLVMDIType *type, bool always_preserve, unsigned flags); -ZIG_EXTERN_C struct ZigLLVMDIGlobalVariable *ZigLLVMCreateGlobalVariable(struct ZigLLVMDIBuilder *dbuilder, +ZIG_EXTERN_C struct ZigLLVMDIGlobalVariableExpression *ZigLLVMCreateGlobalVariableExpression(struct ZigLLVMDIBuilder *dbuilder, struct ZigLLVMDIScope *scope, const char *name, const char *linkage_name, struct ZigLLVMDIFile *file, unsigned line_no, struct ZigLLVMDIType *di_type, bool is_local_to_unit); @@ -334,6 +336,10 @@ ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn); ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv); +ZIG_EXTERN_C ZigLLVMDIGlobalVariable* ZigLLVMGlobalGetVariable(ZigLLVMDIGlobalVariableExpression *global_variable_expression); +ZIG_EXTERN_C ZigLLVMDIGlobalExpression* ZigLLVMGlobalGetExpression(ZigLLVMDIGlobalVariableExpression *global_variable_expression); +ZIG_EXTERN_C void ZigLLVMAttachMetaData(LLVMValueRef Val, ZigLLVMDIGlobalVariableExpression *global_variable_expression); + // synchronize with llvm/include/ADT/Triple.h::ArchType // synchronize with std.Target.Cpu.Arch