Skip to content

Commit da60fc8

Browse files
committed
Changing representation of .cv_def_range directives in Codeview debug info assembly format for better readability
llvm-svn: 367867
1 parent 91a658b commit da60fc8

File tree

23 files changed

+376
-73
lines changed

23 files changed

+376
-73
lines changed

lld/test/COFF/s_udt.s

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,23 +173,23 @@ main: # @main
173173
.short 1 # Flags
174174
.asciz "argc"
175175
.Ltmp13:
176-
.cv_def_range .Ltmp0 .Ltmp1, "B\021\f\000\000\000"
176+
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 12
177177
.short .Ltmp15-.Ltmp14 # Record length
178178
.Ltmp14:
179179
.short 4414 # Record kind: S_LOCAL
180180
.long 4096 # TypeIndex
181181
.short 1 # Flags
182182
.asciz "argv"
183183
.Ltmp15:
184-
.cv_def_range .Ltmp0 .Ltmp1, "B\021\020\000\000\000"
184+
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 16
185185
.short .Ltmp17-.Ltmp16 # Record length
186186
.Ltmp16:
187187
.short 4414 # Record kind: S_LOCAL
188188
.long 4101 # TypeIndex
189189
.short 0 # Flags
190190
.asciz "SPtr"
191191
.Ltmp17:
192-
.cv_def_range .Ltmp0 .Ltmp1, "B\021\000\000\000\000"
192+
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 0
193193
.short .Ltmp19-.Ltmp18 # Record length
194194
.Ltmp18:
195195
.short 4360 # Record kind: S_UDT

lldb/lit/SymbolFile/NativePDB/Inputs/s_constant.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,15 @@ GlobalSSEC: # @GlobalSSEC
165165
.short 1 # Flags
166166
.asciz "argc"
167167
.Ltmp13:
168-
.cv_def_range .Ltmp0 .Ltmp1, "B\021\004\000\000\000"
168+
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 4
169169
.short .Ltmp15-.Ltmp14 # Record length
170170
.Ltmp14:
171171
.short 4414 # Record kind: S_LOCAL
172172
.long 4096 # TypeIndex
173173
.short 1 # Flags
174174
.asciz "argv"
175175
.Ltmp15:
176-
.cv_def_range .Ltmp0 .Ltmp1, "B\021\b\000\000\000"
176+
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 8
177177
.short 2 # Record length
178178
.short 4431 # Record kind: S_PROC_ID_END
179179
.Ltmp7:

lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -641,14 +641,14 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
641641
llvm::StringRef program;
642642
if (GetFrameDataProgram(index, ranges, program)) {
643643
result.location =
644-
MakeVFrameRelLocationExpression(program, loc.Offset, module);
644+
MakeVFrameRelLocationExpression(program, loc.Hdr.Offset, module);
645645
result.ranges = std::move(ranges);
646646
} else {
647647
// invalid variable
648648
}
649649
} else {
650650
result.location =
651-
MakeRegRelLocationExpression(base_reg, loc.Offset, module);
651+
MakeRegRelLocationExpression(base_reg, loc.Hdr.Offset, module);
652652
result.ranges = std::move(ranges);
653653
}
654654
} else if (loc_specifier_cvs.kind() == S_DEFRANGE_REGISTER_REL) {

llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,10 @@ class DefRangeFramePointerRelSym : public SymbolRecord {
520520
static constexpr uint32_t RelocationOffset = 8;
521521

522522
public:
523+
struct Header {
524+
little32_t Offset;
525+
};
526+
523527
explicit DefRangeFramePointerRelSym(SymbolRecordKind Kind)
524528
: SymbolRecord(Kind) {}
525529
DefRangeFramePointerRelSym(uint32_t RecordOffset)
@@ -530,7 +534,7 @@ class DefRangeFramePointerRelSym : public SymbolRecord {
530534
return RecordOffset + RelocationOffset;
531535
}
532536

533-
int32_t Offset;
537+
Header Hdr;
534538
LocalVariableAddrRange Range;
535539
std::vector<LocalVariableAddrGap> Gaps;
536540

llvm/include/llvm/MC/MCStreamer.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/ADT/Optional.h"
1919
#include "llvm/ADT/SmallVector.h"
2020
#include "llvm/ADT/StringRef.h"
21+
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
2122
#include "llvm/MC/MCDirectives.h"
2223
#include "llvm/MC/MCLinkerOptimizationHint.h"
2324
#include "llvm/MC/MCSymbol.h"
@@ -860,6 +861,22 @@ class MCStreamer {
860861
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
861862
StringRef FixedSizePortion);
862863

864+
virtual void EmitCVDefRangeDirective(
865+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
866+
codeview::DefRangeRegisterRelSym::Header DRHdr);
867+
868+
virtual void EmitCVDefRangeDirective(
869+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
870+
codeview::DefRangeSubfieldRegisterSym::Header DRHdr);
871+
872+
virtual void EmitCVDefRangeDirective(
873+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
874+
codeview::DefRangeRegisterSym::Header DRHdr);
875+
876+
virtual void EmitCVDefRangeDirective(
877+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
878+
codeview::DefRangeFramePointerRelSym::Header DRHdr);
879+
863880
/// This implements the CodeView '.cv_stringtable' assembler directive.
864881
virtual void EmitCVStringTableDirective() {}
865882

llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2633,17 +2633,6 @@ void CodeViewDebug::emitLocalVariableList(const FunctionInfo &FI,
26332633
emitLocalVariable(FI, L);
26342634
}
26352635

2636-
/// Only call this on endian-specific types like ulittle16_t and little32_t, or
2637-
/// structs composed of them.
2638-
template <typename T>
2639-
static void copyBytesForDefRange(SmallString<20> &BytePrefix,
2640-
SymbolKind SymKind, const T &DefRangeHeader) {
2641-
BytePrefix.resize(2 + sizeof(T));
2642-
ulittle16_t SymKindLE = ulittle16_t(SymKind);
2643-
memcpy(&BytePrefix[0], &SymKindLE, 2);
2644-
memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
2645-
}
2646-
26472636
void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
26482637
const LocalVariable &Var) {
26492638
// LocalSym record, see SymbolRecord.h for more info.
@@ -2692,8 +2681,9 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
26922681
(bool(Flags & LocalSymFlags::IsParameter)
26932682
? (EncFP == FI.EncodedParamFramePtrReg)
26942683
: (EncFP == FI.EncodedLocalFramePtrReg))) {
2695-
little32_t FPOffset = little32_t(Offset);
2696-
copyBytesForDefRange(BytePrefix, S_DEFRANGE_FRAMEPOINTER_REL, FPOffset);
2684+
DefRangeFramePointerRelSym::Header DRHdr;
2685+
DRHdr.Offset = Offset;
2686+
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
26972687
} else {
26982688
uint16_t RegRelFlags = 0;
26992689
if (DefRange.IsSubfield) {
@@ -2705,7 +2695,7 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
27052695
DRHdr.Register = Reg;
27062696
DRHdr.Flags = RegRelFlags;
27072697
DRHdr.BasePointerOffset = Offset;
2708-
copyBytesForDefRange(BytePrefix, S_DEFRANGE_REGISTER_REL, DRHdr);
2698+
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
27092699
}
27102700
} else {
27112701
assert(DefRange.DataOffset == 0 && "unexpected offset into register");
@@ -2714,15 +2704,14 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
27142704
DRHdr.Register = DefRange.CVRegister;
27152705
DRHdr.MayHaveNoName = 0;
27162706
DRHdr.OffsetInParent = DefRange.StructOffset;
2717-
copyBytesForDefRange(BytePrefix, S_DEFRANGE_SUBFIELD_REGISTER, DRHdr);
2707+
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
27182708
} else {
27192709
DefRangeRegisterSym::Header DRHdr;
27202710
DRHdr.Register = DefRange.CVRegister;
27212711
DRHdr.MayHaveNoName = 0;
2722-
copyBytesForDefRange(BytePrefix, S_DEFRANGE_REGISTER, DRHdr);
2712+
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
27232713
}
27242714
}
2725-
OS.EmitCVDefRangeDirective(DefRange.Ranges, BytePrefix);
27262715
}
27272716
}
27282717

llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(
315315

316316
Error CVSymbolDumperImpl::visitKnownRecord(
317317
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
318-
W.printNumber("Offset", DefRangeFramePointerRel.Offset);
318+
W.printNumber("Offset", DefRangeFramePointerRel.Hdr.Offset);
319319
printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
320320
DefRangeFramePointerRel.getRelocationOffset());
321321
printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);

llvm/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
229229
Error SymbolRecordMapping::visitKnownRecord(
230230
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
231231

232-
error(IO.mapInteger(DefRangeFramePointerRel.Offset));
232+
error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));
233233
error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
234234
error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
235235

llvm/lib/MC/MCAsmStreamer.cpp

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -254,9 +254,26 @@ class MCAsmStreamer final : public MCStreamer {
254254
unsigned SourceLineNum,
255255
const MCSymbol *FnStartSym,
256256
const MCSymbol *FnEndSym) override;
257+
258+
void PrintCVDefRangePrefix(
259+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
260+
261+
void EmitCVDefRangeDirective(
262+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
263+
codeview::DefRangeRegisterRelSym::Header DRHdr) override;
264+
257265
void EmitCVDefRangeDirective(
258266
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
259-
StringRef FixedSizePortion) override;
267+
codeview::DefRangeSubfieldRegisterSym::Header DRHdr) override;
268+
269+
void EmitCVDefRangeDirective(
270+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
271+
codeview::DefRangeRegisterSym::Header DRHdr) override;
272+
273+
void EmitCVDefRangeDirective(
274+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
275+
codeview::DefRangeFramePointerRelSym::Header DRHdr) override;
276+
260277
void EmitCVStringTableDirective() override;
261278
void EmitCVFileChecksumsDirective() override;
262279
void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;
@@ -1376,20 +1393,52 @@ void MCAsmStreamer::EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
13761393
PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
13771394
}
13781395

1379-
void MCAsmStreamer::EmitCVDefRangeDirective(
1380-
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1381-
StringRef FixedSizePortion) {
1396+
void MCAsmStreamer::PrintCVDefRangePrefix(
1397+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
13821398
OS << "\t.cv_def_range\t";
13831399
for (std::pair<const MCSymbol *, const MCSymbol *> Range : Ranges) {
13841400
OS << ' ';
13851401
Range.first->print(OS, MAI);
13861402
OS << ' ';
13871403
Range.second->print(OS, MAI);
13881404
}
1389-
OS << ", ";
1390-
PrintQuotedString(FixedSizePortion, OS);
1405+
}
1406+
1407+
void MCAsmStreamer::EmitCVDefRangeDirective(
1408+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1409+
codeview::DefRangeRegisterRelSym::Header DRHdr) {
1410+
PrintCVDefRangePrefix(Ranges);
1411+
OS << ", reg_rel, ";
1412+
OS << DRHdr.Register << ", " << DRHdr.Flags << ", "
1413+
<< DRHdr.BasePointerOffset;
1414+
EmitEOL();
1415+
}
1416+
1417+
void MCAsmStreamer::EmitCVDefRangeDirective(
1418+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1419+
codeview::DefRangeSubfieldRegisterSym::Header DRHdr) {
1420+
PrintCVDefRangePrefix(Ranges);
1421+
OS << ", subfield_reg, ";
1422+
OS << DRHdr.Register << ", " << DRHdr.OffsetInParent;
1423+
EmitEOL();
1424+
}
1425+
1426+
void MCAsmStreamer::EmitCVDefRangeDirective(
1427+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1428+
codeview::DefRangeRegisterSym::Header DRHdr) {
1429+
PrintCVDefRangePrefix(Ranges);
1430+
OS << ", reg, ";
1431+
OS << DRHdr.Register;
1432+
EmitEOL();
1433+
}
1434+
1435+
void MCAsmStreamer::EmitCVDefRangeDirective(
1436+
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1437+
codeview::DefRangeFramePointerRelSym::Header DRHdr) {
1438+
PrintCVDefRangePrefix(Ranges);
1439+
OS << ", frame_ptr_rel, ";
1440+
OS << DRHdr.Offset;
13911441
EmitEOL();
1392-
this->MCStreamer::EmitCVDefRangeDirective(Ranges, FixedSizePortion);
13931442
}
13941443

13951444
void MCAsmStreamer::EmitCVStringTableDirective() {

0 commit comments

Comments
 (0)