summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-04-04 00:55:30 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-04-04 00:55:30 +0000
commitf89733cfb8ad945e98e682ebafb52d58e16c9625 (patch)
tree5df3143945e3126ab1f83139e8eaf223581c310a /clang
parent90dd6f45cc0d496b1853500350ab07047364f79f (diff)
downloadbcm5719-llvm-f89733cfb8ad945e98e682ebafb52d58e16c9625.tar.gz
bcm5719-llvm-f89733cfb8ad945e98e682ebafb52d58e16c9625.zip
Driver: Handle properly calling dsymutil when source input is
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. llvm-svn: 68417
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Driver/Tools.cpp14
-rw-r--r--clang/test/Driver/darwin-ld.c6
2 files changed, 18 insertions, 2 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 70daaf5a62f..bbf7c9e1a64 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -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());
diff --git a/clang/test/Driver/darwin-ld.c b/clang/test/Driver/darwin-ld.c
index e5ccb17959a..bcef4d3388f 100644
--- a/clang/test/Driver/darwin-ld.c
+++ b/clang/test/Driver/darwin-ld.c
@@ -17,6 +17,12 @@
// 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
OpenPOWER on IntegriCloud