authorgravatar for tw19881113@gmail.comTw <tw19881113@gmail.com> 2023-04-20 19:12:41+08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-04-20 11:12:41+00:00
log31b6d14bf76fa6b78013a6a32d3066e882d64043
tree7a31da91ca6515f1fbb2bcea8023e6b4c9aea63a
parentd80e6ca5a6843cb3911ec2d0b2da8b4ae515202a
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

llvm: emit metadata for exported global variables (#15349)

* llvm: emit metadata for global variable One use case is to genearte BTF information from global variable's metadata. Signed-off-by: Tw <weii.tan>

4 files changed, 39 insertions(+), 10 deletions(-)

src/codegen/llvm.zig+3-2
...@@ -2549,7 +2549,7 @@ pub const DeclGen = struct {...@@ -2549,7 +2549,7 @@ pub const DeclGen = struct {
25492549
2550 const line_number = decl.src_line + 1;2550 const line_number = decl.src_line + 1;
2551 const is_internal_linkage = !dg.module.decl_exports.contains(decl_index);2551 const is_internal_linkage = !dg.module.decl_exports.contains(decl_index);
2552 const di_global = dib.createGlobalVariable(2552 const di_global = dib.createGlobalVariableExpression(
2553 di_file.toScope(),2553 di_file.toScope(),
2554 decl.name,2554 decl.name,
2555 global.getValueName(),2555 global.getValueName(),
...@@ -2559,7 +2559,8 @@ pub const DeclGen = struct {...@@ -2559,7 +2559,8 @@ pub const DeclGen = struct {
2559 is_internal_linkage,2559 is_internal_linkage,
2560 );2560 );
25612561
2562 try dg.object.di_map.put(dg.gpa, dg.decl, di_global.toNode());2562 try dg.object.di_map.put(dg.gpa, dg.decl, di_global.getVariable().toNode());
2563 if (!is_internal_linkage) global.attachMetaData(di_global);
2563 }2564 }
2564 }2565 }
2565 }2566 }
src/codegen/llvm/bindings.zig+14-3
...@@ -256,6 +256,9 @@ pub const Value = opaque {...@@ -256,6 +256,9 @@ pub const Value = opaque {
256256
257 pub const addByValAttr = ZigLLVMAddByValAttr;257 pub const addByValAttr = ZigLLVMAddByValAttr;
258 extern fn ZigLLVMAddByValAttr(Fn: *Value, ArgNo: c_uint, type: *Type) void;258 extern fn ZigLLVMAddByValAttr(Fn: *Value, ArgNo: c_uint, type: *Type) void;
259
260 pub const attachMetaData = ZigLLVMAttachMetaData;
261 extern fn ZigLLVMAttachMetaData(GlobalVar: *Value, DIG: *DIGlobalVariableExpression) void;
259};262};
260263
261pub const Type = opaque {264pub const Type = opaque {
...@@ -1588,6 +1591,7 @@ pub const address_space = struct {...@@ -1588,6 +1591,7 @@ pub const address_space = struct {
1588pub const DIEnumerator = opaque {};1591pub const DIEnumerator = opaque {};
1589pub const DILocalVariable = opaque {};1592pub const DILocalVariable = opaque {};
1590pub const DILocation = opaque {};1593pub const DILocation = opaque {};
1594pub const DIGlobalExpression = opaque {};
15911595
1592pub const DIGlobalVariable = opaque {1596pub const DIGlobalVariable = opaque {
1593 pub const toNode = ZigLLVMGlobalVariableToNode;1597 pub const toNode = ZigLLVMGlobalVariableToNode;
...@@ -1596,6 +1600,13 @@ pub const DIGlobalVariable = opaque {...@@ -1596,6 +1600,13 @@ pub const DIGlobalVariable = opaque {
1596 pub const replaceLinkageName = ZigLLVMGlobalVariableReplaceLinkageName;1600 pub const replaceLinkageName = ZigLLVMGlobalVariableReplaceLinkageName;
1597 extern fn ZigLLVMGlobalVariableReplaceLinkageName(global_variable: *DIGlobalVariable, linkage_name: *MDString) void;1601 extern fn ZigLLVMGlobalVariableReplaceLinkageName(global_variable: *DIGlobalVariable, linkage_name: *MDString) void;
1598};1602};
1603pub const DIGlobalVariableExpression = opaque {
1604 pub const getVariable = ZigLLVMGlobalGetVariable;
1605 extern fn ZigLLVMGlobalGetVariable(global_variable: *DIGlobalVariableExpression) *DIGlobalVariable;
1606
1607 pub const getExpression = ZigLLVMGlobalGetExpression;
1608 extern fn ZigLLVMGlobalGetExpression(global_variable: *DIGlobalVariableExpression) *DIGlobalExpression;
1609};
1599pub const DIType = opaque {1610pub const DIType = opaque {
1600 pub const toScope = ZigLLVMTypeToScope;1611 pub const toScope = ZigLLVMTypeToScope;
1601 extern fn ZigLLVMTypeToScope(ty: *DIType) *DIScope;1612 extern fn ZigLLVMTypeToScope(ty: *DIType) *DIScope;
...@@ -1803,8 +1814,8 @@ pub const DIBuilder = opaque {...@@ -1803,8 +1814,8 @@ pub const DIBuilder = opaque {
1803 flags: c_uint,1814 flags: c_uint,
1804 ) *DILocalVariable;1815 ) *DILocalVariable;
18051816
1806 pub const createGlobalVariable = ZigLLVMCreateGlobalVariable;1817 pub const createGlobalVariableExpression = ZigLLVMCreateGlobalVariableExpression;
1807 extern fn ZigLLVMCreateGlobalVariable(1818 extern fn ZigLLVMCreateGlobalVariableExpression(
1808 dib: *DIBuilder,1819 dib: *DIBuilder,
1809 scope: *DIScope,1820 scope: *DIScope,
1810 name: [*:0]const u8,1821 name: [*:0]const u8,
...@@ -1813,7 +1824,7 @@ pub const DIBuilder = opaque {...@@ -1813,7 +1824,7 @@ pub const DIBuilder = opaque {
1813 line_no: c_uint,1824 line_no: c_uint,
1814 di_type: *DIType,1825 di_type: *DIType,
1815 is_local_to_unit: bool,1826 is_local_to_unit: bool,
1816 ) *DIGlobalVariable;1827 ) *DIGlobalVariableExpression;
18171828
1818 pub const createParameterVariable = ZigLLVMCreateParameterVariable;1829 pub const createParameterVariable = ZigLLVMCreateParameterVariable;
1819 extern fn ZigLLVMCreateParameterVariable(1830 extern fn ZigLLVMCreateParameterVariable(
src/zig_llvm.cpp+15-4
...@@ -870,19 +870,18 @@ ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(ZigLLVMDIBuilder *dbuilder,...@@ -870,19 +870,18 @@ ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(ZigLLVMDIBuilder *dbuilder,
870 return reinterpret_cast<ZigLLVMDILocalVariable*>(result);870 return reinterpret_cast<ZigLLVMDILocalVariable*>(result);
871}871}
872872
873ZigLLVMDIGlobalVariable *ZigLLVMCreateGlobalVariable(ZigLLVMDIBuilder *dbuilder,873ZigLLVMDIGlobalVariableExpression *ZigLLVMCreateGlobalVariableExpression(ZigLLVMDIBuilder *dbuilder,
874 ZigLLVMDIScope *scope, const char *name, const char *linkage_name, ZigLLVMDIFile *file,874 ZigLLVMDIScope *scope, const char *name, const char *linkage_name, ZigLLVMDIFile *file,
875 unsigned line_no, ZigLLVMDIType *di_type, bool is_local_to_unit)875 unsigned line_no, ZigLLVMDIType *di_type, bool is_local_to_unit)
876{876{
877 DIGlobalVariableExpression *result = reinterpret_cast<DIBuilder*>(dbuilder)->createGlobalVariableExpression(877 return reinterpret_cast<ZigLLVMDIGlobalVariableExpression*>(reinterpret_cast<DIBuilder*>(dbuilder)->createGlobalVariableExpression(
878 reinterpret_cast<DIScope*>(scope),878 reinterpret_cast<DIScope*>(scope),
879 name,879 name,
880 linkage_name,880 linkage_name,
881 reinterpret_cast<DIFile*>(file),881 reinterpret_cast<DIFile*>(file),
882 line_no,882 line_no,
883 reinterpret_cast<DIType*>(di_type),883 reinterpret_cast<DIType*>(di_type),
884 is_local_to_unit);884 is_local_to_unit));
885 return reinterpret_cast<ZigLLVMDIGlobalVariable*>(result->getVariable());
886}885}
887886
888ZigLLVMDILocalVariable *ZigLLVMCreateParameterVariable(ZigLLVMDIBuilder *dbuilder,887ZigLLVMDILocalVariable *ZigLLVMCreateParameterVariable(ZigLLVMDIBuilder *dbuilder,
...@@ -1448,6 +1447,18 @@ void ZigLLVMTakeName(LLVMValueRef new_owner, LLVMValueRef victim) {...@@ -1448,6 +1447,18 @@ void ZigLLVMTakeName(LLVMValueRef new_owner, LLVMValueRef victim) {
1448 unwrap(new_owner)->takeName(unwrap(victim));1447 unwrap(new_owner)->takeName(unwrap(victim));
1449}1448}
14501449
1450ZigLLVMDIGlobalVariable* ZigLLVMGlobalGetVariable(ZigLLVMDIGlobalVariableExpression *global_variable_expression) {
1451 return reinterpret_cast<ZigLLVMDIGlobalVariable*>(reinterpret_cast<DIGlobalVariableExpression*>(global_variable_expression)->getVariable());
1452}
1453
1454ZigLLVMDIGlobalExpression* ZigLLVMGlobalGetExpression(ZigLLVMDIGlobalVariableExpression *global_variable_expression) {
1455 return reinterpret_cast<ZigLLVMDIGlobalExpression*>(reinterpret_cast<DIGlobalVariableExpression*>(global_variable_expression)->getExpression());
1456}
1457
1458void ZigLLVMAttachMetaData(LLVMValueRef Val, ZigLLVMDIGlobalVariableExpression *global_variable_expression) {
1459 unwrap<GlobalVariable>(Val)->addDebugInfo(reinterpret_cast<DIGlobalVariableExpression*>(global_variable_expression));
1460}
1461
1451static_assert((Triple::ArchType)ZigLLVM_UnknownArch == Triple::UnknownArch, "");1462static_assert((Triple::ArchType)ZigLLVM_UnknownArch == Triple::UnknownArch, "");
1452static_assert((Triple::ArchType)ZigLLVM_arm == Triple::arm, "");1463static_assert((Triple::ArchType)ZigLLVM_arm == Triple::arm, "");
1453static_assert((Triple::ArchType)ZigLLVM_armeb == Triple::armeb, "");1464static_assert((Triple::ArchType)ZigLLVM_armeb == Triple::armeb, "");
src/zig_llvm.h+7-1
...@@ -34,7 +34,9 @@ struct ZigLLVMDILexicalBlock;...@@ -34,7 +34,9 @@ struct ZigLLVMDILexicalBlock;
34struct ZigLLVMDISubprogram;34struct ZigLLVMDISubprogram;
35struct ZigLLVMDISubroutineType;35struct ZigLLVMDISubroutineType;
36struct ZigLLVMDILocalVariable;36struct ZigLLVMDILocalVariable;
37struct ZigLLVMDIGlobalVariableExpression;
37struct ZigLLVMDIGlobalVariable;38struct ZigLLVMDIGlobalVariable;
39struct ZigLLVMDIGlobalExpression;
38struct ZigLLVMDILocation;40struct ZigLLVMDILocation;
39struct ZigLLVMDIEnumerator;41struct ZigLLVMDIEnumerator;
40struct ZigLLVMInsertionPoint;42struct ZigLLVMInsertionPoint;
...@@ -271,7 +273,7 @@ ZIG_EXTERN_C struct ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(struct Zig...@@ -271,7 +273,7 @@ ZIG_EXTERN_C struct ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(struct Zig
271 struct ZigLLVMDIScope *scope, const char *name, struct ZigLLVMDIFile *file, unsigned line_no,273 struct ZigLLVMDIScope *scope, const char *name, struct ZigLLVMDIFile *file, unsigned line_no,
272 struct ZigLLVMDIType *type, bool always_preserve, unsigned flags);274 struct ZigLLVMDIType *type, bool always_preserve, unsigned flags);
273275
274ZIG_EXTERN_C struct ZigLLVMDIGlobalVariable *ZigLLVMCreateGlobalVariable(struct ZigLLVMDIBuilder *dbuilder,276ZIG_EXTERN_C struct ZigLLVMDIGlobalVariableExpression *ZigLLVMCreateGlobalVariableExpression(struct ZigLLVMDIBuilder *dbuilder,
275 struct ZigLLVMDIScope *scope, const char *name, const char *linkage_name, struct ZigLLVMDIFile *file,277 struct ZigLLVMDIScope *scope, const char *name, const char *linkage_name, struct ZigLLVMDIFile *file,
276 unsigned line_no, struct ZigLLVMDIType *di_type, bool is_local_to_unit);278 unsigned line_no, struct ZigLLVMDIType *di_type, bool is_local_to_unit);
277279
...@@ -334,6 +336,10 @@ ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn);...@@ -334,6 +336,10 @@ ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn);
334336
335ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);337ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);
336338
339ZIG_EXTERN_C ZigLLVMDIGlobalVariable* ZigLLVMGlobalGetVariable(ZigLLVMDIGlobalVariableExpression *global_variable_expression);
340ZIG_EXTERN_C ZigLLVMDIGlobalExpression* ZigLLVMGlobalGetExpression(ZigLLVMDIGlobalVariableExpression *global_variable_expression);
341ZIG_EXTERN_C void ZigLLVMAttachMetaData(LLVMValueRef Val, ZigLLVMDIGlobalVariableExpression *global_variable_expression);
342
337343
338// synchronize with llvm/include/ADT/Triple.h::ArchType344// synchronize with llvm/include/ADT/Triple.h::ArchType
339// synchronize with std.Target.Cpu.Arch345// synchronize with std.Target.Cpu.Arch