aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objcopy/CopyConfig.cpp
diff options
context:
space:
mode:
authorSergey Dmitriev <serguei.n.dmitriev@intel.com>2021-05-19 01:11:53 -0700
committerSergey Dmitriev <serguei.n.dmitriev@intel.com>2021-05-19 01:56:46 -0700
commitf24f140290703b4ec610ac45bd5e4cbdaa8ee25e (patch)
tree16d1c11c19ebfa0e9af00c5125b2fa1540841699 /llvm/tools/llvm-objcopy/CopyConfig.cpp
parentca2c245ba4665bde94f8c6319185d1c9ff295167 (diff)
downloadllvm-f24f140290703b4ec610ac45bd5e4cbdaa8ee25e.zip
llvm-f24f140290703b4ec610ac45bd5e4cbdaa8ee25e.tar.gz
llvm-f24f140290703b4ec610ac45bd5e4cbdaa8ee25e.tar.bz2
[llvm-objcopy] Add support for '--' for delimiting options from input/output files
This will allow to use llvm-objcopy with file names that begin with dashes. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D102665
Diffstat (limited to 'llvm/tools/llvm-objcopy/CopyConfig.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/CopyConfig.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/tools/llvm-objcopy/CopyConfig.cpp b/llvm/tools/llvm-objcopy/CopyConfig.cpp
index 5669928..ce68101 100644
--- a/llvm/tools/llvm-objcopy/CopyConfig.cpp
+++ b/llvm/tools/llvm-objcopy/CopyConfig.cpp
@@ -470,15 +470,23 @@ static void printHelp(const opt::OptTable &OptTable, raw_ostream &OS,
// help flag is set then ParseObjcopyOptions will print the help messege and
// exit.
Expected<DriverConfig>
-parseObjcopyOptions(ArrayRef<const char *> ArgsArr,
+parseObjcopyOptions(ArrayRef<const char *> RawArgsArr,
llvm::function_ref<Error(Error)> ErrorCallback) {
DriverConfig DC;
ObjcopyOptTable T;
+
+ const char *const *DashDash =
+ std::find_if(RawArgsArr.begin(), RawArgsArr.end(),
+ [](StringRef Str) { return Str == "--"; });
+ ArrayRef<const char *> ArgsArr = makeArrayRef(RawArgsArr.begin(), DashDash);
+ if (DashDash != RawArgsArr.end())
+ DashDash = std::next(DashDash);
+
unsigned MissingArgumentIndex, MissingArgumentCount;
llvm::opt::InputArgList InputArgs =
T.ParseArgs(ArgsArr, MissingArgumentIndex, MissingArgumentCount);
- if (InputArgs.size() == 0) {
+ if (InputArgs.size() == 0 && DashDash == RawArgsArr.end()) {
printHelp(T, errs(), ToolType::Objcopy);
exit(1);
}
@@ -502,6 +510,7 @@ parseObjcopyOptions(ArrayRef<const char *> ArgsArr,
for (auto Arg : InputArgs.filtered(OBJCOPY_INPUT))
Positional.push_back(Arg->getValue());
+ std::copy(DashDash, RawArgsArr.end(), std::back_inserter(Positional));
if (Positional.empty())
return createStringError(errc::invalid_argument, "no input file specified");