mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-28 02:37:37 +00:00
[MC] Add --dwarf64 to generate DWARF64 debug info [1/7]
The patch adds an option `--dwarf64` to instruct a tool to generate debug information in the 64-bit DWARF format. There is no real implementation yet, only a few compatibility checks. Differential Revision: https://reviews.llvm.org/D81143
This commit is contained in:
parent
057c9c7ee0
commit
a8ec9de406
@ -185,6 +185,9 @@ namespace llvm {
|
||||
/// The maximum version of dwarf that we should emit.
|
||||
uint16_t DwarfVersion = 4;
|
||||
|
||||
/// The format of dwarf that we emit.
|
||||
dwarf::DwarfFormat DwarfFormat = dwarf::DWARF32;
|
||||
|
||||
/// Honor temporary labels, this is useful for debugging semantic
|
||||
/// differences between temporary and non-temporary labels (primarily on
|
||||
/// Darwin).
|
||||
@ -694,10 +697,8 @@ namespace llvm {
|
||||
void setDwarfDebugProducer(StringRef S) { DwarfDebugProducer = S; }
|
||||
StringRef getDwarfDebugProducer() { return DwarfDebugProducer; }
|
||||
|
||||
dwarf::DwarfFormat getDwarfFormat() const {
|
||||
// TODO: Support DWARF64
|
||||
return dwarf::DWARF32;
|
||||
}
|
||||
void setDwarfFormat(dwarf::DwarfFormat f) { DwarfFormat = f; }
|
||||
dwarf::DwarfFormat getDwarfFormat() const { return DwarfFormat; }
|
||||
|
||||
void setDwarfVersion(uint16_t v) { DwarfVersion = v; }
|
||||
uint16_t getDwarfVersion() const { return DwarfVersion; }
|
||||
|
@ -53,6 +53,7 @@ public:
|
||||
/// Preserve Comments in Assembly.
|
||||
bool PreserveAsmComments : 1;
|
||||
|
||||
bool Dwarf64 : 1;
|
||||
int DwarfVersion = 0;
|
||||
|
||||
std::string ABIName;
|
||||
|
@ -30,6 +30,8 @@ bool getIncrementalLinkerCompatible();
|
||||
|
||||
int getDwarfVersion();
|
||||
|
||||
bool getDwarf64();
|
||||
|
||||
bool getShowMCInst();
|
||||
|
||||
bool getFatalWarnings();
|
||||
|
@ -16,7 +16,7 @@ MCTargetOptions::MCTargetOptions()
|
||||
MCNoWarn(false), MCNoDeprecatedWarn(false), MCSaveTempLabels(false),
|
||||
MCUseDwarfDirectory(false), MCIncrementalLinkerCompatible(false),
|
||||
ShowMCEncoding(false), ShowMCInst(false), AsmVerbose(false),
|
||||
PreserveAsmComments(true) {}
|
||||
PreserveAsmComments(true), Dwarf64(false) {}
|
||||
|
||||
StringRef MCTargetOptions::getABIName() const {
|
||||
return ABIName;
|
||||
|
@ -38,6 +38,7 @@ using namespace llvm;
|
||||
MCOPT_EXP(bool, RelaxAll)
|
||||
MCOPT(bool, IncrementalLinkerCompatible)
|
||||
MCOPT(int, DwarfVersion)
|
||||
MCOPT(bool, Dwarf64)
|
||||
MCOPT(bool, ShowMCInst)
|
||||
MCOPT(bool, FatalWarnings)
|
||||
MCOPT(bool, NoWarn)
|
||||
@ -66,6 +67,11 @@ llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() {
|
||||
cl::init(0));
|
||||
MCBINDOPT(DwarfVersion);
|
||||
|
||||
static cl::opt<bool> Dwarf64(
|
||||
"dwarf64",
|
||||
cl::desc("Generate debugging info in the 64-bit DWARF format"));
|
||||
MCBINDOPT(Dwarf64);
|
||||
|
||||
static cl::opt<bool> ShowMCInst(
|
||||
"asm-show-inst",
|
||||
cl::desc("Emit internal instruction representation to assembly file"));
|
||||
@ -97,6 +103,7 @@ MCTargetOptions llvm::mc::InitMCTargetOptionsFromFlags() {
|
||||
MCTargetOptions Options;
|
||||
Options.MCRelaxAll = getRelaxAll();
|
||||
Options.MCIncrementalLinkerCompatible = getIncrementalLinkerCompatible();
|
||||
Options.Dwarf64 = getDwarf64();
|
||||
Options.DwarfVersion = getDwarfVersion();
|
||||
Options.ShowMCInst = getShowMCInst();
|
||||
Options.ABIName = getABIName();
|
||||
|
3
llvm/test/MC/COFF/dwarf64-err.s
Normal file
3
llvm/test/MC/COFF/dwarf64-err.s
Normal file
@ -0,0 +1,3 @@
|
||||
# RUN: not llvm-mc -dwarf64 -triple x86_64-unknown-windows-gnu %s -o - 2>&1 | FileCheck %s
|
||||
|
||||
# CHECK: the 64-bit DWARF format is not supported for x86_64-unknown-windows-gnu
|
5
llvm/test/MC/ELF/dwarf64-err.s
Normal file
5
llvm/test/MC/ELF/dwarf64-err.s
Normal file
@ -0,0 +1,5 @@
|
||||
# RUN: not llvm-mc -g -dwarf-version 2 -dwarf64 -triple x86_64 %s -o - 2>&1 | FileCheck --check-prefix=DWARF2 %s
|
||||
# RUN: not llvm-mc -g -dwarf-version 5 -dwarf64 -triple i686 %s -o - 2>&1 | FileCheck --check-prefix=I686 %s
|
||||
|
||||
# DWARF2: the 64-bit DWARF format is not supported for DWARF versions prior to 3
|
||||
# I686: the 64-bit DWARF format is only supported for 64-bit targets
|
@ -387,6 +387,31 @@ int main(int argc, char **argv) {
|
||||
return 1;
|
||||
}
|
||||
Ctx.setDwarfVersion(DwarfVersion);
|
||||
if (MCOptions.Dwarf64) {
|
||||
// The 64-bit DWARF format was introduced in DWARFv3.
|
||||
if (DwarfVersion < 3) {
|
||||
errs() << ProgName
|
||||
<< ": the 64-bit DWARF format is not supported for DWARF versions "
|
||||
"prior to 3\n";
|
||||
return 1;
|
||||
}
|
||||
// 32-bit targets don't support DWARF64, which requires 64-bit relocations.
|
||||
if (MAI->getCodePointerSize() < 8) {
|
||||
errs() << ProgName
|
||||
<< ": the 64-bit DWARF format is only supported for 64-bit "
|
||||
"targets\n";
|
||||
return 1;
|
||||
}
|
||||
// If needsDwarfSectionOffsetDirective is true, we would eventually call
|
||||
// MCStreamer::emitSymbolValue() with IsSectionRelative = true, but that
|
||||
// is supported only for 4-byte long references.
|
||||
if (MAI->needsDwarfSectionOffsetDirective()) {
|
||||
errs() << ProgName << ": the 64-bit DWARF format is not supported for "
|
||||
<< TheTriple.normalize() << "\n";
|
||||
return 1;
|
||||
}
|
||||
Ctx.setDwarfFormat(dwarf::DWARF64);
|
||||
}
|
||||
if (!DwarfDebugFlags.empty())
|
||||
Ctx.setDwarfDebugFlags(StringRef(DwarfDebugFlags));
|
||||
if (!DwarfDebugProducer.empty())
|
||||
|
Loading…
Reference in New Issue
Block a user