Skip to content

Commit 002362b

Browse files
authored
Add LLVMGlobalAddDebugInfo to Core.cpp (#148747)
This change allows globals to have multiple metadata attached. The GlobalSetMetadata function only allows only one and is clobbered if more metadata is attempted to be added. The addDebugInfo function calls addMetadata. This is needed because some languages have global structs containing lots of compiler-generated globals.
1 parent 1633e0b commit 002362b

File tree

6 files changed

+68
-0
lines changed

6 files changed

+68
-0
lines changed

llvm/include/llvm-c/Core.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2694,6 +2694,14 @@ LLVM_C_ABI void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes);
26942694
LLVM_C_ABI void LLVMGlobalSetMetadata(LLVMValueRef Global, unsigned Kind,
26952695
LLVMMetadataRef MD);
26962696

2697+
/**
2698+
* Adds a metadata attachment.
2699+
*
2700+
* @see llvm::GlobalObject::addMetadata()
2701+
*/
2702+
LLVM_C_ABI void LLVMGlobalAddMetadata(LLVMValueRef Global, unsigned Kind,
2703+
LLVMMetadataRef MD);
2704+
26972705
/**
26982706
* Erases a metadata attachment of the given kind if it exists.
26992707
*
@@ -2708,6 +2716,14 @@ LLVM_C_ABI void LLVMGlobalEraseMetadata(LLVMValueRef Global, unsigned Kind);
27082716
*/
27092717
LLVM_C_ABI void LLVMGlobalClearMetadata(LLVMValueRef Global);
27102718

2719+
/**
2720+
* Add debuginfo metadata to this global.
2721+
*
2722+
* @see llvm::GlobalVariable::addDebugInfo()
2723+
*/
2724+
LLVM_C_ABI void LLVMGlobalAddDebugInfo(LLVMValueRef Global,
2725+
LLVMMetadataRef GVE);
2726+
27112727
/**
27122728
* Retrieves an array of metadata entries representing the metadata attached to
27132729
* this value. The caller is responsible for freeing this array by calling

llvm/lib/IR/Core.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2186,6 +2186,11 @@ void LLVMGlobalSetMetadata(LLVMValueRef Global, unsigned Kind,
21862186
unwrap<GlobalObject>(Global)->setMetadata(Kind, unwrap<MDNode>(MD));
21872187
}
21882188

2189+
void LLVMGlobalAddMetadata(LLVMValueRef Global, unsigned Kind,
2190+
LLVMMetadataRef MD) {
2191+
unwrap<GlobalObject>(Global)->addMetadata(Kind, *unwrap<MDNode>(MD));
2192+
}
2193+
21892194
void LLVMGlobalEraseMetadata(LLVMValueRef Global, unsigned Kind) {
21902195
unwrap<GlobalObject>(Global)->eraseMetadata(Kind);
21912196
}
@@ -2194,6 +2199,11 @@ void LLVMGlobalClearMetadata(LLVMValueRef Global) {
21942199
unwrap<GlobalObject>(Global)->clearMetadata();
21952200
}
21962201

2202+
void LLVMGlobalAddDebugInfo(LLVMValueRef Global, LLVMMetadataRef GVE) {
2203+
unwrap<GlobalVariable>(Global)->addDebugInfo(
2204+
unwrap<DIGlobalVariableExpression>(GVE));
2205+
}
2206+
21972207
/*--.. Operations on global variables ......................................--*/
21982208

21992209
LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
; RUN: llvm-c-test --add-globaldebuginfo < /dev/null
2+
; This used to trigger an assertion

llvm/tools/llvm-c-test/debuginfo.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,3 +416,40 @@ int llvm_di_type_get_name(void) {
416416

417417
return 0;
418418
}
419+
420+
int llvm_add_globaldebuginfo(void) {
421+
const char *Filename = "debuginfo.c";
422+
LLVMModuleRef M = LLVMModuleCreateWithName(Filename);
423+
LLVMDIBuilderRef Builder = LLVMCreateDIBuilder(M);
424+
LLVMMetadataRef File =
425+
LLVMDIBuilderCreateFile(Builder, Filename, strlen(Filename), ".", 1);
426+
427+
LLVMMetadataRef GlobalVarValueExpr =
428+
LLVMDIBuilderCreateConstantValueExpression(Builder, 0);
429+
LLVMMetadataRef Int64Ty =
430+
LLVMDIBuilderCreateBasicType(Builder, "Int64", 5, 64, 0, LLVMDIFlagZero);
431+
LLVMMetadataRef Int64TypeDef = LLVMDIBuilderCreateTypedef(
432+
Builder, Int64Ty, "int64_t", 7, File, 42, File, 0);
433+
434+
LLVMMetadataRef GVE = LLVMDIBuilderCreateGlobalVariableExpression(
435+
Builder, File, "global", 6, "", 0, File, 1, Int64TypeDef, true,
436+
GlobalVarValueExpr, NULL, 0);
437+
438+
LLVMTypeRef RecType =
439+
LLVMStructCreateNamed(LLVMGetModuleContext(M), "struct");
440+
LLVMValueRef Global = LLVMAddGlobal(M, RecType, "global");
441+
442+
LLVMGlobalAddDebugInfo(Global, GVE);
443+
// use AddMetadata to add twice
444+
int kindId = LLVMGetMDKindID("dbg", 3);
445+
LLVMGlobalAddMetadata(Global, kindId, GVE);
446+
size_t numEntries;
447+
LLVMValueMetadataEntry *ME = LLVMGlobalCopyAllMetadata(Global, &numEntries);
448+
assert(ME != NULL);
449+
assert(numEntries == 2);
450+
451+
LLVMDisposeDIBuilder(Builder);
452+
LLVMDisposeModule(M);
453+
454+
return 0;
455+
}

llvm/tools/llvm-c-test/llvm-c-test.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ int llvm_add_named_metadata_operand(void);
4545
int llvm_set_metadata(void);
4646
int llvm_replace_md_operand(void);
4747
int llvm_is_a_value_as_metadata(void);
48+
int llvm_add_globaldebuginfo(void);
4849

4950
// object.c
5051
int llvm_object_list_sections(void);

llvm/tools/llvm-c-test/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ int main(int argc, char **argv) {
101101
return llvm_replace_md_operand();
102102
} else if (argc == 2 && !strcmp(argv[1], "--is-a-value-as-metadata")) {
103103
return llvm_is_a_value_as_metadata();
104+
} else if (argc == 2 && !strcmp(argv[1], "--add-globaldebuginfo")) {
105+
return llvm_add_globaldebuginfo();
104106
} else if (argc == 2 && !strcmp(argv[1], "--test-function-attributes")) {
105107
return llvm_test_function_attributes();
106108
} else if (argc == 2 && !strcmp(argv[1], "--test-callsite-attributes")) {

0 commit comments

Comments
 (0)