[lld] c4c34f0 - [ELF] Pass Ctx & to InputFiles
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 3 23:06:24 PDT 2024
Author: Fangrui Song
Date: 2024-10-03T23:06:18-07:00
New Revision: c4c34f047461164661b365123af12f4818a0e2c6
URL: https://github.com/llvm/llvm-project/commit/c4c34f047461164661b365123af12f4818a0e2c6
DIFF: https://github.com/llvm/llvm-project/commit/c4c34f047461164661b365123af12f4818a0e2c6.diff
LOG: [ELF] Pass Ctx & to InputFiles
Added:
Modified:
lld/ELF/InputFiles.cpp
lld/ELF/InputFiles.h
lld/ELF/LTO.cpp
Removed:
################################################################################
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 7265ed56e957f2..3f5d2fbb5cbae5 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -102,7 +102,7 @@ static ELFKind getELFKind(MemoryBufferRef mb, StringRef archiveName) {
// For ARM only, to set the EF_ARM_ABI_FLOAT_SOFT or EF_ARM_ABI_FLOAT_HARD
// flag in the ELF Header we need to look at Tag_ABI_VFP_args to find out how
// the input objects have been compiled.
-static void updateARMVFPArgs(const ARMAttributeParser &attributes,
+static void updateARMVFPArgs(Ctx &ctx, const ARMAttributeParser &attributes,
const InputFile *f) {
std::optional<unsigned> attr =
attributes.getAttributeValue(ARMBuildAttrs::ABI_VFP_args);
@@ -150,7 +150,8 @@ static void updateARMVFPArgs(const ARMAttributeParser &attributes,
// at compile time. We follow the convention that if at least one input object
// is compiled with an architecture that supports these features then lld is
// permitted to use them.
-static void updateSupportedARMFeatures(const ARMAttributeParser &attributes) {
+static void updateSupportedARMFeatures(Ctx &ctx,
+ const ARMAttributeParser &attributes) {
std::optional<unsigned> attr =
attributes.getAttributeValue(ARMBuildAttrs::CPU_arch);
if (!attr)
@@ -264,7 +265,7 @@ std::optional<MemoryBufferRef> elf::readFile(StringRef path) {
// All input object files must be for the same architecture
// (e.g. it does not make sense to link x86 object files with
// MIPS object files.) This function checks for that error.
-static bool isCompatible(InputFile *file) {
+static bool isCompatible(Ctx &ctx, InputFile *file) {
if (!file->isElf() && !isa<BitcodeFile>(file))
return true;
@@ -297,7 +298,7 @@ static bool isCompatible(InputFile *file) {
}
template <class ELFT> static void doParseFile(Ctx &ctx, InputFile *file) {
- if (!isCompatible(file))
+ if (!isCompatible(ctx, file))
return;
// Lazy object file
@@ -418,7 +419,8 @@ StringRef InputFile::getNameForScript() const {
// the various ways that a library can be specified to LLD. This ELF extension
// is a form of autolinking and is called `dependent libraries`. It is currently
// unique to LLVM and lld.
-static void addDependentLibrary(StringRef specifier, const InputFile *f) {
+static void addDependentLibrary(Ctx &ctx, StringRef specifier,
+ const InputFile *f) {
if (!ctx.arg.dependentLibraries)
return;
if (std::optional<std::string> s = searchLibraryBaseName(specifier))
@@ -611,7 +613,7 @@ template <class ELFT> void ObjFile<ELFT>::parse(bool ignoreComdats) {
} else {
for (const char *d = data.begin(), *e = data.end(); d < e;) {
StringRef s(d);
- addDependentLibrary(s, this);
+ addDependentLibrary(ctx, s, this);
d += s.size() + 1;
}
}
@@ -631,8 +633,8 @@ template <class ELFT> void ObjFile<ELFT>::parse(bool ignoreComdats) {
InputSection isec(*this, sec, name);
warn(toString(&isec) + ": " + llvm::toString(std::move(e)));
} else {
- updateSupportedARMFeatures(attributes);
- updateARMVFPArgs(attributes, this);
+ updateSupportedARMFeatures(ctx, attributes);
+ updateARMVFPArgs(ctx, attributes, this);
// FIXME: Retain the first attribute section we see. The eglibc ARM
// dynamic loaders require the presence of an attribute section for
@@ -1704,7 +1706,7 @@ BitcodeFile::BitcodeFile(MemoryBufferRef mb, StringRef archiveName,
std::string path = mb.getBufferIdentifier().str();
if (ctx.arg.thinLTOIndexOnly)
- path = replaceThinLTOSuffix(mb.getBufferIdentifier());
+ path = replaceThinLTOSuffix(ctx, mb.getBufferIdentifier());
// ThinLTO assumes that all MemoryBufferRefs given to it have a unique
// name. If two archives define two members with the same name, this
@@ -1738,9 +1740,10 @@ static uint8_t mapVisibility(GlobalValue::VisibilityTypes gvVisibility) {
llvm_unreachable("unknown visibility");
}
-static void
-createBitcodeSymbol(Symbol *&sym, const std::vector<bool> &keptComdats,
- const lto::InputFile::Symbol &objSym, BitcodeFile &f) {
+static void createBitcodeSymbol(Ctx &ctx, Symbol *&sym,
+ const std::vector<bool> &keptComdats,
+ const lto::InputFile::Symbol &objSym,
+ BitcodeFile &f) {
uint8_t binding = objSym.isWeak() ? STB_WEAK : STB_GLOBAL;
uint8_t type = objSym.isTLS() ? STT_TLS : STT_NOTYPE;
uint8_t visibility = mapVisibility(objSym.getVisibility());
@@ -1791,13 +1794,13 @@ void BitcodeFile::parse() {
// ObjFile<ELFT>::initializeSymbols.
for (auto [i, irSym] : llvm::enumerate(obj->symbols()))
if (!irSym.isUndefined())
- createBitcodeSymbol(symbols[i], keptComdats, irSym, *this);
+ createBitcodeSymbol(ctx, symbols[i], keptComdats, irSym, *this);
for (auto [i, irSym] : llvm::enumerate(obj->symbols()))
if (irSym.isUndefined())
- createBitcodeSymbol(symbols[i], keptComdats, irSym, *this);
+ createBitcodeSymbol(ctx, symbols[i], keptComdats, irSym, *this);
for (auto l : obj->getDependentLibraries())
- addDependentLibrary(l, this);
+ addDependentLibrary(ctx, l, this);
}
void BitcodeFile::parseLazy() {
@@ -1917,7 +1920,7 @@ bool InputFile::shouldExtractForCommon(StringRef name) const {
return isNonCommonDef(mb, name, archiveName);
}
-std::string elf::replaceThinLTOSuffix(StringRef path) {
+std::string elf::replaceThinLTOSuffix(Ctx &ctx, StringRef path) {
auto [suffix, repl] = ctx.arg.thinLTOObjectSuffixReplace;
if (path.consume_back(suffix))
return (path + repl).str();
diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h
index 730a4d8855c6bd..fc5ecbc2f5d220 100644
--- a/lld/ELF/InputFiles.h
+++ b/lld/ELF/InputFiles.h
@@ -382,7 +382,7 @@ InputFile *createInternalFile(StringRef name);
ELFFileBase *createObjFile(MemoryBufferRef mb, StringRef archiveName = "",
bool lazy = false);
-std::string replaceThinLTOSuffix(StringRef path);
+std::string replaceThinLTOSuffix(Ctx &, StringRef path);
} // namespace elf
} // namespace lld
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index 6b4b0716b9ccb9..4df1b0c289eef8 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -292,7 +292,7 @@ static void thinLTOCreateEmptyIndexFiles(Ctx &ctx) {
if (linkedBitCodeFiles.contains(f->getName()))
continue;
std::string path =
- replaceThinLTOSuffix(getThinLTOOutputFile(ctx, f->obj->getName()));
+ replaceThinLTOSuffix(ctx, getThinLTOOutputFile(ctx, f->obj->getName()));
std::unique_ptr<raw_fd_ostream> os = openFile(path + ".thinlto.bc");
if (!os)
continue;
More information about the llvm-commits
mailing list