|
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