Author: Hongtao Yu Date: 2021-01-08T12:58:38-08:00 New Revision: 0e23fd676c3984a2b867c167950464262c8e0dc6
URL: https://github.com/llvm/llvm-project/commit/0e23fd676c3984a2b867c167950464262c8e0dc6 DIFF: https://github.com/llvm/llvm-project/commit/0e23fd676c3984a2b867c167950464262c8e0dc6.diff LOG: [Driver] Add DWARF64 flag: -gdwarf64 @ikudrin enabled support for dwarf64 in D87011. Adding a clang flag so it can be used through that compilation pass. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D90507 Added: Modified: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/BackendUtil.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/test/Driver/debug-options.c Removed: ################################################################################ diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 50a778e2a328..d3851df23122 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -32,6 +32,8 @@ ENUM_CODEGENOPT(CompressDebugSections, llvm::DebugCompressionType, 2, llvm::DebugCompressionType::None) CODEGENOPT(RelaxELFRelocations, 1, 0) ///< -Wa,--mrelax-relocations CODEGENOPT(AsmVerbose , 1, 0) ///< -dA, -fverbose-asm. +CODEGENOPT(Dwarf64 , 1, 0) ///< -gdwarf64. +CODEGENOPT(Dwarf32 , 1, 1) ///< -gdwarf32. CODEGENOPT(PreserveAsmComments, 1, 1) ///< -dA, -fno-preserve-as-comments. CODEGENOPT(AssumeSaneOperatorNew , 1, 1) ///< implicit __attribute__((malloc)) operator new CODEGENOPT(Autolink , 1, 1) ///< -fno-autolink diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6585fd1ceb01..9e1059cd14f0 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2574,6 +2574,10 @@ def gdwarf_4 : Flag<["-"], "gdwarf-4">, Group<g_Group>, HelpText<"Generate source-level debug information with dwarf version 4">; def gdwarf_5 : Flag<["-"], "gdwarf-5">, Group<g_Group>, HelpText<"Generate source-level debug information with dwarf version 5">; +def gdwarf64 : Flag<["-"], "gdwarf64">, Group<g_Group>, Flags<[CC1Option]>, + HelpText<"Enables DWARF64 format for ELF binaries, if debug information emission is enabled.">; +def gdwarf32 : Flag<["-"], "gdwarf32">, Group<g_Group>, Flags<[CC1Option]>, + HelpText<"Enables DWARF32 format for ELF binaries, if debug information emission is enabled.">; def gcodeview : Flag<["-"], "gcodeview">, HelpText<"Generate CodeView debug information">, diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 296b111feb2d..90cf5fc5df9a 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -571,6 +571,7 @@ static bool initTargetOptions(DiagnosticsEngine &Diags, Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings; Options.MCOptions.MCNoWarn = CodeGenOpts.NoWarn; Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose; + Options.MCOptions.Dwarf64 = CodeGenOpts.Dwarf64; Options.MCOptions.PreserveAsmComments = CodeGenOpts.PreserveAsmComments; Options.MCOptions.ABIName = TargetOpts.ABI; for (const auto &Entry : HSOpts.UserEntries) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a462758bf1c2..d6453777200f 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4017,6 +4017,25 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D, if (DebuggerTuning == llvm::DebuggerKind::SCE) CmdArgs.push_back("-dwarf-explicit-import"); + auto *DwarfFormatArg = + Args.getLastArg(options::OPT_gdwarf64, options::OPT_gdwarf32); + if (DwarfFormatArg && + DwarfFormatArg->getOption().matches(options::OPT_gdwarf64)) { + const llvm::Triple &RawTriple = TC.getTriple(); + if (EffectiveDWARFVersion < 3) + D.Diag(diag::err_drv_argument_only_allowed_with) + << DwarfFormatArg->getAsString(Args) << "DWARFv3 or greater"; + else if (!RawTriple.isArch64Bit()) + D.Diag(diag::err_drv_argument_only_allowed_with) + << DwarfFormatArg->getAsString(Args) << "64 bit architecture"; + else if (!RawTriple.isOSBinFormatELF()) + D.Diag(diag::err_drv_argument_only_allowed_with) + << DwarfFormatArg->getAsString(Args) << "ELF platforms"; + } + + if (DwarfFormatArg) + DwarfFormatArg->render(Args, CmdArgs); + RenderDebugInfoCompressionArgs(Args, CmdArgs, D, TC); } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 6795151d08d5..dd66bf5b4efc 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -986,6 +986,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, setPGOUseInstrumentor(Opts, Opts.ProfileInstrumentUsePath); Opts.CodeModel = TargetOpts.CodeModel; + Opts.Dwarf64 = Args.hasArg(OPT_gdwarf64); if (const Arg *A = Args.getLastArg(OPT_ftime_report, OPT_ftime_report_EQ)) { Opts.TimePasses = true; diff --git a/clang/test/Driver/debug-options.c b/clang/test/Driver/debug-options.c index f4a6c72f2f82..315ce6c58008 100644 --- a/clang/test/Driver/debug-options.c +++ b/clang/test/Driver/debug-options.c @@ -374,3 +374,19 @@ // RUN: | FileCheck -check-prefix=NO_DEBUG_UNUSED_TYPES %s // NO_DEBUG_UNUSED_TYPES: "-debug-info-kind={{limited|line-tables-only|standalone}}" // NO_DEBUG_UNUSED_TYPES-NOT: "-debug-info-kind=unused-types" +// +// RUN: %clang -### -c -gdwarf-5 -gdwarf64 -target x86_64 %s 2>&1 | FileCheck -check-prefix=GDWARF64_ON %s +// RUN: %clang -### -c -gdwarf-4 -gdwarf64 -target x86_64 %s 2>&1 | FileCheck -check-prefix=GDWARF64_ON %s +// RUN: %clang -### -c -gdwarf-3 -gdwarf64 -target x86_64 %s 2>&1 | FileCheck -check-prefix=GDWARF64_ON %s +// RUN: %clang -### -c -gdwarf-2 -gdwarf64 -target x86_64 %s 2>&1 | FileCheck -check-prefix=GDWARF64_VER %s +// RUN: %clang -### -c -gdwarf-4 -gdwarf64 -target x86_64 -target x86_64 %s 2>&1 \ +// RUN: | FileCheck -check-prefix=GDWARF64_ON %s +// RUN: %clang -### -c -gdwarf-4 -gdwarf64 -target i386-linux-gnu %s 2>&1 \ +// RUN: | FileCheck -check-prefix=GDWARF64_32ARCH %s +// RUN: %clang -### -c -gdwarf-4 -gdwarf64 -target x86_64-apple-darwin %s 2>&1 \ +// RUN: | FileCheck -check-prefix=GDWARF64_ELF %s +// +// GDWARF64_ON: "-gdwarf64" +// GDWARF64_VER: error: invalid argument '-gdwarf64' only allowed with 'DWARFv3 or greater' +// GDWARF64_32ARCH: error: invalid argument '-gdwarf64' only allowed with '64 bit architecture' +// GDWARF64_ELF: error: invalid argument '-gdwarf64' only allowed with 'ELF platforms' _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits