<div dir="ltr">So, this is fine for now as a workaround, but using backend options is pretty terrible. What we really need is a way of describing to the backend the particular options we'd like to communicate on and off programmatically without relying on cl::ParseCommandLineOptions. Currently I'm thinking of a target dependent struct that's passed along to TargetMachine creation. Other thoughts? I think Akira had mentioned a possibility of a string/string map as well.<div><div><br></div><div>-eric</div></div></div><br><div class="gmail_quote">On Sat, Apr 11, 2015 at 1:16 AM Ahmed Bougacha <<a href="mailto:ahmed.bougacha@gmail.com">ahmed.bougacha@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ab<br>
Date: Fri Apr 10 19:10:44 2015<br>
New Revision: 234668<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=234668&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=234668&view=rev</a><br>
Log:<br>
[Driver] Properly support -mglobal-merge using explicit options.<br>
<br>
Follow-up to r234666.  With this, the -m[no-]global-merge options<br>
have the expected behavior. Previously, -mglobal-merge was ignored,<br>
and there was no way of enabling the optimization.<br>
<br>
Added:<br>
    cfe/trunk/test/Driver/mglobal-merge.c<br>
      - copied, changed from r234656, cfe/trunk/test/Driver/mno-global-merge.c<br>
Removed:<br>
    cfe/trunk/test/Driver/mno-global-merge.c<br>
Modified:<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/include/clang/Frontend/CodeGenOptions.def<br>
    cfe/trunk/lib/CodeGen/BackendUtil.cpp<br>
    cfe/trunk/lib/Driver/Tools.cpp<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=234668&r1=234667&r2=234668&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=234668&r1=234667&r2=234668&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Fri Apr 10 19:10:44 2015<br>
@@ -1146,7 +1146,8 @@ def mfloat_abi_EQ : Joined<["-"], "mfloa<br>
 def mfpmath_EQ : Joined<["-"], "mfpmath=">, Group<m_Group>;<br>
 def mfpu_EQ : Joined<["-"], "mfpu=">, Group<m_Group>;<br>
 def mhwdiv_EQ : Joined<["-"], "mhwdiv=">, Group<m_Group>;<br>
-def mglobal_merge : Flag<["-"], "mglobal-merge">, Group<m_Group>;<br>
+def mglobal_merge : Flag<["-"], "mglobal-merge">, Group<m_Group>, Flags<[CC1Option]>,<br>
+  HelpText<"Enable merging of globals">;<br>
 def mhard_float : Flag<["-"], "mhard-float">, Group<m_Group>;<br>
 def miphoneos_version_min_EQ : Joined<["-"], "miphoneos-version-min=">, Group<m_Group>;<br>
 def mios_version_min_EQ : Joined<["-"], "mios-version-min=">,<br>
<br>
Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=234668&r1=234667&r2=234668&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=234668&r1=234667&r2=234668&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original)<br>
+++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Fri Apr 10 19:10:44 2015<br>
@@ -77,7 +77,6 @@ CODEGENOPT(NoExecStack       , 1, 0) ///<br>
 CODEGENOPT(FatalWarnings     , 1, 0) ///< Set when -Wa,--fatal-warnings is<br>
                                      ///< enabled.<br>
 CODEGENOPT(EnableSegmentedStacks , 1, 0) ///< Set when -fsplit-stack is enabled.<br>
-CODEGENOPT(NoGlobalMerge     , 1, 0) ///< Set when -mno-global-merge is enabled.<br>
 CODEGENOPT(NoImplicitFloat   , 1, 0) ///< Set when -mno-implicit-float is enabled.<br>
 CODEGENOPT(NoInfsFPMath      , 1, 0) ///< Assume FP arguments, results not +-Inf.<br>
 CODEGENOPT(NoSignedZeros     , 1, 0) ///< Allow ignoring the signedness of FP zero<br>
<br>
Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=234668&r1=234667&r2=234668&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=234668&r1=234667&r2=234668&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Fri Apr 10 19:10:44 2015<br>
@@ -436,8 +436,6 @@ TargetMachine *EmitAssemblyHelper::Creat<br>
     BackendArgs.push_back("-time-passes");<br>
   for (unsigned i = 0, e = CodeGenOpts.BackendOptions.size(); i != e; ++i)<br>
     BackendArgs.push_back(CodeGenOpts.BackendOptions[i].c_str());<br>
