[lld] e24457a - [ELF] Migrate away from global ctx

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 14 22:17:22 PST 2024


Author: Fangrui Song
Date: 2024-11-14T22:17:10-08:00
New Revision: e24457a330923dbc43a0e056deddb2d42c682e6c

URL: https://github.com/llvm/llvm-project/commit/e24457a330923dbc43a0e056deddb2d42c682e6c
DIFF: https://github.com/llvm/llvm-project/commit/e24457a330923dbc43a0e056deddb2d42c682e6c.diff

LOG: [ELF] Migrate away from global ctx

Added: 
    

Modified: 
    lld/ELF/Arch/MipsArchTree.cpp
    lld/ELF/Driver.cpp
    lld/ELF/Driver.h
    lld/ELF/DriverUtils.cpp
    lld/ELF/ScriptLexer.cpp
    lld/ELF/ScriptLexer.h
    lld/ELF/ScriptParser.cpp
    lld/ELF/SyntheticSections.cpp
    lld/ELF/Target.h

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Arch/MipsArchTree.cpp b/lld/ELF/Arch/MipsArchTree.cpp
index 239fdd100e2c2f..0c64a46fe85d08 100644
--- a/lld/ELF/Arch/MipsArchTree.cpp
+++ b/lld/ELF/Arch/MipsArchTree.cpp
@@ -102,7 +102,7 @@ static uint32_t getMiscFlags(ArrayRef<FileFlags> files) {
   return ret;
 }
 
