mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
update llvm and clang tools to release/14.x
upstream commit 91632c8ac97fa3daffe4ff8f1391735b5d6805e6
This commit is contained in:
parent
308f72701a
commit
3479294b6e
@ -28,6 +28,7 @@
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Config/llvm-config.h"
|
||||
#include "llvm/LinkAllPasses.h"
|
||||
#include "llvm/MC/TargetRegistry.h"
|
||||
#include "llvm/Option/Arg.h"
|
||||
#include "llvm/Option/ArgList.h"
|
||||
#include "llvm/Option/OptTable.h"
|
||||
@ -38,7 +39,6 @@
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/Process.h"
|
||||
#include "llvm/Support/Signals.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#include "llvm/Support/TargetSelect.h"
|
||||
#include "llvm/Support/TimeProfiler.h"
|
||||
#include "llvm/Support/Timer.h"
|
||||
@ -57,7 +57,7 @@ using namespace llvm::opt;
|
||||
// Main driver
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
static void LLVMErrorHandler(void *UserData, const std::string &Message,
|
||||
static void LLVMErrorHandler(void *UserData, const char *Message,
|
||||
bool GenCrashDiag) {
|
||||
DiagnosticsEngine &Diags = *static_cast<DiagnosticsEngine*>(UserData);
|
||||
|
||||
@ -237,8 +237,10 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
|
||||
static_cast<void*>(&Clang->getDiagnostics()));
|
||||
|
||||
DiagsBuffer->FlushDiagnostics(Clang->getDiagnostics());
|
||||
if (!Success)
|
||||
if (!Success) {
|
||||
Clang->getDiagnosticClient().finish();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Execute the frontend actions.
|
||||
{
|
||||
|
||||
@ -36,6 +36,7 @@
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/MC/MCTargetOptions.h"
|
||||
#include "llvm/MC/TargetRegistry.h"
|
||||
#include "llvm/Option/Arg.h"
|
||||
#include "llvm/Option/ArgList.h"
|
||||
#include "llvm/Option/OptTable.h"
|
||||
@ -49,7 +50,6 @@
|
||||
#include "llvm/Support/Process.h"
|
||||
#include "llvm/Support/Signals.h"
|
||||
#include "llvm/Support/SourceMgr.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#include "llvm/Support/TargetSelect.h"
|
||||
#include "llvm/Support/Timer.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -228,7 +228,6 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
|
||||
llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue())
|
||||
.Case("none", llvm::DebugCompressionType::None)
|
||||
.Case("zlib", llvm::DebugCompressionType::Z)
|
||||
.Case("zlib-gnu", llvm::DebugCompressionType::GNU)
|
||||
.Default(llvm::DebugCompressionType::None);
|
||||
}
|
||||
|
||||
@ -490,7 +489,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
|
||||
T, Ctx, std::move(MAB), std::move(OW), std::move(CE), *STI,
|
||||
Opts.RelaxAll, Opts.IncrementalLinkerCompatible,
|
||||
/*DWARFMustBeAtTheEnd*/ true));
|
||||
Str.get()->InitSections(Opts.NoExecStack);
|
||||
Str.get()->initSections(Opts.NoExecStack, *STI);
|
||||
}
|
||||
|
||||
// When -fembed-bitcode is passed to clang_as, a 1-byte marker
|
||||
@ -550,7 +549,7 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,
|
||||
return Failed;
|
||||
}
|
||||
|
||||
static void LLVMErrorHandler(void *UserData, const std::string &Message,
|
||||
static void LLVMErrorHandler(void *UserData, const char *Message,
|
||||
bool GenCrashDiag) {
|
||||
DiagnosticsEngine &Diags = *static_cast<DiagnosticsEngine*>(UserData);
|
||||
|
||||
|
||||
@ -120,7 +120,7 @@ static void ApplyOneQAOverride(raw_ostream &OS,
|
||||
OS << "### Adding argument " << Str << " at end\n";
|
||||
Args.push_back(Str);
|
||||
} else if (Edit[0] == 's' && Edit[1] == '/' && Edit.endswith("/") &&
|
||||
Edit.slice(2, Edit.size()-1).find('/') != StringRef::npos) {
|
||||
Edit.slice(2, Edit.size() - 1).contains('/')) {
|
||||
StringRef MatchPattern = Edit.substr(2).split('/').first;
|
||||
StringRef ReplPattern = Edit.substr(2).split('/').second;
|
||||
ReplPattern = ReplPattern.slice(0, ReplPattern.size()-1);
|
||||
@ -207,6 +207,8 @@ extern int cc1_main(ArrayRef<const char *> Argv, const char *Argv0,
|
||||
void *MainAddr);
|
||||
extern int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0,
|
||||
void *MainAddr);
|
||||
extern int cc1gen_reproducer_main(ArrayRef<const char *> Argv,
|
||||
const char *Argv0, void *MainAddr);
|
||||
|
||||
static void insertTargetAndModeArgs(const ParsedClangName &NameParts,
|
||||
SmallVectorImpl<const char *> &ArgVector,
|
||||
@ -276,27 +278,6 @@ static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,
|
||||
DiagClient->setPrefix(std::string(ExeBasename));
|
||||
}
|
||||
|
||||
// This lets us create the DiagnosticsEngine with a properly-filled-out
|
||||
// DiagnosticOptions instance.
|
||||
static DiagnosticOptions *
|
||||
CreateAndPopulateDiagOpts(ArrayRef<const char *> argv, bool &UseNewCC1Process) {
|
||||
auto *DiagOpts = new DiagnosticOptions;
|
||||
unsigned MissingArgIndex, MissingArgCount;
|
||||
InputArgList Args = getDriverOptTable().ParseArgs(
|
||||
argv.slice(1), MissingArgIndex, MissingArgCount);
|
||||
// We ignore MissingArgCount and the return value of ParseDiagnosticArgs.
|
||||
// Any errors that would be diagnosed here will also be diagnosed later,
|
||||
// when the DiagnosticsEngine actually exists.
|
||||
(void)ParseDiagnosticArgs(*DiagOpts, Args);
|
||||
|
||||
UseNewCC1Process =
|
||||
Args.hasFlag(clang::driver::options::OPT_fno_integrated_cc1,
|
||||
clang::driver::options::OPT_fintegrated_cc1,
|
||||
/*Default=*/CLANG_SPAWN_CC1);
|
||||
|
||||
return DiagOpts;
|
||||
}
|
||||
|
||||
static void SetInstallDir(SmallVectorImpl<const char *> &argv,
|
||||
Driver &TheDriver, bool CanonicalPrefixes) {
|
||||
// Attempt to find the original path used to invoke the driver, to determine
|
||||
@ -337,28 +318,22 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) {
|
||||
if (Tool == "-cc1as")
|
||||
return cc1as_main(makeArrayRef(ArgV).slice(2), ArgV[0],
|
||||
GetExecutablePathVP);
|
||||
if (Tool == "-cc1gen-reproducer")
|
||||
return cc1gen_reproducer_main(makeArrayRef(ArgV).slice(2), ArgV[0],
|
||||
GetExecutablePathVP);
|
||||
// Reject unknown tools.
|
||||
llvm::errs() << "error: unknown integrated tool '" << Tool << "'. "
|
||||
<< "Valid tools include '-cc1' and '-cc1as'.\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C" int ZigClang_main(int Argc, const char **Argv);
|
||||
int ZigClang_main(int Argc, const char **Argv) {
|
||||
int main(int Argc, const char **Argv) {
|
||||
noteBottomOfStack();
|
||||
// ZIG PATCH: On Windows, InitLLVM calls GetCommandLineW(),
|
||||
// and overwrites the args. We don't want it to do that,
|
||||
// and we also don't need the signal handlers it installs
|
||||
// (we have our own already), so we just use llvm_shutdown_obj
|
||||
// instead.
|
||||
// llvm::InitLLVM X(Argc, Argv);
|
||||
llvm::llvm_shutdown_obj X;
|
||||
|
||||
llvm::InitLLVM X(Argc, Argv);
|
||||
llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL
|
||||
" and include the crash backtrace, preprocessed "
|
||||
"source, and associated run script.\n");
|
||||
size_t argv_offset = (strcmp(Argv[1], "-cc1") == 0 || strcmp(Argv[1], "-cc1as") == 0) ? 0 : 1;
|
||||
SmallVector<const char *, 256> Args(Argv + argv_offset, Argv + Argc);
|
||||
SmallVector<const char *, 256> Args(Argv, Argv + Argc);
|
||||
|
||||
if (llvm::sys::Process::FixupStandardFileDescriptors())
|
||||
return 1;
|
||||
@ -402,8 +377,8 @@ int ZigClang_main(int Argc, const char **Argv) {
|
||||
|
||||
// Handle -cc1 integrated tools, even if -cc1 was expanded from a response
|
||||
// file.
|
||||
auto FirstArg = std::find_if(Args.begin() + 1, Args.end(),
|
||||
[](const char *A) { return A != nullptr; });
|
||||
auto FirstArg = llvm::find_if(llvm::drop_begin(Args),
|
||||
[](const char *A) { return A != nullptr; });
|
||||
if (FirstArg != Args.end() && StringRef(*FirstArg).startswith("-cc1")) {
|
||||
// If -cc1 came from a response file, remove the EOL sentinels.
|
||||
if (MarkEOLs) {
|
||||
@ -420,10 +395,10 @@ int ZigClang_main(int Argc, const char **Argv) {
|
||||
// Skip end-of-line response file markers
|
||||
if (Args[i] == nullptr)
|
||||
continue;
|
||||
if (StringRef(Args[i]) == "-no-canonical-prefixes") {
|
||||
if (StringRef(Args[i]) == "-canonical-prefixes")
|
||||
CanonicalPrefixes = true;
|
||||
else if (StringRef(Args[i]) == "-no-canonical-prefixes")
|
||||
CanonicalPrefixes = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Handle CL and _CL_ which permits additional command line options to be
|
||||
@ -457,18 +432,21 @@ int ZigClang_main(int Argc, const char **Argv) {
|
||||
ApplyQAOverride(Args, OverrideStr, SavedStrings);
|
||||
}
|
||||
|
||||
// Pass local param `Argv[0]` as fallback.
|
||||
// See https://github.com/ziglang/zig/pull/3292 .
|
||||
std::string Path = GetExecutablePath(Argv[0], CanonicalPrefixes);
|
||||
std::string Path = GetExecutablePath(Args[0], CanonicalPrefixes);
|
||||
|
||||
// Whether the cc1 tool should be called inside the current process, or if we
|
||||
// should spawn a new clang subprocess (old behavior).
|
||||
// Not having an additional process saves some execution time of Windows,
|
||||
// and makes debugging and profiling easier.
|
||||
bool UseNewCC1Process;
|
||||
bool UseNewCC1Process = CLANG_SPAWN_CC1;
|
||||
for (const char *Arg : Args)
|
||||
UseNewCC1Process = llvm::StringSwitch<bool>(Arg)
|
||||
.Case("-fno-integrated-cc1", true)
|
||||
.Case("-fintegrated-cc1", false)
|
||||
.Default(UseNewCC1Process);
|
||||
|
||||
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts =
|
||||
CreateAndPopulateDiagOpts(Args, UseNewCC1Process);
|
||||
CreateAndPopulateDiagOpts(Args);
|
||||
|
||||
TextDiagnosticPrinter *DiagClient
|
||||
= new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts);
|
||||
|
||||
@ -90,17 +90,18 @@ OPTIONS:
|
||||
--rsp-quoting - quoting style for response files
|
||||
=posix - posix
|
||||
=windows - windows
|
||||
--thin - create a thin archive
|
||||
--version - print the version and exit
|
||||
@<file> - read options from <file>
|
||||
|
||||
OPERATIONS:
|
||||
d - delete [files] from the archive
|
||||
m - move [files] in the archive
|
||||
p - print [files] found in the archive
|
||||
p - print contents of [files] found in the archive
|
||||
q - quick append [files] to the archive
|
||||
r - replace or insert [files] into the archive
|
||||
s - act as ranlib
|
||||
t - display contents of archive
|
||||
t - display list of files in archive
|
||||
x - extract [files] from the archive
|
||||
|
||||
MODIFIERS:
|
||||
@ -118,7 +119,7 @@ MODIFIERS:
|
||||
[P] - use full names when matching (implied for thin archives)
|
||||
[s] - create an archive index (cf. ranlib)
|
||||
[S] - do not build a symbol table
|
||||
[T] - create a thin archive
|
||||
[T] - deprecated, use --thin instead
|
||||
[u] - update only [files] newer than archive contents
|
||||
[U] - use actual timestamps and uids/gids
|
||||
[v] - be verbose about actions taken
|
||||
@ -136,14 +137,14 @@ static unsigned MRILineNumber;
|
||||
static bool ParsingMRIScript;
|
||||
|
||||
// Show the error plus the usage message, and exit.
|
||||
LLVM_ATTRIBUTE_NORETURN static void badUsage(Twine Error) {
|
||||
[[noreturn]] static void badUsage(Twine Error) {
|
||||
WithColor::error(errs(), ToolName) << Error << "\n";
|
||||
printHelpMessage();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Show the error message and exit.
|
||||
LLVM_ATTRIBUTE_NORETURN static void fail(Twine Error) {
|
||||
[[noreturn]] static void fail(Twine Error) {
|
||||
if (ParsingMRIScript) {
|
||||
WithColor::error(errs(), ToolName)
|
||||
<< "script line " << MRILineNumber << ": " << Error << "\n";
|
||||
@ -232,7 +233,7 @@ static std::string ArchiveName;
|
||||
static std::vector<std::unique_ptr<MemoryBuffer>> ArchiveBuffers;
|
||||
static std::vector<std::unique_ptr<object::Archive>> Archives;
|
||||
|
||||
// This variable holds the list of member files to process, as given
|
||||
// This variable holds the list of member files to proecess, as given
|
||||
// on the command line.
|
||||
static std::vector<StringRef> Members;
|
||||
|
||||
@ -390,8 +391,6 @@ static ArchiveOperation parseCommandLine() {
|
||||
break;
|
||||
case 'T':
|
||||
Thin = true;
|
||||
// Thin archives store path names, so P should be forced.
|
||||
CompareFullPath = true;
|
||||
break;
|
||||
case 'L':
|
||||
AddLibrary = true;
|
||||
@ -407,6 +406,10 @@ static ArchiveOperation parseCommandLine() {
|
||||
}
|
||||
}
|
||||
|
||||
// Thin archives store path names, so P should be forced.
|
||||
if (Thin)
|
||||
CompareFullPath = true;
|
||||
|
||||
// At this point, the next thing on the command line must be
|
||||
// the archive name.
|
||||
getArchive();
|
||||
@ -965,6 +968,8 @@ static void createSymbolTable(object::Archive *OldArchive) {
|
||||
if (OldArchive->hasSymbolTable())
|
||||
return;
|
||||
|
||||
if (OldArchive->isThin())
|
||||
Thin = true;
|
||||
performWriteOperation(CreateSymTab, OldArchive, nullptr, nullptr);
|
||||
}
|
||||
|
||||
@ -1003,12 +1008,17 @@ static int performOperation(ArchiveOperation Operation,
|
||||
fail("unable to open '" + ArchiveName + "': " + EC.message());
|
||||
|
||||
if (!EC) {
|
||||
Error Err = Error::success();
|
||||
object::Archive Archive(Buf.get()->getMemBufferRef(), Err);
|
||||
failIfError(std::move(Err), "unable to load '" + ArchiveName + "'");
|
||||
if (Archive.isThin())
|
||||
Expected<std::unique_ptr<object::Archive>> ArchiveOrError =
|
||||
object::Archive::create(Buf.get()->getMemBufferRef());
|
||||
if (!ArchiveOrError)
|
||||
failIfError(ArchiveOrError.takeError(),
|
||||
"unable to load '" + ArchiveName + "'");
|
||||
|
||||
std::unique_ptr<object::Archive> Archive = std::move(ArchiveOrError.get());
|
||||
if (Archive->isThin())
|
||||
CompareFullPath = true;
|
||||
performOperation(Operation, &Archive, std::move(Buf.get()), NewMembers);
|
||||
performOperation(Operation, Archive.get(), std::move(Buf.get()),
|
||||
NewMembers);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1111,11 +1121,11 @@ static void runMRIScript() {
|
||||
}
|
||||
|
||||
static bool handleGenericOption(StringRef arg) {
|
||||
if (arg == "-help" || arg == "--help" || arg == "-h") {
|
||||
if (arg == "--help" || arg == "-h") {
|
||||
printHelpMessage();
|
||||
return true;
|
||||
}
|
||||
if (arg == "-version" || arg == "--version") {
|
||||
if (arg == "--version") {
|
||||
cl::PrintVersionMessage();
|
||||
return true;
|
||||
}
|
||||
@ -1129,8 +1139,6 @@ static const char *matchFlagWithArg(StringRef Expected,
|
||||
|
||||
if (Arg.startswith("--"))
|
||||
Arg = Arg.substr(2);
|
||||
else if (Arg.startswith("-"))
|
||||
Arg = Arg.substr(1);
|
||||
|
||||
size_t len = Expected.size();
|
||||
if (Arg == Expected) {
|
||||
@ -1199,6 +1207,11 @@ static int ar_main(int argc, char **argv) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(*ArgIt, "--thin") == 0) {
|
||||
Thin = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
Match = matchFlagWithArg("format", ArgIt, Argv);
|
||||
if (Match) {
|
||||
FormatType = StringSwitch<Format>(Match)
|
||||
@ -1261,16 +1274,8 @@ static int ranlib_main(int argc, char **argv) {
|
||||
return performOperation(CreateSymTab, nullptr);
|
||||
}
|
||||
|
||||
extern "C" int ZigLlvmAr_main(int argc, char **argv);
|
||||
int ZigLlvmAr_main(int argc, char **argv) {
|
||||
// ZIG PATCH: On Windows, InitLLVM calls GetCommandLineW(),
|
||||
// and overwrites the args. We don't want it to do that,
|
||||
// and we also don't need the signal handlers it installs
|
||||
// (we have our own already), so we just use llvm_shutdown_obj
|
||||
// instead.
|
||||
// InitLLVM X(argc, argv);
|
||||
llvm::llvm_shutdown_obj X;
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
InitLLVM X(argc, argv);
|
||||
ToolName = argv[0];
|
||||
|
||||
llvm::InitializeAllTargetInfos();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user