-  if (CodeGenOpts.NoGlobalMerge)<br>
-    BackendArgs.push_back("-enable-global-merge=false");<br>
   BackendArgs.push_back(nullptr);<br>
   llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,<br>
                                     BackendArgs.data());<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=234668&r1=234667&r2=234668&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=234668&r1=234667&r2=234668&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Fri Apr 10 19:10:44 2015<br>
@@ -861,12 +861,14 @@ void Clang::AddARMTargetArgs(const ArgLi<br>
     }<br>
   }<br>
<br>
-  // Setting -mno-global-merge disables the codegen global merge pass. Setting<br>
-  // -mglobal-merge has no effect as the pass is enabled by default.<br>
+  // Forward the -mglobal-merge option for explicit control over the pass.<br>
   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,<br>
                                options::OPT_mno_global_merge)) {<br>
+    CmdArgs.push_back("-backend-option");<br>
     if (A->getOption().matches(options::OPT_mno_global_merge))<br>
-      CmdArgs.push_back("-mno-global-merge");<br>
+      CmdArgs.push_back("-arm-global-merge=false");<br>
+    else<br>
+      CmdArgs.push_back("-arm-global-merge=true");<br>
   }<br>
<br>
   if (!Args.hasFlag(options::OPT_mimplicit_float,<br>
@@ -957,12 +959,14 @@ void Clang::AddAArch64TargetArgs(const A<br>
     CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");<br>
   }<br>
<br>
-  // Setting -mno-global-merge disables the codegen global merge pass. Setting<br>
-  // -mglobal-merge has no effect as the pass is enabled by default.<br>
+  // Forward the -mglobal-merge option for explicit control over the pass.<br>
   if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,<br>
                                options::OPT_mno_global_merge)) {<br>
+    CmdArgs.push_back("-backend-option");<br>
     if (A->getOption().matches(options::OPT_mno_global_merge))<br>
-      CmdArgs.push_back("-mno-global-merge");<br>
+      CmdArgs.push_back("-aarch64-global-merge=false");<br>
+    else<br>
+      CmdArgs.push_back("-aarch64-global-merge=true");<br>
   }<br>
<br>
   if (Args.hasArg(options::OPT_ffixed_x18)) {<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=234668&r1=234667&r2=234668&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=234668&r1=234667&r2=234668&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri Apr 10 19:10:44 2015<br>
@@ -455,7 +455,6 @@ static bool ParseCodeGenArgs(CodeGenOpti<br>
   Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);<br>
   Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);<br>
   Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags);<br>
-  Opts.NoGlobalMerge = Args.hasArg(OPT_mno_global_merge);<br>
   Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);<br>
   Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);<br>
   Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks);<br>
<br>
Copied: cfe/trunk/test/Driver/mglobal-merge.c (from r234656, cfe/trunk/test/Driver/mno-global-merge.c)<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/mglobal-merge.c?p2=cfe/trunk/test/Driver/mglobal-merge.c&p1=cfe/trunk/test/Driver/mno-global-merge.c&r1=234656&r2=234668&rev=234668&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/mglobal-merge.c?p2=cfe/trunk/test/Driver/mglobal-merge.c&p1=cfe/trunk/test/Driver/mno-global-merge.c&r1=234656&r2=234668&rev=234668&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Driver/mno-global-merge.c (original)<br>
+++ cfe/trunk/test/Driver/mglobal-merge.c Fri Apr 10 19:10:44 2015<br>
@@ -1,20 +1,40 @@<br>
-// RUN: %clang -target armv7-apple-darwin10 \<br>
-// RUN:   -mno-global-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-NGM < %t %s<br>
+// RUN: %clang -target armv7-unknown-unknown -### -fsyntax-only %s 2> %t \<br>
+// RUN:   -mno-global-merge<br>
+// RUN: FileCheck --check-prefix=CHECK-NGM-ARM < %t %s<br>
<br>
-// RUN: %clang -target arm64-apple-ios7 \<br>
-// RUN:   -mno-global-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-NGM < %t %s<br>
+// RUN: %clang -target aarch64-unknown-unknown -### -fsyntax-only %s 2> %t \<br>
+// RUN:   -mno-global-merge<br>
+// RUN: FileCheck --check-prefix=CHECK-NGM-AARCH64 < %t %s<br>
<br>
-// CHECK-NGM: "-mno-global-merge"<br>
+// RUN: %clang -target x86_64-unknown-unknown -### -fsyntax-only %s 2> %t \<br>
+// RUN:   -mno-global-merge<br>
+// RUN: FileCheck --check-prefix=CHECK-NONE < %t %s<br>
<br>
-// RUN: %clang -target armv7-apple-darwin10 \<br>
-// RUN:   -mglobal-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-GM < %t %s<br>
+// CHECK-NGM-ARM: "-backend-option" "-arm-global-merge=false"<br>
+// CHECK-NGM-AARCH64: "-backend-option" "-aarch64-global-merge=false"<br>
<br>
-// RUN: %clang -target arm64-apple-ios7 \<br>
-// RUN:   -mglobal-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-GM < %t %s<br>
+// RUN: %clang -target armv7-unknown-unknown -### -fsyntax-only %s 2> %t \<br>
+// RUN:   -mglobal-merge<br>
+// RUN: FileCheck --check-prefix=CHECK-GM-ARM < %t %s<br>
<br>
-// CHECK-GM-NOT: "-mglobal-merge"<br>
+// RUN: %clang -target aarch64-unknown-unknown -### -fsyntax-only %s 2> %t \<br>
+// RUN:   -mglobal-merge<br>
+// RUN: FileCheck --check-prefix=CHECK-GM-AARCH64 < %t %s<br>
<br>
+// RUN: %clang -target x86_64-unknown-unknown -### -fsyntax-only %s 2> %t \<br>
+// RUN:   -mglobal-merge<br>
+// RUN: FileCheck --check-prefix=CHECK-NONE < %t %s<br>
+<br>
+// CHECK-GM-ARM: "-backend-option" "-arm-global-merge=true"<br>
+// CHECK-GM-AARCH64: "-backend-option" "-aarch64-global-merge=true"<br>
+<br>
+// RUN: %clang -target armv7-unknown-unknown -### -fsyntax-only %s 2> %t<br>
+// RUN: FileCheck --check-prefix=CHECK-NONE < %t %s<br>
+<br>
+// RUN: %clang -target aarch64-unknown-unknown -### -fsyntax-only %s 2> %t<br>
+// RUN: FileCheck --check-prefix=CHECK-NONE < %t %s<br>
+<br>
+// RUN: %clang -target x86_64-unknown-unknown -### -fsyntax-only %s 2> %t<br>
+// RUN: FileCheck --check-prefix=CHECK-NONE < %t %s<br>
+<br>
+// CHECK-NONE-NOT: -global-merge=<br>
<br>
Removed: cfe/trunk/test/Driver/mno-global-merge.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/mno-global-merge.c?rev=234667&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/mno-global-merge.c?rev=234667&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Driver/mno-global-merge.c (original)<br>
+++ cfe/trunk/test/Driver/mno-global-merge.c (removed)<br>
@@ -1,20 +0,0 @@<br>
-// RUN: %clang -target armv7-apple-darwin10 \<br>
-// RUN:   -mno-global-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-NGM < %t %s<br>
-<br>
-// RUN: %clang -target arm64-apple-ios7 \<br>
-// RUN:   -mno-global-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-NGM < %t %s<br>
-<br>
-// CHECK-NGM: "-mno-global-merge"<br>
-<br>
-// RUN: %clang -target armv7-apple-darwin10 \<br>
-// RUN:   -mglobal-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-GM < %t %s<br>
-<br>
-// RUN: %clang -target arm64-apple-ios7 \<br>
-// RUN:   -mglobal-merge -### -fsyntax-only %s 2> %t<br>
-// RUN: FileCheck --check-prefix=CHECK-GM < %t %s<br>
-<br>
-// CHECK-GM-NOT: "-mglobal-merge"<br>
-<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>