[llvm] Add LLVMGlobalAddDebugInfo to Core.cpp (PR #148747)
peter mckinna via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 20 23:34:34 PDT 2025
https://github.com/demoitem updated https://github.com/llvm/llvm-project/pull/148747
>From 0d799d6c749248fa68bbbb376c4d4fbadec1b7bd Mon Sep 17 00:00:00 2001
From: peter mckinna <peter.mckinna at gmail.com>
Date: Mon, 14 Jul 2025 20:59:24 +1000
Subject: [PATCH 1/2] Add LLVMGlobalAddDebugInfo to Core.cpp
---
llvm/include/llvm-c/Core.h | 8 +++++
llvm/lib/IR/Core.cpp | 5 +++
.../Bindings/llvm-c/add_globaldebuginfo.ll | 2 ++
llvm/tools/llvm-c-test/debuginfo.c | 34 +++++++++++++++++++
llvm/tools/llvm-c-test/llvm-c-test.h | 1 +
llvm/tools/llvm-c-test/main.c | 2 ++
6 files changed, 52 insertions(+)
create mode 100644 llvm/test/Bindings/llvm-c/add_globaldebuginfo.ll
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index d645646289025..ec0c5e546fa8f 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -2707,6 +2707,14 @@ LLVM_C_ABI void LLVMGlobalEraseMetadata(LLVMValueRef Global, unsigned Kind);
*/
LLVM_C_ABI void LLVMGlobalClearMetadata(LLVMValueRef Global);
+/**
+ * Add debuginfo metadata to this global.
+ *
+ * @see llvm::GlobalVariable::addDebugInfo()
+ */
+LLVM_C_ABI void LLVMGlobalAddDebugInfo(LLVMValueRef Global,
+ LLVMMetadataRef GVE);
+
/**
* Retrieves an array of metadata entries representing the metadata attached to
* this value. The caller is responsible for freeing this array by calling
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index f7ef4aa473ef5..988249ed23d9d 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -2194,6 +2194,11 @@ void LLVMGlobalClearMetadata(LLVMValueRef Global) {
unwrap<GlobalObject>(Global)->clearMetadata();
}
+void LLVMGlobalAddDebugInfo(LLVMValueRef Global, LLVMMetadataRef GVE) {
+ unwrap<GlobalVariable>(Global)->addDebugInfo(
+ unwrap<DIGlobalVariableExpression>(GVE));
+}
+
/*--.. Operations on global variables ......................................--*/
LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
diff --git a/llvm/test/Bindings/llvm-c/add_globaldebuginfo.ll b/llvm/test/Bindings/llvm-c/add_globaldebuginfo.ll
new file mode 100644
index 0000000000000..da6536a9ce407
--- /dev/null
+++ b/llvm/test/Bindings/llvm-c/add_globaldebuginfo.ll
@@ -0,0 +1,2 @@
+; RUN: llvm-c-test --add-globaldebuginfo < /dev/null
+; This used to trigger an assertion
diff --git a/llvm/tools/llvm-c-test/debuginfo.c b/llvm/tools/llvm-c-test/debuginfo.c
index e73f69743805c..df70f6626ec14 100644
--- a/llvm/tools/llvm-c-test/debuginfo.c
+++ b/llvm/tools/llvm-c-test/debuginfo.c
@@ -416,3 +416,37 @@ int llvm_di_type_get_name(void) {
return 0;
}
+
+int llvm_add_globaldebuginfo(void) {
+ const char *Filename = "debuginfo.c";
+ LLVMModuleRef M = LLVMModuleCreateWithName(Filename);
+ LLVMDIBuilderRef Builder = LLVMCreateDIBuilder(M);
+ LLVMMetadataRef File =
+ LLVMDIBuilderCreateFile(Builder, Filename, strlen(Filename), ".", 1);
+
+ LLVMMetadataRef GlobalVarValueExpr =
+ LLVMDIBuilderCreateConstantValueExpression(Builder, 0);
+ LLVMMetadataRef Int64Ty =
+ LLVMDIBuilderCreateBasicType(Builder, "Int64", 5, 64, 0, LLVMDIFlagZero);
+ LLVMMetadataRef Int64TypeDef = LLVMDIBuilderCreateTypedef(
+ Builder, Int64Ty, "int64_t", 7, File, 42, File, 0);
+
+ LLVMMetadataRef GVE = LLVMDIBuilderCreateGlobalVariableExpression(
+ Builder, File, "global", 6, "", 0, File, 1, Int64TypeDef, true,
+ GlobalVarValueExpr, NULL, 0);
+
+ LLVMTypeRef RecType =
+ LLVMStructCreateNamed(LLVMGetModuleContext(M), "struct");
+ LLVMValueRef Global = LLVMAddGlobal(M, RecType, "global");
+
+ LLVMGlobalAddDebugInfo(Global, GVE);
+ size_t numEntries;
+ LLVMValueMetadataEntry *ME = LLVMGlobalCopyAllMetadata(Global, &numEntries);
+ assert(ME != NULL);
+ assert(numEntries == 1);
+
+ LLVMDisposeDIBuilder(Builder);
+ LLVMDisposeModule(M);
+
+ return 0;
+}
diff --git a/llvm/tools/llvm-c-test/llvm-c-test.h b/llvm/tools/llvm-c-test/llvm-c-test.h
index 1da6596cd5a8f..4c5a88ce0447e 100644
--- a/llvm/tools/llvm-c-test/llvm-c-test.h
+++ b/llvm/tools/llvm-c-test/llvm-c-test.h
@@ -45,6 +45,7 @@ int llvm_add_named_metadata_operand(void);
int llvm_set_metadata(void);
int llvm_replace_md_operand(void);
int llvm_is_a_value_as_metadata(void);
+int llvm_add_globaldebuginfo(void);
// object.c
int llvm_object_list_sections(void);
diff --git a/llvm/tools/llvm-c-test/main.c b/llvm/tools/llvm-c-test/main.c
index badbe4b13b6ba..d1963b702888b 100644
--- a/llvm/tools/llvm-c-test/main.c
+++ b/llvm/tools/llvm-c-test/main.c
@@ -101,6 +101,8 @@ int main(int argc, char **argv) {
return llvm_replace_md_operand();
} else if (argc == 2 && !strcmp(argv[1], "--is-a-value-as-metadata")) {
return llvm_is_a_value_as_metadata();
+ } else if (argc == 2 && !strcmp(argv[1], "--add-globaldebuginfo")) {
+ return llvm_add_globaldebuginfo();
} else if (argc == 2 && !strcmp(argv[1], "--test-function-attributes")) {
return llvm_test_function_attributes();
} else if (argc == 2 && !strcmp(argv[1], "--test-callsite-attributes")) {
>From b2b532a1e35dc349ff608c3f0037a3b013deda4c Mon Sep 17 00:00:00 2001
From: peter mckinna <peter.mckinna at gmail.com>
Date: Mon, 21 Jul 2025 16:14:01 +1000
Subject: [PATCH 2/2] Add GlobalAddMetadata and extend test
---
llvm/include/llvm-c/Core.h | 8 ++++++++
llvm/lib/IR/Core.cpp | 5 +++++
llvm/tools/llvm-c-test/debuginfo.c | 5 ++++-
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index ec0c5e546fa8f..eb85b1d503d8f 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -2693,6 +2693,14 @@ LLVM_C_ABI void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes);
LLVM_C_ABI void LLVMGlobalSetMetadata(LLVMValueRef Global, unsigned Kind,
LLVMMetadataRef MD);
+/**
+ * Adds a metadata attachment.
+ *
+ * @see llvm::GlobalObject::addMetadata()
+ */
+LLVM_C_ABI void LLVMGlobalAddMetadata(LLVMValueRef Global, unsigned Kind,
+ LLVMMetadataRef MD);
+
/**
* Erases a metadata attachment of the given kind if it exists.
*
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 988249ed23d9d..8b5965ba45a6d 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -2186,6 +2186,11 @@ void LLVMGlobalSetMetadata(LLVMValueRef Global, unsigned Kind,
unwrap<GlobalObject>(Global)->setMetadata(Kind, unwrap<MDNode>(MD));
}
+void LLVMGlobalAddMetadata(LLVMValueRef Global, unsigned Kind,
+ LLVMMetadataRef MD) {
+ unwrap<GlobalObject>(Global)->addMetadata(Kind, *unwrap<MDNode>(MD));
+}
+
void LLVMGlobalEraseMetadata(LLVMValueRef Global, unsigned Kind) {
unwrap<GlobalObject>(Global)->eraseMetadata(Kind);
}
diff --git a/llvm/tools/llvm-c-test/debuginfo.c b/llvm/tools/llvm-c-test/debuginfo.c
index df70f6626ec14..3fddd0287f1ac 100644
--- a/llvm/tools/llvm-c-test/debuginfo.c
+++ b/llvm/tools/llvm-c-test/debuginfo.c
@@ -440,10 +440,13 @@ int llvm_add_globaldebuginfo(void) {
LLVMValueRef Global = LLVMAddGlobal(M, RecType, "global");
LLVMGlobalAddDebugInfo(Global, GVE);
+ // use AddMetadata to add twice
+ int kindId = LLVMGetMDKindID("dbg", 3);
+ LLVMGlobalAddMetadata(Global, kindId, GVE);
size_t numEntries;
LLVMValueMetadataEntry *ME = LLVMGlobalCopyAllMetadata(Global, &numEntries);
assert(ME != NULL);
- assert(numEntries == 1);
+ assert(numEntries == 2);
LLVMDisposeDIBuilder(Builder);
LLVMDisposeModule(M);
More information about the llvm-commits
mailing list