Skip to content

Commit d4633fb

Browse files
committed
Add column, DW_AT_artificial & llvm-coro-suspension point
1 parent 8fe2bd7 commit d4633fb

File tree

22 files changed

+136
-53
lines changed

22 files changed

+136
-53
lines changed

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5293,7 +5293,7 @@ void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
52935293

52945294
// Create the descriptor for the label.
52955295
auto *L =
5296-
DBuilder.createLabel(Scope, Name, Unit, Line, CGM.getLangOpts().Optimize);
5296+
DBuilder.createLabel(Scope, Name, Unit, Line, Column, /*IsArtificial=*/false, /*CoroSuspendIdx=*/std::nullopt, CGM.getLangOpts().Optimize);
52975297

52985298
// Insert an llvm.dbg.label into the current block.
52995299
DBuilder.insertLabel(L,

clang/test/CodeGen/debug-label-inline.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ int f2(void) {
2323

2424
// CHECK: distinct !DISubprogram(name: "f1", {{.*}}, retainedNodes: [[ELEMENTS:!.*]])
2525
// CHECK: [[ELEMENTS]] = !{{{.*}}, [[LABEL_METADATA]]}
26-
// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 8)
26+
// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 8, column: 1)
2727
// CHECK: [[INLINEDAT:!.*]] = distinct !DILocation(line: 18,
2828
// CHECK: [[LABEL_LOCATION]] = !DILocation(line: 8, {{.*}}, inlinedAt: [[INLINEDAT]])

clang/test/CodeGen/debug-label.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ int f1(int a, int b) {
1212
return sum;
1313
}
1414

15-
// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 9)
15+
// CHECK: [[LABEL_METADATA]] = !DILabel({{.*}}, name: "top", {{.*}}, line: 9, column: 1)
1616
// CHECK: [[LABEL_LOCATION]] = !DILocation(line: 9,

llvm/docs/LangRef.rst

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6975,16 +6975,22 @@ appear in the included source file.
69756975
DILabel
69766976
"""""""
69776977

6978-
``DILabel`` nodes represent labels within a :ref:`DISubprogram`. All fields of
6979-
a ``DILabel`` are mandatory. The ``scope:`` field must be one of either a
6980-
:ref:`DILexicalBlockFile`, a :ref:`DILexicalBlock`, or a :ref:`DISubprogram`.
6981-
The ``name:`` field is the label identifier. The ``file:`` field is the
6982-
:ref:`DIFile` the label is present in. The ``line:`` field is the source line
6978+
``DILabel`` nodes represent labels within a :ref:`DISubprogram`. The ``scope:``
6979+
field must be one of either a :ref:`DILexicalBlockFile`, a
6980+
:ref:`DILexicalBlock`, or a :ref:`DISubprogram`. The ``name:`` field is the
6981+
label identifier. The ``file:`` field is the :ref:`DIFile` the label is
6982+
present in. The ``line:`` and ``column:`` field are the source line and column
69836983
within the file where the label is declared.
69846984

6985+
Furthermore, a label can be marked as artificial, i.e. compiler-generated,
6986+
using ``isArtificial:``. Such artitificial labels are generated, e.g., by
6987+
the ``CoroSplit`` pass. In addition, the ``CoroSplit`` pass also uses the
6988+
``coroSuspendIdx:`` field to identify the coroutine suspend points.
6989+
69856990
.. code-block:: text
69866991

6987-
!2 = !DILabel(scope: !0, name: "foo", file: !1, line: 7)
6992+
!2 = !DILabel(scope: !0, name: "foo", file: !1, line: 7, column: 4)
6993+
!3 = !DILabel(scope: !0, name: "__coro_resume_3", file: !1, line: 9, column: 3, isArtificial: true, coroSuspendIdx: 3)
69886994

69896995
DICommonBlock
69906996
"""""""""""""

llvm/include/llvm/BinaryFormat/Dwarf.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ HANDLE_DW_AT(0x3e09, LLVM_ptrauth_authenticates_null_values, 0, LLVM)
624624
HANDLE_DW_AT(0x3e0a, LLVM_ptrauth_authentication_mode, 0, LLVM)
625625
HANDLE_DW_AT(0x3e0b, LLVM_num_extra_inhabitants, 0, LLVM)
626626
HANDLE_DW_AT(0x3e0c, LLVM_stmt_sequence, 0, LLVM)
627+
HANDLE_DW_AT(0x3e0d, LLVM_coro_suspend_idx, 0, LLVM)
627628

628629
// Apple extensions.
629630

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,9 @@ namespace llvm {
901901
/// \c Scope must be a \a DILocalScope, and thus its scope chain eventually
902902
/// leads to a \a DISubprogram.
903903
LLVM_ABI DILabel *createLabel(DIScope *Scope, StringRef Name, DIFile *File,
904-
unsigned LineNo, bool AlwaysPreserve = false);
904+
unsigned LineNo, unsigned Column, bool IsArtificial,
905+
std::optional<unsigned> CoroSuspendIdx,
906+
bool AlwaysPreserve = false);
905907

906908
/// Create a new descriptor for a parameter variable.
907909
///

llvm/include/llvm/IR/DebugInfoMetadata.h

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4104,35 +4104,49 @@ class DILabel : public DINode {
41044104
friend class LLVMContextImpl;
41054105
friend class MDNode;
41064106

4107-
DILabel(LLVMContext &C, StorageType Storage, unsigned Line,
4107+
unsigned Column;
4108+
std::optional<unsigned> CoroSuspendIdx;
4109+
bool IsArtificial;
4110+
4111+
DILabel(LLVMContext &C, StorageType Storage, unsigned Line, unsigned Column,
4112+
bool IsArtificial, std::optional<unsigned> CoroSuspendIdx,
41084113
ArrayRef<Metadata *> Ops);
41094114
~DILabel() = default;
41104115

41114116
static DILabel *getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
4112-
DIFile *File, unsigned Line, StorageType Storage,
4113-
bool ShouldCreate = true) {
4117+
DIFile *File, unsigned Line, unsigned Column,
4118+
bool IsArtificial, std::optional<unsigned> CoroSuspendIdx,
4119+
StorageType Storage, bool ShouldCreate = true) {
41144120
return getImpl(Context, Scope, getCanonicalMDString(Context, Name), File,
4115-
Line, Storage, ShouldCreate);
4121+
Line, Column, IsArtificial, CoroSuspendIdx, Storage,
4122+
ShouldCreate);
41164123
}
41174124
LLVM_ABI static DILabel *getImpl(LLVMContext &Context, Metadata *Scope,
41184125
MDString *Name, Metadata *File,
4119-
unsigned Line, StorageType Storage,
4126+
unsigned Line, unsigned Column,
4127+
bool IsArtificial, std::optional<unsigned> CoroSuspendIdx,
4128+
StorageType Storage,
41204129
bool ShouldCreate = true);
41214130

41224131
TempDILabel cloneImpl() const {
41234132
return getTemporary(getContext(), getScope(), getName(), getFile(),
4124-
getLine());
4133+
getLine(), getColumn(), isArtificial(),
4134+
getCoroSuspendIdx());
41254135
}
41264136

41274137
public:
41284138
DEFINE_MDNODE_GET(DILabel,
41294139
(DILocalScope * Scope, StringRef Name, DIFile *File,
4130-
unsigned Line),
4131-
(Scope, Name, File, Line))
4140+
unsigned Line, unsigned Column, bool IsArtificial,
4141+
std::optional<unsigned> CoroSuspendIdx),
4142+
(Scope, Name, File, Line, Column, IsArtificial,
4143+
CoroSuspendIdx))
41324144
DEFINE_MDNODE_GET(DILabel,
41334145
(Metadata * Scope, MDString *Name, Metadata *File,
4134-
unsigned Line),
4135-
(Scope, Name, File, Line))
4146+
unsigned Line, unsigned Column, bool IsArtificial,
4147+
std::optional<unsigned> CoroSuspendIdx),
4148+
(Scope, Name, File, Line, Column, IsArtificial,
4149+
CoroSuspendIdx))
41364150

41374151
TempDILabel clone() const { return cloneImpl(); }
41384152

@@ -4143,8 +4157,11 @@ class DILabel : public DINode {
41434157
return cast_or_null<DILocalScope>(getRawScope());
41444158
}
41454159
unsigned getLine() const { return SubclassData32; }
4160+
unsigned getColumn() const { return Column; }
41464161
StringRef getName() const { return getStringOperand(1); }
41474162
DIFile *getFile() const { return cast_or_null<DIFile>(getRawFile()); }
4163+
bool isArtificial() const { return IsArtificial; }
4164+
std::optional<unsigned> getCoroSuspendIdx() const { return CoroSuspendIdx; }
41484165

41494166
Metadata *getRawScope() const { return getOperand(0); }
41504167
MDString *getRawName() const { return getOperandAs<MDString>(1); }

llvm/lib/AsmParser/LLParser.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6116,18 +6116,23 @@ bool LLParser::parseDILocalVariable(MDNode *&Result, bool IsDistinct) {
61166116
}
61176117

61186118
/// parseDILabel:
6119-
/// ::= !DILabel(scope: !0, name: "foo", file: !1, line: 7)
6119+
/// ::= !DILabel(scope: !0, name: "foo", file: !1, line: 7, column: 4)
61206120
bool LLParser::parseDILabel(MDNode *&Result, bool IsDistinct) {
61216121
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
61226122
REQUIRED(scope, MDField, (/* AllowNull */ false)); \
61236123
REQUIRED(name, MDStringField, ); \
61246124
REQUIRED(file, MDField, ); \
6125-
REQUIRED(line, LineField, );
6125+
REQUIRED(line, LineField, ); \
6126+
OPTIONAL(column, ColumnField, ); \
6127+
OPTIONAL(isArtificial, MDBoolField, ); \
6128+
OPTIONAL(coroSuspendIdx, MDUnsignedField, );
61266129
PARSE_MD_FIELDS();
61276130
#undef VISIT_MD_FIELDS
61286131

6132+
std::optional<unsigned> CoroSuspendIdx = coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val) : std::nullopt;
6133+
61296134
Result = GET_OR_DISTINCT(DILabel,
6130-
(Context, scope.Val, name.Val, file.Val, line.Val));
6135+
(Context, scope.Val, name.Val, file.Val, line.Val, column.Val, isArtificial.Val, CoroSuspendIdx));
61316136
return false;
61326137
}
61336138

