[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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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