Skip to content

Commit

Permalink
Changing representation of .cv_def_range directives in Codeview debug…
Browse files Browse the repository at this point in the history
… info assembly format for better readability

llvm-svn: 367867
  • Loading branch information
nilanjana87 committed Aug 5, 2019
1 parent 91a658b commit da60fc8
Show file tree
Hide file tree
Showing 23 changed files with 376 additions and 73 deletions.
6 changes: 3 additions & 3 deletions lld/test/COFF/s_udt.s
Original file line number Diff line number Diff line change
Expand Up @@ -173,23 +173,23 @@ main: # @main
.short 1 # Flags
.asciz "argc"
.Ltmp13:
.cv_def_range .Ltmp0 .Ltmp1, "B\021\f\000\000\000"
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 12
.short .Ltmp15-.Ltmp14 # Record length
.Ltmp14:
.short 4414 # Record kind: S_LOCAL
.long 4096 # TypeIndex
.short 1 # Flags
.asciz "argv"
.Ltmp15:
.cv_def_range .Ltmp0 .Ltmp1, "B\021\020\000\000\000"
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 16
.short .Ltmp17-.Ltmp16 # Record length
.Ltmp16:
.short 4414 # Record kind: S_LOCAL
.long 4101 # TypeIndex
.short 0 # Flags
.asciz "SPtr"
.Ltmp17:
.cv_def_range .Ltmp0 .Ltmp1, "B\021\000\000\000\000"
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 0
.short .Ltmp19-.Ltmp18 # Record length
.Ltmp18:
.short 4360 # Record kind: S_UDT
Expand Down
4 changes: 2 additions & 2 deletions lldb/lit/SymbolFile/NativePDB/Inputs/s_constant.s
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,15 @@ GlobalSSEC: # @GlobalSSEC
.short 1 # Flags
.asciz "argc"
.Ltmp13:
.cv_def_range .Ltmp0 .Ltmp1, "B\021\004\000\000\000"
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 4
.short .Ltmp15-.Ltmp14 # Record length
.Ltmp14:
.short 4414 # Record kind: S_LOCAL
.long 4096 # TypeIndex
.short 1 # Flags
.asciz "argv"
.Ltmp15:
.cv_def_range .Ltmp0 .Ltmp1, "B\021\b\000\000\000"
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 8
.short 2 # Record length
.short 4431 # Record kind: S_PROC_ID_END
.Ltmp7:
Expand Down
4 changes: 2 additions & 2 deletions lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -641,14 +641,14 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
llvm::StringRef program;
if (GetFrameDataProgram(index, ranges, program)) {
result.location =
MakeVFrameRelLocationExpression(program, loc.Offset, module);
MakeVFrameRelLocationExpression(program, loc.Hdr.Offset, module);
result.ranges = std::move(ranges);
} else {
// invalid variable
}
} else {
result.location =
MakeRegRelLocationExpression(base_reg, loc.Offset, module);
MakeRegRelLocationExpression(base_reg, loc.Hdr.Offset, module);
result.ranges = std::move(ranges);
}
} else if (loc_specifier_cvs.kind() == S_DEFRANGE_REGISTER_REL) {
Expand Down
6 changes: 5 additions & 1 deletion llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,10 @@ class DefRangeFramePointerRelSym : public SymbolRecord {
static constexpr uint32_t RelocationOffset = 8;

public:
struct Header {
little32_t Offset;
};

explicit DefRangeFramePointerRelSym(SymbolRecordKind Kind)
: SymbolRecord(Kind) {}
DefRangeFramePointerRelSym(uint32_t RecordOffset)
Expand All @@ -530,7 +534,7 @@ class DefRangeFramePointerRelSym : public SymbolRecord {
return RecordOffset + RelocationOffset;
}

int32_t Offset;
Header Hdr;
LocalVariableAddrRange Range;
std::vector<LocalVariableAddrGap> Gaps;

Expand Down
17 changes: 17 additions & 0 deletions llvm/include/llvm/MC/MCStreamer.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
#include "llvm/MC/MCDirectives.h"
#include "llvm/MC/MCLinkerOptimizationHint.h"
#include "llvm/MC/MCSymbol.h"
Expand Down Expand Up @@ -860,6 +861,22 @@ class MCStreamer {
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
StringRef FixedSizePortion);

virtual void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeRegisterRelSym::Header DRHdr);

virtual void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeSubfieldRegisterSym::Header DRHdr);

virtual void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeRegisterSym::Header DRHdr);

virtual void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeFramePointerRelSym::Header DRHdr);

/// This implements the CodeView '.cv_stringtable' assembler directive.
virtual void EmitCVStringTableDirective() {}

Expand Down
23 changes: 6 additions & 17 deletions llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2633,17 +2633,6 @@ void CodeViewDebug::emitLocalVariableList(const FunctionInfo &FI,
emitLocalVariable(FI, L);
}

/// Only call this on endian-specific types like ulittle16_t and little32_t, or
/// structs composed of them.
template <typename T>
static void copyBytesForDefRange(SmallString<20> &BytePrefix,
SymbolKind SymKind, const T &DefRangeHeader) {
BytePrefix.resize(2 + sizeof(T));
ulittle16_t SymKindLE = ulittle16_t(SymKind);
memcpy(&BytePrefix[0], &SymKindLE, 2);
memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
}

