[PATCH] D56215: [lld] [ELF] Include default search paths for NetBSD driver
Michał Górny via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 8 12:40:08 PST 2019
mgorny updated this revision to Diff 180717.
mgorny added a comment.
Next version, based on recognizing NetBSD from triple.
@joerg, is this a better approach?
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56215/new/
https://reviews.llvm.org/D56215
Files:
ELF/Config.h
ELF/Driver.cpp
ELF/Driver.h
Index: ELF/Driver.h
===================================================================
--- ELF/Driver.h
+++ ELF/Driver.h
@@ -31,7 +31,9 @@
void addLibrary(StringRef Name);
private:
+ void setDefaultTargetTriple(StringRef argv0);
void readConfigs(llvm::opt::InputArgList &Args);
+ void appendDefaultSearchPaths();
void createFiles(llvm::opt::InputArgList &Args);
void inferMachineType();
template <class ELFT> void link(llvm::opt::InputArgList &Args);
Index: ELF/Driver.cpp
===================================================================
--- ELF/Driver.cpp
+++ ELF/Driver.cpp
@@ -365,6 +365,23 @@
error("unknown -z value: " + StringRef(Arg->getValue()));
}
+void LinkerDriver::appendDefaultSearchPaths() {
+ if (Config->TargetTriple.isOSNetBSD()) {
+ // NetBSD driver relies on the linker knowing the default search paths.
+ // Please keep this in sync with clang/lib/Driver/ToolChains/NetBSD.cpp
+ // (NetBSD::NetBSD constructor)
+ switch (Config->EMachine) {
+ case EM_386:
+ Config->SearchPaths.push_back("/usr/lib/i386");
+ break;
+ case EM_X86_64:
+ break;
+ // TODO: support non-x86 architectures
+ }
+ Config->SearchPaths.push_back("/usr/lib");
+ }
+}
+
void LinkerDriver::main(ArrayRef<const char *> ArgsArr) {
ELFOptTable Parser;
opt::InputArgList Args = Parser.parse(ArgsArr.slice(1));
@@ -410,8 +427,10 @@
}
}
+ setDefaultTargetTriple(ArgsArr[0]);
readConfigs(Args);
checkZOptions(Args);
+ appendDefaultSearchPaths();
// The behavior of -v or --version is a bit strange, but this is
// needed for compatibility with GNU linkers.
@@ -746,6 +765,21 @@
error(Msg + ": " + StringRef(Err).trim());
}
+void LinkerDriver::setDefaultTargetTriple(StringRef argv0) {
+ // Start with a default initial triple
+ Config->TargetTriple = llvm::Triple(getDefaultTargetTriple());
+
+ // Try to override triple with program name prefix
+ std::string ProgName = llvm::sys::path::stem(argv0);
+ size_t LastComponent = ProgName.rfind('-');
+ if (LastComponent != std::string::npos) {
+ std::string Prefix = ProgName.substr(0, LastComponent);
+ std::string IgnoredError;
+ // TODO: verify the triple somehow?
+ Config->TargetTriple = llvm::Triple(Prefix);
+ }
+}
+
// Initializes Config members by the command line options.
void LinkerDriver::readConfigs(opt::InputArgList &Args) {
errorHandler().Verbose = Args.hasArg(OPT_verbose);
Index: ELF/Config.h
===================================================================
--- ELF/Config.h
+++ ELF/Config.h
@@ -14,6 +14,7 @@
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
+#include "llvm/ADT/Triple.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/Support/CachePruning.h"
#include "llvm/Support/CodeGen.h"
@@ -276,6 +277,10 @@
// 4 for ELF32, 8 for ELF64.
int Wordsize;
+
+ // Target triple, inferred from program name or defaulted to LLVM
+ // default target.
+ llvm::Triple TargetTriple;
};
// The only instance of Configuration struct.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56215.180717.patch
Type: text/x-patch
Size: 3103 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190108/c570816b/attachment.bin>
More information about the cfe-commits
mailing list