Skip to content

Commit 56a6681

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

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-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: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,36 @@ 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 =
369+
LLVMDbgRecordGetDebugLoc(AddDbgRecordFirst);
370+
assert(LLVMDILocationGetLine(AddDbgRecordFirstDebugLoc) == 43);
371+
assert(LLVMDbgRecordGetKind(AddDbgRecordFirst) == LLVMDbgRecordValue);
372+
LLVMValueRef AddDbgRecordFirstValue =
373+
LLVMDbgVariableRecordGetValue(AddDbgRecordFirst, 0);
374+
assert(LLVMGetValueKind(AddDbgRecordFirstValue) == LLVMConstantIntValueKind);
375+
assert(LLVMConstIntGetZExtValue(AddDbgRecordFirstValue) == 0);
376+
LLVMMetadataRef AddDbgRecordFirstVariable =
377+
LLVMDbgVariableRecordGetVariable(AddDbgRecordFirst);
378+
assert(LLVMGetMetadataKind(AddDbgRecordFirstVariable) ==
379+
LLVMDILocalVariableMetadataKind);
380+
// TODO: For now, there is no way to get the name.
381+
LLVMMetadataRef AddDbgRecordFirstVariableScope =
382+
LLVMDIVariableGetScope(AddDbgRecordFirstVariable);
383+
assert(LLVMGetMetadataKind(AddDbgRecordFirstVariableScope) ==
384+
LLVMDILexicalBlockMetadataKind);
385+
LLVMMetadataRef AddDbgRecordFirstVariableFile =
386+
LLVMDIScopeGetFile(AddDbgRecordFirstVariableScope);
387+
assert(LLVMGetMetadataKind(AddDbgRecordFirstVariableFile) ==
388+
LLVMDIFileMetadataKind);
389+
unsigned FileLen = 0;
390+
assert(strcmp(LLVMDIFileGetFilename(AddDbgRecordFirstVariableFile, &FileLen),
391+
"debuginfo.c") == 0);
392+
LLVMMetadataRef AddDbgRecordFirstExpr =
393+
LLVMDbgVariableRecordGetExpression(AddDbgRecordFirst);
394+
assert(LLVMGetMetadataKind(AddDbgRecordFirstExpr) ==
395+
LLVMDIExpressionMetadataKind);
396+
367397
char *MStr = LLVMPrintModuleToString(M);
368398
puts(MStr);
369399
LLVMDisposeMessage(MStr);

0 commit comments

Comments
 (0)