diff options
Diffstat (limited to 'lld/ELF/Driver.cpp')
| -rw-r--r-- | lld/ELF/Driver.cpp | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index d196bb167ec..e6eba274e02 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -940,6 +940,10 @@ static bool getBinaryOption(StringRef S) {  }  void LinkerDriver::createFiles(opt::InputArgList &Args) { +  // For --{push,pop}-state. +  std::vector<std::tuple<bool, bool, bool>> Stack; + +  // Iterate over argv to process input files and positional arguments.    for (auto *Arg : Args) {      switch (Arg->getOption().getUnaliasedOption().getID()) {      case OPT_library: @@ -1016,6 +1020,17 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) {        InputFile::IsInGroup = false;        ++InputFile::NextGroupId;        break; +    case OPT_push_state: +      Stack.push_back({Config->AsNeeded, Config->Static, InWholeArchive}); +      break; +    case OPT_pop_state: +      if (Stack.empty()) { +        error("unbalanced --push-state/--pop-state"); +        break; +      } +      std::tie(Config->AsNeeded, Config->Static, InWholeArchive) = Stack.back(); +      Stack.pop_back(); +      break;      }    }  | 