llvm/lib/Bitcode/Reader/MetadataLoader.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
11331133
++NumMDRecordLoaded;
11341134
if (Expected<unsigned> MaybeCode =
11351135
Stream.readRecord(Entry.ID, Record, &Blob)) {
1136+
// Crashes called from here!
11361137
if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
11371138
Blob, NextMetadataNo))
11381139
return Err;
@@ -1319,6 +1320,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
13191320
unsigned Size = Record.size();
13201321
NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
13211322
for (unsigned i = 0; i != Size; ++i) {
1323+
// Crashes here!
13221324
MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
13231325
if (!MD)
13241326
return error("Invalid named metadata: expect fwd ref to MDNode");
@@ -2240,14 +2242,27 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
22402242
break;
22412243
}
22422244
case bitc::METADATA_LABEL: {
2243-
if (Record.size() != 5)
2245+
if (Record.size() < 5 || Record.size() > 7)
22442246
return error("Invalid record");
22452247

22462248
IsDistinct = Record[0] & 1;
2249+
uint64_t Line = Record[4];
2250+
uint64_t Column = Record.size() > 5 ? Record[5] : 0;
2251+
bool IsArtificial = Record[0] & 2;
2252+
std::optional<unsigned> CoroSuspendIdx;
2253+
if (Record.size() > 6) {
2254+
unsigned RawSuspendIdx = Record[6];
2255+
if (RawSuspendIdx != std::numeric_limits<unsigned>::max()) {
2256+
if (RawSuspendIdx > (uint64_t)std::numeric_limits<unsigned>::max())
2257+
return error("CoroSuspendIdx value is too large");
2258+
CoroSuspendIdx = RawSuspendIdx;
2259+
}
2260+
}
2261+
22472262
MetadataList.assignValue(
22482263
GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]),
22492264
getMDString(Record[2]),
2250-
getMDOrNull(Record[3]), Record[4])),
2265+
getMDOrNull(Record[3]), Line, Column, IsArtificial, CoroSuspendIdx)),
22512266
NextMetadataNo);
22522267
NextMetadataNo++;
22532268
break;

llvm/lib/Bitcode/Writer/BitcodeWriter.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2344,11 +2344,14 @@ void ModuleBitcodeWriter::writeDILocalVariable(
23442344
void ModuleBitcodeWriter::writeDILabel(
23452345
const DILabel *N, SmallVectorImpl<uint64_t> &Record,
23462346
unsigned Abbrev) {
2347-
Record.push_back((uint64_t)N->isDistinct());
2347+
uint64_t IsArtificialFlag = uint64_t(N->isArtificial()) << 1;
2348+
Record.push_back((uint64_t)N->isDistinct() | IsArtificialFlag);
23482349
Record.push_back(VE.getMetadataOrNullID(N->getScope()));
23492350
Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
23502351
Record.push_back(VE.getMetadataOrNullID(N->getFile()));
23512352
Record.push_back(N->getLine());
2353+
Record.push_back(N->getColumn());
2354+
Record.push_back(N->getCoroSuspendIdx().value_or(std::numeric_limits<uint64_t>::max()));
23522355

23532356
Stream.EmitRecord(bitc::METADATA_LABEL, Record, Abbrev);
23542357
Record.clear();

llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ DIE *DwarfCompileUnit::getOrCreateCommonBlock(
429429
addString(NDie, dwarf::DW_AT_name, Name);
430430
addGlobalName(Name, NDie, CB->getScope());
431431
if (CB->getFile())
432-
addSourceLine(NDie, CB->getLineNo(), CB->getFile());
432+
addSourceLine(NDie, CB->getLineNo(), /*Column*/ 0, CB->getFile());
433433
if (DIGlobalVariable *V = CB->getDecl())
434434
getCU().addLocationAttribute(&NDie, V, GlobalExprs);
435435
return &NDie;
@@ -1404,7 +1404,7 @@ DIE *DwarfCompileUnit::constructImportedEntityDIE(
14041404
else
14051405
EntityDie = getDIE(Entity);
14061406
assert(EntityDie);
1407-
addSourceLine(*IMDie, Module->getLine(), Module->getFile());
1407+
addSourceLine(*IMDie, Module->getLine(), /*Column*/ 0, Module->getFile());
14081408
addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
14091409
StringRef Name = Module->getName();
14101410
if (!Name.empty()) {
@@ -1701,6 +1701,11 @@ void DwarfCompileUnit::applyLabelAttributes(const DbgLabel &Label,
17011701
addString(LabelDie, dwarf::DW_AT_name, Name);
17021702
const auto *DILabel = Label.getLabel();
17031703
addSourceLine(LabelDie, DILabel);
1704+
if (DILabel->isArtificial())
1705+
addFlag(LabelDie, dwarf::DW_AT_artificial);
1706+
if (DILabel->getCoroSuspendIdx())
1707+
addUInt(LabelDie, dwarf::DW_AT_LLVM_coro_suspend_idx, std::nullopt,
1708+
*DILabel->getCoroSuspendIdx());
17041709
}
17051710

17061711
/// Add a Dwarf expression attribute data and value.

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -442,49 +442,52 @@ void DwarfUnit::addBlock(DIE &Die, dwarf::Attribute Attribute,
442442
addBlock(Die, Attribute, Block->BestForm(), Block);
443443
}
444444

445-
void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, const DIFile *File) {
445+
void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, unsigned Column, const DIFile *File) {
446446
if (Line == 0)
447447
return;
448448

449449
unsigned FileID = getOrCreateSourceID(File);
450450
addUInt(Die, dwarf::DW_AT_decl_file, std::nullopt, FileID);
451451
addUInt(Die, dwarf::DW_AT_decl_line, std::nullopt, Line);
452+
453+
if (Column != 0)
454+
addUInt(Die, dwarf::DW_AT_decl_column, std::nullopt, Column);
452455
}
453456

454457
void DwarfUnit::addSourceLine(DIE &Die, const DILocalVariable *V) {
455458
assert(V);
456459

457-
addSourceLine(Die, V->getLine(), V->getFile());
460+
addSourceLine(Die, V->getLine(), /*Column*/ 0, V->getFile());
458461
}
459462

460463
void DwarfUnit::addSourceLine(DIE &Die, const DIGlobalVariable *G) {
461464
assert(G);
462465

463-
addSourceLine(Die, G->getLine(), G->getFile());
466+
addSourceLine(Die, G->getLine(), /*Column*/ 0, G->getFile());
464467
}
465468

466469
void DwarfUnit::addSourceLine(DIE &Die, const DISubprogram *SP) {
467470
assert(SP);
468471

469-
addSourceLine(Die, SP->getLine(), SP->getFile());
472+
addSourceLine(Die, SP->getLine(), /*Column*/ 0, SP->getFile());
470473
}
471474

472475
void DwarfUnit::addSourceLine(DIE &Die, const DILabel *L) {
473476
assert(L);
474477

475-
addSourceLine(Die, L->getLine(), L->getFile());
478+
addSourceLine(Die, L->getLine(), L->getColumn(), L->getFile());
476479
}
477480

478481
void DwarfUnit::addSourceLine(DIE &Die, const DIType *Ty) {
479482
assert(Ty);
480483

481-
addSourceLine(Die, Ty->getLine(), Ty->getFile());
484+
addSourceLine(Die, Ty->getLine(), /*Column*/ 0, Ty->getFile());
482485
}
483486

484487
void DwarfUnit::addSourceLine(DIE &Die, const DIObjCProperty *Ty) {
485488
assert(Ty);
486489

487-
addSourceLine(Die, Ty->getLine(), Ty->getFile());
490+
addSourceLine(Die, Ty->getLine(), /*Column*/ 0, Ty->getFile());
488491
}
489492

490493
void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ class DwarfUnit : public DIEUnit {
216216
DIEBlock *Block);
217217

218218
/// Add location information to specified debug information entry.
219-
void addSourceLine(DIE &Die, unsigned Line, const DIFile *File);
219+
void addSourceLine(DIE &Die, unsigned Line, unsigned Column, const DIFile *File);
220220
void addSourceLine(DIE &Die, const DILocalVariable *V);
221221
void addSourceLine(DIE &Die, const DIGlobalVariable *G);
222222
void addSourceLine(DIE &Die, const DISubprogram *SP);

llvm/lib/CodeGen/LiveDebugVariables.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ static void printExtendedName(raw_ostream &OS, const DINode *Node,
715715
Res = V->getName();
716716
Line = V->getLine();
717717
} else if (const auto *L = dyn_cast<const DILabel>(Node)) {
718+
// XXX what are we doing here? Adjust it?
718719
Res = L->getName();
719720
Line = L->getLine();
720721
}

llvm/lib/IR/AsmWriter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2611,6 +2611,10 @@ static void writeDILabel(raw_ostream &Out, const DILabel *N,
26112611
Printer.printString("name", N->getName());
26122612
Printer.printMetadata("file", N->getRawFile());
26132613
Printer.printInt("line", N->getLine());
2614+
Printer.printInt("column", N->getColumn());
2615+
Printer.printBool("isArtificial", N->isArtificial(), false);
2616+
if (N->getCoroSuspendIdx())
2617+
Printer.printInt("coroSuspendIdx", *N->getCoroSuspendIdx(), /* ShouldSkipZero */ false);
26142618
Out << ")";
26152619
}
26162620

llvm/lib/IR/DIBuilder.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -946,9 +946,11 @@ DILocalVariable *DIBuilder::createParameterVariable(
946946
}
947947

948948
DILabel *DIBuilder::createLabel(DIScope *Context, StringRef Name, DIFile *File,
949-
unsigned LineNo, bool AlwaysPreserve) {
949+
unsigned LineNo, unsigned Column, bool IsArtificial,
950+
std::optional<unsigned> CoroSuspendIdx,
951+
bool AlwaysPreserve) {
950952
auto *Scope = cast<DILocalScope>(Context);
951-
auto *Node = DILabel::get(VMContext, Scope, Name, File, LineNo);
953+
auto *Node = DILabel::get(VMContext, Scope, Name, File, LineNo, Column, IsArtificial, CoroSuspendIdx);
952954

953955
if (AlwaysPreserve) {
954956
/// The optimizer may remove labels. If there is an interest

llvm/lib/IR/DebugInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1837,7 +1837,8 @@ LLVMMetadataRef LLVMDIBuilderCreateLabel(LLVMDIBuilderRef Builder,
18371837
LLVMBool AlwaysPreserve) {
18381838
return wrap(unwrap(Builder)->createLabel(
18391839
unwrapDI<DIScope>(Context), StringRef(Name, NameLen),
1840-
unwrapDI<DIFile>(File), LineNo, AlwaysPreserve));
1840+
unwrapDI<DIFile>(File), LineNo, /*Column*/ 0, /*IsArtificial*/ false,
1841+
/*CoroSuspendIdx*/ std::nullopt, AlwaysPreserve));
18411842
}
18421843

18431844
LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder,

0 commit comments

Comments
 (0)