authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-04-25 14:42:58-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-05-08 19:37:28-07:00
logde72860de6e920a371806eaf5a65d28a4b606641
treeef46a0302e6afc6b407a4784a08fe34b9daacfec
parent3ac8d37182504da72e151ac93da26a0f01782f95

update ar and clang C++ files to LLVM 18


4 files changed, 150 insertions(+), 54 deletions(-)

src/zig_clang_cc1_main.cpp+45
......@@ -28,6 +28,7 @@
2828#include "llvm/ADT/Statistic.h"
2929#include "llvm/Config/llvm-config.h"
3030#include "llvm/LinkAllPasses.h"
31#include "llvm/MC/MCSubtargetInfo.h"
3132#include "llvm/MC/TargetRegistry.h"
3233#include "llvm/Option/Arg.h"
3334#include "llvm/Option/ArgList.h"
......@@ -38,12 +39,15 @@
3839#include "llvm/Support/ManagedStatic.h"
3940#include "llvm/Support/Path.h"
4041#include "llvm/Support/Process.h"
42#include "llvm/Support/RISCVISAInfo.h"
4143#include "llvm/Support/Signals.h"
4244#include "llvm/Support/TargetSelect.h"
4345#include "llvm/Support/TimeProfiler.h"
4446#include "llvm/Support/Timer.h"
4547#include "llvm/Support/raw_ostream.h"
4648#include "llvm/Target/TargetMachine.h"
49#include "llvm/TargetParser/AArch64TargetParser.h"
50#include "llvm/TargetParser/ARMTargetParser.h"
4751#include <cstdio>
4852
4953#ifdef CLANG_HAVE_RLIMITS
......@@ -182,6 +186,43 @@ static int PrintSupportedCPUs(std::string TargetStr) {
182186 return 0;
183187}
184188
189static int PrintSupportedExtensions(std::string TargetStr) {
190 std::string Error;
191 const llvm::Target *TheTarget =
192 llvm::TargetRegistry::lookupTarget(TargetStr, Error);
193 if (!TheTarget) {
194 llvm::errs() << Error;
195 return 1;
196 }
197
198 llvm::TargetOptions Options;
199 std::unique_ptr<llvm::TargetMachine> TheTargetMachine(
200 TheTarget->createTargetMachine(TargetStr, "", "", Options, std::nullopt));
201 const llvm::Triple &MachineTriple = TheTargetMachine->getTargetTriple();
202 const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo();
203 const llvm::ArrayRef<llvm::SubtargetFeatureKV> Features =
204 MCInfo->getAllProcessorFeatures();
205
206 llvm::StringMap<llvm::StringRef> DescMap;
207 for (const llvm::SubtargetFeatureKV &feature : Features)
208 DescMap.insert({feature.Key, feature.Desc});
209
210 if (MachineTriple.isRISCV())
211 llvm::riscvExtensionsHelp(DescMap);
212 else if (MachineTriple.isAArch64())
213 llvm::AArch64::PrintSupportedExtensions(DescMap);
214 else if (MachineTriple.isARM())
215 llvm::ARM::PrintSupportedExtensions(DescMap);
216 else {
217 // The option was already checked in Driver::HandleImmediateArgs,
218 // so we do not expect to get here if we are not a supported architecture.
219 assert(0 && "Unhandled triple for --print-supported-extensions option.");
220 return 1;
221 }
222
223 return 0;
224}
225
185226int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
186227 ensureSufficientStack();
187228
......@@ -221,6 +262,10 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
221262 if (Clang->getFrontendOpts().PrintSupportedCPUs)
222263 return PrintSupportedCPUs(Clang->getTargetOpts().Triple);
223264
265 // --print-supported-extensions takes priority over the actual compilation.
266 if (Clang->getFrontendOpts().PrintSupportedExtensions)
267 return PrintSupportedExtensions(Clang->getTargetOpts().Triple);
268
224269 // Infer the builtin include path if unspecified.
225270 if (Clang->getHeaderSearchOpts().UseBuiltinIncludes &&
226271 Clang->getHeaderSearchOpts().ResourceDir.empty())
src/zig_clang_cc1as_main.cpp+8-7
......@@ -204,10 +204,10 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
204204 // Parse the arguments.
205205 const OptTable &OptTbl = getDriverOptTable();
206206
207 const unsigned IncludedFlagsBitmask = options::CC1AsOption;
207 llvm::opt::Visibility VisibilityMask(options::CC1AsOption);
208208 unsigned MissingArgIndex, MissingArgCount;
209 InputArgList Args = OptTbl.ParseArgs(Argv, MissingArgIndex, MissingArgCount,
210 IncludedFlagsBitmask);
209 InputArgList Args =
210 OptTbl.ParseArgs(Argv, MissingArgIndex, MissingArgCount, VisibilityMask);
211211
212212 // Check for missing argument error.
213213 if (MissingArgCount) {
......@@ -220,7 +220,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
220220 for (const Arg *A : Args.filtered(OPT_UNKNOWN)) {
221221 auto ArgString = A->getAsString(Args);
222222 std::string Nearest;
223 if (OptTbl.findNearest(ArgString, Nearest, IncludedFlagsBitmask) > 1)
223 if (OptTbl.findNearest(ArgString, Nearest, VisibilityMask) > 1)
224224 Diags.Report(diag::err_drv_unknown_argument) << ArgString;
225225 else
226226 Diags.Report(diag::err_drv_unknown_argument_with_suggestion)
......@@ -643,9 +643,10 @@ int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
643643 if (Asm.ShowHelp) {
644644 getDriverOptTable().printHelp(
645645 llvm::outs(), "clang -cc1as [options] file...",
646 "Clang Integrated Assembler",
647 /*Include=*/driver::options::CC1AsOption, /*Exclude=*/0,
648 /*ShowAllAliases=*/false);
646 "Clang Integrated Assembler", /*ShowHidden=*/false,
647 /*ShowAllAliases=*/false,
648 llvm::opt::Visibility(driver::options::CC1AsOption));
649
649650 return 0;
650651 }
651652
src/zig_clang_driver.cpp+14-23
......@@ -36,7 +36,6 @@
3636#include "llvm/Support/CrashRecoveryContext.h"
3737#include "llvm/Support/ErrorHandling.h"
3838#include "llvm/Support/FileSystem.h"
39#include "llvm/Support/InitLLVM.h"
4039#include "llvm/Support/LLVMDriver.h"
4140#include "llvm/Support/Path.h"
4241#include "llvm/Support/PrettyStackTrace.h"
......@@ -65,7 +64,7 @@ std::string GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) {
6564 if (llvm::ErrorOr<std::string> P =
6665 llvm::sys::findProgramByName(ExecutablePath))
6766 ExecutablePath = *P;
68 return std::string(ExecutablePath.str());
67 return std::string(ExecutablePath);
6968 }
7069
7170 // This just needs to be some symbol in the binary; C++ doesn't
......@@ -79,9 +78,9 @@ static const char *GetStableCStr(std::set<std::string> &SavedStrings,
7978 return SavedStrings.insert(std::string(S)).first->c_str();
8079}
8180
82/// ApplyQAOverride - Apply a list of edits to the input argument lists.
81/// ApplyOneQAOverride - Apply a list of edits to the input argument lists.
8382///
84/// The input string is a space separate list of edits to perform,
83/// The input string is a space separated list of edits to perform,
8584/// they are applied in order to the input argument lists. Edits
8685/// should be one of the following forms:
8786///
......@@ -122,7 +121,7 @@ static void ApplyOneQAOverride(raw_ostream &OS,
122121 GetStableCStr(SavedStrings, Edit.substr(1));
123122 OS << "### Adding argument " << Str << " at end\n";
124123 Args.push_back(Str);
125 } else if (Edit[0] == 's' && Edit[1] == '/' && Edit.endswith("/") &&
124 } else if (Edit[0] == 's' && Edit[1] == '/' && Edit.ends_with("/") &&
126125 Edit.slice(2, Edit.size() - 1).contains('/')) {
127126 StringRef MatchPattern = Edit.substr(2).split('/').first;
128127 StringRef ReplPattern = Edit.substr(2).split('/').second;
......@@ -177,7 +176,7 @@ static void ApplyOneQAOverride(raw_ostream &OS,
177176 }
178177}
179178
180/// ApplyQAOverride - Apply a comma separate list of edits to the
179/// ApplyQAOverride - Apply a space separated list of edits to the
181180/// input argument lists. See ApplyOneQAOverride.
182181static void ApplyQAOverride(SmallVectorImpl<const char*> &Args,
183182 const char *OverrideStr,
......@@ -210,6 +209,9 @@ extern int cc1_main(ArrayRef<const char *> Argv, const char *Argv0,
210209 void *MainAddr);
211210extern int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0,
212211 void *MainAddr);
212extern int cc1gen_reproducer_main(ArrayRef<const char *> Argv,
213 const char *Argv0, void *MainAddr,
214 const llvm::ToolContext &);
213215
214216static void insertTargetAndModeArgs(const ParsedClangName &NameParts,
215217 SmallVectorImpl<const char *> &ArgVector,
......@@ -363,27 +365,21 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV,
363365 return cc1_main(ArrayRef(ArgV).slice(1), ArgV[0], GetExecutablePathVP);
364366 if (Tool == "-cc1as")
365367 return cc1as_main(ArrayRef(ArgV).slice(2), ArgV[0], GetExecutablePathVP);
368 if (Tool == "-cc1gen-reproducer")
369 return cc1gen_reproducer_main(ArrayRef(ArgV).slice(2), ArgV[0],
370 GetExecutablePathVP, ToolContext);
366371 // Reject unknown tools.
367372 llvm::errs() << "error: unknown integrated tool '" << Tool << "'. "
368373 << "Valid tools include '-cc1' and '-cc1as'.\n";
369374 return 1;
370375}
371376
372static int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) {
377int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) {
373378 noteBottomOfStack();
374 // ZIG PATCH: On Windows, InitLLVM calls GetCommandLineW(),
375 // and overwrites the args. We don't want it to do that,
376 // and we also don't need the signal handlers it installs
377 // (we have our own already), so we just use llvm_shutdown_obj
378 // instead.
379 // llvm::InitLLVM X(Argc, Argv);
380 llvm::llvm_shutdown_obj X;
381
382379 llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL
383380 " and include the crash backtrace, preprocessed "
384381 "source, and associated run script.\n");
385 size_t argv_offset = (strcmp(Argv[1], "-cc1") == 0 || strcmp(Argv[1], "-cc1as") == 0) ? 0 : 1;
386 SmallVector<const char *, 256> Args(Argv + argv_offset, Argv + Argc);
382 SmallVector<const char *, 256> Args(Argv, Argv + Argc);
387383
388384 if (llvm::sys::Process::FixupStandardFileDescriptors())
389385 return 1;
......@@ -405,7 +401,7 @@ static int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContex
405401 }
406402
407403 // Handle -cc1 integrated tools.
408 if (Args.size() >= 2 && StringRef(Args[1]).startswith("-cc1"))
404 if (Args.size() >= 2 && StringRef(Args[1]).starts_with("-cc1"))
409405 return ExecuteCC1Tool(Args, ToolContext);
410406
411407 // Handle options that need handling before the real command line parsing in
......@@ -605,8 +601,3 @@ static int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContex
605601 // failing command.
606602 return Res;
607603}
608
609extern "C" int ZigClang_main(int, char **);
610int ZigClang_main(int argc, char **argv) {
611 return clang_main(argc, argv, {argv[0], nullptr, false});
612}
src/zig_llvm-ar.cpp+83-24
......@@ -25,7 +25,6 @@
2525#include "llvm/Support/FileSystem.h"
2626#include "llvm/Support/Format.h"
2727#include "llvm/Support/FormatVariadic.h"
28#include "llvm/Support/InitLLVM.h"
2928#include "llvm/Support/LLVMDriver.h"
3029#include "llvm/Support/LineIterator.h"
3130#include "llvm/Support/MemoryBuffer.h"
......@@ -69,7 +68,9 @@ static void printRanLibHelp(StringRef ToolName) {
6968 << " -v --version - Display the version of this program\n"
7069 << " -D - Use zero for timestamps and uids/gids "
7170 "(default)\n"
72 << " -U - Use actual timestamps and uids/gids\n";
71 << " -U - Use actual timestamps and uids/gids\n"
72 << " -X{32|64|32_64|any} - Specify which archive symbol tables "
73 "should be generated if they do not already exist (AIX OS only)\n";
7374}
7475
7576static void printArHelp(StringRef ToolName) {
......@@ -225,7 +226,8 @@ static bool DisplayMemberOffsets = false; ///< 'O' modifier
225226static bool CompareFullPath = false; ///< 'P' modifier
226227static bool OnlyUpdate = false; ///< 'u' modifier
227228static bool Verbose = false; ///< 'v' modifier
228static bool Symtab = true; ///< 's' modifier
229static SymtabWritingMode Symtab =
230 SymtabWritingMode::NormalSymtab; ///< 's' modifier
229231static bool Deterministic = true; ///< 'D' and 'U' modifiers
230232static bool Thin = false; ///< 'T' modifier
231233static bool AddLibrary = false; ///< 'L' modifier
......@@ -371,11 +373,11 @@ static ArchiveOperation parseCommandLine() {
371373 CompareFullPath = true;
372374 break;
373375 case 's':
374 Symtab = true;
376 Symtab = SymtabWritingMode::NormalSymtab;
375377 MaybeJustCreateSymTab = true;
376378 break;
377379 case 'S':
378 Symtab = false;
380 Symtab = SymtabWritingMode::NoSymtab;
379381 break;
380382 case 'u':
381383 OnlyUpdate = true;
......@@ -1074,9 +1076,31 @@ static void createSymbolTable(object::Archive *OldArchive) {
10741076 // In summary, we only need to update the symbol table if we have none.
10751077 // This is actually very common because of broken build systems that think
10761078 // they have to run ranlib.
1077 if (OldArchive->hasSymbolTable())
1078 return;
1079 if (OldArchive->hasSymbolTable()) {
1080 if (OldArchive->kind() != object::Archive::K_AIXBIG)
1081 return;
10791082
1083 // For archives in the Big Archive format, the bit mode option specifies
1084 // which symbol table to generate. The presence of a symbol table that does
1085 // not match the specified bit mode does not prevent creation of the symbol
1086 // table that has been requested.
1087 if (OldArchive->kind() == object::Archive::K_AIXBIG) {
1088 BigArchive *BigArc = dyn_cast<BigArchive>(OldArchive);
1089 if (BigArc->has32BitGlobalSymtab() &&
1090 Symtab == SymtabWritingMode::BigArchive32)
1091 return;
1092
1093 if (BigArc->has64BitGlobalSymtab() &&
1094 Symtab == SymtabWritingMode::BigArchive64)
1095 return;
1096
1097 if (BigArc->has32BitGlobalSymtab() && BigArc->has64BitGlobalSymtab() &&
1098 Symtab == SymtabWritingMode::NormalSymtab)
1099 return;
1100
1101 Symtab = SymtabWritingMode::NormalSymtab;
1102 }
1103 }
10801104 if (OldArchive->isThin())
10811105 Thin = true;
10821106 performWriteOperation(CreateSymTab, OldArchive, nullptr, nullptr);
......@@ -1262,8 +1286,7 @@ static const char *matchFlagWithArg(StringRef Expected,
12621286 ArrayRef<const char *> Args) {
12631287 StringRef Arg = *ArgIt;
12641288
1265 if (Arg.startswith("--"))
1266 Arg = Arg.substr(2);
1289 Arg.consume_front("--");
12671290
12681291 size_t len = Expected.size();
12691292 if (Arg == Expected) {
......@@ -1272,7 +1295,7 @@ static const char *matchFlagWithArg(StringRef Expected,
12721295
12731296 return *ArgIt;
12741297 }
1275 if (Arg.startswith(Expected) && Arg.size() > len && Arg[len] == '=')
1298 if (Arg.starts_with(Expected) && Arg.size() > len && Arg[len] == '=')
12761299 return Arg.data() + len + 1;
12771300
12781301 return nullptr;
......@@ -1389,6 +1412,8 @@ static int ar_main(int argc, char **argv) {
13891412
13901413static int ranlib_main(int argc, char **argv) {
13911414 std::vector<StringRef> Archives;
1415 bool HasAIXXOption = false;
1416
13921417 for (int i = 1; i < argc; ++i) {
13931418 StringRef arg(argv[i]);
13941419 if (handleGenericOption(arg)) {
......@@ -1406,6 +1431,28 @@ static int ranlib_main(int argc, char **argv) {
14061431 } else if (arg.front() == 'v') {
14071432 cl::PrintVersionMessage();
14081433 return 0;
1434 } else if (arg.front() == 'X') {
1435 if (object::Archive::getDefaultKindForHost() ==
1436 object::Archive::K_AIXBIG) {
1437 HasAIXXOption = true;
1438 arg.consume_front("X");
1439 const char *Xarg = arg.data();
1440 if (Xarg[0] == '\0') {
1441 if (argv[i + 1][0] != '-')
1442 BitMode = getBitMode(argv[++i]);
1443 else
1444 BitMode = BitModeTy::Unknown;
1445 } else
1446 BitMode = getBitMode(arg.data());
1447
1448 if (BitMode == BitModeTy::Unknown)
1449 fail("the specified object mode is not valid. Specify -X32, "
1450 "-X64, -X32_64, or -Xany");
1451 } else {
1452 fail(Twine("-") + Twine(arg) +
1453 " option not supported on non AIX OS");
1454 }
1455 break;
14091456 } else {
14101457 // TODO: GNU ranlib also supports a -t flag
14111458 fail("Invalid option: '-" + arg + "'");
......@@ -1417,6 +1464,31 @@ static int ranlib_main(int argc, char **argv) {
14171464 }
14181465 }
14191466
1467 if (object::Archive::getDefaultKindForHost() == object::Archive::K_AIXBIG) {
1468 // If not specify -X option, get BitMode from enviorment variable
1469 // "OBJECT_MODE" for AIX OS if specify.
1470 if (!HasAIXXOption) {
1471 if (char *EnvObjectMode = getenv("OBJECT_MODE")) {
1472 BitMode = getBitMode(EnvObjectMode);
1473 if (BitMode == BitModeTy::Unknown)
1474 fail("the OBJECT_MODE environment variable has an invalid value. "
1475 "OBJECT_MODE must be 32, 64, 32_64, or any");
1476 }
1477 }
1478
1479 switch (BitMode) {
1480 case BitModeTy::Bit32:
1481 Symtab = SymtabWritingMode::BigArchive32;
1482 break;
1483 case BitModeTy::Bit64:
1484 Symtab = SymtabWritingMode::BigArchive64;
1485 break;
1486 default:
1487 Symtab = SymtabWritingMode::NormalSymtab;
1488 break;
1489 }
1490 }
1491
14201492 for (StringRef Archive : Archives) {
14211493 ArchiveName = Archive.str();
14221494 performOperation(CreateSymTab);
......@@ -1426,15 +1498,7 @@ static int ranlib_main(int argc, char **argv) {
14261498 return 0;
14271499}
14281500
1429static int llvm_ar_main(int argc, char **argv, const llvm::ToolContext &) {
1430 // ZIG PATCH: On Windows, InitLLVM calls GetCommandLineW(),
1431 // and overwrites the args. We don't want it to do that,
1432 // and we also don't need the signal handlers it installs
1433 // (we have our own already), so we just use llvm_shutdown_obj
1434 // instead.
1435 // InitLLVM X(argc, argv);
1436 llvm::llvm_shutdown_obj X;
1437
1501int llvm_ar_main(int argc, char **argv, const llvm::ToolContext &) {
14381502 ToolName = argv[0];
14391503
14401504 llvm::InitializeAllTargetInfos();
......@@ -1464,8 +1528,3 @@ static int llvm_ar_main(int argc, char **argv, const llvm::ToolContext &) {
14641528
14651529 fail("not ranlib, ar, lib or dlltool");
14661530}
1467
1468extern "C" int ZigLlvmAr_main(int, char **);
1469int ZigLlvmAr_main(int argc, char **argv) {
1470 return llvm_ar_main(argc, argv, {argv[0], nullptr, false});
1471}