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 {
25492549
25502550 const line_number = decl.src_line + 1;
25512551 const is_internal_linkage = !dg.module.decl_exports.contains(decl_index);
2552 const di_global = dib.createGlobalVariable(
2552 const di_global = dib.createGlobalVariableExpression(
25532553 di_file.toScope(),
25542554 decl.name,
25552555 global.getValueName(),
......@@ -2559,7 +2559,8 @@ pub const DeclGen = struct {
25592559 is_internal_linkage,
25602560 );
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);
25632564 }
25642565 }
25652566 }
src/codegen/llvm/bindings.zig+14-3
......@@ -256,6 +256,9 @@ pub const Value = opaque {
256256
257257 pub const addByValAttr = ZigLLVMAddByValAttr;
258258 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;
259262};
260263
261264pub const Type = opaque {
......@@ -1588,6 +1591,7 @@ pub const address_space = struct {
15881591pub const DIEnumerator = opaque {};
15891592pub const DILocalVariable = opaque {};
15901593pub const DILocation = opaque {};
1594pub const DIGlobalExpression = opaque {};
15911595
15921596pub const DIGlobalVariable = opaque {
15931597 pub const toNode = ZigLLVMGlobalVariableToNode;
......@@ -1596,6 +1600,13 @@ pub const DIGlobalVariable = opaque {
15961600 pub const replaceLinkageName = ZigLLVMGlobalVariableReplaceLinkageName;
15971601 extern fn ZigLLVMGlobalVariableReplaceLinkageName(global_variable: *DIGlobalVariable, linkage_name: *MDString) void;
15981602};
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};
15991610pub const DIType = opaque {
16001611 pub const toScope = ZigLLVMTypeToScope;
16011612 extern fn ZigLLVMTypeToScope(ty: *DIType) *DIScope;
......@@ -1803,8 +1814,8 @@ pub const DIBuilder = opaque {
18031814 flags: c_uint,
18041815 ) *DILocalVariable;
18051816
1806 pub const createGlobalVariable = ZigLLVMCreateGlobalVariable;
1807 extern fn ZigLLVMCreateGlobalVariable(
1817 pub const createGlobalVariableExpression = ZigLLVMCreateGlobalVariableExpression;
1818 extern fn ZigLLVMCreateGlobalVariableExpression(
18081819 dib: *DIBuilder,
18091820 scope: *DIScope,
18101821 name: [*:0]const u8,
......@@ -1813,7 +1824,7 @@ pub const DIBuilder = opaque {
18131824 line_no: c_uint,
18141825 di_type: *DIType,
18151826 is_local_to_unit: bool,
1816 ) *DIGlobalVariable;
1827 ) *DIGlobalVariableExpression;
18171828
18181829 pub const createParameterVariable = ZigLLVMCreateParameterVariable;
18191830 extern fn ZigLLVMCreateParameterVariable(
src/zig_llvm.cpp+15-4
......@@ -870,19 +870,18 @@ ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(ZigLLVMDIBuilder *dbuilder,
870870 return reinterpret_cast<ZigLLVMDILocalVariable*>(result);
871871}
872872
873ZigLLVMDIGlobalVariable *ZigLLVMCreateGlobalVariable(ZigLLVMDIBuilder *dbuilder,
873ZigLLVMDIGlobalVariableExpression *ZigLLVMCreateGlobalVariableExpression(ZigLLVMDIBuilder *dbuilder,
874874 ZigLLVMDIScope *scope, const char *name, const char *linkage_name, ZigLLVMDIFile *file,
875875 unsigned line_no, ZigLLVMDIType *di_type, bool is_local_to_unit)
876876{
877 DIGlobalVariableExpression *result = reinterpret_cast<DIBuilder*>(dbuilder)->createGlobalVariableExpression(
877 return reinterpret_cast<ZigLLVMDIGlobalVariableExpression*>(reinterpret_cast<DIBuilder*>(dbuilder)->createGlobalVariableExpression(
878878 reinterpret_cast<DIScope*>(scope),
879879 name,
880880 linkage_name,
881881 reinterpret_cast<DIFile*>(file),
882882 line_no,
883883 reinterpret_cast<DIType*>(di_type),
884 is_local_to_unit);
885 return reinterpret_cast<ZigLLVMDIGlobalVariable*>(result->getVariable());
884 is_local_to_unit));
886885}
887886
888887ZigLLVMDILocalVariable *ZigLLVMCreateParameterVariable(ZigLLVMDIBuilder *dbuilder,
......@@ -1448,6 +1447,18 @@ void ZigLLVMTakeName(LLVMValueRef new_owner, LLVMValueRef victim) {
14481447 unwrap(new_owner)->takeName(unwrap(victim));
14491448}
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
14511462static_assert((Triple::ArchType)ZigLLVM_UnknownArch == Triple::UnknownArch, "");
14521463static_assert((Triple::ArchType)ZigLLVM_arm == Triple::arm, "");
14531464static_assert((Triple::ArchType)ZigLLVM_armeb == Triple::armeb, "");
src/zig_llvm.h+7-1
......@@ -34,7 +34,9 @@ struct ZigLLVMDILexicalBlock;
3434struct ZigLLVMDISubprogram;
3535struct ZigLLVMDISubroutineType;
3636struct ZigLLVMDILocalVariable;
37struct ZigLLVMDIGlobalVariableExpression;
3738struct ZigLLVMDIGlobalVariable;
39struct ZigLLVMDIGlobalExpression;
3840struct ZigLLVMDILocation;
3941struct ZigLLVMDIEnumerator;
4042struct ZigLLVMInsertionPoint;
......@@ -271,7 +273,7 @@ ZIG_EXTERN_C struct ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(struct Zig
271273 struct ZigLLVMDIScope *scope, const char *name, struct ZigLLVMDIFile *file, unsigned line_no,
272274 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,
275277 struct ZigLLVMDIScope *scope, const char *name, const char *linkage_name, struct ZigLLVMDIFile *file,
276278 unsigned line_no, struct ZigLLVMDIType *di_type, bool is_local_to_unit);
277279
......@@ -334,6 +336,10 @@ ZIG_EXTERN_C void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn);
334336
335337ZIG_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
338344// synchronize with llvm/include/ADT/Triple.h::ArchType
339345// synchronize with std.Target.Cpu.Arch