update llvm and clang tools to release/14.x

upstream commit 91632c8ac97fa3daffe4ff8f1391735b5d6805e6
This commit is contained in:
Andrew Kelley 2022-02-03 13:43:51 -07:00
parent 308f72701a
commit 3479294b6e
4 changed files with 62 additions and 78 deletions

View File

@ -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.
{

View File

@ -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);

View File

@ -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);

View File

@ -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();