[llvm] 8fec6d1 - llvm-c: Introduce 'LLVMDISubprogramReplaceType' (#143461)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 24 06:42:10 PDT 2025


Author: David
Date: 2025-06-24T14:42:06+01:00
New Revision: 8fec6d11777ad29c55f8104fc11504cadba3fc22

URL: https://github.com/llvm/llvm-project/commit/8fec6d11777ad29c55f8104fc11504cadba3fc22
DIFF: https://github.com/llvm/llvm-project/commit/8fec6d11777ad29c55f8104fc11504cadba3fc22.diff

LOG: llvm-c: Introduce 'LLVMDISubprogramReplaceType' (#143461)

The C API does not provide a way to replace the subroutine type after
creating a subprogram. This functionality is useful for creating a
subroutine type composed of types which have the subprogram as scope

Added: 
    

Modified: 
    llvm/include/llvm-c/DebugInfo.h
    llvm/lib/IR/DebugInfo.cpp
    llvm/tools/llvm-c-test/debuginfo.c

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm-c/DebugInfo.h b/llvm/include/llvm-c/DebugInfo.h
index 991def64028da..ef89a88617bea 100644
--- a/llvm/include/llvm-c/DebugInfo.h
+++ b/llvm/include/llvm-c/DebugInfo.h
@@ -1420,6 +1420,16 @@ void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP);
  */
 unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram);
 
+/**
+ * Replace the subprogram subroutine type.
+ * \param Subprogram        The subprogram object.
+ * \param SubroutineType    The new subroutine type.
+ *
+ * @see DISubprogram::replaceType()
+ */
+void LLVMDISubprogramReplaceType(LLVMMetadataRef Subprogram,
+                                 LLVMMetadataRef SubroutineType);
+
 /**
  * Get the debug location for the given instruction.
  *

diff  --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index 196fe294a274b..5c645ffe3f3f7 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -1813,6 +1813,12 @@ unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram) {
   return unwrapDI<DISubprogram>(Subprogram)->getLine();
 }
 
+void LLVMDISubprogramReplaceType(LLVMMetadataRef Subprogram,
+                                 LLVMMetadataRef SubroutineType) {
+  unwrapDI<DISubprogram>(Subprogram)
+      ->replaceType(unwrapDI<DISubroutineType>(SubroutineType));
+}
+
 LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst) {
   return wrap(unwrap<Instruction>(Inst)->getDebugLoc().getAsMDNode());
 }

diff  --git a/llvm/tools/llvm-c-test/debuginfo.c b/llvm/tools/llvm-c-test/debuginfo.c
index 3ac5a6bc2cf03..8c6f6436782e9 100644
--- a/llvm/tools/llvm-c-test/debuginfo.c
+++ b/llvm/tools/llvm-c-test/debuginfo.c
@@ -130,12 +130,12 @@ int llvm_test_dibuilder(void) {
   LLVMMetadataRef FooParamLocation =
     LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
                                      ReplaceableFunctionMetadata, NULL);
-  LLVMMetadataRef FunctionMetadata =
-    LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
-                                File, 42, FunctionTy, true, true,
-                                42, 0, false);
+  LLVMMetadataRef FunctionMetadata = LLVMDIBuilderCreateFunction(
+      DIB, File, "foo", 3, "foo", 3, File, 42, NULL, true, true, 42, 0, false);
   LLVMMetadataReplaceAllUsesWith(ReplaceableFunctionMetadata, FunctionMetadata);
 
+  LLVMDISubprogramReplaceType(FunctionMetadata, FunctionTy);
+
   LLVMMetadataRef FooParamExpression =
     LLVMDIBuilderCreateExpression(DIB, NULL, 0);
   LLVMMetadataRef FooParamVar1 =


        


More information about the llvm-commits mailing list