Implement semantic action for SEARCH_DIR linker script command
This is needed, among others by the FreeBSD kernel linker script. Patch by Davide Italiano! Reviewers: ruiu, rafaelauler Differential Revision: http://reviews.llvm.org/D7220 llvm-svn: 227694
This commit is contained in:
parent
08ad328ae2
commit
8251d741f4
|
@ -268,6 +268,9 @@ public:
|
|||
return true;
|
||||
}
|
||||
|
||||
// Retrieve search path list.
|
||||
StringRefVector getSearchPaths() { return _inputSearchPaths; };
|
||||
|
||||
// By default, the linker would merge sections that are read only with
|
||||
// segments that have read and execute permissions. When the user specifies a
|
||||
// flag --rosegment, a separate segment needs to be created.
|
||||
|
|
|
@ -280,11 +280,16 @@ GnuLdDriver::evalLinkerScript(ELFLinkingContext &ctx,
|
|||
if (!script)
|
||||
return LinkerScriptReaderError::parse_error;
|
||||
// Evaluate script commands.
|
||||
// Currently we only recognize GROUP() command.
|
||||
for (const script::Command *c : script->_commands)
|
||||
// Currently we only recognize this subset of linker script commands:
|
||||
// - GROUP()
|
||||
// - SEARCH_DIR()
|
||||
for (const script::Command *c : script->_commands) {
|
||||
if (auto *group = dyn_cast<script::Group>(c))
|
||||
if (std::error_code ec = evaluateLinkerScriptGroup(ctx, path, group, diag))
|
||||
return ec;
|
||||
if (auto *searchDir = dyn_cast<script::SearchDir>(c))
|
||||
ctx.addSearchPath(searchDir->getSearchPath());
|
||||
}
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
|
|
|
@ -177,3 +177,17 @@ TEST_F(GnuLdParserTest, LinkerScriptGroup) {
|
|||
EXPECT_EQ("/y", cast<FileNode>(nodes[2].get())->getFile()->path());
|
||||
EXPECT_EQ(2, cast<GroupEnd>(nodes[3].get())->getSize());
|
||||
}
|
||||
|
||||
TEST_F(GnuLdParserTest, LinkerScriptSearchDir) {
|
||||
parse("ld", "a.o", nullptr);
|
||||
std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(
|
||||
"SEARCH_DIR(\"/foo/bar\")", "foo.so");
|
||||
std::string s;
|
||||
raw_string_ostream out(s);
|
||||
std::error_code ec = GnuLdDriver::evalLinkerScript(
|
||||
*_context, std::move(mb), out);
|
||||
EXPECT_FALSE(ec);
|
||||
std::vector<StringRef> searchPaths = _context->getSearchPaths();
|
||||
EXPECT_EQ((size_t)2, searchPaths.size());
|
||||
EXPECT_EQ("/foo/bar", searchPaths[1]);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue