Author: rafael
Date: Thu Jun  2 13:58:46 2011
New Revision: 132474

URL: http://llvm.org/viewvc/llvm-project?rev=132474&view=rev
Log:
Change how we link libprofile_rt.a. While at it, refactor the code a bit.

Modified:
    cfe/trunk/lib/Driver/Tools.cpp
    cfe/trunk/test/Driver/darwin-ld.c

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=132474&r1=132473&r2=132474&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Thu Jun  2 13:58:46 2011
@@ -114,11 +114,6 @@
   // (constructed via -Xarch_).
   Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
 
-  // Add our corresponding lib directory. This is necessary for finding 
libprofile_rt.a
-  // for example. This matches gcc's behaviour that adds
-  // -L<inst>/gcc/lib/gcc/<triple>/<ver> to the link line.
-  CmdArgs.push_back(Args.MakeArgString("-L" + TC.getDriver().Dir + "/../lib"));
-
   for (InputInfoList::const_iterator
          it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
     const InputInfo &II = *it;
@@ -152,6 +147,22 @@
   }
 }
 
+static void addProfileRT(const ToolChain &TC, const ArgList &Args,
+                         ArgStringList &CmdArgs) {
+  if (Args.hasArg(options::OPT_fprofile_arcs) ||
+      Args.hasArg(options::OPT_fprofile_generate) ||
+      Args.hasArg(options::OPT_fcreate_profile) ||
+      Args.hasArg(options::OPT_coverage)) {
+    // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov
+    // to the link line. We cannot do the same thing because unlike gcov
+    // there is a libprofile_rt.so. We used to use the -l:libprofile_rt.a
+    // syntax, but that is not supported by old linkers.
+    const char *lib = Args.MakeArgString(TC.getDriver().Dir + "/../lib/" +
+                                         "libprofile_rt.a");
+    CmdArgs.push_back(lib);
+  }
+}
+
 void Clang::AddPreprocessingOptions(const Driver &D,
                                     const ArgList &Args,
                                     ArgStringList &CmdArgs,
@@ -3153,11 +3164,7 @@
     // endfile_spec is empty.
   }
 
-  if (Args.hasArg(options::OPT_fprofile_arcs) ||
-      Args.hasArg(options::OPT_fprofile_generate) ||
-      Args.hasArg(options::OPT_fcreate_profile) ||
-      Args.hasArg(options::OPT_coverage))
-    CmdArgs.push_back("-l:libprofile_rt.a");
+  addProfileRT(getToolChain(), Args, CmdArgs);
 
   Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
   Args.AddAllArgs(CmdArgs, options::OPT_F);
@@ -3316,11 +3323,7 @@
                                 getToolChain().GetFilePath("crtend.o")));
   }
 
-  if (Args.hasArg(options::OPT_fprofile_arcs) ||
-      Args.hasArg(options::OPT_fprofile_generate) ||
-      Args.hasArg(options::OPT_fcreate_profile) ||
-      Args.hasArg(options::OPT_coverage))
-    CmdArgs.push_back("-l:libprofile_rt.a");
+  addProfileRT(getToolChain(), Args, CmdArgs);
 
   const char *Exec =
     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
@@ -3621,11 +3624,7 @@
                                                                     
"crtn.o")));
   }
 
-  if (Args.hasArg(options::OPT_fprofile_arcs) ||
-      Args.hasArg(options::OPT_fprofile_generate) ||
-      Args.hasArg(options::OPT_fcreate_profile) ||
-      Args.hasArg(options::OPT_coverage))
-    CmdArgs.push_back("-l:libprofile_rt.a");
+  addProfileRT(getToolChain(), Args, CmdArgs);
 
   const char *Exec =
     Args.MakeArgString(getToolChain().GetProgramPath("ld"));
@@ -3780,11 +3779,7 @@
                                                                     
"crtn.o")));
   }
 
-  if (Args.hasArg(options::OPT_fprofile_arcs) ||
-      Args.hasArg(options::OPT_fprofile_generate) ||
-      Args.hasArg(options::OPT_fcreate_profile) ||
-      Args.hasArg(options::OPT_coverage))
-    CmdArgs.push_back("-l:libprofile_rt.a");
+  addProfileRT(getToolChain(), Args, CmdArgs);
 
   const char *Exec = Args.MakeArgString(FindTargetProgramPath(getToolChain(),
                                                       ToolTriple.getTriple(),
@@ -4008,11 +4003,7 @@
     }
   }
 
-  if (Args.hasArg(options::OPT_fprofile_arcs) ||
-      Args.hasArg(options::OPT_fprofile_generate) ||
-      Args.hasArg(options::OPT_fcreate_profile) ||
-      Args.hasArg(options::OPT_coverage))
-    CmdArgs.push_back("-l:libprofile_rt.a");
+  addProfileRT(getToolChain(), Args, CmdArgs);
 
   if (Args.hasArg(options::OPT_use_gold_plugin)) {
     CmdArgs.push_back("-plugin");
@@ -4096,11 +4087,7 @@
                                               "/usr/gnu/lib/libend.a")));
   }
 
