On Jul 31, 2012, at 4:10 AM, Chandler Carruth wrote:

> Cool.

Thanks for taking a look at this so quickly! I apologize for the length of this 
email.

> First, this needs a test in the 'test/Driver/...' tree. Likely with other BSD 
> 'ld' invocation tests. There are lots of examples to crib from, in particular 
> the Linux ones.

I'm actually not sure what the right way to test this is. The base FreeBSD does 
not have gold so any test of gold shouldn't run. In fact, it seems like LTO 
support should be tested at configure time. Currently, Darwin and Linux (and 
FreeBSD with my patch) just report that they support LTO, even though the rest 
of the tool chain may not. This causes errors later:

[hilbert:~] steve$ uname -a
Linux hilbert 2.6.35-28-generic #50-Ubuntu SMP Fri Mar 18 18:42:20 UTC 2011 
x86_64 x86_64 x86_64 GNU/Linux
[hilbert:~] steve$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.22
Copyright 2011 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
[hilbert:~] steve$ clang -flto -x c - <<< 'int main(){}'
/tmp/--nsAnN9.o: file not recognized: File format not recognized
clang: error: linker command failed with exit code 1 (use -v to see invocation)

My Debian-based systems also have gold installed as ld.gold. Maybe it'd make 
sense for configure to look for gold by checking ld --version and if that's not 
gold then checking for ld.gold. Possibly allow the user to specify an 
alternative linker to use for LTO (the README in llvm/tools/gold mentions 
ld-new).

But back to tests, I'm not familiar enough with the test infrastructure to 
write this sort of conditional test. I've read 
<http://llvm.org/docs/TestingGuide.html>, but I'm not sure that's up to date. 
In particular, it says 2>&1 isn't supported but many tests do that. An XFAIL 
almost seems appropriate except that the expected failure isn't for a 
particular target but whether it has gold or not.

> Second, can we factor out the logic to add the actual plugin flag? It should 
> already exist somewhere for Linux?

The freebsd::Link and linux::Link classes don't have much in the way of shared 
ancestry. They're both subclasses of Tool which seems like the wrong place to 
put such common code. Maybe they, and others that use GNU binutils should 
inherit from something more specific than Tool that could handle both adding 
adding the -plugin LLVMgold.so arguments as well as the appropriate selection 
of linker.

Otherwise, it seems like factoring this out wouldn't save much. Here are the 
two implementations currently (I clearly copied from the Linux implementation, 
comment and all).

Linux:
  if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
    CmdArgs.push_back("-plugin");
    std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
    CmdArgs.push_back(Args.MakeArgString(Plugin));
  }

FreeBSD:
  const bool UseGold = D.IsUsingLTO(Args) || 
Args.hasArg(options::OPT_use_gold_plugin);
  if (UseGold) {
    CmdArgs.push_back("-plugin");
    std::string Plugin = getToolChain().getDriver().Dir + "/../lib/LLVMgold.so";
    CmdArgs.push_back(Args.MakeArgString(Plugin));
  }

Something like

static void addGoldPlugin(ArgStringList &CmdArgs, StringRef Plugin) {
  CmdArgs.push_back("-plugin");
  CmdArgs.push_back(Args.MakeArgString(Plugin.str()));
}

// ...
  if (UseGold)
    addGoldPlugin(CmdArgs, getToolChain().getDriver().Dir + 
"/../lib/LLVMgold.so");

Thoughts?

-- 
Stephen Checkoway






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

Reply via email to