-static uint32_t getPicFlags(ArrayRef<FileFlags> files) {
+static uint32_t getPicFlags(Ctx &ctx, ArrayRef<FileFlags> files) {
   // Check PIC/non-PIC compatibility.
   bool isPic = files[0].flags & (EF_MIPS_PIC | EF_MIPS_CPIC);
   for (const FileFlags &f : files.slice(1)) {
@@ -274,7 +274,7 @@ static std::string getFullArchName(uint32_t flags) {
 // Output file gets EF_MIPS_ARCH_2 flag. From the other side mips3 and mips32
 // are incompatible because nor mips3 is a parent for misp32, nor mips32
 // is a parent for mips3.
-static uint32_t getArchFlags(ArrayRef<FileFlags> files) {
+static uint32_t getArchFlags(Ctx &ctx, ArrayRef<FileFlags> files) {
   uint32_t ret = files[0].flags & (EF_MIPS_ARCH | EF_MIPS_MACH);
 
   for (const FileFlags &f : files.slice(1)) {
@@ -307,7 +307,7 @@ template <class ELFT> uint32_t elf::calcMipsEFlags(Ctx &ctx) {
     return ctx.arg.mipsN32Abi ? EF_MIPS_ABI2 : EF_MIPS_ABI_O32;
   }
   checkFlags(ctx, v);
-  return getMiscFlags(v) | getPicFlags(v) | getArchFlags(v);
+  return getMiscFlags(v) | getPicFlags(ctx, v) | getArchFlags(ctx, v);
 }
 
 static int compareMipsFpAbi(uint8_t fpA, uint8_t fpB) {
@@ -350,7 +350,7 @@ static StringRef getMipsFpAbiName(uint8_t fpAbi) {
   }
 }
 
-uint8_t elf::getMipsFpAbiFlag(uint8_t oldFlag, uint8_t newFlag,
+uint8_t elf::getMipsFpAbiFlag(Ctx &ctx, uint8_t oldFlag, uint8_t newFlag,
                               StringRef fileName) {
   if (compareMipsFpAbi(newFlag, oldFlag) >= 0)
     return newFlag;

diff  --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index fed6b21ddc5168..429e5fa3c9db2a 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -600,7 +600,7 @@ static uint8_t getZStartStopVisibility(opt::InputArgList &args) {
   return ret;
 }
 
-static GcsPolicy getZGcs(opt::InputArgList &args) {
+static GcsPolicy getZGcs(Ctx &ctx, opt::InputArgList &args) {
   GcsPolicy ret = GcsPolicy::Implicit;
   for (auto *arg : args.filtered(OPT_z)) {
     std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
@@ -620,7 +620,7 @@ static GcsPolicy getZGcs(opt::InputArgList &args) {
 }
 
 // Report a warning for an unknown -z option.
-static void checkZOptions(opt::InputArgList &args) {
+static void checkZOptions(Ctx &ctx, opt::InputArgList &args) {
   // This function is called before getTarget(), when certain options are not
   // initialized yet. Claim them here.
   args::getZOptionValue(args, OPT_z, "max-page-size", 0);
@@ -639,7 +639,7 @@ LinkerDriver::LinkerDriver(Ctx &ctx) : ctx(ctx) {}
 
 void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
   ELFOptTable parser;
-  opt::InputArgList args = parser.parse(argsArr.slice(1));
+  opt::InputArgList args = parser.parse(ctx, argsArr.slice(1));
 
   // Interpret these flags early because error()/warn() depend on them.
   errorHandler().errorLimit = args::getInteger(args, OPT_error_limit, 20);
@@ -689,7 +689,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
   }
 
   readConfigs(ctx, args);
-  checkZOptions(args);
+  checkZOptions(ctx, args);
 
   // The behavior of -v or --version is a bit strange, but this is
   // needed for compatibility with GNU linkers.
@@ -790,7 +790,7 @@ static void setUnresolvedSymbolPolicy(Ctx &ctx, opt::InputArgList &args) {
       diagShlib ? errorOrWarn : UnresolvedPolicy::Ignore;
 }
 
-static Target2Policy getTarget2(opt::InputArgList &args) {
+static Target2Policy getTarget2(Ctx &ctx, opt::InputArgList &args) {
   StringRef s = args.getLastArgValue(OPT_target2, "got-rel");
   if (s == "rel")
     return Target2Policy::Rel;
@@ -802,7 +802,7 @@ static Target2Policy getTarget2(opt::InputArgList &args) {
   return Target2Policy::GotRel;
 }
 
-static bool isOutputFormatBinary(opt::InputArgList &args) {
+static bool isOutputFormatBinary(Ctx &ctx, opt::InputArgList &args) {
   StringRef s = args.getLastArgValue(OPT_oformat, "elf");
   if (s == "binary")
     return true;
@@ -882,7 +882,8 @@ static StripPolicy getStrip(Ctx &ctx, opt::InputArgList &args) {
   return StripPolicy::Debug;
 }
 
-static uint64_t parseSectionAddress(StringRef s, opt::InputArgList &args,
+static uint64_t parseSectionAddress(Ctx &ctx, StringRef s,
+                                    opt::InputArgList &args,
                                     const opt::Arg &arg) {
   uint64_t va = 0;
   s.consume_front("0x");
@@ -891,25 +892,26 @@ static uint64_t parseSectionAddress(StringRef s, opt::InputArgList &args,
   return va;
 }
 
-static StringMap<uint64_t> getSectionStartMap(opt::InputArgList &args) {
+static StringMap<uint64_t> getSectionStartMap(Ctx &ctx,
+                                              opt::InputArgList &args) {
   StringMap<uint64_t> ret;
   for (auto *arg : args.filtered(OPT_section_start)) {
     StringRef name;
     StringRef addr;
     std::tie(name, addr) = StringRef(arg->getValue()).split('=');
-    ret[name] = parseSectionAddress(addr, args, *arg);
+    ret[name] = parseSectionAddress(ctx, addr, args, *arg);
   }
 
   if (auto *arg = args.getLastArg(OPT_Ttext))
-    ret[".text"] = parseSectionAddress(arg->getValue(), args, *arg);
+    ret[".text"] = parseSectionAddress(ctx, arg->getValue(), args, *arg);
   if (auto *arg = args.getLastArg(OPT_Tdata))
-    ret[".data"] = parseSectionAddress(arg->getValue(), args, *arg);
+    ret[".data"] = parseSectionAddress(ctx, arg->getValue(), args, *arg);
   if (auto *arg = args.getLastArg(OPT_Tbss))
-    ret[".bss"] = parseSectionAddress(arg->getValue(), args, *arg);
+    ret[".bss"] = parseSectionAddress(ctx, arg->getValue(), args, *arg);
   return ret;
 }
 
-static SortSectionPolicy getSortSection(opt::InputArgList &args) {
+static SortSectionPolicy getSortSection(Ctx &ctx, opt::InputArgList &args) {
   StringRef s = args.getLastArgValue(OPT_sort_section);
   if (s == "alignment")
     return SortSectionPolicy::Alignment;
@@ -920,7 +922,8 @@ static SortSectionPolicy getSortSection(opt::InputArgList &args) {
   return SortSectionPolicy::Default;
 }
 
-static OrphanHandlingPolicy getOrphanHandling(opt::InputArgList &args) {
+static OrphanHandlingPolicy getOrphanHandling(Ctx &ctx,
+                                              opt::InputArgList &args) {
   StringRef s = args.getLastArgValue(OPT_orphan_handling, "place");
   if (s == "warn")
     return OrphanHandlingPolicy::Warn;
@@ -935,7 +938,7 @@ static OrphanHandlingPolicy getOrphanHandling(opt::InputArgList &args) {
 // synonym for "sha1" because all our hash functions including
 // --build-id=sha1 are actually tree hashes for performance reasons.
 static std::pair<BuildIdKind, SmallVector<uint8_t, 0>>
-getBuildId(opt::InputArgList &args) {
+getBuildId(Ctx &ctx, opt::InputArgList &args) {
   auto *arg = args.getLastArg(OPT_build_id);
   if (!arg)
     return {BuildIdKind::None, {}};
@@ -957,7 +960,8 @@ getBuildId(opt::InputArgList &args) {
   return {BuildIdKind::None, {}};
 }
 
-static std::pair<bool, bool> getPackDynRelocs(opt::InputArgList &args) {
+static std::pair<bool, bool> getPackDynRelocs(Ctx &ctx,
+                                              opt::InputArgList &args) {
   StringRef s = args.getLastArgValue(OPT_pack_dyn_relocs, "none");
   if (s == "android")
     return {true, false};
@@ -1152,7 +1156,8 @@ static void ltoValidateAllVtablesHaveTypeInfos(Ctx &ctx,
   }
 }
 
-static CGProfileSortKind getCGProfileSortKind(opt::InputArgList &args) {
+static CGProfileSortKind getCGProfileSortKind(Ctx &ctx,
+                                              opt::InputArgList &args) {
   StringRef s = args.getLastArgValue(OPT_call_graph_profile_sort, "cdsort");
   if (s == "hfsort")
     return CGProfileSortKind::Hfsort;
@@ -1163,7 +1168,8 @@ static CGProfileSortKind getCGProfileSortKind(opt::InputArgList &args) {
   return CGProfileSortKind::None;
 }
 
-static DebugCompressionType getCompressionType(StringRef s, StringRef option) {
+static DebugCompressionType getCompressionType(Ctx &ctx, StringRef s,
+                                               StringRef option) {
   DebugCompressionType type = StringSwitch<DebugCompressionType>(s)
                                   .Case("zlib", DebugCompressionType::Zlib)
                                   .Case("zstd", DebugCompressionType::Zstd)
@@ -1184,8 +1190,8 @@ static StringRef getAliasSpelling(opt::Arg *arg) {
   return arg->getSpelling();
 }
 
-static std::pair<StringRef, StringRef> getOldNewOptions(opt::InputArgList &args,
-                                                        unsigned id) {
+static std::pair<StringRef, StringRef>
+getOldNewOptions(Ctx &ctx, opt::InputArgList &args, unsigned id) {
   auto *arg = args.getLastArg(id);
   if (!arg)
     return {"", ""};
@@ -1200,8 +1206,8 @@ static std::pair<StringRef, StringRef> getOldNewOptions(opt::InputArgList &args,
 
 // Parse options of the form "old;new[;extra]".
 static std::tuple<StringRef, StringRef, StringRef>
-getOldNewOptionsExtra(opt::InputArgList &args, unsigned id) {
-  auto [oldDir, second] = getOldNewOptions(args, id);
+getOldNewOptionsExtra(Ctx &ctx, opt::InputArgList &args, unsigned id) {
+  auto [oldDir, second] = getOldNewOptions(ctx, args, id);
   auto [newDir, extraDir] = second.split(';');
   return {oldDir, newDir, extraDir};
 }
@@ -1303,13 +1309,13 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
     else if (arg->getOption().matches(OPT_Bsymbolic))
       ctx.arg.bsymbolic = BsymbolicKind::All;
   }
-  ctx.arg.callGraphProfileSort = getCGProfileSortKind(args);
+  ctx.arg.callGraphProfileSort = getCGProfileSortKind(ctx, args);
   ctx.arg.checkSections =
       args.hasFlag(OPT_check_sections, OPT_no_check_sections, true);
   ctx.arg.chroot = args.getLastArgValue(OPT_chroot);
   if (auto *arg = args.getLastArg(OPT_compress_debug_sections)) {
     ctx.arg.compressDebugSections =
-        getCompressionType(arg->getValue(), "--compress-debug-sections");
+        getCompressionType(ctx, arg->getValue(), "--compress-debug-sections");
   }
   ctx.arg.cref = args.hasArg(OPT_cref);
   ctx.arg.optimizeBBJumps =
@@ -1406,7 +1412,7 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   ctx.arg.nmagic = args.hasFlag(OPT_nmagic, OPT_no_nmagic, false);
   ctx.arg.noinhibitExec = args.hasArg(OPT_noinhibit_exec);
   ctx.arg.nostdlib = args.hasArg(OPT_nostdlib);
-  ctx.arg.oFormatBinary = isOutputFormatBinary(args);
+  ctx.arg.oFormatBinary = isOutputFormatBinary(ctx, args);
   ctx.arg.omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false);
   ctx.arg.optRemarksFilename = args.getLastArgValue(OPT_opt_remarks_filename);
   ctx.arg.optStatsFilename = args.getLastArgValue(OPT_plugin_opt_stats_file);
@@ -1426,7 +1432,7 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   ctx.arg.optRemarksWithHotness = args.hasArg(OPT_opt_remarks_with_hotness);
   ctx.arg.optRemarksFormat = args.getLastArgValue(OPT_opt_remarks_format);
   ctx.arg.optimize = args::getInteger(args, OPT_O, 1);
-  ctx.arg.orphanHandling = getOrphanHandling(args);
+  ctx.arg.orphanHandling = getOrphanHandling(ctx, args);
   ctx.arg.outputFile = args.getLastArgValue(OPT_o);
   ctx.arg.packageMetadata = args.getLastArgValue(OPT_package_metadata);
   ctx.arg.pie = args.hasFlag(OPT_pie, OPT_no_pie, false);
@@ -1460,11 +1466,11 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   }
 
   ctx.arg.searchPaths = args::getStrings(args, OPT_library_path);
-  ctx.arg.sectionStartMap = getSectionStartMap(args);
+  ctx.arg.sectionStartMap = getSectionStartMap(ctx, args);
   ctx.arg.shared = args.hasArg(OPT_shared);
   ctx.arg.singleRoRx = !args.hasFlag(OPT_rosegment, OPT_no_rosegment, true);
   ctx.arg.soName = args.getLastArgValue(OPT_soname);
-  ctx.arg.sortSection = getSortSection(args);
+  ctx.arg.sortSection = getSortSection(ctx, args);
   ctx.arg.splitStackAdjustSize =
       args::getInteger(args, OPT_split_stack_adjust_size, 16384);
   ctx.arg.zSectionHeader =
@@ -1472,7 +1478,7 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   ctx.arg.strip = getStrip(ctx, args); // needs zSectionHeader
   ctx.arg.sysroot = args.getLastArgValue(OPT_sysroot);
   ctx.arg.target1Rel = args.hasFlag(OPT_target1_rel, OPT_target1_abs, false);
-  ctx.arg.target2 = getTarget2(args);
+  ctx.arg.target2 = getTarget2(ctx, args);
   ctx.arg.thinLTOCacheDir = args.getLastArgValue(OPT_thinlto_cache_dir);
   ctx.arg.thinLTOCachePolicy = CHECK(
       parseCachePruningPolicy(args.getLastArgValue(OPT_thinlto_cache_policy)),
@@ -1485,10 +1491,10 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
                              args.hasArg(OPT_thinlto_index_only_eq);
   ctx.arg.thinLTOIndexOnlyArg = args.getLastArgValue(OPT_thinlto_index_only_eq);
   ctx.arg.thinLTOObjectSuffixReplace =
-      getOldNewOptions(args, OPT_thinlto_object_suffix_replace_eq);
+      getOldNewOptions(ctx, args, OPT_thinlto_object_suffix_replace_eq);
   std::tie(ctx.arg.thinLTOPrefixReplaceOld, ctx.arg.thinLTOPrefixReplaceNew,
            ctx.arg.thinLTOPrefixReplaceNativeObject) =
-      getOldNewOptionsExtra(args, OPT_thinlto_prefix_replace_eq);
+      getOldNewOptionsExtra(ctx, args, OPT_thinlto_prefix_replace_eq);
   if (ctx.arg.thinLTOEmitIndexFiles && !ctx.arg.thinLTOIndexOnly) {
     if (args.hasArg(OPT_thinlto_object_suffix_replace_eq))
       ErrAlways(ctx) << "--thinlto-object-suffix-replace is not supported with "
@@ -1525,7 +1531,7 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   ctx.arg.zCopyreloc = getZFlag(args, "copyreloc", "nocopyreloc", true);
   ctx.arg.zForceBti = hasZOption(args, "force-bti");
   ctx.arg.zForceIbt = hasZOption(args, "force-ibt");
-  ctx.arg.zGcs = getZGcs(args);
+  ctx.arg.zGcs = getZGcs(ctx, args);
   ctx.arg.zGlobal = hasZOption(args, "global");
   ctx.arg.zGnustack = getZGnuStack(args);
   ctx.arg.zHazardplt = hasZOption(args, "hazardplt");
@@ -1627,7 +1633,7 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
       continue;
     }
     auto [typeStr, levelStr] = fields[1].split(':');
-    auto type = getCompressionType(typeStr, arg->getSpelling());
+    auto type = getCompressionType(ctx, typeStr, arg->getSpelling());
     unsigned level = 0;
     if (fields[1].size() != typeStr.size() &&
         !llvm::to_integer(levelStr, level)) {
@@ -1781,14 +1787,14 @@ static void readConfigs(Ctx &ctx, opt::InputArgList &args) {
   if (ctx.arg.nmagic || ctx.arg.omagic || ctx.arg.relocatable)
     ctx.arg.zRelro = false;
 
-  std::tie(ctx.arg.buildId, ctx.arg.buildIdVector) = getBuildId(args);
+  std::tie(ctx.arg.buildId, ctx.arg.buildIdVector) = getBuildId(ctx, args);
 
   if (getZFlag(args, "pack-relative-relocs", "nopack-relative-relocs", false)) {
     ctx.arg.relrGlibc = true;
     ctx.arg.relrPackDynRelocs = true;
   } else {
     std::tie(ctx.arg.androidPackDynRelocs, ctx.arg.relrPackDynRelocs) =
-        getPackDynRelocs(args);
+        getPackDynRelocs(ctx, args);
   }
 
   if (auto *arg = args.getLastArg(OPT_symbol_ordering_file)){
@@ -1949,7 +1955,7 @@ static void setConfigs(Ctx &ctx, opt::InputArgList &args) {
   }
 }
 
-static bool isFormatBinary(StringRef s) {
+static bool isFormatBinary(Ctx &ctx, StringRef s) {
   if (s == "binary")
     return true;
   if (s == "elf" || s == "default")
@@ -2006,7 +2012,7 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
       ctx.arg.asNeeded = true;
       break;
     case OPT_format:
-      ctx.arg.formatBinary = isFormatBinary(arg->getValue());
+      ctx.arg.formatBinary = isFormatBinary(ctx, arg->getValue());
       break;
     case OPT_no_as_needed:
       ctx.arg.asNeeded = false;

diff  --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h
index 95cc437d351f76..b5d41633141e29 100644
--- a/lld/ELF/Driver.h
+++ b/lld/ELF/Driver.h
@@ -21,7 +21,7 @@ struct Ctx;
 class ELFOptTable : public llvm::opt::GenericOptTable {
 public:
   ELFOptTable();
-  llvm::opt::InputArgList parse(ArrayRef<const char *> argv);
+  llvm::opt::InputArgList parse(Ctx &, ArrayRef<const char *> argv);
 };
 
 // Create enum with OPT_xxx values for each option in Options.td

diff  --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp
index 096f033a767ef5..d41dc2e0524764 100644
--- a/lld/ELF/DriverUtils.cpp
+++ b/lld/ELF/DriverUtils.cpp
@@ -65,7 +65,8 @@ static void handleColorDiagnostics(opt::InputArgList &args) {
     ErrAlways(ctx) << "unknown option: --color-diagnostics=" << s;
 }
 
-static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &args) {
+static cl::TokenizerCallback getQuotingStyle(Ctx &ctx,
+                                             opt::InputArgList &args) {
   if (auto *arg = args.getLastArg(OPT_rsp_quoting)) {
     StringRef s = arg->getValue();
     if (s != "windows" && s != "posix")
@@ -103,7 +104,7 @@ static void concatLTOPluginOptions(SmallVectorImpl<const char *> &args) {
 }
 
 // Parses a given list of options.
-opt::InputArgList ELFOptTable::parse(ArrayRef<const char *> argv) {
+opt::InputArgList ELFOptTable::parse(Ctx &ctx, ArrayRef<const char *> argv) {
   // Make InputArgList from string vectors.
   unsigned missingIndex;
   unsigned missingCount;
@@ -116,7 +117,7 @@ opt::InputArgList ELFOptTable::parse(ArrayRef<const char *> argv) {
 
   // Expand response files (arguments in the form of @<filename>)
   // and then parse the argument again.
-  cl::ExpandResponseFiles(saver(), getQuotingStyle(args), vec);
+  cl::ExpandResponseFiles(saver(), getQuotingStyle(ctx, args), vec);
   concatLTOPluginOptions(vec);
   args = this->ParseArgs(vec, missingIndex, missingCount);
 

diff  --git a/lld/ELF/ScriptLexer.cpp b/lld/ELF/ScriptLexer.cpp
index ae5ad7cae949d9..62865681127edf 100644
--- a/lld/ELF/ScriptLexer.cpp
+++ b/lld/ELF/ScriptLexer.cpp
@@ -54,7 +54,7 @@ ScriptLexer::Buffer::Buffer(Ctx &ctx, MemoryBufferRef mb)
 }
 
 ScriptLexer::ScriptLexer(Ctx &ctx, MemoryBufferRef mb)
-    : curBuf(ctx, mb), mbs(1, mb) {
+    : ctx(ctx), curBuf(ctx, mb), mbs(1, mb) {
   activeFilenames.insert(mb.getBufferIdentifier());
 }
 

diff  --git a/lld/ELF/ScriptLexer.h b/lld/ELF/ScriptLexer.h
index 0f31ef17844b76..d689a7e108f93e 100644
--- a/lld/ELF/ScriptLexer.h
+++ b/lld/ELF/ScriptLexer.h
@@ -33,6 +33,7 @@ class ScriptLexer {
     Buffer() = default;
     Buffer(Ctx &ctx, MemoryBufferRef mb);
   };
+  Ctx &ctx;
   // The current buffer and parent buffers due to INCLUDE.
   Buffer curBuf;
   SmallVector<Buffer, 0> buffers;

diff  --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index d8adc56cf7d9a0..aa89d8c22cf2f4 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -972,8 +972,8 @@ void ScriptParser::readSectionAddressType(OutputSection *cmd) {
   }
 }
 
-static Expr checkAlignment(Expr e, std::string &loc) {
-  return [=] {
+static Expr checkAlignment(Ctx &ctx, Expr e, std::string &loc) {
+  return [=, &ctx] {
     uint64_t alignment = std::max((uint64_t)1, e().getValue());
     if (!isPowerOf2_64(alignment)) {
       ErrAlways(ctx) << loc << ": alignment must be power of 2";
@@ -1023,9 +1023,9 @@ OutputDesc *ScriptParser::readOutputSectionDescription(StringRef outSec) {
   if (consume("AT"))
     osec->lmaExpr = readParenExpr();
   if (consume("ALIGN"))
-    osec->alignExpr = checkAlignment(readParenExpr(), location);
+    osec->alignExpr = checkAlignment(ctx, readParenExpr(), location);
   if (consume("SUBALIGN"))
-    osec->subalignExpr = checkAlignment(readParenExpr(), location);
+    osec->subalignExpr = checkAlignment(ctx, readParenExpr(), location);
 
   // Parse constraints.
   if (consume("ONLY_IF_RO"))
@@ -1516,13 +1516,13 @@ Expr ScriptParser::readPrimary() {
     expect("(");
     Expr e = readExpr();
     if (consume(")")) {
-      e = checkAlignment(e, location);
+      e = checkAlignment(ctx, e, location);
       return [=, s = ctx.script] {
         return alignToPowerOf2(s->getDot(), e().getValue());
       };
     }
     expect(",");
-    Expr e2 = checkAlignment(readExpr(), location);
+    Expr e2 = checkAlignment(ctx, readExpr(), location);
     expect(")");
     return [=] {
       ExprValue v = e();

diff  --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index ba2dadece74735..55ce1abae73add 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -150,7 +150,8 @@ MipsAbiFlagsSection<ELFT>::create(Ctx &ctx) {
     flags.ases |= s->ases;
     flags.flags1 |= s->flags1;
     flags.flags2 |= s->flags2;
-    flags.fp_abi = elf::getMipsFpAbiFlag(flags.fp_abi, s->fp_abi, filename);
+    flags.fp_abi =
+        elf::getMipsFpAbiFlag(ctx, flags.fp_abi, s->fp_abi, filename);
   };
 
   if (create)
@@ -3408,7 +3409,7 @@ readAddressAreas(DWARFContext &dwarf, InputSection *sec) {
 
 template <class ELFT>
 static SmallVector<GdbIndexSection::NameAttrEntry, 0>
-readPubNamesAndTypes(const LLDDwarfObj<ELFT> &obj,
+readPubNamesAndTypes(Ctx &ctx, const LLDDwarfObj<ELFT> &obj,
                      const SmallVectorImpl<GdbIndexSection::CuEntry> &cus) {
   const LLDDWARFSection &pubNames = obj.getGnuPubnamesSection();
   const LLDDWARFSection &pubTypes = obj.getGnuPubtypesSection();
@@ -3564,7 +3565,8 @@ std::unique_ptr<GdbIndexSection> GdbIndexSection::create(Ctx &ctx) {
     chunks[i].sec = dobj.getInfoSection();
     chunks[i].compilationUnits = readCuList(dwarf);
     chunks[i].addressAreas = readAddressAreas(dwarf, chunks[i].sec);
-    nameAttrs[i] = readPubNamesAndTypes<ELFT>(dobj, chunks[i].compilationUnits);
+    nameAttrs[i] =
+        readPubNamesAndTypes<ELFT>(ctx, dobj, chunks[i].compilationUnits);
   });
 
   auto ret = std::make_unique<GdbIndexSection>(ctx);

diff  --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index 250a29d6184313..d4919ffc3aac96 100644
--- a/lld/ELF/Target.h
+++ b/lld/ELF/Target.h
@@ -211,7 +211,7 @@ static inline std::string getErrorLoc(Ctx &ctx, const uint8_t *loc) {
 void processArmCmseSymbols(Ctx &);
 
 template <class ELFT> uint32_t calcMipsEFlags(Ctx &);
-uint8_t getMipsFpAbiFlag(uint8_t oldFlag, uint8_t newFlag,
+uint8_t getMipsFpAbiFlag(Ctx &, uint8_t oldFlag, uint8_t newFlag,
                          llvm::StringRef fileName);
 bool isMipsN32Abi(Ctx &, const InputFile &f);
 bool isMicroMips(Ctx &);


        


More information about the llvm-commits mailing list