1616#include " llvm/ObjCopy/ConfigManager.h"
1717#include " llvm/ObjCopy/MachO/MachOConfig.h"
1818#include " llvm/Object/Binary.h"
19+ #include " llvm/Object/OffloadBundle.h"
1920#include " llvm/Option/Arg.h"
2021#include " llvm/Option/ArgList.h"
2122#include " llvm/Support/CRC.h"
@@ -164,6 +165,41 @@ class StripOptTable : public opt::GenericOptTable {
164165 }
165166};
166167
168+ enum ExtractBundleEntryID {
169+ EXTRACT_BUNDLE_ENTRY_INVALID = 0 , // This is not an option ID.
170+ #define OPTION (...) \
171+ LLVM_MAKE_OPT_ID_WITH_ID_PREFIX (EXTRACT_BUNDLE_ENTRY_, __VA_ARGS__),
172+ #include " ExtractBundleEntryOpts.inc"
173+ #undef OPTION
174+ };
175+
176+ namespace extract_bundle_entry {
177+ #define OPTTABLE_STR_TABLE_CODE
178+ #include " ExtractBundleEntryOpts.inc"
179+ #undef OPTTABLE_STR_TABLE_CODE
180+
181+ #define OPTTABLE_PREFIXES_TABLE_CODE
182+ #include " ExtractBundleEntryOpts.inc"
183+ #undef OPTTABLE_PREFIXES_TABLE_CODE
184+
185+ static constexpr opt::OptTable::Info ExtractBundleEntryInfoTable[] = {
186+ #define OPTION (...) \
187+ LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX (EXTRACT_BUNDLE_ENTRY_, __VA_ARGS__),
188+ #include " ExtractBundleEntryOpts.inc"
189+ #undef OPTION
190+ };
191+ } // namespace extract_bundle_entry
192+
193+ class ExtractBundleEntryOptTable : public opt ::GenericOptTable {
194+ public:
195+ ExtractBundleEntryOptTable ()
196+ : GenericOptTable(extract_bundle_entry::OptionStrTable,
197+ extract_bundle_entry::OptionPrefixesTable,
198+ extract_bundle_entry::ExtractBundleEntryInfoTable) {
199+ setGroupedShortOptions (true );
200+ }
201+ };
202+
167203} // namespace
168204
169205static SectionFlag parseSectionRenameFlag (StringRef SectionName) {
@@ -418,7 +454,13 @@ template <class T> static ErrorOr<T> getAsInteger(StringRef Val) {
418454
419455namespace {
420456
421- enum class ToolType { Objcopy, Strip, InstallNameTool, BitcodeStrip };
457+ enum class ToolType {
458+ Objcopy,
459+ Strip,
460+ InstallNameTool,
461+ BitcodeStrip,
462+ ExtractBundleEntry
463+ };
422464
423465} // anonymous namespace
424466
@@ -442,6 +484,10 @@ static void printHelp(const opt::OptTable &OptTable, raw_ostream &OS,
442484 ToolName = " llvm-bitcode-strip" ;
443485 HelpText = " [options] input" ;
444486 break ;
487+ case ToolType::ExtractBundleEntry:
488+ ToolName = " llvm-extract-bundle-entry" ;
489+ HelpText = " URI" ;
490+ break ;
445491 }
446492 OptTable.printHelp (OS, (ToolName + HelpText).str ().c_str (),
447493 (ToolName + " tool" ).str ().c_str ());
@@ -1670,3 +1716,41 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
16701716
16711717 return std::move (DC);
16721718}
1719+
1720+ Expected<DriverConfig> objcopy::parseExtractBundleEntryOptions (
1721+ ArrayRef<const char *> ArgsArr, function_ref<Error(Error)> ErrorCallback) {
1722+
1723+ DriverConfig DC;
1724+
1725+ ExtractBundleEntryOptTable T;
1726+ unsigned MissingArgumentIndex, MissingArgumentCount;
1727+ opt::InputArgList InputArgs =
1728+ T.ParseArgs (ArgsArr, MissingArgumentIndex, MissingArgumentCount);
1729+
1730+ if (InputArgs.size () == 0 ) {
1731+ printHelp (T, errs (), ToolType::ExtractBundleEntry);
1732+ exit (1 );
1733+ }
1734+
1735+ if (InputArgs.hasArg (EXTRACT_BUNDLE_ENTRY_help)) {
1736+ printHelp (T, outs (), ToolType::ExtractBundleEntry);
1737+ exit (0 );
1738+ }
1739+
1740+ for (auto *Arg : InputArgs.filtered (EXTRACT_BUNDLE_ENTRY_UNKNOWN))
1741+ return createStringError (errc::invalid_argument, " unknown argument '%s'" ,
1742+ Arg->getAsString (InputArgs).c_str ());
1743+
1744+ SmallVector<StringRef, 256 > Positional;
1745+
1746+ for (auto *Arg : InputArgs.filtered (EXTRACT_BUNDLE_ENTRY_INPUT))
1747+ Positional.push_back (Arg->getValue ());
1748+ assert (!Positional.empty ());
1749+
1750+ // iterate over all input arguments
1751+ for (auto input : Positional)
1752+ if (Error Err = object::extractOffloadBundleByURI (input))
1753+ return std::move (Err);
1754+
1755+ return std::move (DC);
1756+ }
0 commit comments