diff --git a/clang/include/clang/Driver/CC1AsOptions.td b/clang/include/clang/Driver/CC1AsOptions.td index 50472ffdf9cd..2643c4f0e854 100644 --- a/clang/include/clang/Driver/CC1AsOptions.td +++ b/clang/include/clang/Driver/CC1AsOptions.td @@ -29,6 +29,10 @@ def I : JoinedOrSeparate<"-I">, MetaVarName<"">, HelpText<"Add directory to include search path">; def n : Flag<"-n">, HelpText<"Don't automatically start assembly file with a text section">; +def L : Flag<"-L">, + HelpText<"Save temporary labels in the symbol table. " + "Note this may change .s semantics, it should almost never be used " + "on compiler generated code!">; //===----------------------------------------------------------------------===// // Frontend Options @@ -72,4 +76,4 @@ def relax_all : Flag<"-relax-all">, HelpText<"Relax all fixups (for performance testing)">; def no_exec_stack : Flag<"--noexecstack">, - HelpText<"Mark the file as not needing an executable stack">; \ No newline at end of file + HelpText<"Mark the file as not needing an executable stack">; diff --git a/clang/tools/driver/cc1as_main.cpp b/clang/tools/driver/cc1as_main.cpp index 643bd412bed6..0222f00dc6b8 100644 --- a/clang/tools/driver/cc1as_main.cpp +++ b/clang/tools/driver/cc1as_main.cpp @@ -71,6 +71,7 @@ struct AssemblerInvocation { std::vector IncludePaths; unsigned NoInitialTextSection : 1; + unsigned SaveTemporaryLabels : 1; /// @} /// @name Frontend Options @@ -156,6 +157,7 @@ void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, // Language Options Opts.IncludePaths = Args->getAllArgValues(OPT_I); Opts.NoInitialTextSection = Args->hasArg(OPT_n); + Opts.SaveTemporaryLabels = Args->hasArg(OPT_L); // Frontend Options if (Args->hasArg(OPT_INPUT)) { @@ -265,6 +267,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { const TargetAsmInfo *tai = new TargetAsmInfo(*TM); MCContext Ctx(*MAI, tai); + if (Opts.SaveTemporaryLabels) + Ctx.setAllowTemporaryLabels(false); OwningPtr Str;