Conversation
|
@llvm/pr-subscribers-debuginfo @llvm/pr-subscribers-llvm-ir Author: Maxime Arthaud (arthaud) ChangesIn the LLVM-C library, there is currently no way to get information about a DbgRecord - which is the new way to attach debug information to llvm instructions. This PR adds utility functions to read DbgRecord information. Full diff: https://github.com/llvm/llvm-project/pull/166383.diff 3 Files Affected:
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index 4e380d9bd5969..83dd1eba876e6 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -531,6 +531,13 @@ enum {
*/
typedef unsigned LLVMGEPNoWrapFlags;
+typedef enum {
+ LLVMDbgRecordLabel,
+ LLVMDbgRecordDeclare,
+ LLVMDbgRecordValue,
+ LLVMDbgRecordAssign,
+} LLVMDbgRecordKind;
+
/**
* @}
*/
@@ -3896,6 +3903,37 @@ LLVM_C_ABI LLVMDbgRecordRef LLVMGetNextDbgRecord(LLVMDbgRecordRef DbgRecord);
LLVM_C_ABI LLVMDbgRecordRef
LLVMGetPreviousDbgRecord(LLVMDbgRecordRef DbgRecord);
+/**
+ * Get the debug location attached to the debug record.
+ *
+ * @see llvm::DbgRecord::getDebugLoc()
+ */
+LLVMMetadataRef LLVMDbgRecordGetDebugLoc(LLVMDbgRecordRef Rec);
+
+LLVMDbgRecordKind LLVMDbgRecordGetKind(LLVMDbgRecordRef Rec);
+
+/**
+ * Get the value of the DbgVariableRecord.
+ *
+ * @see llvm::DbgVariableRecord::getValue()
+ */
+LLVMValueRef LLVMDbgVariableRecordGetValue(LLVMDbgRecordRef Rec,
+ unsigned OpIdx);
+
+/**
+ * Get the debug info variable of the DbgVariableRecord.
+ *
+ * @see llvm::DbgVariableRecord::getVariable()
+ */
+LLVMMetadataRef LLVMDbgVariableRecordGetVariable(LLVMDbgRecordRef Rec);
+
+/**
+ * Get the debug info expression of the DbgVariableRecord.
+ *
+ * @see llvm::DbgVariableRecord::getExpression()
+ */
+LLVMMetadataRef LLVMDbgVariableRecordGetExpression(LLVMDbgRecordRef Rec);
+
/**
* @defgroup LLVMCCoreValueInstructionCall Call Sites and Invocations
*
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 27d8294b01264..fd9630ea2abe7 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -3036,6 +3036,40 @@ LLVMDbgRecordRef LLVMGetPreviousDbgRecord(LLVMDbgRecordRef Rec) {
return wrap(&*--I);
}
+LLVMMetadataRef LLVMDbgRecordGetDebugLoc(LLVMDbgRecordRef Rec) {
+ return wrap(unwrap<DbgRecord>(Rec)->getDebugLoc().getAsMDNode());
+}
+
+LLVMDbgRecordKind LLVMDbgRecordGetKind(LLVMDbgRecordRef Rec) {
+ DbgRecord *Record = unwrap<DbgRecord>(Rec);
+ if (isa<DbgLabelRecord>(Record)) {
+ return LLVMDbgRecordLabel;
+ }
+ DbgVariableRecord *VariableRecord = dyn_cast<DbgVariableRecord>(Record);
+ assert(VariableRecord && "unexpected record");
+ if (VariableRecord->isDbgDeclare()) {
+ return LLVMDbgRecordDeclare;
+ }
+ if (VariableRecord->isDbgValue()) {
+ return LLVMDbgRecordValue;
+ }
+ assert(VariableRecord->isDbgAssign() && "unexpected record");
+ return LLVMDbgRecordAssign;
+}
+
+LLVMValueRef LLVMDbgVariableRecordGetValue(LLVMDbgRecordRef Rec,
+ unsigned OpIdx) {
+ return wrap(unwrap<DbgVariableRecord>(Rec)->getValue(OpIdx));
+}
+
+LLVMMetadataRef LLVMDbgVariableRecordGetVariable(LLVMDbgRecordRef Rec) {
+ return wrap(unwrap<DbgVariableRecord>(Rec)->getRawVariable());
+}
+
+LLVMMetadataRef LLVMDbgVariableRecordGetExpression(LLVMDbgRecordRef Rec) {
+ return wrap(unwrap<DbgVariableRecord>(Rec)->getRawExpression());
+}
+
unsigned LLVMGetNumArgOperands(LLVMValueRef Instr) {
if (FuncletPadInst *FPI = dyn_cast<FuncletPadInst>(unwrap(Instr))) {
return FPI->arg_size();
diff --git a/llvm/tools/llvm-c-test/debuginfo.c b/llvm/tools/llvm-c-test/debuginfo.c
index 9db7aa0929aab..ec45f75de4c89 100644
--- a/llvm/tools/llvm-c-test/debuginfo.c
+++ b/llvm/tools/llvm-c-test/debuginfo.c
@@ -364,6 +364,25 @@ int llvm_test_dibuilder(void) {
assert(AddDbgRecordUnderTheRange == NULL);
(void)AddDbgRecordUnderTheRange;
+ // Test that we can read the first debug record.
+ LLVMMetadataRef AddDbgRecordFirstDebugLoc = LLVMDbgRecordGetDebugLoc(AddDbgRecordFirst);
+ assert(LLVMDILocationGetLine(AddDbgRecordFirstDebugLoc) == 43);
+ assert(LLVMDbgRecordGetKind(AddDbgRecordFirst) == LLVMDbgRecordValue);
+ LLVMValueRef AddDbgRecordFirstValue = LLVMDbgVariableRecordGetValue(AddDbgRecordFirst, 0);
+ assert(LLVMGetValueKind(AddDbgRecordFirstValue) == LLVMConstantIntValueKind);
+ assert(LLVMConstIntGetZExtValue(AddDbgRecordFirstValue) == 0);
+ LLVMMetadataRef AddDbgRecordFirstVariable = LLVMDbgVariableRecordGetVariable(AddDbgRecordFirst);
+ assert(LLVMGetMetadataKind(AddDbgRecordFirstVariable) == LLVMDILocalVariableMetadataKind);
+ // TODO: For now, there is no way to get the name.
+ LLVMMetadataRef AddDbgRecordFirstVariableScope = LLVMDIVariableGetScope(AddDbgRecordFirstVariable);
+ assert(LLVMGetMetadataKind(AddDbgRecordFirstVariableScope) == LLVMDILexicalBlockMetadataKind);
+ LLVMMetadataRef AddDbgRecordFirstVariableFile = LLVMDIScopeGetFile(AddDbgRecordFirstVariableScope);
+ assert(LLVMGetMetadataKind(AddDbgRecordFirstVariableFile) == LLVMDIFileMetadataKind);
+ unsigned FileLen = 0;
+ assert(strcmp(LLVMDIFileGetFilename(AddDbgRecordFirstVariableFile, &FileLen), "debuginfo.c") == 0);
+ LLVMMetadataRef AddDbgRecordFirstExpr = LLVMDbgVariableRecordGetExpression(AddDbgRecordFirst);
+ assert(LLVMGetMetadataKind(AddDbgRecordFirstExpr) == LLVMDIExpressionMetadataKind);
+
char *MStr = LLVMPrintModuleToString(M);
puts(MStr);
LLVMDisposeMessage(MStr);
|
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
OCHyams
left a comment
There was a problem hiding this comment.
LGTM with a style nit. Test looks good, thanks
llvm/lib/IR/Core.cpp
Outdated
|
|
||
| LLVMDbgRecordKind LLVMDbgRecordGetKind(LLVMDbgRecordRef Rec) { | ||
| DbgRecord *Record = unwrap<DbgRecord>(Rec); | ||
| if (isa<DbgLabelRecord>(Record)) { |
There was a problem hiding this comment.
boring nit pick: please can we drop the braces on the single-line ifs? (style guide)
|
Do you have commit access or would you like me to merge this? |
|
I need this to be merged, thank you. |
|
No problem. I just spotted that I think a few of the variables you added to the test will cause unused variable warnings in release builds. I can't remember that being a requirement but I think some bots run with Werror. I could be making that up, but I can see other assert-only variables in the test have a (On the other hand, we could land it and see if any bots complain...) |
This adds llvm-c bindings to read DbgRecords.
|
Sure, done. |
In the LLVM-C library, there is currently no way to get information about a DbgRecord - which is the new way to attach debug information to llvm instructions. We can only iterate on debug records with LLVMGetFirstDbgRecord/ LLVMGetLastDbgRecord/LLVMGetNextDbgRecord, but there is no way to read information. This PR adds utility functions to read DbgRecord information.
In the LLVM-C library, there is currently no way to get information about a DbgRecord - which is the new way to attach debug information to llvm instructions.
We can only iterate on debug records with LLVMGetFirstDbgRecord/LLVMGetLastDbgRecord/LLVMGetNextDbgRecord, but there is no way to read information.
This PR adds utility functions to read DbgRecord information.