void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
const LocalVariable &Var) {
// LocalSym record, see SymbolRecord.h for more info.
Expand Down Expand Up @@ -2692,8 +2681,9 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
(bool(Flags & LocalSymFlags::IsParameter)
? (EncFP == FI.EncodedParamFramePtrReg)
: (EncFP == FI.EncodedLocalFramePtrReg))) {
little32_t FPOffset = little32_t(Offset);
copyBytesForDefRange(BytePrefix, S_DEFRANGE_FRAMEPOINTER_REL, FPOffset);
DefRangeFramePointerRelSym::Header DRHdr;
DRHdr.Offset = Offset;
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
} else {
uint16_t RegRelFlags = 0;
if (DefRange.IsSubfield) {
Expand All @@ -2705,7 +2695,7 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
DRHdr.Register = Reg;
DRHdr.Flags = RegRelFlags;
DRHdr.BasePointerOffset = Offset;
copyBytesForDefRange(BytePrefix, S_DEFRANGE_REGISTER_REL, DRHdr);
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
}
} else {
assert(DefRange.DataOffset == 0 && "unexpected offset into register");
Expand All @@ -2714,15 +2704,14 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
DRHdr.Register = DefRange.CVRegister;
DRHdr.MayHaveNoName = 0;
DRHdr.OffsetInParent = DefRange.StructOffset;
copyBytesForDefRange(BytePrefix, S_DEFRANGE_SUBFIELD_REGISTER, DRHdr);
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
} else {
DefRangeRegisterSym::Header DRHdr;
DRHdr.Register = DefRange.CVRegister;
DRHdr.MayHaveNoName = 0;
copyBytesForDefRange(BytePrefix, S_DEFRANGE_REGISTER, DRHdr);
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
}
}
OS.EmitCVDefRangeDirective(DefRange.Ranges, BytePrefix);
}
}

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(

Error CVSymbolDumperImpl::visitKnownRecord(
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
W.printNumber("Offset", DefRangeFramePointerRel.Offset);
W.printNumber("Offset", DefRangeFramePointerRel.Hdr.Offset);
printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
DefRangeFramePointerRel.getRelocationOffset());
printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
Error SymbolRecordMapping::visitKnownRecord(
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {

error(IO.mapInteger(DefRangeFramePointerRel.Offset));
error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));
error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));

Expand Down
63 changes: 56 additions & 7 deletions llvm/lib/MC/MCAsmStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,26 @@ class MCAsmStreamer final : public MCStreamer {
unsigned SourceLineNum,
const MCSymbol *FnStartSym,
const MCSymbol *FnEndSym) override;

void PrintCVDefRangePrefix(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);

void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeRegisterRelSym::Header DRHdr) override;

void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
StringRef FixedSizePortion) override;
codeview::DefRangeSubfieldRegisterSym::Header DRHdr) override;

void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeRegisterSym::Header DRHdr) override;

void EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeFramePointerRelSym::Header DRHdr) override;

void EmitCVStringTableDirective() override;
void EmitCVFileChecksumsDirective() override;
void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;
Expand Down Expand Up @@ -1376,20 +1393,52 @@ void MCAsmStreamer::EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
}

void MCAsmStreamer::EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
StringRef FixedSizePortion) {
void MCAsmStreamer::PrintCVDefRangePrefix(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
OS << "\t.cv_def_range\t";
for (std::pair<const MCSymbol *, const MCSymbol *> Range : Ranges) {
OS << ' ';
Range.first->print(OS, MAI);
OS << ' ';
Range.second->print(OS, MAI);
}
OS << ", ";
PrintQuotedString(FixedSizePortion, OS);
}

void MCAsmStreamer::EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeRegisterRelSym::Header DRHdr) {
PrintCVDefRangePrefix(Ranges);
OS << ", reg_rel, ";
OS << DRHdr.Register << ", " << DRHdr.Flags << ", "
<< DRHdr.BasePointerOffset;
EmitEOL();
}

void MCAsmStreamer::EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeSubfieldRegisterSym::Header DRHdr) {
PrintCVDefRangePrefix(Ranges);
OS << ", subfield_reg, ";
OS << DRHdr.Register << ", " << DRHdr.OffsetInParent;
EmitEOL();
}

void MCAsmStreamer::EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeRegisterSym::Header DRHdr) {
PrintCVDefRangePrefix(Ranges);
OS << ", reg, ";
OS << DRHdr.Register;
EmitEOL();
}

void MCAsmStreamer::EmitCVDefRangeDirective(
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
codeview::DefRangeFramePointerRelSym::Header DRHdr) {
PrintCVDefRangePrefix(Ranges);
OS << ", frame_ptr_rel, ";
OS << DRHdr.Offset;
EmitEOL();
this->MCStreamer::EmitCVDefRangeDirective(Ranges, FixedSizePortion);
}

void MCAsmStreamer::EmitCVStringTableDirective() {
Expand Down
Loading

0 comments on commit da60fc8

Please sign in to comment.