[llvm-branch-commits] [llvm] 4fda9ab - [AIX DWARF] support aix dwarf for 32-bit assembly.
Chen Zheng via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jan 25 04:17:39 PST 2021
Author: Chen Zheng
Date: 2021-01-25T07:01:54-05:00
New Revision: 4fda9ab7444d93fa12e830975230fc4a1fdfe094
URL: https://github.com/llvm/llvm-project/commit/4fda9ab7444d93fa12e830975230fc4a1fdfe094
DIFF: https://github.com/llvm/llvm-project/commit/4fda9ab7444d93fa12e830975230fc4a1fdfe094.diff
LOG: [AIX DWARF] support aix dwarf for 32-bit assembly.
Added:
Modified:
llvm/include/llvm/MC/MCAsmInfo.h
llvm/include/llvm/MC/MCAsmStreamer.h
llvm/include/llvm/MC/MCContext.h
llvm/include/llvm/MC/MCDwarf.h
llvm/include/llvm/MC/MCSectionXCOFF.h
llvm/include/llvm/MC/MCStreamer.h
llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
llvm/lib/MC/MCAsmInfoXCOFF.cpp
llvm/lib/MC/MCAsmStreamer.cpp
llvm/lib/MC/MCContext.cpp
llvm/lib/MC/MCDwarf.cpp
llvm/lib/MC/MCObjectFileInfo.cpp
llvm/lib/MC/MCSectionXCOFF.cpp
llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h
index 98e9c2fd3607..3c7d9420d963 100644
--- a/llvm/include/llvm/MC/MCAsmInfo.h
+++ b/llvm/include/llvm/MC/MCAsmInfo.h
@@ -388,6 +388,14 @@ class MCAsmInfo {
/// absolute
diff erence.
bool DwarfFDESymbolsUseAbsDiff = false;
+ /// True if the target supports generating the DWARF line table through using
+ /// of the .loc/.file directives. Defaults to true.
+ bool UsesDwarfFileAndLocDirectives = true;
+
+ /// True if the target needs dwarf section size in the header of dwarf section
+ /// (if any) in assembly file. Defaults to true.
+ bool DwarfSectionSizeRequired = true;
+
/// True if dwarf register numbers are printed instead of symbolic register
/// names in .cfi_* directives. Defaults to false.
bool DwarfRegNumForCFI = false;
@@ -667,6 +675,14 @@ class MCAsmInfo {
return SupportsExtendedDwarfLocDirective;
}
+ bool usesDwarfFileAndLocDirectives() const {
+ return UsesDwarfFileAndLocDirectives;
+ }
+
+ bool requiredDwarfSectionSize() const {
+ return DwarfSectionSizeRequired;
+ }
+
void addInitialFrameState(const MCCFIInstruction &Inst);
const std::vector<MCCFIInstruction> &getInitialFrameState() const {
diff --git a/llvm/include/llvm/MC/MCAsmStreamer.h b/llvm/include/llvm/MC/MCAsmStreamer.h
index 5b2f407841e5..3bb845c40b43 100644
--- a/llvm/include/llvm/MC/MCAsmStreamer.h
+++ b/llvm/include/llvm/MC/MCAsmStreamer.h
@@ -367,6 +367,9 @@ class MCAsmStreamer final : public MCStreamer {
void emitRawTextImpl(StringRef String) override;
void finishImpl() override;
+ void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel,
+ const MCSymbol *Label,
+ unsigned PointerSize) override;
};
} // end anonymous namespace.
diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h
index 49ab0ce8d6fd..1c31fdfc4165 100644
--- a/llvm/include/llvm/MC/MCContext.h
+++ b/llvm/include/llvm/MC/MCContext.h
@@ -574,7 +574,8 @@ namespace llvm {
XCOFF::StorageMappingClass MappingClass,
XCOFF::SymbolType CSectType, SectionKind K,
bool MultiSymbolsAllowed = false,
- const char *BeginSymName = nullptr);
+ const char *BeginSymName = nullptr,
+ unsigned SecFlags = 0);
// Create and save a copy of STI and return a reference to the copy.
MCSubtargetInfo &getSubtargetCopy(const MCSubtargetInfo &STI);
diff --git a/llvm/include/llvm/MC/MCDwarf.h b/llvm/include/llvm/MC/MCDwarf.h
index 70da5f76e766..715035203cbc 100644
--- a/llvm/include/llvm/MC/MCDwarf.h
+++ b/llvm/include/llvm/MC/MCDwarf.h
@@ -172,7 +172,7 @@ class MCDwarfLineEntry : public MCDwarfLoc {
// This is called when an instruction is assembled into the specified
// section and if there is information from the last .loc directive that
// has yet to have a line entry made for it is made.
- static void Make(MCObjectStreamer *MCOS, MCSection *Section);
+ static void Make(MCStreamer *MCOS, MCSection *Section);
};
/// Instances of this class represent the line information for a compile
@@ -310,10 +310,10 @@ class MCDwarfLineTable {
public:
// This emits the Dwarf file and the line tables for all Compile Units.
- static void Emit(MCObjectStreamer *MCOS, MCDwarfLineTableParams Params);
+ static void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params);
// This emits the Dwarf file and the line tables for a given Compile Unit.
- void EmitCU(MCObjectStreamer *MCOS, MCDwarfLineTableParams Params,
+ void EmitCU(MCStreamer *MCOS, MCDwarfLineTableParams Params,
Optional<MCDwarfLineStr> &LineStr) const;
Expected<unsigned> tryGetFile(StringRef &Directory, StringRef &FileName,
diff --git a/llvm/include/llvm/MC/MCSectionXCOFF.h b/llvm/include/llvm/MC/MCSectionXCOFF.h
index aa39dff07180..9d9c69f175dc 100644
--- a/llvm/include/llvm/MC/MCSectionXCOFF.h
+++ b/llvm/include/llvm/MC/MCSectionXCOFF.h
@@ -36,18 +36,20 @@ class MCSectionXCOFF final : public MCSection {
XCOFF::SymbolType Type;
MCSymbolXCOFF *const QualName;
StringRef SymbolTableName;
+ unsigned SecFlags;
bool MultiSymbolsAllowed;
static constexpr unsigned DefaultAlignVal = 4;
MCSectionXCOFF(StringRef Name, XCOFF::StorageMappingClass SMC,
XCOFF::SymbolType ST, SectionKind K, MCSymbolXCOFF *QualName,
- MCSymbol *Begin, StringRef SymbolTableName,
+ unsigned SecFlags, MCSymbol *Begin, StringRef SymbolTableName,
bool MultiSymbolsAllowed)
: MCSection(SV_XCOFF, Name, K, Begin), MappingClass(SMC), Type(ST),
QualName(QualName), SymbolTableName(SymbolTableName),
- MultiSymbolsAllowed(MultiSymbolsAllowed) {
- assert((ST == XCOFF::XTY_SD || ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) &&
- "Invalid or unhandled type for csect.");
+ SecFlags(SecFlags), MultiSymbolsAllowed(MultiSymbolsAllowed) {
+ assert(
+ (ST == XCOFF::XTY_SD || ST == XCOFF::XTY_CM || ST == XCOFF::XTY_ER) &&
+ "Invalid or unhandled type for csect.");
assert(QualName != nullptr && "QualName is needed.");
QualName->setRepresentedCsect(this);
QualName->setStorageClass(XCOFF::C_HIDEXT);
@@ -79,6 +81,7 @@ class MCSectionXCOFF final : public MCSection {
bool isVirtualSection() const override;
StringRef getSymbolTableName() const { return SymbolTableName; }
bool isMultiSymbolsAllowed() const { return MultiSymbolsAllowed; }
+ unsigned getSecFlags() const { return SecFlags; }
};
} // end namespace llvm
diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h
index cf27c0e89f0c..6d0473196e21 100644
--- a/llvm/include/llvm/MC/MCStreamer.h
+++ b/llvm/include/llvm/MC/MCStreamer.h
@@ -1092,6 +1092,14 @@ class MCStreamer {
void Finish(SMLoc EndLoc = SMLoc());
virtual bool mayHaveInstructions(MCSection &Sec) const { return true; }
+
+ /// If targets does not support representing debug line section by .loc/.file
+ /// directives in assembly output, we need to populate debug line section with
+ /// raw debug line contents.
+ virtual void emitDwarfAdvanceLineAddr(int64_t LineDelta,
+ const MCSymbol *LastLabel,
+ const MCSymbol *Label,
+ unsigned PointerSize) {}
};
/// Create a dummy machine code streamer, which does nothing. This is useful for
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
index c6e43445e7d0..8fb21a63d463 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
@@ -18,6 +18,7 @@
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCAsmStreamer.h"
#include "llvm/MC/MCDwarf.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/MC/MCSection.h"
@@ -207,6 +208,12 @@ void AsmPrinter::maybeEmitDwarf64Mark() const {
void AsmPrinter::emitDwarfUnitLength(uint64_t Length,
const Twine &Comment) const {
+ // If the assembler on some targets will fill the dwarf unit length, we
+ // don't need to emit the length in compiler. For exmaple AIX assembler
+ // requires the assembly file without unit length in debug sections header.
+ if (!OutStreamer->getContext().getAsmInfo()->requiredDwarfSectionSize() &&
+ isa<MCAsmStreamer>(OutStreamer))
+ return;
assert(isDwarf64() || Length <= dwarf::DW_LENGTH_lo_reserved);
maybeEmitDwarf64Mark();
OutStreamer->AddComment(Comment);
@@ -215,6 +222,12 @@ void AsmPrinter::emitDwarfUnitLength(uint64_t Length,
void AsmPrinter::emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo,
const Twine &Comment) const {
+ // If the assembler on some targets will fill the dwarf unit length, we
+ // don't need to emit the length in compiler. For exmaple AIX assembler
+ // requires the assembly file without unit length in debug sections header.
+ if (!OutStreamer->getContext().getAsmInfo()->requiredDwarfSectionSize() &&
+ isa<MCAsmStreamer>(OutStreamer))
+ return;
maybeEmitDwarf64Mark();
OutStreamer->AddComment(Comment);
OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, getDwarfOffsetByteSize());
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index befc4bba19a2..61bc7da773d7 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -27,6 +27,7 @@
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/GlobalVariable.h"
+#include "llvm/MC/MCAsmStreamer.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
@@ -356,14 +357,32 @@ void DwarfCompileUnit::initStmtList() {
// left in the skeleton CU and so not included.
// The line table entries are not always emitted in assembly, so it
// is not okay to use line_table_start here.
- addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
- TLOF.getDwarfLineSection()->getBeginSymbol());
+ // If the assembler on some targets will fill the dwarf unit length, we
+ // don't need to emit the length in compiler. For exmaple AIX assembler
+ // requires an assembly file without unit length in debug sections header.
+ // We need to adjust the reference here to contain the assembler insertion
+ // length.
+ MCContext &Ctx = Asm->OutStreamer->getContext();
+ if (!Ctx.getAsmInfo()->requiredDwarfSectionSize() &&
+ isa<MCAsmStreamer>(Asm->OutStreamer))
+ addLabelPlusOffset(
+ getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
+ -dwarf::getUnitLengthFieldByteSize(Ctx.getDwarfFormat()));
+ else
+ addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
+ TLOF.getDwarfLineSection()->getBeginSymbol());
}
void DwarfCompileUnit::applyStmtList(DIE &D) {
- const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
- addSectionLabel(D, dwarf::DW_AT_stmt_list, LineTableStartSym,
- TLOF.getDwarfLineSection()->getBeginSymbol());
+ MCContext &Ctx = Asm->OutStreamer->getContext();
+ if (!Ctx.getAsmInfo()->requiredDwarfSectionSize() && isa<MCAsmStreamer>(Asm->OutStreamer))
+ addLabelPlusOffset(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
+ -dwarf::getUnitLengthFieldByteSize(Ctx.getDwarfFormat()));
+ else {
+ const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
+ addSectionLabel(D, dwarf::DW_AT_stmt_list, LineTableStartSym,
+ TLOF.getDwarfLineSection()->getBeginSymbol());
+ }
}
void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin,
diff --git a/llvm/lib/MC/MCAsmInfoXCOFF.cpp b/llvm/lib/MC/MCAsmInfoXCOFF.cpp
index 2f8bc6a49bb7..a23a71b865b4 100644
--- a/llvm/lib/MC/MCAsmInfoXCOFF.cpp
+++ b/llvm/lib/MC/MCAsmInfoXCOFF.cpp
@@ -23,6 +23,8 @@ MCAsmInfoXCOFF::MCAsmInfoXCOFF() {
PrivateLabelPrefix = "L..";
SupportsQuotedNames = false;
UseDotAlignForAlignment = true;
+ UsesDwarfFileAndLocDirectives = false;
+ DwarfSectionSizeRequired = false;
if (UseLEB128Directives == cl::BOU_UNSET)
HasLEB128Directives = false;
ZeroDirective = "\t.space\t";
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 77c5f409789a..5185e66dd171 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -1070,6 +1070,10 @@ Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
if (NumFiles == Table.getMCDwarfFiles().size())
return FileNo;
+ // Target doesn't support .loc/.file directives, return early.
+ if (!MAI->usesDwarfFileAndLocDirectives())
+ return FileNo;
+
SmallString<128> Str;
raw_svector_ostream OS1(Str);
printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source,
@@ -1096,6 +1100,10 @@ void MCAsmStreamer::emitDwarfFile0Directive(StringRef Directory,
getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
Source);
+ // Target doesn't support .loc/.file directives, return early.
+ if (!MAI->usesDwarfFileAndLocDirectives())
+ return;
+
SmallString<128> Str;
raw_svector_ostream OS1(Str);
printDwarfFileDirective(0, Directory, Filename, Checksum, Source,
@@ -1111,6 +1119,20 @@ void MCAsmStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
unsigned Column, unsigned Flags,
unsigned Isa, unsigned Discriminator,
StringRef FileName) {
+ // If target doesn't support .loc/.file directive, we need to record the lines
+ // same way like we do in object mode.
+ if (!MAI->usesDwarfFileAndLocDirectives()) {
+ if (!getContext().getDwarfLocSeen())
+ // This is the very start of the file, set the initial line number to 1.
+ // We need this because in assembly mode, we will not record new line when
+ // we emit a new instruction. See MCAsmStreamer::emitInstruction.
+ this->MCStreamer::emitDwarfLocDirective(FileNo, 1, 0, 0, 0, 0, FileName);
+ MCDwarfLineEntry::Make(this, getCurrentSectionOnly());
+ this->MCStreamer::emitDwarfLocDirective(FileNo, Line, Column, Flags, Isa,
+ Discriminator, FileName);
+ return;
+ }
+
OS << "\t.loc\t" << FileNo << " " << Line << " " << Column;
if (MAI->supportsExtendedDwarfLocDirective()) {
if (Flags & DWARF2_FLAG_BASIC_BLOCK)
@@ -1845,6 +1867,13 @@ void MCAsmStreamer::finishImpl() {
if (getContext().getGenDwarfForAssembly())
MCGenDwarfInfo::Emit(this);
+ // Now it is time to emit debug line sections if target doesn't support .loc
+ // and .line directives.
+ if (!MAI->usesDwarfFileAndLocDirectives()) {
+ MCDwarfLineTable::Emit(this, getAssembler().getDWARFLinetableParams());
+ return;
+ }
+
// Emit the label for the line table, if requested - since the rest of the
// line table will be defined by .loc/.file directives, and not emitted
// directly, the label is the only work required here.
@@ -1858,6 +1887,43 @@ void MCAsmStreamer::finishImpl() {
}
}
+// Generate dwarf line sections for assembly mode without .loc/.file
+void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
+ const MCSymbol *LastLabel,
+ const MCSymbol *Label,
+ unsigned PointerSize) {
+ assert(!MAI->usesDwarfFileAndLocDirectives() &&
+ ".loc/.file don't need raw data in debug line section!");
+ if (!LastLabel) {
+ // set to CU beginning.
+ emitIntValue(dwarf::DW_LNS_extended_op, 1);
+ emitULEB128IntValue(PointerSize + 1);
+ emitIntValue(dwarf::DW_LNE_set_address, 1);
+ emitSymbolValue(Label, PointerSize);
+ return;
+ }
+
+ // INT64_MAX is a signal of the end of the section. Emit DW_LNE_end_sequence
+ // for the end of the section.
+ if (LineDelta == INT64_MAX) {
+ emitIntValue(0, 1);
+ emitULEB128IntValue(1);
+ emitIntValue(dwarf::DW_LNE_end_sequence, 1);
+ return;
+ }
+
+ // advance line.
+ emitIntValue(dwarf::DW_LNS_advance_line, 1);
+ emitSLEB128IntValue(LineDelta);
+ emitIntValue(dwarf::DW_LNS_copy, 1);
+
+ // set new address to new label.
+ emitIntValue(dwarf::DW_LNS_extended_op, 1);
+ emitULEB128IntValue(PointerSize + 1);
+ emitIntValue(dwarf::DW_LNE_set_address, 1);
+ emitSymbolValue(Label, PointerSize);
+}
+
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
std::unique_ptr<formatted_raw_ostream> OS,
bool isVerboseAsm, bool useDwarfDirectory,
diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp
index 9dab8a6c0910..afbd4c27cd6c 100644
--- a/llvm/lib/MC/MCContext.cpp
+++ b/llvm/lib/MC/MCContext.cpp
@@ -669,7 +669,8 @@ MCSectionWasm *MCContext::getWasmSection(const Twine &Section, SectionKind Kind,
MCSectionXCOFF *
MCContext::getXCOFFSection(StringRef Section, XCOFF::StorageMappingClass SMC,
XCOFF::SymbolType Type, SectionKind Kind,
- bool MultiSymbolsAllowed, const char *BeginSymName) {
+ bool MultiSymbolsAllowed, const char *BeginSymName,
+ unsigned SecFlags) {
// Do the lookup. If we have a hit, return it.
auto IterBool = XCOFFUniquingMap.insert(
std::make_pair(XCOFFSectionKey{Section.str(), SMC}, nullptr));
@@ -695,7 +696,7 @@ MCContext::getXCOFFSection(StringRef Section, XCOFF::StorageMappingClass SMC,
// CachedName contains invalid character(s) such as '$' for an XCOFF symbol.
MCSectionXCOFF *Result = new (XCOFFAllocator.Allocate())
MCSectionXCOFF(QualName->getUnqualifiedName(), SMC, Type, Kind, QualName,
- Begin, CachedName, MultiSymbolsAllowed);
+ SecFlags, Begin, CachedName, MultiSymbolsAllowed);
Entry.second = Result;
auto *F = new MCDataFragment();
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index 12a7d9b6e589..ecd01d5e38cf 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -24,6 +24,7 @@
#include "llvm/MC/MCObjectFileInfo.h"
#include "llvm/MC/MCObjectStreamer.h"
#include "llvm/MC/MCRegisterInfo.h"
+#include "llvm/MC/MCAsmStreamer.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCSymbol.h"
@@ -105,7 +106,7 @@ static inline uint64_t ScaleAddrDelta(MCContext &Context, uint64_t AddrDelta) {
// and if there is information from the last .loc directive that has yet to have
// a line entry made for it is made.
//
-void MCDwarfLineEntry::Make(MCObjectStreamer *MCOS, MCSection *Section) {
+void MCDwarfLineEntry::Make(MCStreamer *MCOS, MCSection *Section) {
if (!MCOS->getContext().getDwarfLocSeen())
return;
@@ -163,7 +164,7 @@ makeStartPlusIntExpr(MCContext &Ctx, const MCSymbol &Start, int IntVal) {
// in the LineSection.
//
static inline void emitDwarfLineTable(
- MCObjectStreamer *MCOS, MCSection *Section,
+ MCStreamer *MCOS, MCSection *Section,
const MCLineSection::MCDwarfLineEntryCollection &LineEntries) {
unsigned FileNum = 1;
unsigned LastLine = 1;
@@ -173,6 +174,9 @@ static inline void emitDwarfLineTable(
unsigned Discriminator = 0;
MCSymbol *LastLabel = nullptr;
+ const MCAsmInfo *AsmInfo = MCOS->getContext().getAsmInfo();
+ unsigned PointerSize = AsmInfo->getCodePointerSize();
+
// Loop through each MCDwarfLineEntry and encode the dwarf line number table.
for (const MCDwarfLineEntry &LineEntry : LineEntries) {
int64_t LineDelta = static_cast<int64_t>(LineEntry.getLine()) - LastLine;
@@ -217,15 +221,24 @@ static inline void emitDwarfLineTable(
// At this point we want to emit/create the sequence to encode the delta in
// line numbers and the increment of the address from the previous Label
// and the current Label.
- const MCAsmInfo *asmInfo = MCOS->getContext().getAsmInfo();
- MCOS->emitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label,
- asmInfo->getCodePointerSize());
+ MCOS->emitDwarfAdvanceLineAddr(LineDelta, LastLabel, Label, PointerSize);
Discriminator = 0;
LastLine = LineEntry.getLine();
LastLabel = Label;
}
+ // Directly add DW_LNE_end_sequence if we generate debug line section for
+ // not .loc/.file and assembly mode.
+ if (!AsmInfo->usesDwarfFileAndLocDirectives() && isa<MCAsmStreamer>(MCOS)) {
+ MCSymbol *Sym = Section->getEndSymbol(MCOS->getContext());
+ if (!Sym->isInSection())
+ MCOS->emitLabel(Sym);
+
+ MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, Sym, PointerSize);
+ return;
+ }
+
// Emit a DW_LNE_end_sequence for the end of the section.
// Use the section end label to compute the address delta and use INT64_MAX
// as the line delta which is the signal that this is actually a
@@ -237,16 +250,13 @@ static inline void emitDwarfLineTable(
MCContext &Ctx = MCOS->getContext();
MCOS->SwitchSection(Ctx.getObjectFileInfo()->getDwarfLineSection());
- const MCAsmInfo *AsmInfo = Ctx.getAsmInfo();
- MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
- AsmInfo->getCodePointerSize());
+ MCOS->emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd, PointerSize);
}
//
// This emits the Dwarf file and the line tables.
//
-void MCDwarfLineTable::Emit(MCObjectStreamer *MCOS,
- MCDwarfLineTableParams Params) {
+void MCDwarfLineTable::Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params) {
MCContext &context = MCOS->getContext();
auto &LineTables = context.getMCDwarfLineTables();
@@ -481,24 +491,32 @@ MCDwarfLineTableHeader::Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params,
dwarf::getUnitLengthFieldByteSize(context.getDwarfFormat());
unsigned OffsetSize = dwarf::getDwarfOffsetByteSize(context.getDwarfFormat());
- if (context.getDwarfFormat() == dwarf::DWARF64)
- // Emit DWARF64 mark.
- MCOS->emitInt32(dwarf::DW_LENGTH_DWARF64);
-
- // The length field does not include itself and, in case of the 64-bit DWARF
- // format, the DWARF64 mark.
- emitAbsValue(*MCOS,
- makeEndMinusStartExpr(context, *LineStartSym, *LineEndSym,
- UnitLengthBytes),
- OffsetSize);
+ // Keep track of the bytes between the very start and where the header length
+ // comes out.
+ unsigned PreHeaderLengthBytes = 0;
+
+ // If the assembler on some targets will fill the dwarf unit length, we
+ // don't need to emit the length in compiler. For exmaple AIX assembler
+ // requires the assembly file without unit length in debug sections header.
+ if (!(!MCOS->getContext().getAsmInfo()->requiredDwarfSectionSize() &&
+ isa<MCAsmStreamer>(MCOS))) {
+ if (context.getDwarfFormat() == dwarf::DWARF64)
+ // Emit DWARF64 mark.
+ MCOS->emitInt32(dwarf::DW_LENGTH_DWARF64);
+
+ // The length field does not include itself and, in case of the 64-bit DWARF
+ // format, the DWARF64 mark.
+ emitAbsValue(*MCOS,
+ makeEndMinusStartExpr(context, *LineStartSym, *LineEndSym,
+ UnitLengthBytes),
+ OffsetSize);
+ PreHeaderLengthBytes += UnitLengthBytes;
+ }
// Next 2 bytes is the Version.
unsigned LineTableVersion = context.getDwarfVersion();
MCOS->emitInt16(LineTableVersion);
-
- // Keep track of the bytes between the very start and where the header length
- // comes out.
- unsigned PreHeaderLengthBytes = UnitLengthBytes + 2;
+ PreHeaderLengthBytes += 2;
// In v5, we get address info next.
if (LineTableVersion >= 5) {
@@ -547,8 +565,7 @@ MCDwarfLineTableHeader::Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params,
return std::make_pair(LineStartSym, LineEndSym);
}
-void MCDwarfLineTable::EmitCU(MCObjectStreamer *MCOS,
- MCDwarfLineTableParams Params,
+void MCDwarfLineTable::EmitCU(MCStreamer *MCOS, MCDwarfLineTableParams Params,
Optional<MCDwarfLineStr> &LineStr) const {
MCSymbol *LineEndSym = Header.Emit(MCOS, Params, LineStr).second;
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp
index 398de873fe0b..95f492fe8b40 100644
--- a/llvm/lib/MC/MCObjectFileInfo.cpp
+++ b/llvm/lib/MC/MCObjectFileInfo.cpp
@@ -898,18 +898,60 @@ void MCObjectFileInfo::initXCOFFMCObjectFileInfo(const Triple &T) {
// DWARF sections for XCOFF are not csects. They are special STYP_DWARF
// sections, and the individual DWARF sections are distinguished by their
// section subtype.
- // TODO: Populate the DWARF sections appropriately.
- DwarfAbbrevSection = nullptr; // SSUBTYP_DWABREV
- DwarfInfoSection = nullptr; // SSUBTYP_DWINFO
- DwarfLineSection = nullptr; // SSUBTYP_DWLINE
- DwarfFrameSection = nullptr; // SSUBTYP_DWFRAME
- DwarfPubNamesSection = nullptr; // SSUBTYP_DWPBNMS
- DwarfPubTypesSection = nullptr; // SSUBTYP_DWPBTYP
- DwarfStrSection = nullptr; // SSUBTYP_DWSTR
- DwarfLocSection = nullptr; // SSUBTYP_DWLOC
- DwarfARangesSection = nullptr; // SSUBTYP_DWARNGE
- DwarfRangesSection = nullptr; // SSUBTYP_DWRNGES
- DwarfMacinfoSection = nullptr; // SSUBTYP_DWMAC
+ DwarfAbbrevSection = Ctx->getXCOFFSection(
+ ".dwabrev", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwabrev",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWABREV);
+
+ DwarfInfoSection = Ctx->getXCOFFSection(
+ ".dwinfo", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwinfo",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWINFO);
+
+ DwarfLineSection = Ctx->getXCOFFSection(
+ ".dwline", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwline",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWLINE);
+
+ DwarfFrameSection = Ctx->getXCOFFSection(
+ ".dwframe", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwframe",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWFRAME);
+
+ DwarfPubNamesSection = Ctx->getXCOFFSection(
+ ".dwpbnms", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwpbnms",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWPBNMS);
+
+ DwarfPubTypesSection = Ctx->getXCOFFSection(
+ ".dwpbtyp", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwpbtyp",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWPBTYP);
+
+ DwarfStrSection = Ctx->getXCOFFSection(
+ ".dwstr", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwstr",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWSTR);
+
+ DwarfLocSection = Ctx->getXCOFFSection(
+ ".dwloc", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwloc",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWLOC);
+
+ DwarfARangesSection = Ctx->getXCOFFSection(
+ ".dwarnge", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwarnge",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWARNGE);
+
+ DwarfRangesSection = Ctx->getXCOFFSection(
+ ".dwrnges", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwrnges",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWRNGES);
+
+ DwarfMacinfoSection = Ctx->getXCOFFSection(
+ ".dwmac", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
+ SectionKind::getMetadata(), /* MultiSymbolsAllowed*/ true, ".dwmac",
+ XCOFF::STYP_DWARF | XCOFF::SSUBTYP_DWMAC);
}
void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
diff --git a/llvm/lib/MC/MCSectionXCOFF.cpp b/llvm/lib/MC/MCSectionXCOFF.cpp
index 17b7b60a04ab..a737ca4f9e70 100644
--- a/llvm/lib/MC/MCSectionXCOFF.cpp
+++ b/llvm/lib/MC/MCSectionXCOFF.cpp
@@ -9,7 +9,9 @@
#include "llvm/MC/MCSectionXCOFF.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCExpr.h"
+#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Debug.h"
using namespace llvm;
@@ -70,6 +72,16 @@ void MCSectionXCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
return;
}
+ // XCOFF debug sections.
+ if (getKind().isMetadata() && (getSecFlags() & (unsigned)XCOFF::STYP_DWARF)) {
+ OS << "\n\t.dwsect "
+ << format("0x%" PRIx32,
+ (getSecFlags() & ~((unsigned)(XCOFF::STYP_DWARF))))
+ << '\n';
+ OS << MAI.getPrivateLabelPrefix() << getName() << ':' << '\n';
+ return;
+ }
+
report_fatal_error("Printing for this SectionKind is unimplemented.");
}
diff --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp
index 2b76af279ce6..55da48a7ce51 100644
--- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp
+++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCAsmInfo.cpp
@@ -63,4 +63,10 @@ PPCXCOFFMCAsmInfo::PPCXCOFFMCAsmInfo(bool Is64Bit, const Triple &T) {
// A size of 8 is only supported by the assembler under 64-bit.
Data64bitsDirective = Is64Bit ? "\t.vbyte\t8, " : nullptr;
+
+ // Debug Information
+ SupportsDebugInformation = true;
+
+ // Set up dwarf DIRECTIVES
+ MinInstAlignment = 4;
}
More information about the llvm-branch-commits
mailing list