╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ zig_llvm-ar.cpp ──────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
1380 continue; 1381 } 1382 1383 Match = matchFlagWithArg("format", ArgIt, Argv); 1384 if (Match) { 1385 FormatType = StringSwitch<Format>(Match) 1386 .Case("default", Default) 1387 .Case("gnu", GNU) 1388 .Case("darwin", DARWIN) 1389 .Case("bsd", BSD) 1390 .Case("bigarchive", BIGARCHIVE) 1391 .Case("coff", COFF) 1392 .Default(Unknown); 1393 if (FormatType == Unknown) 1394 fail(std::string("Invalid format ") + Match); 1395 continue; 1396 } 1397 1398 if ((Match = matchFlagWithArg("output", ArgIt, Argv))) { 1399 OutputDir = Match; 1400 continue; 1401 } 1402 1403 if (matchFlagWithArg("plugin", ArgIt, Argv) || 1404 matchFlagWithArg("rsp-quoting", ArgIt, Argv)) 1405 continue; 1406 1407 if (strncmp(*ArgIt, "-X", 2) == 0) { 1408 if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) { 1409 Match = *(*ArgIt + 2) != '\0' ? *ArgIt + 2 : *(++ArgIt); 1410 BitMode = getBitMode(Match); 1411 if (BitMode == BitModeTy::Unknown) 1412 fail(Twine("invalid bit mode: ") + Match); 1413 continue; 1414 } else { 1415 fail(Twine(*ArgIt) + " option not supported on non AIX OS"); 1416 } 1417 } 1418 1419 Options += *ArgIt + 1; 1420 } 1421 1422 return performOperation(parseCommandLine()); 1423 } 1424 1425 static int ranlib_main(int argc, char **argv) { 1426 std::vector<StringRef> Archives; 1427 bool HasAIXXOption = false; 1428 1429 for (int i = 1; i < argc; ++i) { 1430 StringRef arg(argv[i]); 1431 if (handleGenericOption(arg)) { 1432 return 0; 1433 } else if (arg.consume_front("-")) { 1434 // Handle the -D/-U flag 1435 while (!arg.empty()) { 1436 if (arg.front() == 'D') { 1437 Deterministic = true; 1438 } else if (arg.front() == 'U') { 1439 Deterministic = false; 1440 } else if (arg.front() == 'h') { 1441 printHelpMessage(); 1442 return 0; 1443 } else if (arg.front() == 'V') { 1444 cl::PrintVersionMessage(); 1445 return 0; 1446 } else if (arg.front() == 'X') { 1447 if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) { 1448 HasAIXXOption = true; 1449 arg.consume_front("X"); 1450 const char *Xarg = arg.data(); 1451 if (Xarg[0] == '\0') { 1452 if (argv[i + 1][0] != '-') 1453 BitMode = getBitMode(argv[++i]); 1454 else 1455 BitMode = BitModeTy::Unknown; 1456 } else 1457 BitMode = getBitMode(arg.data()); 1458 1459 if (BitMode == BitModeTy::Unknown) 1460 fail("the specified object mode is not valid. Specify -X32, " 1461 "-X64, -X32_64, or -Xany"); 1462 } else { 1463 fail(Twine("-") + Twine(arg) + 1464 " option not supported on non AIX OS"); 1465 } 1466 break; 1467 } else { 1468 // TODO: GNU ranlib also supports a -t flag 1469 fail("Invalid option: '-" + arg + "'"); 1470 } 1471 arg = arg.drop_front(1); 1472 } 1473 } else { 1474 Archives.push_back(arg); 1475 } 1476 } 1477 1478 if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) { 1479 // If not specify -X option, get BitMode from enviorment variable 1480 // "OBJECT_MODE" for AIX OS if specify. 1481 if (!HasAIXXOption) { 1482 if (char *EnvObjectMode = getenv("OBJECT_MODE")) { 1483 BitMode = getBitMode(EnvObjectMode); 1484 if (BitMode == BitModeTy::Unknown) 1485 fail("the OBJECT_MODE environment variable has an invalid value. " 1486 "OBJECT_MODE must be 32, 64, 32_64, or any"); 1487 } 1488 } 1489 1490 switch (BitMode) { 1491 case BitModeTy::Bit32: 1492 Symtab = SymtabWritingMode::BigArchive32; 1493 break; 1494 case BitModeTy::Bit64: 1495 Symtab = SymtabWritingMode::BigArchive64; 1496 break; 1497 default: 1498 Symtab = SymtabWritingMode::NormalSymtab; 1499 break; 1500 } 1501 } 1502 1503 for (StringRef Archive : Archives) { 1504 ArchiveName = Archive.str(); 1505 performOperation(CreateSymTab); 1506 } 1507 if (Archives.empty()) 1508 badUsage("an archive name must be specified"); 1509 return 0; 1510 } 1511 1512 static int llvm_ar_main(int argc, char **argv, const llvm::ToolContext &) { 1513 ToolName = argv[0]; 1514 1515 llvm::InitializeAllTargetInfos(); 1516 llvm::InitializeAllTargetMCs(); 1517 llvm::InitializeAllAsmParsers(); 1518 1519 Stem = sys::path::stem(ToolName); 1520 auto Is = [](StringRef Tool) { 1521 // We need to recognize the following filenames. 1522 // 1523 // Lib.exe -> lib (see D44808, MSBuild runs Lib.exe) 1524 // dlltool.exe -> dlltool 1525 // arm-pokymllib32-linux-gnueabi-llvm-ar-10 -> ar 1526 auto I = Stem.rfind_insensitive(Tool); 1527 return I != StringRef::npos && 1528 (I + Tool.size() == Stem.size() || !isAlnum(Stem[I + Tool.size()])); 1529 }; 1530 1531 if (Is("dlltool")) 1532 return dlltoolDriverMain(ArrayRef(argv, argc)); 1533 if (Is("ranlib")) 1534 return ranlib_main(argc, argv); 1535 if (Is("lib")) 1536 return libDriverMain(ArrayRef(argv, argc)); 1537 if (Is("ar")) 1538 return ar_main(argc, argv); 1539 1540 fail("not ranlib, ar, lib or dlltool"); 1541 } 1542 1543 extern "C" int ZigLlvmAr_main(int, char **); 1544 int ZigLlvmAr_main(int argc, char **argv) { 1545 return llvm_ar_main(argc, argv, {argv[0], nullptr, false}); 1546 } 1547