diff options
author | Fangrui Song <i@maskray.me> | 2024-11-16 22:28:54 -0800 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2024-11-16 22:28:55 -0800 |
commit | 8f238f662c8237b88392f8a94469cd50d86636d6 (patch) | |
tree | ea77dc200d12e34affac33e6733d87f9ebf36ad1 | |
parent | b3230dd452bc8eb9ab4479cdb98f944838cb58b6 (diff) | |
download | llvm-8f238f662c8237b88392f8a94469cd50d86636d6.zip llvm-8f238f662c8237b88392f8a94469cd50d86636d6.tar.gz llvm-8f238f662c8237b88392f8a94469cd50d86636d6.tar.bz2 |
[ELF] Make Ctx inherit from CommonLinkerContext
link calls `new CommonLinkerContext`. Now that `Ctx ctx` is a local
variable, we can make it inherit from CommonLinkerContext.
-rw-r--r-- | lld/ELF/Config.h | 15 | ||||
-rw-r--r-- | lld/ELF/Driver.cpp | 32 | ||||
-rw-r--r-- | lld/ELF/DriverUtils.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/LTO.cpp | 24 | ||||
-rw-r--r-- | lld/ELF/Relocations.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 4 |
6 files changed, 37 insertions, 46 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 06c5428..431d675 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -551,15 +551,12 @@ struct InStruct { std::unique_ptr<SymtabShndxSection> symTabShndx; }; -struct Ctx { +struct Ctx : CommonLinkerContext { Config arg; LinkerDriver driver; LinkerScript *script; std::unique_ptr<TargetInfo> target; - CommonLinkerContext *commonCtx; - ErrorHandler *errHandler; - // These variables are initialized by Writer and should not be used before // Writer is initialized. uint8_t *bufferStart = nullptr; @@ -689,18 +686,16 @@ static inline ArrayRef<VersionDefinition> namedVersionDefs(Ctx &ctx) { return llvm::ArrayRef(ctx.arg.versionDefinitions).slice(2); } -inline llvm::BumpPtrAllocator &bAlloc(Ctx &ctx) { - return ctx.commonCtx->bAlloc; -} -inline llvm::StringSaver &saver(Ctx &ctx) { return ctx.commonCtx->saver; } +inline llvm::BumpPtrAllocator &bAlloc(Ctx &ctx) { return ctx.bAlloc; } +inline llvm::StringSaver &saver(Ctx &ctx) { return ctx.saver; } inline llvm::UniqueStringSaver &uniqueSaver(Ctx &ctx) { - return ctx.commonCtx->uniqueSaver; + return ctx.uniqueSaver; } struct ELFSyncStream : SyncStream { Ctx &ctx; ELFSyncStream(Ctx &ctx, DiagLevel level) - : SyncStream(*ctx.errHandler, level), ctx(ctx) {} + : SyncStream(ctx.e, level), ctx(ctx) {} }; template <typename T> diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 9d78404..927fa9d 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -90,7 +90,7 @@ ELFSyncStream elf::Err(Ctx &ctx) { } ELFSyncStream elf::ErrAlways(Ctx &ctx) { return {ctx, DiagLevel::Err}; } ELFSyncStream elf::Fatal(Ctx &ctx) { return {ctx, DiagLevel::Fatal}; } -uint64_t elf::errCount(Ctx &ctx) { return ctx.errHandler->errorCount; } +uint64_t elf::errCount(Ctx &ctx) { return ctx.e.errorCount; } ELFSyncStream elf::InternalErr(Ctx &ctx, const uint8_t *buf) { ELFSyncStream s(ctx, DiagLevel::Err); @@ -112,9 +112,9 @@ namespace lld { namespace elf { bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS, llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput) { - Ctx ctx; // This driver-specific context will be freed later by unsafeLldMain(). - auto *context = new CommonLinkerContext; + auto *context = new Ctx; + Ctx &ctx = *context; context->e.initialize(stdoutOS, stderrOS, exitEarly, disableOutput); context->e.logName = args::getFilenameWithoutExe(args[0]); @@ -124,8 +124,6 @@ bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS, LinkerScript script(ctx); ctx.script = &script; - ctx.commonCtx = context; - ctx.errHandler = &context->e; ctx.symAux.emplace_back(); ctx.symtab = std::make_unique<SymbolTable>(ctx); @@ -334,8 +332,8 @@ void LinkerDriver::addLibrary(StringRef name) { if (std::optional<std::string> path = searchLibrary(ctx, name)) addFile(saver(ctx).save(*path), /*withLOption=*/true); else - ctx.errHandler->error("unable to find library -l" + name, - ErrorTag::LibNotFound, {name}); + ctx.e.error("unable to find library -l" + name, ErrorTag::LibNotFound, + {name}); } // This function is called on startup. We need this for LTO since @@ -589,11 +587,11 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) { opt::InputArgList args = parser.parse(ctx, argsArr.slice(1)); // Interpret these flags early because Err/Warn depend on them. - ctx.errHandler->errorLimit = args::getInteger(args, OPT_error_limit, 20); - ctx.errHandler->fatalWarnings = + ctx.e.errorLimit = args::getInteger(args, OPT_error_limit, 20); + ctx.e.fatalWarnings = args.hasFlag(OPT_fatal_warnings, OPT_no_fatal_warnings, false) && !args.hasArg(OPT_no_warnings); - ctx.errHandler->suppressWarnings = args.hasArg(OPT_no_warnings); + ctx.e.suppressWarnings = args.hasArg(OPT_no_warnings); // Handle -help if (args.hasArg(OPT_help)) { @@ -667,10 +665,9 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) { } if (ctx.arg.timeTraceEnabled) { - checkError( - *ctx.errHandler, - timeTraceProfilerWrite(args.getLastArgValue(OPT_time_trace_eq).str(), - ctx.arg.outputFile)); + checkError(ctx.e, timeTraceProfilerWrite( + args.getLastArgValue(OPT_time_trace_eq).str(), + ctx.arg.outputFile)); timeTraceProfilerCleanup(); } } @@ -1227,8 +1224,8 @@ static bool remapInputs(Ctx &ctx, StringRef line, const Twine &location) { // Initializes Config members by the command line options. static void readConfigs(Ctx &ctx, opt::InputArgList &args) { - ctx.errHandler->verbose = args.hasArg(OPT_verbose); - ctx.errHandler->vsDiagnostics = + ctx.e.verbose = args.hasArg(OPT_verbose); + ctx.e.vsDiagnostics = args.hasArg(OPT_visual_studio_diagnostics_format, false); ctx.arg.allowMultipleDefinition = @@ -1286,8 +1283,7 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) { args.hasArg(OPT_enable_non_contiguous_regions); ctx.arg.entry = args.getLastArgValue(OPT_entry); - ctx.errHandler->errorHandlingScript = - args.getLastArgValue(OPT_error_handling_script); + ctx.e.errorHandlingScript = args.getLastArgValue(OPT_error_handling_script); ctx.arg.executeOnly = args.hasFlag(OPT_execute_only, OPT_no_execute_only, false); diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index 33006c1..97ede74 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -58,9 +58,9 @@ static void handleColorDiagnostics(Ctx &ctx, opt::InputArgList &args) { return; StringRef s = arg->getValue(); if (s == "always") - ctx.errHandler->errs().enable_colors(true); + ctx.e.errs().enable_colors(true); else if (s == "never") - ctx.errHandler->errs().enable_colors(false); + ctx.e.errs().enable_colors(false); else if (s != "auto") ErrAlways(ctx) << "unknown option: --color-diagnostics=" << s; } @@ -138,7 +138,7 @@ opt::InputArgList ELFOptTable::parse(Ctx &ctx, ArrayRef<const char *> argv) { } void elf::printHelp(Ctx &ctx) { - auto &outs = ctx.errHandler->outs(); + auto &outs = ctx.e.outs(); ELFOptTable().printHelp( outs, (ctx.arg.progName + " [options] file...").str().c_str(), "lld", false /*ShowHidden*/, true /*ShowAllAliases*/); diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp index 36161c3..7379f97 100644 --- a/lld/ELF/LTO.cpp +++ b/lld/ELF/LTO.cpp @@ -165,9 +165,9 @@ static lto::Config createConfig(Ctx &ctx) { } if (!ctx.arg.saveTempsArgs.empty()) - checkError(*ctx.errHandler, c.addSaveTemps(ctx.arg.outputFile.str() + ".", - /*UseInputModulePath*/ true, - ctx.arg.saveTempsArgs)); + checkError(ctx.e, c.addSaveTemps(ctx.arg.outputFile.str() + ".", + /*UseInputModulePath*/ true, + ctx.arg.saveTempsArgs)); return c; } @@ -278,7 +278,7 @@ void BitcodeCompiler::add(BitcodeFile &f) { // their values are still not final. r.LinkerRedefined = sym->scriptDefined; } - checkError(*ctx.errHandler, ltoObj->add(std::move(f.obj), resols)); + checkError(ctx.e, ltoObj->add(std::move(f.obj), resols)); } // If LazyObjFile has not been added to link, emit empty index files. @@ -329,14 +329,14 @@ std::vector<InputFile *> BitcodeCompiler::compile() { })); if (!ctx.bitcodeFiles.empty()) - checkError(*ctx.errHandler, ltoObj->run( - [&](size_t task, const Twine &moduleName) { - buf[task].first = moduleName.str(); - return std::make_unique<CachedFileStream>( - std::make_unique<raw_svector_ostream>( - buf[task].second)); - }, - cache)); + checkError(ctx.e, ltoObj->run( + [&](size_t task, const Twine &moduleName) { + buf[task].first = moduleName.str(); + return std::make_unique<CachedFileStream>( + std::make_unique<raw_svector_ostream>( + buf[task].second)); + }, + cache)); // Emit empty index files for non-indexed files but not in single-module mode. if (ctx.arg.thinLTOModulesToCompile.empty()) { diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index a000e79..1f3c570 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -777,7 +777,7 @@ static void reportUndefinedSymbol(Ctx &ctx, const UndefinedDiag &undef, if (undef.isWarning) Warn(ctx) << msg; else - ctx.errHandler->error(msg, ErrorTag::SymbolNotFound, {sym.getName()}); + ctx.e.error(msg, ErrorTag::SymbolNotFound, {sym.getName()}); } void elf::reportUndefinedSymbols(Ctx &ctx) { diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 32bb05f..0ec0da2 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -49,7 +49,7 @@ template <class ELFT> class Writer { public: LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) - Writer(Ctx &ctx) : ctx(ctx), buffer(ctx.errHandler->outputBuffer) {} + Writer(Ctx &ctx) : ctx(ctx), buffer(ctx.e.outputBuffer) {} void run(); @@ -342,7 +342,7 @@ template <class ELFT> void Writer<ELFT>::run() { // Handle --print-memory-usage option. if (ctx.arg.printMemoryUsage) - ctx.script->printMemoryUsage(ctx.errHandler->outs()); + ctx.script->printMemoryUsage(ctx.e.outs()); if (ctx.arg.checkSections) checkSections(); |