/// Data - Raw data bytes for abbreviation.
///
- std::vector<DIEAbbrevData> Data;
+ SmallVector<DIEAbbrevData, 8> Data;
public:
unsigned getTag() const { return Tag; }
unsigned getNumber() const { return Number; }
unsigned getChildrenFlag() const { return ChildrenFlag; }
- const std::vector<DIEAbbrevData> &getData() const { return Data; }
+ const SmallVector<DIEAbbrevData, 8> &getData() const { return Data; }
void setTag(unsigned T) { Tag = T; }
void setChildrenFlag(unsigned CF) { ChildrenFlag = CF; }
void setNumber(unsigned N) { Number = N; }
/// Attributes values.
///
- std::vector<DIEValue *> Values;
+ SmallVector<DIEValue*, 32> Values;
public:
explicit DIE(unsigned Tag)
unsigned getOffset() const { return Offset; }
unsigned getSize() const { return Size; }
const std::vector<DIE *> &getChildren() const { return Children; }
- std::vector<DIEValue *> &getValues() { return Values; }
+ SmallVector<DIEValue*, 32> &getValues() { return Values; }
void setTag(unsigned Tag) { Abbrev.setTag(Tag); }
void setOffset(unsigned O) { Offset = O; }
void setSize(unsigned S) { Size = S; }
isString,
isLabel,
isAsIsLabel,
+ isSectionOffset,
isDelta,
isEntry,
isBlock
#endif
};
+//===----------------------------------------------------------------------===//
+/// DIESectionOffset - A section offset DIE.
+//
+class DIESectionOffset : public DIEValue {
+public:
+ const DWLabel Label;
+ const DWLabel Section;
+ bool IsEH : 1;
+ bool UseSet : 1;
+
+ DIESectionOffset(const DWLabel &Lab, const DWLabel &Sec,
+ bool isEH = false, bool useSet = true)
+ : DIEValue(isSectionOffset), Label(Lab), Section(Sec),
+ IsEH(isEH), UseSet(useSet) {}
+
+ // Implement isa/cast/dyncast.
+ static bool classof(const DIESectionOffset *) { return true; }
+ static bool classof(const DIEValue *D) { return D->Type == isSectionOffset; }
+
+ /// EmitValue - Emit section offset.
+ ///
+ virtual void EmitValue(DwarfDebug &DD, unsigned Form);
+
+ /// SizeOf - Determine size of section offset value in bytes.
+ ///
+ virtual unsigned SizeOf(const DwarfDebug &DD, unsigned Form) const;
+
+ /// Profile - Used to gather unique data for the value folding set.
+ ///
+ static void Profile(FoldingSetNodeID &ID, const DWLabel &Label,
+ const DWLabel &Section) {
+ ID.AddInteger(isSectionOffset);
+ Label.Profile(ID);
+ Section.Profile(ID);
+ // IsEH and UseSet are specific to the Label/Section that we will emit
+ // the offset for; so Label/Section are enough for uniqueness.
+ }
+ virtual void Profile(FoldingSetNodeID &ID) { Profile(ID, Label, Section); }
+
+#ifndef NDEBUG
+ virtual void print(std::ostream &O) {
+ O << "Off: ";
+ Label.print(O);
+ O << "-";
+ Section.print(O);
+ O << "-" << IsEH << "-" << UseSet;
+ }
+#endif
+};
+
//===----------------------------------------------------------------------===//
/// DIEDelta - A simple label difference DIE.
///
///
AsmPrinter *Asm;
- /// TAI - Target Asm Printer.
+ /// TAI - Target asm information.
const TargetAsmInfo *TAI;
/// TD - Target data.
Asm->EOL("Offset");
} else if (Reg < 64) {
Asm->EmitInt8(DW_CFA_offset + Reg);
- Asm->EOL("DW_CFA_offset + Reg (" + utostr(Reg) + ")");
+ if (VerboseAsm)
+ Asm->EOL("DW_CFA_offset + Reg (" + utostr(Reg) + ")");
+ else
+ Asm->EOL();
Asm->EmitULEB128Bytes(Offset);
Asm->EOL("Offset");
} else {
Die->AddValue(Attribute, Form, Value);
}
+ /// AddSectionOffset - Add a section offset label attribute data and value.
+ ///
+ void AddSectionOffset(DIE *Die, unsigned Attribute, unsigned Form,
+ const DWLabel &Label, const DWLabel &Section,
+ bool isEH = false, bool useSet = true) {
+ FoldingSetNodeID ID;
+ DIESectionOffset::Profile(ID, Label, Section);
+ void *Where;
+ DIEValue *Value = ValuesSet.FindNodeOrInsertPos(ID, Where);
+ if (!Value) {
+ Value = new DIESectionOffset(Label, Section, isEH, useSet);
+ ValuesSet.InsertNode(Value, Where);
+ Values.push_back(Value);
+ }
+
+ Die->AddValue(Attribute, Form, Value);
+ }
+
/// AddDelta - Add a label delta attribute data and value.
///
void AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID) {
// Construct debug information entry.
DIE *Die = new DIE(DW_TAG_compile_unit);
- if (TAI->isAbsoluteDebugSectionOffsets())
- AddLabel(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0));
- else
- AddDelta(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0),
- DWLabel("section_line", 0));
+ AddSectionOffset(Die, DW_AT_stmt_list, DW_FORM_data4,
+ DWLabel("section_line", 0), DWLabel("section_line", 0), false);
AddString(Die, DW_AT_producer, DW_FORM_string, UnitDesc->getProducer());
AddUInt (Die, DW_AT_language, DW_FORM_data1, UnitDesc->getLanguage());
AddString(Die, DW_AT_name, DW_FORM_string, UnitDesc->getFileName());
// Emit the code (index) for the abbreviation.
Asm->EmitULEB128Bytes(AbbrevNumber);
- Asm->EOL(std::string("Abbrev [" +
- utostr(AbbrevNumber) +
- "] 0x" + utohexstr(Die->getOffset()) +
- ":0x" + utohexstr(Die->getSize()) + " " +
- TagString(Abbrev->getTag())));
+
+ if (VerboseAsm)
+ Asm->EOL(std::string("Abbrev [" +
+ utostr(AbbrevNumber) +
+ "] 0x" + utohexstr(Die->getOffset()) +
+ ":0x" + utohexstr(Die->getSize()) + " " +
+ TagString(Abbrev->getTag())));
+ else
+ Asm->EOL();
- std::vector<DIEValue *> &Values = Die->getValues();
- const std::vector<DIEAbbrevData> &AbbrevData = Abbrev->getData();
+ SmallVector<DIEValue*, 32> &Values = Die->getValues();
+ const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
// Emit the DIE attribute values.
for (unsigned i = 0, N = Values.size(); i < N; ++i) {
// Start the size with the size of abbreviation code.
Offset += Asm->SizeULEB128(AbbrevNumber);
- const std::vector<DIEValue *> &Values = Die->getValues();
- const std::vector<DIEAbbrevData> &AbbrevData = Abbrev->getData();
+ const SmallVector<DIEValue*, 32> &Values = Die->getValues();
+ const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
// Size the DIE attribute values.
for (unsigned i = 0, N = Values.size(); i < N; ++i) {
Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
const UniqueVector<std::string> &Directories = MMI->getDirectories();
- const UniqueVector<SourceFileInfo>
- &SourceFiles = MMI->getSourceFiles();
+ const UniqueVector<SourceFileInfo> &SourceFiles = MMI->getSourceFiles();
// Emit directories.
for (unsigned DirectoryID = 1, NDID = Directories.size();
for (unsigned j = 0, M = SectionSourceLines.size(); j < M; ++j) {
// Isolate current sections line info.
const std::vector<SourceLineInfo> &LineInfos = SectionSourceLines[j];
-
- Asm->EOL(std::string("Section ") + SectionMap[j + 1]);
+
+ if (VerboseAsm)
+ Asm->EOL(std::string("Section ") + SectionMap[j + 1]);
+ else
+ Asm->EOL();
// Dwarf assumes we start with first line of first source file.
unsigned Source = 1;
unsigned SourceID = LineInfo.getSourceID();
const SourceFileInfo &SourceFile = SourceFiles[SourceID];
unsigned DirectoryID = SourceFile.getDirectoryID();
- Asm->EOL(Directories[DirectoryID]
- + SourceFile.getName()
- + ":"
- + utostr_32(LineInfo.getLine()));
+ if (VerboseAsm)
+ Asm->EOL(Directories[DirectoryID]
+ + SourceFile.getName()
+ + ":"
+ + utostr_32(LineInfo.getLine()));
+ else
+ Asm->EOL();
// Define the line address.
Asm->EmitInt8(0); Asm->EOL("Extended Op");
/// ConstructGlobalDIEs - Create DIEs for each of the externally visible
/// global variables.
void ConstructGlobalDIEs() {
- std::vector<GlobalVariableDesc *> GlobalVariables =
- MMI->getAnchoredDescriptors<GlobalVariableDesc>(*M);
+ std::vector<GlobalVariableDesc *> GlobalVariables;
+ MMI->getAnchoredDescriptors<GlobalVariableDesc>(*M, GlobalVariables);
for (unsigned i = 0, N = GlobalVariables.size(); i < N; ++i) {
GlobalVariableDesc *GVD = GlobalVariables[i];
/// ConstructSubprogramDIEs - Create DIEs for each of the externally visible
/// subprograms.
void ConstructSubprogramDIEs() {
- std::vector<SubprogramDesc *> Subprograms =
- MMI->getAnchoredDescriptors<SubprogramDesc>(*M);
+ std::vector<SubprogramDesc *> Subprograms;
+ MMI->getAnchoredDescriptors<SubprogramDesc>(*M, Subprograms);
for (unsigned i = 0, N = Subprograms.size(); i < N; ++i) {
SubprogramDesc *SPD = Subprograms[i];
/// content.
void BeginModule(Module *M) {
this->M = M;
-
- if (!ShouldEmitDwarf()) return;
}
/// EndModule - Emit all Dwarf sections that should come after the content.
I != E; ++I) {
for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end();
MI != E; ++MI) {
- if (MI->getOpcode() != TargetInstrInfo::LABEL) {
+ if (!MI->isLabel()) {
SawPotentiallyThrowing |= MI->getDesc().isCall();
continue;
}
// Try to merge with the previous call-site.
if (PreviousIsInvoke) {
- CallSiteEntry &Prev = CallSites[CallSites.size()-1];
+ CallSiteEntry &Prev = CallSites.back();
if (Site.PadLabel == Prev.PadLabel && Site.Action == Prev.Action) {
// Extend the range of the previous entry.
Prev.EndLabel = Site.EndLabel;
shouldEmitTable = true;
// See if we need frame move info.
- if (MMI->hasDebugInfo() ||
- !MF->getFunction()->doesNotThrow() ||
- UnwindTablesMandatory)
+ if (!MF->getFunction()->doesNotThrow() || UnwindTablesMandatory)
shouldEmitMoves = true;
if (shouldEmitMoves || shouldEmitTable)
//===----------------------------------------------------------------------===//
+/// EmitValue - Emit delta value.
+///
+void DIESectionOffset::EmitValue(DwarfDebug &DD, unsigned Form) {
+ bool IsSmall = Form == DW_FORM_data4;
+ DD.EmitSectionOffset(Label.Tag, Section.Tag,
+ Label.Number, Section.Number, IsSmall, IsEH, UseSet);
+}
+
+/// SizeOf - Determine size of delta value in bytes.
+///
+unsigned DIESectionOffset::SizeOf(const DwarfDebug &DD, unsigned Form) const {
+ if (Form == DW_FORM_data4) return 4;
+ return DD.getTargetData()->getPointerSize();
+}
+
+//===----------------------------------------------------------------------===//
+
/// EmitValue - Emit delta value.
///
void DIEDelta::EmitValue(DwarfDebug &DD, unsigned Form) {
///
unsigned DIEBlock::ComputeSize(DwarfDebug &DD) {
if (!Size) {
- const std::vector<DIEAbbrevData> &AbbrevData = Abbrev.getData();
+ const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData();
for (unsigned i = 0, N = Values.size(); i < N; ++i) {
Size += Values[i]->SizeOf(DD, AbbrevData[i].getForm());
default: assert(0 && "Improper form for block"); break;
}
- const std::vector<DIEAbbrevData> &AbbrevData = Abbrev.getData();
+ const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev.getData();
for (unsigned i = 0, N = Values.size(); i < N; ++i) {
DD.getAsm()->EOL();
}
O << "\n";
- const std::vector<DIEAbbrevData> &Data = Abbrev.getData();
+ const SmallVector<DIEAbbrevData, 8> &Data = Abbrev.getData();
IndentCount += 2;
for (unsigned i = 0, N = Data.size(); i < N; ++i) {