-  if (Args.hasArg(options::OPT_fprofile_arcs) ||
-      Args.hasArg(options::OPT_fprofile_generate) ||
-      Args.hasArg(options::OPT_fcreate_profile) ||
-      Args.hasArg(options::OPT_coverage))
-    CmdArgs.push_back("-l:libprofile_rt.a");
+  addProfileRT(getToolChain(), Args, CmdArgs);
 
   const char *Exec =
     Args.MakeArgString(getToolChain().GetProgramPath("/usr/gnu/bin/gld"));
@@ -4257,11 +4244,7 @@
                               getToolChain().GetFilePath("crtn.o")));
   }
 
-  if (Args.hasArg(options::OPT_fprofile_arcs) ||
-      Args.hasArg(options::OPT_fprofile_generate) ||
-      Args.hasArg(options::OPT_fcreate_profile) ||
-      Args.hasArg(options::OPT_coverage))
-    CmdArgs.push_back("-l:libprofile_rt.a");
+  addProfileRT(getToolChain(), Args, CmdArgs);
 
   const char *Exec =
     Args.MakeArgString(getToolChain().GetProgramPath("ld"));

Modified: cfe/trunk/test/Driver/darwin-ld.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/darwin-ld.c?rev=132474&r1=132473&r2=132474&view=diff
==============================================================================
--- cfe/trunk/test/Driver/darwin-ld.c (original)
+++ cfe/trunk/test/Driver/darwin-ld.c Thu Jun  2 13:58:46 2011
@@ -19,7 +19,7 @@
 // Note that at conception, this exactly matches gcc.
 
 // RUN: %clang -ccc-host-triple i386-apple-darwin9 -### -A ARG0 -F ARG1 -L 
ARG2 -Mach -T ARG4 -X -Z -all_load -allowable_client ARG8 -bind_at_load 
-compatibility_version ARG11 -current_version ARG12 -d -dead_strip -dylib_file 
ARG14 -dylinker -dylinker_install_name ARG16 -dynamic -dynamiclib -e ARG19 
-exported_symbols_list ARG20 -fexceptions -flat_namespace -fnested-functions 
-fopenmp -force_cpusubtype_ALL -fpie -fprofile-arcs 
-headerpad_max_install_names -image_base ARG29 -init ARG30 -install_name ARG31 
-m ARG33 -mmacosx-version-min=10.3.2 -multi_module -multiply_defined ARG37 
-multiply_defined_unused ARG38 -no_dead_strip_inits_and_terms -nodefaultlibs 
-nofixprebinding -nomultidefs -noprebind -noseglinkedit -nostartfiles -nostdlib 
-pagezero_size ARG54 -pg -prebind -prebind_all_twolevel_modules -preload -r 
-read_only_relocs ARG55 -s -sectalign ARG57_0 ARG57_1 ARG57_2 -sectcreate 
ARG58_0 ARG58_1 ARG58_2 -sectobjectsymbols ARG59_0 ARG59_1 -sectorder ARG60_0 
ARG60_1 ARG60_2 -seg
 1addr ARG61 -seg_addr_table ARG62 -seg_addr_table_filename ARG63 -segaddr 
ARG64_0 ARG64_1 -segcreate ARG65_0 ARG65_1 ARG65_2 -seglinkedit -segprot 
ARG67_0 ARG67_1 ARG67_2 -segs_read_FOO -segs_read_only_addr ARG69 
-segs_read_write_addr ARG70 -shared-libgcc -single_module -static 
-static-libgcc -sub_library ARG77 -sub_umbrella ARG78 -t -twolevel_namespace 
-twolevel_namespace_hints -u ARG82 -umbrella ARG83 -undefined ARG84 
-unexported_symbols_list ARG85 -w -weak_reference_mismatches ARG87 -whatsloaded 
-whyload -y -filelist FOO -l FOO 2> %t.log
-// RUN: grep '".*ld.*" "-static" "-dylib" "-dylib_compatibility_version" 
"ARG11" "-dylib_current_version" "ARG12" "-arch" "i386" "-dylib_install_name" 
"ARG31" "-all_load" "-allowable_client" "ARG8" "-bind_at_load" "-dead_strip" 
"-no_dead_strip_inits_and_terms" "-dylib_file" "ARG14" "-dynamic" 
"-exported_symbols_list" "ARG20" "-flat_namespace" 
"-headerpad_max_install_names" "-image_base" "ARG29" "-init" "ARG30" 
"-macosx_version_min" "10.3.2" "-nomultidefs" "-multi_module" "-single_module" 
"-multiply_defined" "ARG37" "-multiply_defined_unused" "ARG38" "-pie" 
"-prebind" "-noprebind" "-nofixprebinding" "-prebind_all_twolevel_modules" 
"-read_only_relocs" "ARG55" "-sectcreate" "ARG58_0" "ARG58_1" "ARG58_2" 
"-sectorder" "ARG60_0" "ARG60_1" "ARG60_2" "-seg1addr" "ARG61" "-segprot" 
"ARG67_0" "ARG67_1" "ARG67_2" "-segaddr" "ARG64_0" "ARG64_1" 
"-segs_read_only_addr" "ARG69" "-segs_read_write_addr" "ARG70" 
"-seg_addr_table" "ARG62" "-seg_addr_table_filename" "ARG63" "-sub_library" 
"ARG7
 7" "-sub_umbrella" "ARG78" "-twolevel_namespace" "-twolevel_namespace_hints" 
