garvitgupta08 created this revision. garvitgupta08 added reviewers: apazos, efriedma, MaskRay, nickdesaulniers. Herald added a project: All. garvitgupta08 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
D136309 <https://reviews.llvm.org/D136309> and D136707 <https://reviews.llvm.org/D136707> are 2 differentials that pass -g and -gdwarf-* to assembler when -fno-integrated-as is used. Due to this we started seeing assembler errors with certain .c and .cpp files - "Error: file number 1 already allocated" This is because the debug info generated at the source code level is conflicting with the debug info generated by assembler as mentioned in the gcc bug report - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=35925 This patch solves the above failure by passing -g and -gdwarf-* flags to assembler only when the source code is assembly, otherwise just generate the debug info at the source code level. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D145726 Files: clang/lib/Driver/ToolChains/Gnu.cpp clang/test/Driver/as-options.c clang/test/Driver/as-options.cpp Index: clang/test/Driver/as-options.cpp =================================================================== --- /dev/null +++ clang/test/Driver/as-options.cpp @@ -0,0 +1,11 @@ +// Test that -g and -gdwarf-* are not passed through to GAS. +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g \ +// RUN: -fdebug-default-version=4 -c %s -### 2>&1 | FileCheck --check-prefix=DEBUG %s +// DEBUG-NOT: "-g" +// DEBUG-NOT: "-gdwarf-4" Index: clang/test/Driver/as-options.c =================================================================== --- /dev/null +++ clang/test/Driver/as-options.c @@ -0,0 +1,11 @@ +// Test that -g and -gdwarf-* are not passed through to GAS. +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g \ +// RUN: -fdebug-default-version=4 -c %s -### 2>&1 | FileCheck --check-prefix=DEBUG %s +// DEBUG-NOT: "-g" +// DEBUG-NOT: "-gdwarf-4" Index: clang/lib/Driver/ToolChains/Gnu.cpp =================================================================== --- clang/lib/Driver/ToolChains/Gnu.cpp +++ clang/lib/Driver/ToolChains/Gnu.cpp @@ -969,19 +969,23 @@ CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); - for (const auto &II : Inputs) + for (const auto &II : Inputs) { CmdArgs.push_back(II.getFilename()); - - if (Arg *A = Args.getLastArg(options::OPT_g_Flag, options::OPT_gN_Group, - options::OPT_gdwarf_2, options::OPT_gdwarf_3, - options::OPT_gdwarf_4, options::OPT_gdwarf_5, - options::OPT_gdwarf)) - if (!A->getOption().matches(options::OPT_g0)) { - Args.AddLastArg(CmdArgs, options::OPT_g_Flag); - - unsigned DwarfVersion = getDwarfVersion(getToolChain(), Args); - CmdArgs.push_back(Args.MakeArgString("-gdwarf-" + Twine(DwarfVersion))); - } + StringRef BaseInput = StringRef(II.getBaseInput()); + types::ID InputType = types::lookupTypeForExtension( + llvm::sys::path::extension(BaseInput).drop_front()); + if (InputType == types::TY_Asm || InputType == types::TY_PP_Asm) + if (Arg *A = Args.getLastArg(options::OPT_g_Flag, options::OPT_gN_Group, + options::OPT_gdwarf_2, options::OPT_gdwarf_3, + options::OPT_gdwarf_4, options::OPT_gdwarf_5, + options::OPT_gdwarf)) + if (!A->getOption().matches(options::OPT_g0)) { + Args.AddLastArg(CmdArgs, options::OPT_g_Flag); + unsigned DwarfVersion = getDwarfVersion(getToolChain(), Args); + CmdArgs.push_back( + Args.MakeArgString("-gdwarf-" + Twine(DwarfVersion))); + } + } const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(DefaultAssembler));
Index: clang/test/Driver/as-options.cpp =================================================================== --- /dev/null +++ clang/test/Driver/as-options.cpp @@ -0,0 +1,11 @@ +// Test that -g and -gdwarf-* are not passed through to GAS. +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g \ +// RUN: -fdebug-default-version=4 -c %s -### 2>&1 | FileCheck --check-prefix=DEBUG %s +// DEBUG-NOT: "-g" +// DEBUG-NOT: "-gdwarf-4" Index: clang/test/Driver/as-options.c =================================================================== --- /dev/null +++ clang/test/Driver/as-options.c @@ -0,0 +1,11 @@ +// Test that -g and -gdwarf-* are not passed through to GAS. +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -gdwarf-4 -g -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=arm-linux-gnueabi -fno-integrated-as -g \ +// RUN: -fdebug-default-version=4 -c %s -### 2>&1 | FileCheck --check-prefix=DEBUG %s +// DEBUG-NOT: "-g" +// DEBUG-NOT: "-gdwarf-4" Index: clang/lib/Driver/ToolChains/Gnu.cpp =================================================================== --- clang/lib/Driver/ToolChains/Gnu.cpp +++ clang/lib/Driver/ToolChains/Gnu.cpp @@ -969,19 +969,23 @@ CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); - for (const auto &II : Inputs) + for (const auto &II : Inputs) { CmdArgs.push_back(II.getFilename()); - - if (Arg *A = Args.getLastArg(options::OPT_g_Flag, options::OPT_gN_Group, - options::OPT_gdwarf_2, options::OPT_gdwarf_3, - options::OPT_gdwarf_4, options::OPT_gdwarf_5, - options::OPT_gdwarf)) - if (!A->getOption().matches(options::OPT_g0)) { - Args.AddLastArg(CmdArgs, options::OPT_g_Flag); - - unsigned DwarfVersion = getDwarfVersion(getToolChain(), Args); - CmdArgs.push_back(Args.MakeArgString("-gdwarf-" + Twine(DwarfVersion))); - } + StringRef BaseInput = StringRef(II.getBaseInput()); + types::ID InputType = types::lookupTypeForExtension( + llvm::sys::path::extension(BaseInput).drop_front()); + if (InputType == types::TY_Asm || InputType == types::TY_PP_Asm) + if (Arg *A = Args.getLastArg(options::OPT_g_Flag, options::OPT_gN_Group, + options::OPT_gdwarf_2, options::OPT_gdwarf_3, + options::OPT_gdwarf_4, options::OPT_gdwarf_5, + options::OPT_gdwarf)) + if (!A->getOption().matches(options::OPT_g0)) { + Args.AddLastArg(CmdArgs, options::OPT_g_Flag); + unsigned DwarfVersion = getDwarfVersion(getToolChain(), Args); + CmdArgs.push_back( + Args.MakeArgString("-gdwarf-" + Twine(DwarfVersion))); + } + } const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(DefaultAssembler));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits