[lld] cf57a67 - [ELF] ScriptParser: pass Ctx to ScriptParser and ScriptLexer. NFC
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 21 11:06:11 PDT 2024
Author: Fangrui Song
Date: 2024-09-21T11:06:06-07:00
New Revision: cf57a670bb3b85a362098b931a3176f2debe6a6a
URL: https://github.com/llvm/llvm-project/commit/cf57a670bb3b85a362098b931a3176f2debe6a6a
DIFF: https://github.com/llvm/llvm-project/commit/cf57a670bb3b85a362098b931a3176f2debe6a6a.diff
LOG: [ELF] ScriptParser: pass Ctx to ScriptParser and ScriptLexer. NFC
Added:
Modified:
lld/ELF/Driver.cpp
lld/ELF/ScriptLexer.cpp
lld/ELF/ScriptLexer.h
lld/ELF/ScriptParser.cpp
lld/ELF/ScriptParser.h
Removed:
################################################################################
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 2d8752cea03c69..95baaeec1a1836 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -293,7 +293,7 @@ void LinkerDriver::addFile(StringRef path, bool withLOption) {
switch (identify_magic(mbref.getBuffer())) {
case file_magic::unknown:
- readLinkerScript(mbref);
+ readLinkerScript(ctx, mbref);
return;
case file_magic::archive: {
auto members = getArchiveMembers(mbref);
@@ -1810,12 +1810,12 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
for (auto *arg :
args.filtered(OPT_dynamic_list, OPT_export_dynamic_symbol_list))
if (std::optional<MemoryBufferRef> buffer = readFile(arg->getValue()))
- readDynamicList(*buffer);
+ readDynamicList(ctx, *buffer);
for (auto *arg : args.filtered(OPT_version_script))
if (std::optional<std::string> path = searchScript(arg->getValue())) {
if (std::optional<MemoryBufferRef> buffer = readFile(*path))
- readVersionScript(*buffer);
+ readVersionScript(ctx, *buffer);
} else {
error(Twine("cannot find version script ") + arg->getValue());
}
@@ -1943,7 +1943,7 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
hasInput = true;
break;
case OPT_defsym: {
- readDefsym(MemoryBufferRef(arg->getValue(), "--defsym"));
+ readDefsym(ctx, MemoryBufferRef(arg->getValue(), "--defsym"));
break;
}
case OPT_script:
@@ -1953,7 +1953,7 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
if (arg->getOption().matches(OPT_default_script)) {
defaultScript = mb;
} else {
- readLinkerScript(*mb);
+ readLinkerScript(ctx, *mb);
hasScript = true;
}
}
@@ -2039,7 +2039,7 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
}
if (defaultScript && !hasScript)
- readLinkerScript(*defaultScript);
+ readLinkerScript(ctx, *defaultScript);
if (files.empty() && !hasInput && errorCount() == 0)
error("no input files");
}
diff --git a/lld/ELF/ScriptLexer.cpp b/lld/ELF/ScriptLexer.cpp
index 40528f0cd7f611..7b45e26ee405e0 100644
--- a/lld/ELF/ScriptLexer.cpp
+++ b/lld/ELF/ScriptLexer.cpp
@@ -39,21 +39,22 @@ using namespace llvm;
using namespace lld;
using namespace lld::elf;
-ScriptLexer::Buffer::Buffer(MemoryBufferRef mb)
+ScriptLexer::Buffer::Buffer(Ctx &ctx, MemoryBufferRef mb)
: s(mb.getBuffer()), filename(mb.getBufferIdentifier()),
begin(mb.getBufferStart()) {
- if (config->sysroot == "")
+ if (ctx.arg.sysroot == "")
return;
StringRef path = filename;
for (; !path.empty(); path = sys::path::parent_path(path)) {
- if (!sys::fs::equivalent(config->sysroot, path))
+ if (!sys::fs::equivalent(ctx.arg.sysroot, path))
continue;
isUnderSysroot = true;
return;
}
}
-ScriptLexer::ScriptLexer(MemoryBufferRef mb) : curBuf(mb), mbs(1, mb) {
+ScriptLexer::ScriptLexer(Ctx &ctx, MemoryBufferRef mb)
+ : curBuf(ctx, mb), mbs(1, mb) {
activeFilenames.insert(mb.getBufferIdentifier());
}
diff --git a/lld/ELF/ScriptLexer.h b/lld/ELF/ScriptLexer.h
index ffd84411f22ac7..0f31ef17844b76 100644
--- a/lld/ELF/ScriptLexer.h
+++ b/lld/ELF/ScriptLexer.h
@@ -17,6 +17,7 @@
#include <vector>
namespace lld::elf {
+struct Ctx;
class ScriptLexer {
protected:
@@ -30,7 +31,7 @@ class ScriptLexer {
bool isUnderSysroot = false;
Buffer() = default;
- Buffer(MemoryBufferRef mb);
+ Buffer(Ctx &ctx, MemoryBufferRef mb);
};
// The current buffer and parent buffers due to INCLUDE.
Buffer curBuf;
@@ -57,7 +58,7 @@ class ScriptLexer {
bool eof = false;
public:
- explicit ScriptLexer(MemoryBufferRef mb);
+ explicit ScriptLexer(Ctx &ctx, MemoryBufferRef mb);
void setError(const Twine &msg);
void lex();
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index 819036a1ab1820..6816138467cd09 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -47,8 +47,7 @@ using namespace lld::elf;
namespace {
class ScriptParser final : ScriptLexer {
public:
- ScriptParser(MemoryBufferRef mb) : ScriptLexer(mb) {
- }
+ ScriptParser(Ctx &ctx, MemoryBufferRef mb) : ScriptLexer(ctx, mb) {}
void readLinkerScript();
void readVersionScript();
@@ -197,7 +196,7 @@ void ScriptParser::readDynamicList() {
}
for (SymbolVersion v : globals)
- config->dynamicList.push_back(v);
+ ctx.arg.dynamicList.push_back(v);
}
void ScriptParser::readVersionScript() {
@@ -313,11 +312,11 @@ void ScriptParser::readNoCrossRefs(bool to) {
void ScriptParser::addFile(StringRef s) {
if (curBuf.isUnderSysroot && s.starts_with("/")) {
SmallString<128> pathData;
- StringRef path = (config->sysroot + s).toStringRef(pathData);
+ StringRef path = (ctx.arg.sysroot + s).toStringRef(pathData);
if (sys::fs::exists(path))
ctx.driver.addFile(saver().save(path), /*withLOption=*/false);
else
- setError("cannot find " + s + " inside " + config->sysroot);
+ setError("cannot find " + s + " inside " + ctx.arg.sysroot);
return;
}
@@ -326,10 +325,10 @@ void ScriptParser::addFile(StringRef s) {
ctx.driver.addFile(s, /*withLOption=*/false);
} else if (s.starts_with("=")) {
// Case 2: relative to the sysroot.
- if (config->sysroot.empty())
+ if (ctx.arg.sysroot.empty())
ctx.driver.addFile(s.substr(1), /*withLOption=*/false);
else
- ctx.driver.addFile(saver().save(config->sysroot + "/" + s.substr(1)),
+ ctx.driver.addFile(saver().save(ctx.arg.sysroot + "/" + s.substr(1)),
/*withLOption=*/false);
} else if (s.starts_with("-l")) {
// Case 3: search in the list of library paths.
@@ -361,26 +360,26 @@ void ScriptParser::addFile(StringRef s) {
void ScriptParser::readAsNeeded() {
expect("(");
- bool orig = config->asNeeded;
- config->asNeeded = true;
+ bool orig = ctx.arg.asNeeded;
+ ctx.arg.asNeeded = true;
while (auto tok = till(")"))
addFile(unquote(tok));
- config->asNeeded = orig;
+ ctx.arg.asNeeded = orig;
}
void ScriptParser::readEntry() {
// -e <symbol> takes predecence over ENTRY(<symbol>).
expect("(");
StringRef name = readName();
- if (config->entry.empty())
- config->entry = name;
+ if (ctx.arg.entry.empty())
+ ctx.arg.entry = name;
expect(")");
}
void ScriptParser::readExtern() {
expect("(");
while (auto tok = till(")"))
- config->undefined.push_back(unquote(tok));
+ ctx.arg.undefined.push_back(unquote(tok));
}
void ScriptParser::readGroup() {
@@ -402,7 +401,7 @@ void ScriptParser::readInclude() {
if (std::optional<std::string> path = searchScript(name)) {
if (std::optional<MemoryBufferRef> mb = readFile(*path)) {
buffers.push_back(curBuf);
- curBuf = Buffer(*mb);
+ curBuf = Buffer(ctx, *mb);
mbs.push_back(*mb);
}
return;
@@ -424,8 +423,8 @@ void ScriptParser::readOutput() {
// -o <file> takes predecence over OUTPUT(<file>).
expect("(");
StringRef name = readName();
- if (config->outputFile.empty())
- config->outputFile = name;
+ if (ctx.arg.outputFile.empty())
+ ctx.arg.outputFile = name;
expect(")");
}
@@ -479,34 +478,34 @@ void ScriptParser::readOutputFormat() {
if (!consume(")")) {
expect(",");
StringRef tmp = readName();
- if (config->optEB)
+ if (ctx.arg.optEB)
s = tmp;
expect(",");
tmp = readName();
- if (config->optEL)
+ if (ctx.arg.optEL)
s = tmp;
consume(")");
}
// If more than one OUTPUT_FORMAT is specified, only the first is checked.
- if (!config->bfdname.empty())
+ if (!ctx.arg.bfdname.empty())
return;
- config->bfdname = s;
+ ctx.arg.bfdname = s;
if (s == "binary") {
- config->oFormatBinary = true;
+ ctx.arg.oFormatBinary = true;
return;
}
if (s.consume_back("-freebsd"))
- config->osabi = ELFOSABI_FREEBSD;
+ ctx.arg.osabi = ELFOSABI_FREEBSD;
- std::tie(config->ekind, config->emachine) = parseBfdName(s);
- if (config->emachine == EM_NONE)
- setError("unknown output format name: " + config->bfdname);
+ std::tie(ctx.arg.ekind, ctx.arg.emachine) = parseBfdName(s);
+ if (ctx.arg.emachine == EM_NONE)
+ setError("unknown output format name: " + ctx.arg.bfdname);
if (s == "elf32-ntradlittlemips" || s == "elf32-ntradbigmips")
- config->mipsN32Abi = true;
- if (config->emachine == EM_MSP430)
- config->osabi = ELFOSABI_STANDALONE;
+ ctx.arg.mipsN32Abi = true;
+ if (ctx.arg.emachine == EM_MSP430)
+ ctx.arg.osabi = ELFOSABI_STANDALONE;
}
void ScriptParser::readPhdrs() {
@@ -550,8 +549,8 @@ void ScriptParser::readRegionAlias() {
void ScriptParser::readSearchDir() {
expect("(");
StringRef name = readName();
- if (!config->nostdlib)
- config->searchPaths.push_back(name);
+ if (!ctx.arg.nostdlib)
+ ctx.arg.searchPaths.push_back(name);
expect(")");
}
@@ -562,7 +561,7 @@ void ScriptParser::readSearchDir() {
SmallVector<SectionCommand *, 0> ScriptParser::readOverlay() {
Expr addrExpr;
if (consume(":")) {
- addrExpr = [] { return ctx.script->getDot(); };
+ addrExpr = [&] { return ctx.script->getDot(); };
} else {
addrExpr = readExpr();
expect(":");
@@ -570,7 +569,7 @@ SmallVector<SectionCommand *, 0> ScriptParser::readOverlay() {
// When AT is omitted, LMA should equal VMA. script->getDot() when evaluating
// lmaExpr will ensure this, even if the start address is specified.
Expr lmaExpr =
- consume("AT") ? readParenExpr() : [] { return ctx.script->getDot(); };
+ consume("AT") ? readParenExpr() : [&] { return ctx.script->getDot(); };
expect("{");
SmallVector<SectionCommand *, 0> v;
@@ -704,9 +703,9 @@ void ScriptParser::readTarget() {
expect(")");
if (tok.starts_with("elf"))
- config->formatBinary = false;
+ ctx.arg.formatBinary = false;
else if (tok == "binary")
- config->formatBinary = true;
+ ctx.arg.formatBinary = true;
else
setError("unknown target: " + tok);
}
@@ -1327,7 +1326,7 @@ Expr ScriptParser::getPageSize() {
std::string location = getCurrentLocation();
return [=]() -> uint64_t {
if (ctx.target)
- return config->commonPageSize;
+ return ctx.arg.commonPageSize;
error(location + ": unable to calculate page size");
return 4096; // Return a dummy value.
};
@@ -1338,7 +1337,7 @@ Expr ScriptParser::readConstant() {
if (s == "COMMONPAGESIZE")
return getPageSize();
if (s == "MAXPAGESIZE")
- return [] { return config->maxPageSize; };
+ return [&] { return ctx.arg.maxPageSize; };
setError("unknown constant: " + s);
return [] { return 0; };
}
@@ -1556,7 +1555,7 @@ Expr ScriptParser::readPrimary() {
expect("(");
expect(".");
expect(")");
- return [] { return ctx.script->getDot(); };
+ return [&] { return ctx.script->getDot(); };
}
if (tok == "DATA_SEGMENT_RELRO_END") {
// GNU linkers implements more complicated logic to handle
@@ -1568,8 +1567,8 @@ Expr ScriptParser::readPrimary() {
readExpr();
expect(")");
ctx.script->seenRelroEnd = true;
- return [=] {
- return alignToPowerOf2(ctx.script->getDot(), config->maxPageSize);
+ return [&] {
+ return alignToPowerOf2(ctx.script->getDot(), ctx.arg.maxPageSize);
};
}
if (tok == "DEFINED") {
@@ -1728,9 +1727,9 @@ void ScriptParser::readAnonymousDeclaration() {
SmallVector<SymbolVersion, 0> globals;
std::tie(locals, globals) = readSymbols();
for (const SymbolVersion &pat : locals)
- config->versionDefinitions[VER_NDX_LOCAL].localPatterns.push_back(pat);
+ ctx.arg.versionDefinitions[VER_NDX_LOCAL].localPatterns.push_back(pat);
for (const SymbolVersion &pat : globals)
- config->versionDefinitions[VER_NDX_GLOBAL].nonLocalPatterns.push_back(pat);
+ ctx.arg.versionDefinitions[VER_NDX_GLOBAL].nonLocalPatterns.push_back(pat);
expect(";");
}
@@ -1748,8 +1747,8 @@ void ScriptParser::readVersionDeclaration(StringRef verStr) {
ver.name = verStr;
ver.nonLocalPatterns = std::move(globals);
ver.localPatterns = std::move(locals);
- ver.id = config->versionDefinitions.size();
- config->versionDefinitions.push_back(ver);
+ ver.id = ctx.arg.versionDefinitions.size();
+ ctx.arg.versionDefinitions.push_back(ver);
// Each version may have a parent version. For example, "Ver2"
// defined as "Ver2 { global: foo; local: *; } Ver1;" has "Ver1"
@@ -1891,21 +1890,23 @@ void ScriptParser::readMemoryAttributes(uint32_t &flags, uint32_t &invFlags,
}
}
-void elf::readLinkerScript(MemoryBufferRef mb) {
+void elf::readLinkerScript(Ctx &ctx, MemoryBufferRef mb) {
llvm::TimeTraceScope timeScope("Read linker script",
mb.getBufferIdentifier());
- ScriptParser(mb).readLinkerScript();
+ ScriptParser(ctx, mb).readLinkerScript();
}
-void elf::readVersionScript(MemoryBufferRef mb) {
+void elf::readVersionScript(Ctx &ctx, MemoryBufferRef mb) {
llvm::TimeTraceScope timeScope("Read version script",
mb.getBufferIdentifier());
- ScriptParser(mb).readVersionScript();
+ ScriptParser(ctx, mb).readVersionScript();
}
-void elf::readDynamicList(MemoryBufferRef mb) {
+void elf::readDynamicList(Ctx &ctx, MemoryBufferRef mb) {
llvm::TimeTraceScope timeScope("Read dynamic list", mb.getBufferIdentifier());
- ScriptParser(mb).readDynamicList();
+ ScriptParser(ctx, mb).readDynamicList();
}
-void elf::readDefsym(MemoryBufferRef mb) { ScriptParser(mb).readDefsym(); }
+void elf::readDefsym(Ctx &ctx, MemoryBufferRef mb) {
+ ScriptParser(ctx, mb).readDefsym();
+}
diff --git a/lld/ELF/ScriptParser.h b/lld/ELF/ScriptParser.h
index d6f71c5ee63291..3af4fa3ea65f70 100644
--- a/lld/ELF/ScriptParser.h
+++ b/lld/ELF/ScriptParser.h
@@ -13,18 +13,19 @@
#include "llvm/Support/MemoryBufferRef.h"
namespace lld::elf {
+struct Ctx;
// Parses a linker script. Calling this function updates
// lld::elf::config and lld::elf::script.
-void readLinkerScript(MemoryBufferRef mb);
+void readLinkerScript(Ctx &ctx, MemoryBufferRef mb);
// Parses a version script.
-void readVersionScript(MemoryBufferRef mb);
+void readVersionScript(Ctx &ctx, MemoryBufferRef mb);
-void readDynamicList(MemoryBufferRef mb);
+void readDynamicList(Ctx &ctx, MemoryBufferRef mb);
// Parses the defsym expression.
-void readDefsym(MemoryBufferRef mb);
+void readDefsym(Ctx &ctx, MemoryBufferRef mb);
bool hasWildcard(StringRef s);
More information about the llvm-commits
mailing list