Changing representation of .cv_def_range directives in Codeview debug info assembly format for better readability
llvm-svn: 367867
This commit is contained in:
parent
91a658b094
commit
da60fc813c
|
@ -173,7 +173,7 @@ main: # @main
|
||||||
.short 1 # Flags
|
.short 1 # Flags
|
||||||
.asciz "argc"
|
.asciz "argc"
|
||||||
.Ltmp13:
|
.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
|
.short .Ltmp15-.Ltmp14 # Record length
|
||||||
.Ltmp14:
|
.Ltmp14:
|
||||||
.short 4414 # Record kind: S_LOCAL
|
.short 4414 # Record kind: S_LOCAL
|
||||||
|
@ -181,7 +181,7 @@ main: # @main
|
||||||
.short 1 # Flags
|
.short 1 # Flags
|
||||||
.asciz "argv"
|
.asciz "argv"
|
||||||
.Ltmp15:
|
.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
|
.short .Ltmp17-.Ltmp16 # Record length
|
||||||
.Ltmp16:
|
.Ltmp16:
|
||||||
.short 4414 # Record kind: S_LOCAL
|
.short 4414 # Record kind: S_LOCAL
|
||||||
|
@ -189,7 +189,7 @@ main: # @main
|
||||||
.short 0 # Flags
|
.short 0 # Flags
|
||||||
.asciz "SPtr"
|
.asciz "SPtr"
|
||||||
.Ltmp17:
|
.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
|
.short .Ltmp19-.Ltmp18 # Record length
|
||||||
.Ltmp18:
|
.Ltmp18:
|
||||||
.short 4360 # Record kind: S_UDT
|
.short 4360 # Record kind: S_UDT
|
||||||
|
|
|
@ -165,7 +165,7 @@ GlobalSSEC: # @GlobalSSEC
|
||||||
.short 1 # Flags
|
.short 1 # Flags
|
||||||
.asciz "argc"
|
.asciz "argc"
|
||||||
.Ltmp13:
|
.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
|
.short .Ltmp15-.Ltmp14 # Record length
|
||||||
.Ltmp14:
|
.Ltmp14:
|
||||||
.short 4414 # Record kind: S_LOCAL
|
.short 4414 # Record kind: S_LOCAL
|
||||||
|
@ -173,7 +173,7 @@ GlobalSSEC: # @GlobalSSEC
|
||||||
.short 1 # Flags
|
.short 1 # Flags
|
||||||
.asciz "argv"
|
.asciz "argv"
|
||||||
.Ltmp15:
|
.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 2 # Record length
|
||||||
.short 4431 # Record kind: S_PROC_ID_END
|
.short 4431 # Record kind: S_PROC_ID_END
|
||||||
.Ltmp7:
|
.Ltmp7:
|
||||||
|
|
|
@ -641,14 +641,14 @@ VariableInfo lldb_private::npdb::GetVariableLocationInfo(
|
||||||
llvm::StringRef program;
|
llvm::StringRef program;
|
||||||
if (GetFrameDataProgram(index, ranges, program)) {
|
if (GetFrameDataProgram(index, ranges, program)) {
|
||||||
result.location =
|
result.location =
|
||||||
MakeVFrameRelLocationExpression(program, loc.Offset, module);
|
MakeVFrameRelLocationExpression(program, loc.Hdr.Offset, module);
|
||||||
result.ranges = std::move(ranges);
|
result.ranges = std::move(ranges);
|
||||||
} else {
|
} else {
|
||||||
// invalid variable
|
// invalid variable
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result.location =
|
result.location =
|
||||||
MakeRegRelLocationExpression(base_reg, loc.Offset, module);
|
MakeRegRelLocationExpression(base_reg, loc.Hdr.Offset, module);
|
||||||
result.ranges = std::move(ranges);
|
result.ranges = std::move(ranges);
|
||||||
}
|
}
|
||||||
} else if (loc_specifier_cvs.kind() == S_DEFRANGE_REGISTER_REL) {
|
} else if (loc_specifier_cvs.kind() == S_DEFRANGE_REGISTER_REL) {
|
||||||
|
|
|
@ -520,6 +520,10 @@ class DefRangeFramePointerRelSym : public SymbolRecord {
|
||||||
static constexpr uint32_t RelocationOffset = 8;
|
static constexpr uint32_t RelocationOffset = 8;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
struct Header {
|
||||||
|
little32_t Offset;
|
||||||
|
};
|
||||||
|
|
||||||
explicit DefRangeFramePointerRelSym(SymbolRecordKind Kind)
|
explicit DefRangeFramePointerRelSym(SymbolRecordKind Kind)
|
||||||
: SymbolRecord(Kind) {}
|
: SymbolRecord(Kind) {}
|
||||||
DefRangeFramePointerRelSym(uint32_t RecordOffset)
|
DefRangeFramePointerRelSym(uint32_t RecordOffset)
|
||||||
|
@ -530,7 +534,7 @@ public:
|
||||||
return RecordOffset + RelocationOffset;
|
return RecordOffset + RelocationOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t Offset;
|
Header Hdr;
|
||||||
LocalVariableAddrRange Range;
|
LocalVariableAddrRange Range;
|
||||||
std::vector<LocalVariableAddrGap> Gaps;
|
std::vector<LocalVariableAddrGap> Gaps;
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "llvm/ADT/Optional.h"
|
#include "llvm/ADT/Optional.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
|
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
|
||||||
#include "llvm/MC/MCDirectives.h"
|
#include "llvm/MC/MCDirectives.h"
|
||||||
#include "llvm/MC/MCLinkerOptimizationHint.h"
|
#include "llvm/MC/MCLinkerOptimizationHint.h"
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
|
@ -860,6 +861,22 @@ public:
|
||||||
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
StringRef FixedSizePortion);
|
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.
|
/// This implements the CodeView '.cv_stringtable' assembler directive.
|
||||||
virtual void EmitCVStringTableDirective() {}
|
virtual void EmitCVStringTableDirective() {}
|
||||||
|
|
||||||
|
|
|
@ -2633,17 +2633,6 @@ void CodeViewDebug::emitLocalVariableList(const FunctionInfo &FI,
|
||||||
emitLocalVariable(FI, L);
|
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,
|
void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
|
||||||
const LocalVariable &Var) {
|
const LocalVariable &Var) {
|
||||||
// LocalSym record, see SymbolRecord.h for more info.
|
// LocalSym record, see SymbolRecord.h for more info.
|
||||||
|
@ -2692,8 +2681,9 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
|
||||||
(bool(Flags & LocalSymFlags::IsParameter)
|
(bool(Flags & LocalSymFlags::IsParameter)
|
||||||
? (EncFP == FI.EncodedParamFramePtrReg)
|
? (EncFP == FI.EncodedParamFramePtrReg)
|
||||||
: (EncFP == FI.EncodedLocalFramePtrReg))) {
|
: (EncFP == FI.EncodedLocalFramePtrReg))) {
|
||||||
little32_t FPOffset = little32_t(Offset);
|
DefRangeFramePointerRelSym::Header DRHdr;
|
||||||
copyBytesForDefRange(BytePrefix, S_DEFRANGE_FRAMEPOINTER_REL, FPOffset);
|
DRHdr.Offset = Offset;
|
||||||
|
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
|
||||||
} else {
|
} else {
|
||||||
uint16_t RegRelFlags = 0;
|
uint16_t RegRelFlags = 0;
|
||||||
if (DefRange.IsSubfield) {
|
if (DefRange.IsSubfield) {
|
||||||
|
@ -2705,7 +2695,7 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
|
||||||
DRHdr.Register = Reg;
|
DRHdr.Register = Reg;
|
||||||
DRHdr.Flags = RegRelFlags;
|
DRHdr.Flags = RegRelFlags;
|
||||||
DRHdr.BasePointerOffset = Offset;
|
DRHdr.BasePointerOffset = Offset;
|
||||||
copyBytesForDefRange(BytePrefix, S_DEFRANGE_REGISTER_REL, DRHdr);
|
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert(DefRange.DataOffset == 0 && "unexpected offset into register");
|
assert(DefRange.DataOffset == 0 && "unexpected offset into register");
|
||||||
|
@ -2714,15 +2704,14 @@ void CodeViewDebug::emitLocalVariable(const FunctionInfo &FI,
|
||||||
DRHdr.Register = DefRange.CVRegister;
|
DRHdr.Register = DefRange.CVRegister;
|
||||||
DRHdr.MayHaveNoName = 0;
|
DRHdr.MayHaveNoName = 0;
|
||||||
DRHdr.OffsetInParent = DefRange.StructOffset;
|
DRHdr.OffsetInParent = DefRange.StructOffset;
|
||||||
copyBytesForDefRange(BytePrefix, S_DEFRANGE_SUBFIELD_REGISTER, DRHdr);
|
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
|
||||||
} else {
|
} else {
|
||||||
DefRangeRegisterSym::Header DRHdr;
|
DefRangeRegisterSym::Header DRHdr;
|
||||||
DRHdr.Register = DefRange.CVRegister;
|
DRHdr.Register = DefRange.CVRegister;
|
||||||
DRHdr.MayHaveNoName = 0;
|
DRHdr.MayHaveNoName = 0;
|
||||||
copyBytesForDefRange(BytePrefix, S_DEFRANGE_REGISTER, DRHdr);
|
OS.EmitCVDefRangeDirective(DefRange.Ranges, DRHdr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OS.EmitCVDefRangeDirective(DefRange.Ranges, BytePrefix);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -315,7 +315,7 @@ Error CVSymbolDumperImpl::visitKnownRecord(
|
||||||
|
|
||||||
Error CVSymbolDumperImpl::visitKnownRecord(
|
Error CVSymbolDumperImpl::visitKnownRecord(
|
||||||
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
|
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
|
||||||
W.printNumber("Offset", DefRangeFramePointerRel.Offset);
|
W.printNumber("Offset", DefRangeFramePointerRel.Hdr.Offset);
|
||||||
printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
|
printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
|
||||||
DefRangeFramePointerRel.getRelocationOffset());
|
DefRangeFramePointerRel.getRelocationOffset());
|
||||||
printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
|
printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
|
||||||
|
|
|
@ -229,7 +229,7 @@ Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
|
||||||
Error SymbolRecordMapping::visitKnownRecord(
|
Error SymbolRecordMapping::visitKnownRecord(
|
||||||
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
|
CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
|
||||||
|
|
||||||
error(IO.mapInteger(DefRangeFramePointerRel.Offset));
|
error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));
|
||||||
error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
|
error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
|
||||||
error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
|
error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
|
||||||
|
|
||||||
|
|
|
@ -254,9 +254,26 @@ public:
|
||||||
unsigned SourceLineNum,
|
unsigned SourceLineNum,
|
||||||
const MCSymbol *FnStartSym,
|
const MCSymbol *FnStartSym,
|
||||||
const MCSymbol *FnEndSym) override;
|
const MCSymbol *FnEndSym) override;
|
||||||
|
|
||||||
|
void PrintCVDefRangePrefix(
|
||||||
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
|
||||||
|
|
||||||
void EmitCVDefRangeDirective(
|
void EmitCVDefRangeDirective(
|
||||||
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
StringRef FixedSizePortion) override;
|
codeview::DefRangeRegisterRelSym::Header DRHdr) override;
|
||||||
|
|
||||||
|
void EmitCVDefRangeDirective(
|
||||||
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
|
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 EmitCVStringTableDirective() override;
|
||||||
void EmitCVFileChecksumsDirective() override;
|
void EmitCVFileChecksumsDirective() override;
|
||||||
void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;
|
void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;
|
||||||
|
@ -1376,9 +1393,8 @@ void MCAsmStreamer::EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
|
||||||
PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
|
PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCAsmStreamer::EmitCVDefRangeDirective(
|
void MCAsmStreamer::PrintCVDefRangePrefix(
|
||||||
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
|
||||||
StringRef FixedSizePortion) {
|
|
||||||
OS << "\t.cv_def_range\t";
|
OS << "\t.cv_def_range\t";
|
||||||
for (std::pair<const MCSymbol *, const MCSymbol *> Range : Ranges) {
|
for (std::pair<const MCSymbol *, const MCSymbol *> Range : Ranges) {
|
||||||
OS << ' ';
|
OS << ' ';
|
||||||
|
@ -1386,10 +1402,43 @@ void MCAsmStreamer::EmitCVDefRangeDirective(
|
||||||
OS << ' ';
|
OS << ' ';
|
||||||
Range.second->print(OS, MAI);
|
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();
|
EmitEOL();
|
||||||
this->MCStreamer::EmitCVDefRangeDirective(Ranges, FixedSizePortion);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCAsmStreamer::EmitCVStringTableDirective() {
|
void MCAsmStreamer::EmitCVStringTableDirective() {
|
||||||
|
|
|
@ -524,6 +524,19 @@ private:
|
||||||
/// directives parsed by this class.
|
/// directives parsed by this class.
|
||||||
StringMap<DirectiveKind> DirectiveKindMap;
|
StringMap<DirectiveKind> DirectiveKindMap;
|
||||||
|
|
||||||
|
// Codeview def_range type parsing.
|
||||||
|
enum CVDefRangeType {
|
||||||
|
CVDR_DEFRANGE = 0, // Placeholder
|
||||||
|
CVDR_DEFRANGE_REGISTER,
|
||||||
|
CVDR_DEFRANGE_FRAMEPOINTER_REL,
|
||||||
|
CVDR_DEFRANGE_SUBFIELD_REGISTER,
|
||||||
|
CVDR_DEFRANGE_REGISTER_REL
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Maps Codeview def_range types --> CVDefRangeType enum, for
|
||||||
|
/// Codeview def_range types parsed by this class.
|
||||||
|
StringMap<CVDefRangeType> CVDefRangeTypeMap;
|
||||||
|
|
||||||
// ".ascii", ".asciz", ".string"
|
// ".ascii", ".asciz", ".string"
|
||||||
bool parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated);
|
bool parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated);
|
||||||
bool parseDirectiveReloc(SMLoc DirectiveLoc); // ".reloc"
|
bool parseDirectiveReloc(SMLoc DirectiveLoc); // ".reloc"
|
||||||
|
@ -671,6 +684,7 @@ private:
|
||||||
bool parseDirectiveAddrsigSym();
|
bool parseDirectiveAddrsigSym();
|
||||||
|
|
||||||
void initializeDirectiveKindMap();
|
void initializeDirectiveKindMap();
|
||||||
|
void initializeCVDefRangeTypeMap();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
@ -720,6 +734,7 @@ AsmParser::AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out,
|
||||||
|
|
||||||
PlatformParser->Initialize(*this);
|
PlatformParser->Initialize(*this);
|
||||||
initializeDirectiveKindMap();
|
initializeDirectiveKindMap();
|
||||||
|
initializeCVDefRangeTypeMap();
|
||||||
|
|
||||||
NumOfMacroInstantiations = 0;
|
NumOfMacroInstantiations = 0;
|
||||||
}
|
}
|
||||||
|
@ -1737,6 +1752,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
|
||||||
StringMap<DirectiveKind>::const_iterator DirKindIt =
|
StringMap<DirectiveKind>::const_iterator DirKindIt =
|
||||||
DirectiveKindMap.find(IDVal);
|
DirectiveKindMap.find(IDVal);
|
||||||
DirectiveKind DirKind = (DirKindIt == DirectiveKindMap.end())
|
DirectiveKind DirKind = (DirKindIt == DirectiveKindMap.end())
|
||||||
|
|
||||||
? DK_NO_DIRECTIVE
|
? DK_NO_DIRECTIVE
|
||||||
: DirKindIt->getValue();
|
: DirKindIt->getValue();
|
||||||
switch (DirKind) {
|
switch (DirKind) {
|
||||||
|
@ -3825,6 +3841,13 @@ bool AsmParser::parseDirectiveCVInlineLinetable() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AsmParser::initializeCVDefRangeTypeMap() {
|
||||||
|
CVDefRangeTypeMap["reg"] = CVDR_DEFRANGE_REGISTER;
|
||||||
|
CVDefRangeTypeMap["frame_ptr_rel"] = CVDR_DEFRANGE_FRAMEPOINTER_REL;
|
||||||
|
CVDefRangeTypeMap["subfield_reg"] = CVDR_DEFRANGE_SUBFIELD_REGISTER;
|
||||||
|
CVDefRangeTypeMap["reg_rel"] = CVDR_DEFRANGE_REGISTER_REL;
|
||||||
|
}
|
||||||
|
|
||||||
/// parseDirectiveCVDefRange
|
/// parseDirectiveCVDefRange
|
||||||
/// ::= .cv_def_range RangeStart RangeEnd (GapStart GapEnd)*, bytes*
|
/// ::= .cv_def_range RangeStart RangeEnd (GapStart GapEnd)*, bytes*
|
||||||
bool AsmParser::parseDirectiveCVDefRange() {
|
bool AsmParser::parseDirectiveCVDefRange() {
|
||||||
|
@ -3846,13 +3869,92 @@ bool AsmParser::parseDirectiveCVDefRange() {
|
||||||
Ranges.push_back({GapStartSym, GapEndSym});
|
Ranges.push_back({GapStartSym, GapEndSym});
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string FixedSizePortion;
|
StringRef CVDefRangeTypeStr;
|
||||||
if (parseToken(AsmToken::Comma, "unexpected token in directive") ||
|
if (parseToken(
|
||||||
parseEscapedString(FixedSizePortion))
|
AsmToken::Comma,
|
||||||
return true;
|
"expected comma before def_range type in .cv_def_range directive") ||
|
||||||
|
parseIdentifier(CVDefRangeTypeStr))
|
||||||
|
return Error(Loc, "expected def_range type in directive");
|
||||||
|
|
||||||
getStreamer().EmitCVDefRangeDirective(Ranges, FixedSizePortion);
|
StringMap<CVDefRangeType>::const_iterator CVTypeIt =
|
||||||
return false;
|
CVDefRangeTypeMap.find(CVDefRangeTypeStr);
|
||||||
|
CVDefRangeType CVDRType = (CVTypeIt == CVDefRangeTypeMap.end())
|
||||||
|
? CVDR_DEFRANGE
|
||||||
|
: CVTypeIt->getValue();
|
||||||
|
switch (CVDRType) {
|
||||||
|
case CVDR_DEFRANGE_REGISTER: {
|
||||||
|
int64_t DRRegister;
|
||||||
|
if (parseToken(AsmToken::Comma, "expected comma before register number in "
|
||||||
|
".cv_def_range directive") ||
|
||||||
|
parseAbsoluteExpression(DRRegister))
|
||||||
|
return Error(Loc, "expected register number");
|
||||||
|
|
||||||
|
codeview::DefRangeRegisterSym::Header DRHdr;
|
||||||
|
DRHdr.Register = DRRegister;
|
||||||
|
DRHdr.MayHaveNoName = 0;
|
||||||
|
getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CVDR_DEFRANGE_FRAMEPOINTER_REL: {
|
||||||
|
int64_t DROffset;
|
||||||
|
if (parseToken(AsmToken::Comma,
|
||||||
|
"expected comma before offset in .cv_def_range directive") ||
|
||||||
|
parseAbsoluteExpression(DROffset))
|
||||||
|
return Error(Loc, "expected offset value");
|
||||||
|
|
||||||
|
codeview::DefRangeFramePointerRelSym::Header DRHdr;
|
||||||
|
DRHdr.Offset = DROffset;
|
||||||
|
getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CVDR_DEFRANGE_SUBFIELD_REGISTER: {
|
||||||
|
int64_t DRRegister;
|
||||||
|
int64_t DROffsetInParent;
|
||||||
|
if (parseToken(AsmToken::Comma, "expected comma before register number in "
|
||||||
|
".cv_def_range directive") ||
|
||||||
|
parseAbsoluteExpression(DRRegister))
|
||||||
|
return Error(Loc, "expected register number");
|
||||||
|
if (parseToken(AsmToken::Comma,
|
||||||
|
"expected comma before offset in .cv_def_range directive") ||
|
||||||
|
parseAbsoluteExpression(DROffsetInParent))
|
||||||
|
return Error(Loc, "expected offset value");
|
||||||
|
|
||||||
|
codeview::DefRangeSubfieldRegisterSym::Header DRHdr;
|
||||||
|
DRHdr.Register = DRRegister;
|
||||||
|
DRHdr.MayHaveNoName = 0;
|
||||||
|
DRHdr.OffsetInParent = DROffsetInParent;
|
||||||
|
getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CVDR_DEFRANGE_REGISTER_REL: {
|
||||||
|
int64_t DRRegister;
|
||||||
|
int64_t DRFlags;
|
||||||
|
int64_t DRBasePointerOffset;
|
||||||
|
if (parseToken(AsmToken::Comma, "expected comma before register number in "
|
||||||
|
".cv_def_range directive") ||
|
||||||
|
parseAbsoluteExpression(DRRegister))
|
||||||
|
return Error(Loc, "expected register value");
|
||||||
|
if (parseToken(
|
||||||
|
AsmToken::Comma,
|
||||||
|
"expected comma before flag value in .cv_def_range directive") ||
|
||||||
|
parseAbsoluteExpression(DRFlags))
|
||||||
|
return Error(Loc, "expected flag value");
|
||||||
|
if (parseToken(AsmToken::Comma, "expected comma before base pointer offset "
|
||||||
|
"in .cv_def_range directive") ||
|
||||||
|
parseAbsoluteExpression(DRBasePointerOffset))
|
||||||
|
return Error(Loc, "expected base pointer offset value");
|
||||||
|
|
||||||
|
codeview::DefRangeRegisterRelSym::Header DRHdr;
|
||||||
|
DRHdr.Register = DRRegister;
|
||||||
|
DRHdr.Flags = DRFlags;
|
||||||
|
DRHdr.BasePointerOffset = DRBasePointerOffset;
|
||||||
|
getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return Error(Loc, "unexpected def_range type in .cv_def_range directive");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// parseDirectiveCVString
|
/// parseDirectiveCVString
|
||||||
|
|
|
@ -327,10 +327,56 @@ void MCStreamer::EmitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
|
||||||
const MCSymbol *FnStartSym,
|
const MCSymbol *FnStartSym,
|
||||||
const MCSymbol *FnEndSym) {}
|
const MCSymbol *FnEndSym) {}
|
||||||
|
|
||||||
|
/// 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,
|
||||||
|
codeview::SymbolKind SymKind,
|
||||||
|
const T &DefRangeHeader) {
|
||||||
|
BytePrefix.resize(2 + sizeof(T));
|
||||||
|
codeview::ulittle16_t SymKindLE = codeview::ulittle16_t(SymKind);
|
||||||
|
memcpy(&BytePrefix[0], &SymKindLE, 2);
|
||||||
|
memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
void MCStreamer::EmitCVDefRangeDirective(
|
void MCStreamer::EmitCVDefRangeDirective(
|
||||||
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
StringRef FixedSizePortion) {}
|
StringRef FixedSizePortion) {}
|
||||||
|
|
||||||
|
void MCStreamer::EmitCVDefRangeDirective(
|
||||||
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
|
codeview::DefRangeRegisterRelSym::Header DRHdr) {
|
||||||
|
SmallString<20> BytePrefix;
|
||||||
|
copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL, DRHdr);
|
||||||
|
EmitCVDefRangeDirective(Ranges, BytePrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MCStreamer::EmitCVDefRangeDirective(
|
||||||
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
|
codeview::DefRangeSubfieldRegisterSym::Header DRHdr) {
|
||||||
|
SmallString<20> BytePrefix;
|
||||||
|
copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_SUBFIELD_REGISTER,
|
||||||
|
DRHdr);
|
||||||
|
EmitCVDefRangeDirective(Ranges, BytePrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MCStreamer::EmitCVDefRangeDirective(
|
||||||
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
|
codeview::DefRangeRegisterSym::Header DRHdr) {
|
||||||
|
SmallString<20> BytePrefix;
|
||||||
|
copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER, DRHdr);
|
||||||
|
EmitCVDefRangeDirective(Ranges, BytePrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MCStreamer::EmitCVDefRangeDirective(
|
||||||
|
ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
|
||||||
|
codeview::DefRangeFramePointerRelSym::Header DRHdr) {
|
||||||
|
SmallString<20> BytePrefix;
|
||||||
|
copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_FRAMEPOINTER_REL,
|
||||||
|
DRHdr);
|
||||||
|
EmitCVDefRangeDirective(Ranges, BytePrefix);
|
||||||
|
}
|
||||||
|
|
||||||
void MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol,
|
void MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol,
|
||||||
MCSymbol *EHSymbol) {
|
MCSymbol *EHSymbol) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -391,7 +391,7 @@ template <> void SymbolRecordImpl<DefRangeRegisterSym>::map(IO &IO) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template <> void SymbolRecordImpl<DefRangeFramePointerRelSym>::map(IO &IO) {
|
template <> void SymbolRecordImpl<DefRangeFramePointerRelSym>::map(IO &IO) {
|
||||||
IO.mapRequired("Offset", Symbol.Offset);
|
IO.mapRequired("Offset", Symbol.Hdr.Offset);
|
||||||
IO.mapRequired("Range", Symbol.Range);
|
IO.mapRequired("Range", Symbol.Range);
|
||||||
IO.mapRequired("Gaps", Symbol.Gaps);
|
IO.mapRequired("Gaps", Symbol.Gaps);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ entry:
|
||||||
ret double %sub
|
ret double %sub
|
||||||
}
|
}
|
||||||
|
|
||||||
; ASM: .cv_def_range Ltmp1 Lfunc_end0, "A\021\200\000\000\000"
|
; ASM: .cv_def_range Ltmp1 Lfunc_end0, reg, 128
|
||||||
; OBJ: DefRangeRegisterSym {
|
; OBJ: DefRangeRegisterSym {
|
||||||
; OBJ: Register: ST0 (0x80)
|
; OBJ: Register: ST0 (0x80)
|
||||||
; OBJ: MayHaveNoName: 0
|
; OBJ: MayHaveNoName: 0
|
||||||
|
|
|
@ -62,7 +62,7 @@
|
||||||
; ASM: .long 116 # TypeIndex
|
; ASM: .long 116 # TypeIndex
|
||||||
; ASM: .short 0 # Flags
|
; ASM: .short 0 # Flags
|
||||||
; ASM: .asciz "p"
|
; ASM: .asciz "p"
|
||||||
; ASM: .cv_def_range [[p_b1]] [[p_e1]] [[p_b2]] .Lfunc_end0, "A\021\027\000\000\000"
|
; ASM: .cv_def_range [[p_b1]] [[p_e1]] [[p_b2]] .Lfunc_end0, reg, 23
|
||||||
; ASM: .short 2 # Record length
|
; ASM: .short 2 # Record length
|
||||||
; ASM: .short 4431 # Record kind: S_PROC_ID_END
|
; ASM: .short 4431 # Record kind: S_PROC_ID_END
|
||||||
|
|
||||||
|
|
|
@ -71,30 +71,30 @@
|
||||||
; ASM: .long 116 # TypeIndex
|
; ASM: .long 116 # TypeIndex
|
||||||
; ASM: .short 1 # Flags
|
; ASM: .short 1 # Flags
|
||||||
; ASM: .asciz "param"
|
; ASM: .asciz "param"
|
||||||
; ASM: .cv_def_range [[prologue_end]] [[param_end]], "B\0214\000\000\000"
|
; ASM: .cv_def_range [[prologue_end]] [[param_end]], frame_ptr_rel, 52
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .long 116 # TypeIndex
|
; ASM: .long 116 # TypeIndex
|
||||||
; ASM: .short 0 # Flags
|
; ASM: .short 0 # Flags
|
||||||
; ASM: .asciz "a"
|
; ASM: .asciz "a"
|
||||||
; ASM: .cv_def_range [[if_start]] [[else_start]], "B\021(\000\000\000"
|
; ASM: .cv_def_range [[if_start]] [[else_start]], frame_ptr_rel, 40
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .long 116 # TypeIndex
|
; ASM: .long 116 # TypeIndex
|
||||||
; ASM: .short 0 # Flags
|
; ASM: .short 0 # Flags
|
||||||
; ASM: .asciz "b"
|
; ASM: .asciz "b"
|
||||||
; ASM: .cv_def_range [[else_start]] [[else_end]], "B\021$\000\000\000"
|
; ASM: .cv_def_range [[else_start]] [[else_end]], frame_ptr_rel, 36
|
||||||
; ASM: .short 4429 # Record kind: S_INLINESITE
|
; ASM: .short 4429 # Record kind: S_INLINESITE
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .long 116 # TypeIndex
|
; ASM: .long 116 # TypeIndex
|
||||||
; ASM: .short 0 # Flags
|
; ASM: .short 0 # Flags
|
||||||
; ASM: .asciz "v"
|
; ASM: .asciz "v"
|
||||||
; ASM: .cv_def_range [[inline_site1]] [[else_start]], "B\021,\000\000\000"
|
; ASM: .cv_def_range [[inline_site1]] [[else_start]], frame_ptr_rel, 44
|
||||||
; ASM: .short 4430 # Record kind: S_INLINESITE_END
|
; ASM: .short 4430 # Record kind: S_INLINESITE_END
|
||||||
; ASM: .short 4429 # Record kind: S_INLINESITE
|
; ASM: .short 4429 # Record kind: S_INLINESITE
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .long 116 # TypeIndex
|
; ASM: .long 116 # TypeIndex
|
||||||
; ASM: .short 0 # Flags
|
; ASM: .short 0 # Flags
|
||||||
; ASM: .asciz "v"
|
; ASM: .asciz "v"
|
||||||
; ASM: .cv_def_range [[inline_site2]] [[else_end]], "B\0210\000\000\000"
|
; ASM: .cv_def_range [[inline_site2]] [[else_end]], frame_ptr_rel, 48
|
||||||
; ASM: .short 4430 # Record kind: S_INLINESITE_END
|
; ASM: .short 4430 # Record kind: S_INLINESITE_END
|
||||||
|
|
||||||
; OBJ: Subsection [
|
; OBJ: Subsection [
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
; ASM-NEXT: .asciz "foo"
|
; ASM-NEXT: .asciz "foo"
|
||||||
; ASM-NEXT: .p2align 2
|
; ASM-NEXT: .p2align 2
|
||||||
; ASM-NEXT: .Ltmp
|
; ASM-NEXT: .Ltmp
|
||||||
; ASM: .cv_def_range .Ltmp{{.*}} .Ltmp{{.*}}, "B\021(\000\000\000"
|
; ASM: .cv_def_range .Ltmp{{.*}} .Ltmp{{.*}}, frame_ptr_rel, 40
|
||||||
|
|
||||||
; OBJ: Subsection [
|
; OBJ: Subsection [
|
||||||
; OBJ: SubSectionType: Symbols (0xF1)
|
; OBJ: SubSectionType: Symbols (0xF1)
|
||||||
|
|
|
@ -113,10 +113,10 @@
|
||||||
; ASM: .asciz "loop_csr" # Function name
|
; ASM: .asciz "loop_csr" # Function name
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "o"
|
; ASM: .asciz "o"
|
||||||
; ASM: .cv_def_range [[oy_ox_start]] [[ox_start]], "C\021\030\000\000\000\000\000\000\000"
|
; ASM: .cv_def_range [[oy_ox_start]] [[ox_start]], subfield_reg, 24, 0
|
||||||
; ASM: .cv_def_range [[oy_ox_start]] [[oy_start]], "C\021\027\000\000\000\004\000\000\000"
|
; ASM: .cv_def_range [[oy_ox_start]] [[oy_start]], subfield_reg, 23, 4
|
||||||
; ASM: .cv_def_range [[ox_start]] [[loopskip_start]], "C\021\030\000\000\000\000\000\000\000"
|
; ASM: .cv_def_range [[ox_start]] [[loopskip_start]], subfield_reg, 24, 0
|
||||||
; ASM: .cv_def_range [[oy_start]] [[loopskip_start]], "C\021\027\000\000\000\004\000\000\000"
|
; ASM: .cv_def_range [[oy_start]] [[loopskip_start]], subfield_reg, 23, 4
|
||||||
|
|
||||||
|
|
||||||
; OBJ-LABEL: GlobalProcIdSym {
|
; OBJ-LABEL: GlobalProcIdSym {
|
||||||
|
@ -147,7 +147,7 @@
|
||||||
; ASM: .asciz "pad_right" # Function name
|
; ASM: .asciz "pad_right" # Function name
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "o"
|
; ASM: .asciz "o"
|
||||||
; ASM: .cv_def_range [[pad_right_tmp]] [[pad_right_tmp]], "C\021\021\000\000\000\004\000\000\000"
|
; ASM: .cv_def_range [[pad_right_tmp]] [[pad_right_tmp]], subfield_reg, 17, 4
|
||||||
|
|
||||||
; OBJ-LABEL: GlobalProcIdSym {
|
; OBJ-LABEL: GlobalProcIdSym {
|
||||||
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
||||||
|
@ -170,7 +170,7 @@
|
||||||
; ASM: .asciz "pad_left" # Function name
|
; ASM: .asciz "pad_left" # Function name
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "o"
|
; ASM: .asciz "o"
|
||||||
; ASM: .cv_def_range [[pad_left_tmp]] [[pad_left_tmp]], "C\021\021\000\000\000\000\000\000\000"
|
; ASM: .cv_def_range [[pad_left_tmp]] [[pad_left_tmp]], subfield_reg, 17, 0
|
||||||
|
|
||||||
; OBJ-LABEL: GlobalProcIdSym {
|
; OBJ-LABEL: GlobalProcIdSym {
|
||||||
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
||||||
|
@ -193,10 +193,10 @@
|
||||||
; ASM: .asciz "nested" # Function name
|
; ASM: .asciz "nested" # Function name
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "o"
|
; ASM: .asciz "o"
|
||||||
; ASM: .cv_def_range .Lfunc_begin3 .Lfunc_end3, "E\021J\001\000\000\000\000\000\000"
|
; ASM: .cv_def_range .Lfunc_begin3 .Lfunc_end3, reg_rel, 330, 0, 0
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "p"
|
; ASM: .asciz "p"
|
||||||
; ASM: .cv_def_range [[p_start]] .Lfunc_end3, "C\021\021\000\000\000\004\000\000\000"
|
; ASM: .cv_def_range [[p_start]] .Lfunc_end3, subfield_reg, 17, 4
|
||||||
|
|
||||||
; OBJ-LABEL: GlobalProcIdSym {
|
; OBJ-LABEL: GlobalProcIdSym {
|
||||||
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
||||||
|
@ -232,7 +232,7 @@
|
||||||
; ASM: .asciz "bitpiece_spill" # Function name
|
; ASM: .asciz "bitpiece_spill" # Function name
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "o"
|
; ASM: .asciz "o"
|
||||||
; ASM: .cv_def_range [[spill_o_x_start]] .Lfunc_end4, "E\021O\001A\000$\000\000\000"
|
; ASM: .cv_def_range [[spill_o_x_start]] .Lfunc_end4, reg_rel, 335, 65, 36
|
||||||
|
|
||||||
; OBJ-LABEL: GlobalProcIdSym {
|
; OBJ-LABEL: GlobalProcIdSym {
|
||||||
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
; OBJ: Kind: S_GPROC32_ID (0x1147)
|
||||||
|
|
|
@ -58,25 +58,25 @@
|
||||||
|
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "p"
|
; ASM: .asciz "p"
|
||||||
; ASM: .cv_def_range .Lfunc_begin0 [[p_ecx_esi]], "A\021\022\000\000\000"
|
; ASM: .cv_def_range .Lfunc_begin0 [[p_ecx_esi]], reg, 18
|
||||||
; ASM: .cv_def_range [[p_ecx_esi]] [[func_end]], "A\021\027\000\000\000"
|
; ASM: .cv_def_range [[p_ecx_esi]] [[func_end]], reg, 23
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "c"
|
; ASM: .asciz "c"
|
||||||
; ASM: .cv_def_range [[after_getint]] [[after_je]], "A\021\021\000\000\000"
|
; ASM: .cv_def_range [[after_getint]] [[after_je]], reg, 17
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "a"
|
; ASM: .asciz "a"
|
||||||
; ASM: .cv_def_range [[after_getint]] [[after_inc_eax]], "A\021\021\000\000\000"
|
; ASM: .cv_def_range [[after_getint]] [[after_inc_eax]], reg, 17
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "b"
|
; ASM: .asciz "b"
|
||||||
; ASM: .cv_def_range [[after_inc_eax]] [[after_if]], "A\021\021\000\000\000"
|
; ASM: .cv_def_range [[after_inc_eax]] [[after_if]], reg, 17
|
||||||
|
|
||||||
; ASM: .short 4429 # Record kind: S_INLINESITE
|
; ASM: .short 4429 # Record kind: S_INLINESITE
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "a"
|
; ASM: .asciz "a"
|
||||||
; ASM: .cv_def_range [[after_getint]] [[after_inc_eax]], "A\021\021\000\000\000"
|
; ASM: .cv_def_range [[after_getint]] [[after_inc_eax]], reg, 17
|
||||||
; ASM: .short 4414 # Record kind: S_LOCAL
|
; ASM: .short 4414 # Record kind: S_LOCAL
|
||||||
; ASM: .asciz "b"
|
; ASM: .asciz "b"
|
||||||
; ASM: .cv_def_range [[after_inc_eax]] [[after_if]], "A\021\021\000\000\000"
|
; ASM: .cv_def_range [[after_inc_eax]] [[after_if]], reg, 17
|
||||||
; ASM: .short 4430 # Record kind: S_INLINESITE_END
|
; ASM: .short 4430 # Record kind: S_INLINESITE_END
|
||||||
|
|
||||||
; OBJ: Subsection [
|
; OBJ: Subsection [
|
||||||
|
|
|
@ -97,7 +97,7 @@ max: # @max
|
||||||
# BUG
|
# BUG
|
||||||
.p2align 2
|
.p2align 2
|
||||||
.Ltmp13:
|
.Ltmp13:
|
||||||
.cv_def_range .Ltmp0 .Ltmp1, "B\021\000\000\000\000"
|
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 8
|
||||||
.short .Ltmp15-.Ltmp14 # Record length
|
.short .Ltmp15-.Ltmp14 # Record length
|
||||||
.Ltmp14:
|
.Ltmp14:
|
||||||
.short 4414 # Record kind: S_LOCAL
|
.short 4414 # Record kind: S_LOCAL
|
||||||
|
@ -107,7 +107,7 @@ max: # @max
|
||||||
# BUG
|
# BUG
|
||||||
.p2align 2
|
.p2align 2
|
||||||
.Ltmp15:
|
.Ltmp15:
|
||||||
.cv_def_range .Ltmp0 .Ltmp1, "B\021\004\000\000\000"
|
.cv_def_range .Ltmp0 .Ltmp1, frame_ptr_rel, 8
|
||||||
.short 2 # Record length
|
.short 2 # Record length
|
||||||
.short 4431 # Record kind: S_PROC_ID_END
|
.short 4431 # Record kind: S_PROC_ID_END
|
||||||
.Ltmp7:
|
.Ltmp7:
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
# RUN: not llvm-mc < %s -filetype=obj --triple=x86_64-windows -o /dev/null 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2
|
||||||
|
# CHECK: error: expected comma before def_range type in .cv_def_range directive
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2,
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, subfield_reg
|
||||||
|
# CHECK: error: expected comma before register number in .cv_def_range directive
|
||||||
|
# CHECK: error: expected register number
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, subfield_reg,
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: error: expected register number
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, subfield_reg, 25
|
||||||
|
# CHECK: error: expected comma before offset in .cv_def_range directive
|
||||||
|
# CHECK: error: expected offset value
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, subfield_reg, 25,
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: error: expected offset value
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2
|
||||||
|
# CHECK: error: expected comma before def_range type in .cv_def_range directive
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2,
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg
|
||||||
|
# CHECK: error: expected comma before register number in .cv_def_range directive
|
||||||
|
# CHECK: error: expected register number
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg,
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: error: expected register number
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2
|
||||||
|
# CHECK: error: expected comma before def_range type in .cv_def_range directive
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2,
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, frame_ptr_rel
|
||||||
|
# CHECK: error: expected comma before offset in .cv_def_range directive
|
||||||
|
# CHECK: error: expected offset value
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, frame_ptr_rel,
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: error: expected offset value
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2
|
||||||
|
# CHECK: error: expected comma before def_range type in .cv_def_range directive
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2,
|
||||||
|
# CHECK: error: expected def_range type in directive
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg_rel
|
||||||
|
# CHECK: error: expected comma before register number in .cv_def_range directive
|
||||||
|
# CHECK: error: expected register value
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg_rel,
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: error: expected register value
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg_rel, 330
|
||||||
|
# CHECK: error: expected comma before flag value in .cv_def_range directive
|
||||||
|
# CHECK: error: expected flag value
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg_rel, 330,
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: error: expected flag value
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg_rel, 330, 0
|
||||||
|
# CHECK: error: expected comma before base pointer offset in .cv_def_range directive
|
||||||
|
# CHECK: error: expected base pointer offset value
|
||||||
|
|
||||||
|
.cv_def_range .Ltmp1 .Ltmp2, reg_rel, 330, 0,
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: error: expected base pointer offset value
|
|
@ -120,8 +120,8 @@ f: # @f
|
||||||
.short 0 # Flags
|
.short 0 # Flags
|
||||||
.asciz "p"
|
.asciz "p"
|
||||||
.Ltmp19:
|
.Ltmp19:
|
||||||
.cv_def_range .Lbegin0 .Lend0 .Lbegin1 .Lend1 .Lbegin2 .Lend2 .Lbegin3 .Lend3, "A\021\027\000\000\000"
|
.cv_def_range .Lbegin0 .Lend0 .Lbegin1 .Lend1 .Lbegin2 .Lend2 .Lbegin3 .Lend3, reg, 23
|
||||||
.cv_def_range .Lbegin4 .Lend4 .Lbegin5 .Lend5, "A\021\027\000\000\000"
|
.cv_def_range .Lbegin4 .Lend4 .Lbegin5 .Lend5, reg, 23
|
||||||
.short 2 # Record length
|
.short 2 # Record length
|
||||||
.short 4431 # Record kind: S_PROC_ID_END
|
.short 4431 # Record kind: S_PROC_ID_END
|
||||||
.Ltmp15:
|
.Ltmp15:
|
||||||
|
|
|
@ -75,7 +75,7 @@ Ltmp2:
|
||||||
Ltmp3:
|
Ltmp3:
|
||||||
.short 2 # Record length
|
.short 2 # Record length
|
||||||
.short 4431 # Record kind: S_PROC_ID_END
|
.short 4431 # Record kind: S_PROC_ID_END
|
||||||
.cv_def_range Lvar_begin0 Lvar_end0, "\102\021\374\377\377\377"
|
.cv_def_range Lvar_begin0 Lvar_end0, frame_ptr_rel, -4
|
||||||
|
|
||||||
# CHECK: DefRangeFramePointerRelSym {
|
# CHECK: DefRangeFramePointerRelSym {
|
||||||
# CHECK: Offset: -4
|
# CHECK: Offset: -4
|
||||||
|
|
|
@ -569,8 +569,9 @@ Error MinimalSymbolDumper::visitKnownRecord(
|
||||||
Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
|
Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR,
|
||||||
DefRangeFramePointerRelSym &Def) {
|
DefRangeFramePointerRelSym &Def) {
|
||||||
AutoIndent Indent(P, 7);
|
AutoIndent Indent(P, 7);
|
||||||
P.formatLine("offset = {0}, range = {1}", Def.Offset, formatRange(Def.Range));
|
P.formatLine("offset = {0}, range = {1}", Def.Hdr.Offset,
|
||||||
P.formatLine("gaps = {2}", Def.Offset,
|
formatRange(Def.Range));
|
||||||
|
P.formatLine("gaps = {2}", Def.Hdr.Offset,
|
||||||
formatGaps(P.getIndentLevel() + 9, Def.Gaps));
|
formatGaps(P.getIndentLevel() + 9, Def.Gaps));
|
||||||
return Error::success();
|
return Error::success();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue