]> granicus.if.org Git - clang/commitdiff
Driver: Handle properly calling dsymutil when source input is
authorDaniel Dunbar <daniel@zuster.org>
Sat, 4 Apr 2009 00:55:30 +0000 (00:55 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 4 Apr 2009 00:55:30 +0000 (00:55 +0000)
preceeded by a linker input flag.
 - <rdar://problem/6757236> clang should make a dSYM when going
   straight from source to binary

 - This still matches gcc, but the right way to solve this would be to
   detect the situation we care about (we are compiling from source
   and linking in one step), instead of looking at the suffix of the
   input file. The Tool doesn't quite have enough information to do
   this yet, however.

 - Also, find the suffix correctly.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68417 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Tools.cpp
test/Driver/darwin-ld.c

index 70daaf5a62f1ff067c0019e9e2673bfd36cf00cc..bbf7c9e1a6403702e1fac00df4a6e50c39409e53 100644 (file)
@@ -1446,13 +1446,23 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
     Args.MakeArgString(getToolChain().GetProgramPath(C, "collect2").c_str());
   Dest.addCommand(new Command(Exec, CmdArgs));  
 
+  // Find the first non-empty base input (we want to ignore linker
+  // inputs).
+  const char *BaseInput = "";
+  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
+    if (Inputs[i].getBaseInput()[0] != '\0') {
+      BaseInput = Inputs[i].getBaseInput();
+      break;
+    }
+  }
+  
   if (Args.getLastArg(options::OPT_g_Group) &&
       !Args.getLastArg(options::OPT_gstabs) &&
       !Args.getLastArg(options::OPT_g0)) {
     // FIXME: This is gross, but matches gcc. The test only considers
     // the suffix (not the -x type), and then only of the first
-    // input. Awesome.
-    const char *Suffix = strchr(Inputs[0].getBaseInput(), '.');
+    // source input. Awesome.
+    const char *Suffix = strrchr(BaseInput, '.');
     if (Suffix && isSourceSuffix(Suffix + 1)) {
       const char *Exec = 
        Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil").c_str());
index e5ccb17959a04ad340b2466cf83ee9bd82c85a2d..bcef4d3388f10e1513c1e05a32236baec297402f 100644 (file)
 // RUN: grep '"-lcrt1.10.6.o" .*"-lSystem" "-lgcc"' %t.log &&
 // RUN: grep '"-lgcc_s"' %t.log | count 0 &&
 
+// Make sure we run dsymutil on source input files.
+// RUN: clang -ccc-host-triple i386-apple-darwin9 -### -g %s -o BAR 2> %t.log &&
+// RUN: grep '".*dsymutil" "BAR"' %t.log &&
+// RUN: clang -ccc-host-triple i386-apple-darwin9 -### -g -filelist FOO %s -o BAR 2> %t.log &&
+// RUN: grep '".*dsymutil" "BAR"' %t.log &&
+
 // Splatter test case. This is gross, but it works for now. For the
 // driver, just getting coverage of the tool code and checking the
 // output options is nearly good enough. The main thing we are