<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 6, 2015 at 11:18 AM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><p dir="ltr">I think I probably asked this before - but just to check, the reason these definitions are left in is because the actual external definition may not be in the lto build? (Otherwise you could drop the available externally definition in each object/bitcode file and know that you could clone it from the actual external definition during lto time?) When does this come up (where do we get these available externally definitions at compile time? From c99 extern inline? Does it come up that the true extern definition is not in the lto scope?)</p></blockquote><div><br></div><div>Yep, I think Reid had answered this here:</div><div><br></div><div> <a href="http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20150608/281203.html">http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20150608/281203.html</a></div><div><br></div><div>Teresa</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">
<div class="gmail_quote">On Jul 6, 2015 9:28 AM, "Teresa Johnson" <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: tejohnson<br>
Date: Mon Jul  6 11:23:00 2015<br>
New Revision: 241467<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D241467-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=WauksVZ56wPPEpI1w_aWxxqcO7i-yM_YyD6cPqJpvxo&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=241467&view=rev</a><br>
Log:<br>
Resubmit "Pass down the -flto option to the -cc1 job" (r239481)<br>
<br>
The patch is the same except for the addition of a new test for the<br>
issue that required reverting the dependent llvm commit.<br>
<br>
--Original Commit Message--<br>
<br>
Pass down the -flto option to the -cc1 job, and from there into the<br>
CodeGenOptions and onto the PassManagerBuilder. This enables gating<br>
the new EliminateAvailableExternally module pass on whether we are<br>
preparing for LTO.<br>
<br>
If we are preparing for LTO (e.g. a -flto -c compile), the new pass is not<br>
included as we want to preserve available externally functions for possible<br>
link time inlining.<br>
<br>
Added:<br>
    cfe/trunk/test/CodeGen/available-externally-hidden.cpp<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>
    cfe/trunk/test/CodeGen/available-externally-suppress.c<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Driver_Options.td-3Frev-3D241467-26r1-3D241466-26r2-3D241467-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=jGcwGYG3Xp4tLxRSiyw1MQpCcbfLNpnNer-YkC_8RH8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=241467&r1=241466&r2=241467&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Mon Jul  6 11:23:00 2015<br>
@@ -641,7 +641,7 @@ def flat__namespace : Flag<["-"], "flat_<br>
 def flax_vector_conversions : Flag<["-"], "flax-vector-conversions">, Group<f_Group>;<br>
 def flimited_precision_EQ : Joined<["-"], "flimited-precision=">, Group<f_Group>;<br>
 def flto_EQ : Joined<["-"], "flto=">, Group<clang_ignored_gcc_optimization_f_Group>;<br>
-def flto : Flag<["-"], "flto">, Group<f_Group>;<br>
+def flto : Flag<["-"], "flto">, Flags<[CC1Option]>, Group<f_Group>;<br>
 def fno_lto : Flag<["-"], "fno-lto">, Group<f_Group>;<br>
 def fmacro_backtrace_limit_EQ : Joined<["-"], "fmacro-backtrace-limit=">,<br>
                                 Group<f_Group>, Flags<[DriverOption, CoreOption]>;<br>
<br>
Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Frontend_CodeGenOptions.def-3Frev-3D241467-26r1-3D241466-26r2-3D241467-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=aEEERiYAviArPouRnK3_p0D4FIfJPemD69_QQWrj4ig&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=241467&r1=241466&r2=241467&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original)<br>
+++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Mon Jul  6 11:23:00 2015<br>
@@ -67,6 +67,8 @@ CODEGENOPT(InstrumentFunctions , 1, 0) /<br>
 CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -pg is enabled.<br>
 CODEGENOPT(LessPreciseFPMAD  , 1, 0) ///< Enable less precise MAD instructions to<br>
                                      ///< be generated.<br>
+CODEGENOPT(PrepareForLTO     , 1, 0) ///< Set when -flto is enabled on the<br>
+                                     ///< compile step.<br>
 CODEGENOPT(MergeAllConstants , 1, 1) ///< Merge identical constants.<br>
 CODEGENOPT(MergeFunctions    , 1, 0) ///< Set when -fmerge-functions is enabled.<br>
 CODEGENOPT(MSVolatile        , 1, 0) ///< Set when /volatile:ms is enabled.<br>
<br>
Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_BackendUtil.cpp-3Frev-3D241467-26r1-3D241466-26r2-3D241467-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=DC-ygIVVRLLleGjsQhRoRvRyIS3qBuwQBWnQbLrib3c&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=241467&r1=241466&r2=241467&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Mon Jul  6 11:23:00 2015<br>
@@ -292,6 +292,7 @@ void EmitAssemblyHelper::CreatePasses()<br>
   PMBuilder.DisableUnitAtATime = !CodeGenOpts.UnitAtATime;<br>
   PMBuilder.DisableUnrollLoops = !CodeGenOpts.UnrollLoops;<br>
   PMBuilder.MergeFunctions = CodeGenOpts.MergeFunctions;<br>
+  PMBuilder.PrepareForLTO = CodeGenOpts.PrepareForLTO;<br>
   PMBuilder.RerollLoops = CodeGenOpts.RerollLoops;<br>
