-
Notifications
You must be signed in to change notification settings - Fork 15.1k
[llvm-c] Add bindings for DbgRecord #166383
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
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. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
boring nit pick: please can we drop the braces on the single-line ifs? (style guide)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
This adds llvm-c bindings to read DbgRecords.
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.