Skip to content

Commit f7ed0ae

Browse files
committed
[llvm-c] Add bindings for DbgRecord
This adds llvm-c bindings to read DbgRecords.
1 parent 12f392c commit f7ed0ae

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

llvm/include/llvm-c/Core.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,13 @@ enum {
531531
*/
532532
typedef unsigned LLVMGEPNoWrapFlags;
533533

534+
typedef enum {
535+
LLVMDbgRecordLabel,
536+
LLVMDbgRecordDeclare,
537+
LLVMDbgRecordValue,
538+
LLVMDbgRecordAssign,
539+
} LLVMDbgRecordKind;
540+
534541
/**
535542
* @}
536543
*/
@@ -3896,6 +3903,37 @@ LLVM_C_ABI LLVMDbgRecordRef LLVMGetNextDbgRecord(LLVMDbgRecordRef DbgRecord);
38963903
LLVM_C_ABI LLVMDbgRecordRef
38973904
LLVMGetPreviousDbgRecord(LLVMDbgRecordRef DbgRecord);
38983905

3906+
/**
3907+
* Get the debug location attached to the debug record.
3908+
*
3909+
* @see llvm::DbgRecord::getDebugLoc()
3910+
*/
3911+
LLVMMetadataRef LLVMDbgRecordGetDebugLoc(LLVMDbgRecordRef Rec);
3912+
3913+
LLVMDbgRecordKind LLVMDbgRecordGetKind(LLVMDbgRecordRef Rec);
3914+
3915+
/**
3916+
* Get the value of the DbgVariableRecord.
3917+
*
3918+
* @see llvm::DbgVariableRecord::getValue()
3919+
*/
3920+
LLVMValueRef LLVMDbgVariableRecordGetValue(LLVMDbgRecordRef Rec,
3921+
unsigned OpIdx);
3922+
3923+
/**
3924+
* Get the debug info variable of the DbgVariableRecord.
3925+
*
3926+
* @see llvm::DbgVariableRecord::getVariable()
3927+
*/
3928+
LLVMMetadataRef LLVMDbgVariableRecordGetVariable(LLVMDbgRecordRef Rec);
3929+
3930+
/**
3931+
* Get the debug info expression of the DbgVariableRecord.
3932+
*
3933+
* @see llvm::DbgVariableRecord::getExpression()
3934+
*/
3935+
LLVMMetadataRef LLVMDbgVariableRecordGetExpression(LLVMDbgRecordRef Rec);
3936+
38993937
/**
39003938
* @defgroup LLVMCCoreValueInstructionCall Call Sites and Invocations
39013939
*

llvm/lib/IR/Core.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3036,6 +3036,40 @@ LLVMDbgRecordRef LLVMGetPreviousDbgRecord(LLVMDbgRecordRef Rec) {
30363036
return wrap(&*--I);
30373037
}
30383038

3039+
LLVMMetadataRef LLVMDbgRecordGetDebugLoc(LLVMDbgRecordRef Rec) {
3040+
return wrap(unwrap<DbgRecord>(Rec)->getDebugLoc().getAsMDNode());
3041+
}
3042+
3043+
LLVMDbgRecordKind LLVMDbgRecordGetKind(LLVMDbgRecordRef Rec) {
3044+
DbgRecord *Record = unwrap<DbgRecord>(Rec);
3045+
if (isa<DbgLabelRecord>(Record)) {
3046+
return LLVMDbgRecordLabel;
3047+
}
3048+
DbgVariableRecord *VariableRecord = dyn_cast<DbgVariableRecord>(Record);
3049+
assert(VariableRecord && "unexpected record");
3050+
if (VariableRecord->isDbgDeclare()) {
3051+
return LLVMDbgRecordDeclare;
3052+
}
3053+
if (VariableRecord->isDbgValue()) {
3054+
return LLVMDbgRecordValue;
3055+
}
3056+
assert(VariableRecord->isDbgAssign() && "unexpected record");
3057+
return LLVMDbgRecordAssign;
3058+
}
3059+
3060+
LLVMValueRef LLVMDbgVariableRecordGetValue(LLVMDbgRecordRef Rec,
3061+
unsigned OpIdx) {
3062+
return wrap(unwrap<DbgVariableRecord>(Rec)->getValue(OpIdx));
3063+
}
3064+
3065+
LLVMMetadataRef LLVMDbgVariableRecordGetVariable(LLVMDbgRecordRef Rec) {
3066+
return wrap(unwrap<DbgVariableRecord>(Rec)->getRawVariable());
3067+
}
3068+
3069+
LLVMMetadataRef LLVMDbgVariableRecordGetExpression(LLVMDbgRecordRef Rec) {
3070+
return wrap(unwrap<DbgVariableRecord>(Rec)->getRawExpression());
3071+
}
3072+
30393073
unsigned LLVMGetNumArgOperands(LLVMValueRef Instr) {
30403074
if (FuncletPadInst *FPI = dyn_cast<FuncletPadInst>(unwrap(Instr))) {
30413075
return FPI->arg_size();

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,25 @@ int llvm_test_dibuilder(void) {
364364
assert(AddDbgRecordUnderTheRange == NULL);
365365
(void)AddDbgRecordUnderTheRange;
366366

367+
// Test that we can read the first debug record.
368+
LLVMMetadataRef AddDbgRecordFirstDebugLoc = LLVMDbgRecordGetDebugLoc(AddDbgRecordFirst);
369+
assert(LLVMDILocationGetLine(AddDbgRecordFirstDebugLoc) == 43);
370+
assert(LLVMDbgRecordGetKind(AddDbgRecordFirst) == LLVMDbgRecordValue);
371+
LLVMValueRef AddDbgRecordFirstValue = LLVMDbgVariableRecordGetValue(AddDbgRecordFirst, 0);
372+
assert(LLVMGetValueKind(AddDbgRecordFirstValue) == LLVMConstantIntValueKind);
373+
assert(LLVMConstIntGetZExtValue(AddDbgRecordFirstValue) == 0);
374+
LLVMMetadataRef AddDbgRecordFirstVariable = LLVMDbgVariableRecordGetVariable(AddDbgRecordFirst);
375+
assert(LLVMGetMetadataKind(AddDbgRecordFirstVariable) == LLVMDILocalVariableMetadataKind);
376+
// TODO: For now, there is no way to get the name.
377+
LLVMMetadataRef AddDbgRecordFirstVariableScope = LLVMDIVariableGetScope(AddDbgRecordFirstVariable);
378+
assert(LLVMGetMetadataKind(AddDbgRecordFirstVariableScope) == LLVMDILexicalBlockMetadataKind);
379+
LLVMMetadataRef AddDbgRecordFirstVariableFile = LLVMDIScopeGetFile(AddDbgRecordFirstVariableScope);
380+
assert(LLVMGetMetadataKind(AddDbgRecordFirstVariableFile) == LLVMDIFileMetadataKind);
381+
unsigned FileLen = 0;
382+
assert(strcmp(LLVMDIFileGetFilename(AddDbgRecordFirstVariableFile, &FileLen), "debuginfo.c") == 0);
383+
LLVMMetadataRef AddDbgRecordFirstExpr = LLVMDbgVariableRecordGetExpression(AddDbgRecordFirst);
384+
assert(LLVMGetMetadataKind(AddDbgRecordFirstExpr) == LLVMDIExpressionMetadataKind);
385+
367386
char *MStr = LLVMPrintModuleToString(M);
368387
puts(MStr);
369388
LLVMDisposeMessage(MStr);

0 commit comments

Comments
 (0)