|
16 | 16 | #include "llvm/ObjCopy/ConfigManager.h" |
17 | 17 | #include "llvm/ObjCopy/MachO/MachOConfig.h" |
18 | 18 | #include "llvm/Object/Binary.h" |
| 19 | +#include "llvm/Object/OffloadBinary.h" |
| 20 | +#include "llvm/Object/OffloadBundle.h" |
19 | 21 | #include "llvm/Option/Arg.h" |
20 | 22 | #include "llvm/Option/ArgList.h" |
21 | 23 | #include "llvm/Support/CRC.h" |
@@ -284,6 +286,11 @@ static Expected<uint8_t> parseVisibilityType(StringRef VisType) { |
284 | 286 | return type; |
285 | 287 | } |
286 | 288 |
|
| 289 | +static void llvm::objcopy::parseDumpOffloadBundle(StringRef URI) { |
| 290 | + if (Error Err = object::extractOffloadBundleByURI(URI)) |
| 291 | + outs() << "Failed to extract from URI."; |
| 292 | +} |
| 293 | + |
287 | 294 | namespace { |
288 | 295 | struct TargetInfo { |
289 | 296 | FileFormat Format; |
@@ -727,34 +734,45 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> ArgsArr, |
727 | 734 |
|
728 | 735 | SmallVector<const char *, 2> Positional; |
729 | 736 |
|
| 737 | + ConfigManager ConfigMgr; |
| 738 | + CommonConfig &Config = ConfigMgr.Common; |
| 739 | + COFFConfig &COFFConfig = ConfigMgr.COFF; |
| 740 | + ELFConfig &ELFConfig = ConfigMgr.ELF; |
| 741 | + MachOConfig &MachOConfig = ConfigMgr.MachO; |
| 742 | + |
| 743 | + if (InputArgs.hasArg(OBJCOPY_dump_offload_bundle)) |
| 744 | + Config.NeedPositional = false; |
| 745 | + |
730 | 746 | for (auto *Arg : InputArgs.filtered(OBJCOPY_UNKNOWN)) |
731 | 747 | return createStringError(errc::invalid_argument, "unknown argument '%s'", |
732 | 748 | Arg->getAsString(InputArgs).c_str()); |
733 | 749 |
|
734 | 750 | for (auto *Arg : InputArgs.filtered(OBJCOPY_INPUT)) |
735 | 751 | Positional.push_back(Arg->getValue()); |
736 | 752 |
|
737 | | - if (Positional.empty()) |
| 753 | + if (Positional.empty() && Config.NeedPositional) |
738 | 754 | return createStringError(errc::invalid_argument, "no input file specified"); |
739 | 755 |
|
740 | | - if (Positional.size() > 2) |
| 756 | + if (Positional.size() > 2 && Config.NeedPositional) |
741 | 757 | return createStringError(errc::invalid_argument, |
742 | 758 | "too many positional arguments"); |
743 | 759 |
|
744 | | - ConfigManager ConfigMgr; |
745 | | - CommonConfig &Config = ConfigMgr.Common; |
746 | | - COFFConfig &COFFConfig = ConfigMgr.COFF; |
747 | | - ELFConfig &ELFConfig = ConfigMgr.ELF; |
748 | | - MachOConfig &MachOConfig = ConfigMgr.MachO; |
749 | | - Config.InputFilename = Positional[0]; |
750 | | - Config.OutputFilename = Positional[Positional.size() == 1 ? 0 : 1]; |
751 | | - if (InputArgs.hasArg(OBJCOPY_target) && |
752 | | - (InputArgs.hasArg(OBJCOPY_input_target) || |
753 | | - InputArgs.hasArg(OBJCOPY_output_target))) |
754 | | - return createStringError( |
755 | | - errc::invalid_argument, |
756 | | - "--target cannot be used with --input-target or --output-target"); |
| 760 | + if (Arg *A = InputArgs.getLastArg(OBJCOPY_dump_offload_bundle)) { |
| 761 | + for (StringRef URIStr : llvm::split(A->getValue(), ",")) { |
| 762 | + llvm::objcopy::parseDumpOffloadBundle(URIStr); |
| 763 | + } |
| 764 | + } |
757 | 765 |
|
| 766 | + if (Config.NeedPositional) { |
| 767 | + Config.InputFilename = Positional[0]; |
| 768 | + Config.OutputFilename = Positional[Positional.size() == 1 ? 0 : 1]; |
| 769 | + if (InputArgs.hasArg(OBJCOPY_target) && |
| 770 | + (InputArgs.hasArg(OBJCOPY_input_target) || |
| 771 | + InputArgs.hasArg(OBJCOPY_output_target))) |
| 772 | + return createStringError( |
| 773 | + errc::invalid_argument, |
| 774 | + "--target cannot be used with --input-target or --output-target"); |
| 775 | + } |
758 | 776 | if (InputArgs.hasArg(OBJCOPY_regex) && InputArgs.hasArg(OBJCOPY_wildcard)) |
759 | 777 | return createStringError(errc::invalid_argument, |
760 | 778 | "--regex and --wildcard are incompatible"); |
@@ -1417,25 +1435,26 @@ objcopy::parseInstallNameToolOptions(ArrayRef<const char *> ArgsArr) { |
1417 | 1435 | Arg->getAsString(InputArgs).c_str()); |
1418 | 1436 | for (auto *Arg : InputArgs.filtered(INSTALL_NAME_TOOL_INPUT)) |
1419 | 1437 | Positional.push_back(Arg->getValue()); |
1420 | | - if (Positional.empty()) |
| 1438 | + if (Positional.empty() && Config.NeedPositional) |
1421 | 1439 | return createStringError(errc::invalid_argument, "no input file specified"); |
1422 | | - if (Positional.size() > 1) |
| 1440 | + if (Positional.size() > 1 && Config.NeedPositional) |
1423 | 1441 | return createStringError( |
1424 | 1442 | errc::invalid_argument, |
1425 | 1443 | "llvm-install-name-tool expects a single input file"); |
1426 | | - Config.InputFilename = Positional[0]; |
1427 | | - Config.OutputFilename = Positional[0]; |
1428 | | - |
1429 | | - Expected<OwningBinary<Binary>> BinaryOrErr = |
1430 | | - createBinary(Config.InputFilename); |
1431 | | - if (!BinaryOrErr) |
1432 | | - return createFileError(Config.InputFilename, BinaryOrErr.takeError()); |
1433 | | - auto *Binary = (*BinaryOrErr).getBinary(); |
1434 | | - if (!Binary->isMachO() && !Binary->isMachOUniversalBinary()) |
1435 | | - return createStringError(errc::invalid_argument, |
1436 | | - "input file: %s is not a Mach-O file", |
1437 | | - Config.InputFilename.str().c_str()); |
1438 | | - |
| 1444 | + if (Config.NeedPositional) { |
| 1445 | + Config.InputFilename = Positional[0]; |
| 1446 | + Config.OutputFilename = Positional[0]; |
| 1447 | + |
| 1448 | + Expected<OwningBinary<Binary>> BinaryOrErr = |
| 1449 | + createBinary(Config.InputFilename); |
| 1450 | + if (!BinaryOrErr) |
| 1451 | + return createFileError(Config.InputFilename, BinaryOrErr.takeError()); |
| 1452 | + auto *Binary = (*BinaryOrErr).getBinary(); |
| 1453 | + if (!Binary->isMachO() && !Binary->isMachOUniversalBinary()) |
| 1454 | + return createStringError(errc::invalid_argument, |
| 1455 | + "input file: %s is not a Mach-O file", |
| 1456 | + Config.InputFilename.str().c_str()); |
| 1457 | + } |
1439 | 1458 | DC.CopyConfigs.push_back(std::move(ConfigMgr)); |
1440 | 1459 | return std::move(DC); |
1441 | 1460 | } |
@@ -1474,13 +1493,16 @@ objcopy::parseBitcodeStripOptions(ArrayRef<const char *> ArgsArr, |
1474 | 1493 | Arg->getAsString(InputArgs).c_str()); |
1475 | 1494 |
|
1476 | 1495 | SmallVector<StringRef, 2> Positional; |
1477 | | - for (auto *Arg : InputArgs.filtered(BITCODE_STRIP_INPUT)) |
1478 | | - Positional.push_back(Arg->getValue()); |
1479 | | - if (Positional.size() > 1) |
1480 | | - return createStringError(errc::invalid_argument, |
1481 | | - "llvm-bitcode-strip expects a single input file"); |
1482 | | - assert(!Positional.empty()); |
1483 | | - Config.InputFilename = Positional[0]; |
| 1496 | + if (Config.NeedPositional) { |
| 1497 | + for (auto *Arg : InputArgs.filtered(BITCODE_STRIP_INPUT)) |
| 1498 | + Positional.push_back(Arg->getValue()); |
| 1499 | + if (Positional.size() > 1) |
| 1500 | + return createStringError( |
| 1501 | + errc::invalid_argument, |
| 1502 | + "llvm-bitcode-strip expects a single input file"); |
| 1503 | + assert(!Positional.empty()); |
| 1504 | + Config.InputFilename = Positional[0]; |
| 1505 | + } |
1484 | 1506 |
|
1485 | 1507 | if (!InputArgs.hasArg(BITCODE_STRIP_output)) { |
1486 | 1508 | return createStringError(errc::invalid_argument, |
@@ -1542,27 +1564,31 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr, |
1542 | 1564 | exit(0); |
1543 | 1565 | } |
1544 | 1566 |
|
1545 | | - SmallVector<StringRef, 2> Positional; |
1546 | | - for (auto *Arg : InputArgs.filtered(STRIP_UNKNOWN)) |
1547 | | - return createStringError(errc::invalid_argument, "unknown argument '%s'", |
1548 | | - Arg->getAsString(InputArgs).c_str()); |
1549 | | - for (auto *Arg : InputArgs.filtered(STRIP_INPUT)) |
1550 | | - Positional.push_back(Arg->getValue()); |
1551 | | - std::copy(DashDash, RawArgsArr.end(), std::back_inserter(Positional)); |
1552 | | - |
1553 | | - if (Positional.empty()) |
1554 | | - return createStringError(errc::invalid_argument, "no input file specified"); |
1555 | | - |
1556 | | - if (Positional.size() > 1 && InputArgs.hasArg(STRIP_output)) |
1557 | | - return createStringError( |
1558 | | - errc::invalid_argument, |
1559 | | - "multiple input files cannot be used in combination with -o"); |
1560 | | - |
1561 | 1567 | ConfigManager ConfigMgr; |
1562 | 1568 | CommonConfig &Config = ConfigMgr.Common; |
1563 | 1569 | ELFConfig &ELFConfig = ConfigMgr.ELF; |
1564 | 1570 | MachOConfig &MachOConfig = ConfigMgr.MachO; |
1565 | 1571 |
|
| 1572 | + SmallVector<StringRef, 2> Positional; |
| 1573 | + if (Config.NeedPositional) { |
| 1574 | + for (auto *Arg : InputArgs.filtered(STRIP_UNKNOWN)) |
| 1575 | + return createStringError(errc::invalid_argument, "unknown argument '%s'", |
| 1576 | + Arg->getAsString(InputArgs).c_str()); |
| 1577 | + for (auto *Arg : InputArgs.filtered(STRIP_INPUT)) |
| 1578 | + Positional.push_back(Arg->getValue()); |
| 1579 | + std::copy(DashDash, RawArgsArr.end(), std::back_inserter(Positional)); |
| 1580 | + |
| 1581 | + if (Positional.empty()) |
| 1582 | + return createStringError(errc::invalid_argument, |
| 1583 | + "no input file specified"); |
| 1584 | + |
| 1585 | + if (Positional.size() > 1 && InputArgs.hasArg(STRIP_output)) { |
| 1586 | + return createStringError( |
| 1587 | + errc::invalid_argument, |
| 1588 | + "multiple input files cannot be used in combination with -o"); |
| 1589 | + } |
| 1590 | + } |
| 1591 | + |
1566 | 1592 | if (InputArgs.hasArg(STRIP_regex) && InputArgs.hasArg(STRIP_wildcard)) |
1567 | 1593 | return createStringError(errc::invalid_argument, |
1568 | 1594 | "--regex and --wildcard are incompatible"); |
|
0 commit comments