-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Add --dump-offload-bundle option to llvm-objcopy #143347
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 3 commits
0f0030c
bc29780
1447801
a454551
78faec5
e493a07
448bfce
79b6ace
47dbdbd
f88b75e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -210,6 +210,27 @@ static Error dumpSectionToFile(StringRef SecName, StringRef Filename, | |
| "section '%s' not found", SecName.str().c_str()); | ||
| } | ||
|
|
||
| static Error dumpRawDataURIToFile(StringRef Filename, int64_t Offset, | ||
| int64_t Size, ObjectFile &Obj) { | ||
| SmallString<2048> NameBuf; | ||
| raw_svector_ostream OutputFileName(NameBuf); | ||
| OutputFileName << Obj.getFileName().str() << "-offset" << Offset << "-size" | ||
| << Size << ".co"; | ||
|
|
||
| Expected<std::unique_ptr<FileOutputBuffer>> BufferOrErr = | ||
| FileOutputBuffer::create(OutputFileName.str(), Size); | ||
|
|
||
| if (!BufferOrErr) | ||
| return BufferOrErr.takeError(); | ||
|
||
|
|
||
| MemoryBufferRef Input = Obj.getMemoryBufferRef(); | ||
| std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufferOrErr); | ||
| std::copy(Input.getBufferStart(), Input.getBufferStart() + Size, | ||
| Buf->getBufferStart()); | ||
|
||
|
|
||
| return Buf->commit(); | ||
| } | ||
|
|
||
| Error Object::compressOrDecompressSections(const CommonConfig &Config) { | ||
| // Build a list of sections we are going to replace. | ||
| // We can't call `addSection` while iterating over sections, | ||
|
|
||
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,6 +16,8 @@ | |
| #include "llvm/ObjCopy/ConfigManager.h" | ||
| #include "llvm/ObjCopy/MachO/MachOConfig.h" | ||
| #include "llvm/Object/Binary.h" | ||
| #include "llvm/Object/OffloadBinary.h" | ||
| #include "llvm/Object/OffloadBundle.h" | ||
| #include "llvm/Option/Arg.h" | ||
| #include "llvm/Option/ArgList.h" | ||
| #include "llvm/Support/CRC.h" | ||
|
|
@@ -284,6 +286,13 @@ static Expected<uint8_t> parseVisibilityType(StringRef VisType) { | |
| return type; | ||
| } | ||
|
|
||
| Expected<StringRef> llvm::objcopy::parseDumpOffloadBundle(StringRef URI) { | ||
| if (Error Err = object::extractOffloadBundleByURI(URI)) | ||
| return createStringError(errc::invalid_argument, | ||
| "failed to extract from URI"); | ||
| return URI; | ||
| } | ||
|
|
||
| namespace { | ||
| struct TargetInfo { | ||
| FileFormat Format; | ||
|
|
@@ -727,34 +736,47 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> ArgsArr, | |
|
|
||
| SmallVector<const char *, 2> Positional; | ||
|
|
||
| ConfigManager ConfigMgr; | ||
| CommonConfig &Config = ConfigMgr.Common; | ||
| COFFConfig &COFFConfig = ConfigMgr.COFF; | ||
| ELFConfig &ELFConfig = ConfigMgr.ELF; | ||
| MachOConfig &MachOConfig = ConfigMgr.MachO; | ||
|
|
||
| if (InputArgs.hasArg(OBJCOPY_dump_offload_bundle)) | ||
| Config.NeedPositional = false; | ||
|
|
||
| for (auto *Arg : InputArgs.filtered(OBJCOPY_UNKNOWN)) | ||
| return createStringError(errc::invalid_argument, "unknown argument '%s'", | ||
| Arg->getAsString(InputArgs).c_str()); | ||
|
|
||
| for (auto *Arg : InputArgs.filtered(OBJCOPY_INPUT)) | ||
| Positional.push_back(Arg->getValue()); | ||
|
|
||
| if (Positional.empty()) | ||
| if (Positional.empty() && Config.NeedPositional) | ||
| return createStringError(errc::invalid_argument, "no input file specified"); | ||
|
|
||
| if (Positional.size() > 2) | ||
| if (Positional.size() > 2 && Config.NeedPositional) | ||
| return createStringError(errc::invalid_argument, | ||
| "too many positional arguments"); | ||
|
|
||
| ConfigManager ConfigMgr; | ||
| CommonConfig &Config = ConfigMgr.Common; | ||
| COFFConfig &COFFConfig = ConfigMgr.COFF; | ||
| ELFConfig &ELFConfig = ConfigMgr.ELF; | ||
| MachOConfig &MachOConfig = ConfigMgr.MachO; | ||
| Config.InputFilename = Positional[0]; | ||
| Config.OutputFilename = Positional[Positional.size() == 1 ? 0 : 1]; | ||
| if (InputArgs.hasArg(OBJCOPY_target) && | ||
| (InputArgs.hasArg(OBJCOPY_input_target) || | ||
| InputArgs.hasArg(OBJCOPY_output_target))) | ||
| return createStringError( | ||
| errc::invalid_argument, | ||
| "--target cannot be used with --input-target or --output-target"); | ||
| if (Arg *A = InputArgs.getLastArg(OBJCOPY_dump_offload_bundle)) { | ||
| for (StringRef URIStr : llvm::split(A->getValue(), ",")) { | ||
| Expected<StringRef> res = llvm::objcopy::parseDumpOffloadBundle(URIStr); | ||
| if (!res) | ||
| return res.takeError(); | ||
| } | ||
| } | ||
|
|
||
| if (Config.NeedPositional) { | ||
| Config.InputFilename = Positional[0]; | ||
| Config.OutputFilename = Positional[Positional.size() == 1 ? 0 : 1]; | ||
| if (InputArgs.hasArg(OBJCOPY_target) && | ||
| (InputArgs.hasArg(OBJCOPY_input_target) || | ||
| InputArgs.hasArg(OBJCOPY_output_target))) | ||
| return createStringError( | ||
| errc::invalid_argument, | ||
| "--target cannot be used with --input-target or --output-target"); | ||
| } | ||
| if (InputArgs.hasArg(OBJCOPY_regex) && InputArgs.hasArg(OBJCOPY_wildcard)) | ||
| return createStringError(errc::invalid_argument, | ||
| "--regex and --wildcard are incompatible"); | ||
|
|
@@ -1417,12 +1439,13 @@ objcopy::parseInstallNameToolOptions(ArrayRef<const char *> ArgsArr) { | |
| Arg->getAsString(InputArgs).c_str()); | ||
| for (auto *Arg : InputArgs.filtered(INSTALL_NAME_TOOL_INPUT)) | ||
| Positional.push_back(Arg->getValue()); | ||
| if (Positional.empty()) | ||
| if (Positional.empty() && Config.NeedPositional) | ||
| return createStringError(errc::invalid_argument, "no input file specified"); | ||
| if (Positional.size() > 1) | ||
| if (Positional.size() > 1 && Config.NeedPositional) | ||
| return createStringError( | ||
| errc::invalid_argument, | ||
| "llvm-install-name-tool expects a single input file"); | ||
|
|
||
| Config.InputFilename = Positional[0]; | ||
| Config.OutputFilename = Positional[0]; | ||
|
|
||
|
|
@@ -1435,7 +1458,6 @@ objcopy::parseInstallNameToolOptions(ArrayRef<const char *> ArgsArr) { | |
| return createStringError(errc::invalid_argument, | ||
| "input file: %s is not a Mach-O file", | ||
| Config.InputFilename.str().c_str()); | ||
|
|
||
| DC.CopyConfigs.push_back(std::move(ConfigMgr)); | ||
| return std::move(DC); | ||
| } | ||
|
|
@@ -1477,8 +1499,9 @@ objcopy::parseBitcodeStripOptions(ArrayRef<const char *> ArgsArr, | |
| for (auto *Arg : InputArgs.filtered(BITCODE_STRIP_INPUT)) | ||
| Positional.push_back(Arg->getValue()); | ||
| if (Positional.size() > 1) | ||
| return createStringError(errc::invalid_argument, | ||
| "llvm-bitcode-strip expects a single input file"); | ||
| return createStringError( | ||
| errc::invalid_argument, | ||
| "llvm-bitcode-strip expects a single input file"); | ||
| assert(!Positional.empty()); | ||
| Config.InputFilename = Positional[0]; | ||
|
|
||
|
|
@@ -1542,6 +1565,11 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr, | |
| exit(0); | ||
| } | ||
|
|
||
| ConfigManager ConfigMgr; | ||
| CommonConfig &Config = ConfigMgr.Common; | ||
| ELFConfig &ELFConfig = ConfigMgr.ELF; | ||
| MachOConfig &MachOConfig = ConfigMgr.MachO; | ||
|
|
||
| SmallVector<StringRef, 2> Positional; | ||
| for (auto *Arg : InputArgs.filtered(STRIP_UNKNOWN)) | ||
| return createStringError(errc::invalid_argument, "unknown argument '%s'", | ||
|
|
@@ -1551,18 +1579,14 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr, | |
| std::copy(DashDash, RawArgsArr.end(), std::back_inserter(Positional)); | ||
|
|
||
| if (Positional.empty()) | ||
| return createStringError(errc::invalid_argument, "no input file specified"); | ||
| return createStringError(errc::invalid_argument, | ||
|
||
| "no input file specified"); | ||
|
|
||
| if (Positional.size() > 1 && InputArgs.hasArg(STRIP_output)) | ||
| return createStringError( | ||
| errc::invalid_argument, | ||
| "multiple input files cannot be used in combination with -o"); | ||
|
|
||
| ConfigManager ConfigMgr; | ||
| CommonConfig &Config = ConfigMgr.Common; | ||
| ELFConfig &ELFConfig = ConfigMgr.ELF; | ||
| MachOConfig &MachOConfig = ConfigMgr.MachO; | ||
|
|
||
| if (InputArgs.hasArg(STRIP_regex) && InputArgs.hasArg(STRIP_wildcard)) | ||
| return createStringError(errc::invalid_argument, | ||
| "--regex and --wildcard are incompatible"); | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.