<br>
   PMBuilder.addExtension(PassManagerBuilder::EP_EarlyAsPossible,<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Driver_Tools.cpp-3Frev-3D241467-26r1-3D241466-26r2-3D241467-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=NI1pkDQtzWG-QMZ7VbaahSWxTZ-2NIYHhWz8-NFB5fA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=241467&r1=241466&r2=241467&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Mon Jul  6 11:23:00 2015<br>
@@ -2805,6 +2805,10 @@ void Clang::ConstructJob(Compilation &C,<br>
     assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&<br>
            "Invalid action for clang tool.");<br>
<br>
+    if (JA.getType() == types::TY_LTO_IR ||<br>
+        JA.getType() == types::TY_LTO_BC) {<br>
+      CmdArgs.push_back("-flto");<br>
+    }<br>
     if (JA.getType() == types::TY_Nothing) {<br>
       CmdArgs.push_back("-fsyntax-only");<br>
     } else if (JA.getType() == types::TY_LLVM_IR ||<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Frontend_CompilerInvocation.cpp-3Frev-3D241467-26r1-3D241466-26r2-3D241467-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=ET9TFDk2CjqkYF365NIREu6gCfnO4le61rkMjXndiNM&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=241467&r1=241466&r2=241467&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Jul  6 11:23:00 2015<br>
@@ -508,6 +508,8 @@ static bool ParseCodeGenArgs(CodeGenOpti<br>
<br>
   Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions);<br>
<br>
+  Opts.PrepareForLTO = Args.hasArg(OPT_flto);<br>
+<br>
   Opts.MSVolatile = Args.hasArg(OPT_fms_volatile);<br>
<br>
   Opts.VectorizeBB = Args.hasArg(OPT_vectorize_slp_aggressive);<br>
<br>
Added: cfe/trunk/test/CodeGen/available-externally-hidden.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGen_available-2Dexternally-2Dhidden.cpp-3Frev-3D241467-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=f1xhvLSuS88Dn5M9yOrb-PRXK6qtt8dtzXOm1ngzmvk&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/available-externally-hidden.cpp?rev=241467&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/available-externally-hidden.cpp (added)<br>
+++ cfe/trunk/test/CodeGen/available-externally-hidden.cpp Mon Jul  6 11:23:00 2015<br>
@@ -0,0 +1,32 @@<br>
+// RUN: %clang_cc1 -O2 -fvisibility hidden -std=c++11 -emit-llvm -o - -triple x86_64-apple-darwin10 %s | FileCheck %s<br>
+<br>
+// Ensure that available_externally functions eliminated at -O2 are now<br>
+// declarations, and are not emitted as hidden with -fvisibility=hidden,<br>
+// but rather with default visibility.<br>
+struct Filter {<br>
+  virtual void Foo();<br>
+  int a;<br>
+};<br>
+<br>
+class Message{};<br>
+class Sender {<br>
+ public:<br>
+  virtual bool Send(Message* msg) = 0;<br>
+<br>
+ protected:<br>
+  virtual ~Sender() {}<br>
+};<br>
+<br>
+// CHECK: declare zeroext i1 @_ZThn16_N17SyncMessageFilter4SendEP7Message<br>
+class SyncMessageFilter : public Filter, public Sender {<br>
+ public:<br>
+  bool Send(Message* message) override;<br>
+};<br>
+<br>
+class TestSyncMessageFilter : public SyncMessageFilter {<br>
+};<br>
+<br>
+int main() {<br>
+TestSyncMessageFilter*  f = new TestSyncMessageFilter;<br>
+  f->Send(new Message);<br>
+}<br>
<br>
Modified: cfe/trunk/test/CodeGen/available-externally-suppress.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGen_available-2Dexternally-2Dsuppress.c-3Frev-3D241467-26r1-3D241466-26r2-3D241467-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=0jkRCAktRMV9p4V8DD0tBJoUxlErfZZKk1czgmcFEks&s=Wt5J0iA5AoQ1g2R7glFuO86yrUYdyeZVRERrXPobOJM&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/available-externally-suppress.c?rev=241467&r1=241466&r2=241467&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/available-externally-suppress.c (original)<br>
+++ cfe/trunk/test/CodeGen/available-externally-suppress.c Mon Jul  6 11:23:00 2015<br>
@@ -1,12 +1,18 @@<br>
 // RUN: %clang_cc1 -emit-llvm -o - -triple x86_64-apple-darwin10 %s | FileCheck %s<br>
+// RUN: %clang_cc1 -O2 -fno-inline -emit-llvm -o - -triple x86_64-apple-darwin10 %s | FileCheck %s<br>
+// RUN: %clang_cc1 -flto -O2 -fno-inline -emit-llvm -o - -triple x86_64-apple-darwin10 %s | FileCheck %s -check-prefix=LTO<br>
<br>
 // Ensure that we don't emit available_externally functions at -O0.<br>
+// Also should not emit them at -O2, unless -flto is present in which case<br>
+// we should preserve them for link-time inlining decisions.<br>
 int x;<br>
<br>
 inline void f0(int y) { x = y; }<br>
<br>
 // CHECK-LABEL: define void @test()<br>
 // CHECK: declare void @f0(i32)<br>
+// LTO-LABEL: define void @test()<br>
+// LTO: define available_externally void @f0<br>
 void test() {<br>
   f0(17);<br>
 }<br>
@@ -19,9 +25,13 @@ inline int __attribute__((always_inline)<br>
 }<br>
<br>
 // CHECK: @test1<br>
+// LTO: @test1<br>
 int test1(int x) {<br>
   // CHECK: br i1<br>
   // CHECK-NOT: call {{.*}} @f1<br>
   // CHECK: ret i32<br>
+  // LTO: br i1<br>
+  // LTO-NOT: call {{.*}} @f1<br>
+  // LTO: ret i32<br>
   return f1(x);<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" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Teresa Johnson |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> 408-460-2413</td></tr></tbody></table></span></div>
</div></div>