"-umbrella" "ARG83" "-undefined" "ARG84" "-unexported_symbols_list" "ARG85" 
"-weak_reference_mismatches" "ARG87" "-X" "-y" "-w" "-pagezero_size" "ARG54" 
"-segs_read_FOO" "-seglinkedit" "-noseglinkedit" "-sectalign" "ARG57_0" 
"ARG57_1" "ARG57_2" "-sectobjectsymbols" "ARG59_0" "ARG59_1" "-segcreate" 
"ARG65_0" "ARG65_1" "ARG65_2" "-whyload" "-whatsloaded" 
"-dylinker_install_name" "ARG16" "-dylinker" "-Mach" "-d" "-s" "-t" "-Z" "-u" 
"ARG82" "-undefined" "ARG84" "-A" "ARG0" "-e" "ARG19" "-m" "ARG33" "-r" "-o" 
"a.out" "-LARG2" "-lgomp".* "-filelist" "FOO" "-lFOO" "-allow_stack_execute" 
"-l:libprofile_rt.a" "-T" "ARG4" "-FARG1"' %t.log
+// RUN: grep '".*ld.*" "-static" "-dylib" "-dylib_compatibility_version" 
"ARG11" "-dylib_current_version" "ARG12" "-arch" "i386" "-dylib_install_name" 
"ARG31" "-all_load" "-allowable_client" "ARG8" "-bind_at_load" "-dead_strip" 
"-no_dead_strip_inits_and_terms" "-dylib_file" "ARG14" "-dynamic" 
"-exported_symbols_list" "ARG20" "-flat_namespace" 
"-headerpad_max_install_names" "-image_base" "ARG29" "-init" "ARG30" 
"-macosx_version_min" "10.3.2" "-nomultidefs" "-multi_module" "-single_module" 
"-multiply_defined" "ARG37" "-multiply_defined_unused" "ARG38" "-pie" 
"-prebind" "-noprebind" "-nofixprebinding" "-prebind_all_twolevel_modules" 
"-read_only_relocs" "ARG55" "-sectcreate" "ARG58_0" "ARG58_1" "ARG58_2" 
"-sectorder" "ARG60_0" "ARG60_1" "ARG60_2" "-seg1addr" "ARG61" "-segprot" 
"ARG67_0" "ARG67_1" "ARG67_2" "-segaddr" "ARG64_0" "ARG64_1" 
"-segs_read_only_addr" "ARG69" "-segs_read_write_addr" "ARG70" 
"-seg_addr_table" "ARG62" "-seg_addr_table_filename" "ARG63" "-sub_library" 
"ARG7
 7" "-sub_umbrella" "ARG78" "-twolevel_namespace" "-twolevel_namespace_hints" 
"-umbrella" "ARG83" "-undefined" "ARG84" "-unexported_symbols_list" "ARG85" 
"-weak_reference_mismatches" "ARG87" "-X" "-y" "-w" "-pagezero_size" "ARG54" 
"-segs_read_FOO" "-seglinkedit" "-noseglinkedit" "-sectalign" "ARG57_0" 
"ARG57_1" "ARG57_2" "-sectobjectsymbols" "ARG59_0" "ARG59_1" "-segcreate" 
"ARG65_0" "ARG65_1" "ARG65_2" "-whyload" "-whatsloaded" 
"-dylinker_install_name" "ARG16" "-dylinker" "-Mach" "-d" "-s" "-t" "-Z" "-u" 
"ARG82" "-undefined" "ARG84" "-A" "ARG0" "-e" "ARG19" "-m" "ARG33" "-r" "-o" 
"a.out" "-LARG2" "-lgomp".* "-filelist" "FOO" "-lFOO" "-allow_stack_execute" 
"/.*/libprofile_rt.a" "-T" "ARG4" "-FARG1"' %t.log
 
 // Check linker changes that came with new linkedit format.
 // RUN: touch %t.o


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to