update clang drivers from llvm 10 to 11

This commit is contained in:
Andrew Kelley 2020-07-24 17:01:52 -07:00
parent c8ea8cf5df
commit bd121f3af4
4 changed files with 54 additions and 33 deletions

View File

@ -359,7 +359,7 @@ endif()
if(MSVC) if(MSVC)
set(EXE_CFLAGS "${EXE_CFLAGS}") set(EXE_CFLAGS "${EXE_CFLAGS}")
else() else()
set(EXE_CFLAGS "${EXE_CFLAGS} -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -Werror=type-limits -Wno-missing-braces") set(EXE_CFLAGS "${EXE_CFLAGS} -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -Werror=type-limits -Wno-missing-braces -Wno-comment")
if(MINGW) if(MINGW)
set(EXE_CFLAGS "${EXE_CFLAGS} -Wno-format") set(EXE_CFLAGS "${EXE_CFLAGS} -Wno-format")
endif() endif()

View File

@ -177,7 +177,7 @@ static int PrintSupportedCPUs(std::string TargetStr) {
// the target machine will handle the mcpu printing // the target machine will handle the mcpu printing
llvm::TargetOptions Options; llvm::TargetOptions Options;
std::unique_ptr<llvm::TargetMachine> TheTargetMachine( std::unique_ptr<llvm::TargetMachine> TheTargetMachine(
TheTarget->createTargetMachine(TargetStr, "", "+cpuHelp", Options, None)); TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options, None));
return 0; return 0;
} }
@ -203,8 +203,8 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer; TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer;
DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer); DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer);
bool Success = bool Success = CompilerInvocation::CreateFromArgs(Clang->getInvocation(),
CompilerInvocation::CreateFromArgs(Clang->getInvocation(), Argv, Diags); Argv, Diags, Argv0);
if (Clang->getFrontendOpts().TimeTrace) { if (Clang->getFrontendOpts().TimeTrace) {
llvm::timeTraceProfilerInitialize( llvm::timeTraceProfilerInitialize(
@ -259,6 +259,7 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) {
// FIXME(ibiryukov): make profilerOutput flush in destructor instead. // FIXME(ibiryukov): make profilerOutput flush in destructor instead.
profilerOutput->flush(); profilerOutput->flush();
llvm::timeTraceProfilerCleanup(); llvm::timeTraceProfilerCleanup();
Clang->clearOutputFiles(false);
} }
} }

View File

@ -207,7 +207,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
// Target Options // Target Options
Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple)); Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
Opts.CPU = Args.getLastArgValue(OPT_target_cpu); Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu));
Opts.Features = Args.getAllArgValues(OPT_target_feature); Opts.Features = Args.getAllArgValues(OPT_target_feature);
// Use the default target triple if unspecified. // Use the default target triple if unspecified.
@ -238,13 +238,19 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations); Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);
Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags); Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);
Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags); Opts.DwarfDebugFlags =
Opts.DwarfDebugProducer = Args.getLastArgValue(OPT_dwarf_debug_producer); std::string(Args.getLastArgValue(OPT_dwarf_debug_flags));
Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir); Opts.DwarfDebugProducer =
Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name); std::string(Args.getLastArgValue(OPT_dwarf_debug_producer));
Opts.DebugCompilationDir =
std::string(Args.getLastArgValue(OPT_fdebug_compilation_dir));
Opts.MainFileName = std::string(Args.getLastArgValue(OPT_main_file_name));
for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
Opts.DebugPrefixMap.insert(StringRef(Arg).split('=')); auto Split = StringRef(Arg).split('=');
Opts.DebugPrefixMap.insert(
{std::string(Split.first), std::string(Split.second)});
}
// Frontend Options // Frontend Options
if (Args.hasArg(OPT_INPUT)) { if (Args.hasArg(OPT_INPUT)) {
@ -260,8 +266,9 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
} }
} }
Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm); Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);
Opts.OutputPath = Args.getLastArgValue(OPT_o); Opts.OutputPath = std::string(Args.getLastArgValue(OPT_o));
Opts.SplitDwarfOutput = Args.getLastArgValue(OPT_split_dwarf_output); Opts.SplitDwarfOutput =
std::string(Args.getLastArgValue(OPT_split_dwarf_output));
if (Arg *A = Args.getLastArg(OPT_filetype)) { if (Arg *A = Args.getLastArg(OPT_filetype)) {
StringRef Name = A->getValue(); StringRef Name = A->getValue();
unsigned OutputType = StringSwitch<unsigned>(Name) unsigned OutputType = StringSwitch<unsigned>(Name)
@ -289,8 +296,9 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack); Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings); Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
Opts.NoWarn = Args.hasArg(OPT_massembler_no_warn); Opts.NoWarn = Args.hasArg(OPT_massembler_no_warn);
Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic"); Opts.RelocationModel =
Opts.TargetABI = Args.getLastArgValue(OPT_target_abi); std::string(Args.getLastArgValue(OPT_mrelocation_model, "pic"));
Opts.TargetABI = std::string(Args.getLastArgValue(OPT_target_abi));
Opts.IncrementalLinkerCompatible = Opts.IncrementalLinkerCompatible =
Args.hasArg(OPT_mincremental_linker_compatible); Args.hasArg(OPT_mincremental_linker_compatible);
Opts.SymbolDefs = Args.getAllArgValues(OPT_defsym); Opts.SymbolDefs = Args.getAllArgValues(OPT_defsym);
@ -421,12 +429,7 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,
SrcMgr.getMemoryBuffer(BufferIndex)->getBuffer()); SrcMgr.getMemoryBuffer(BufferIndex)->getBuffer());
// Build up the feature string from the target feature list. // Build up the feature string from the target feature list.
std::string FS; std::string FS = llvm::join(Opts.Features, ",");
if (!Opts.Features.empty()) {
FS = Opts.Features[0];
for (unsigned i = 1, e = Opts.Features.size(); i != e; ++i)
FS += "," + Opts.Features[i];
}
std::unique_ptr<MCStreamer> Str; std::unique_ptr<MCStreamer> Str;
@ -490,7 +493,7 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,
MCSection *AsmLabel = Ctx.getMachOSection( MCSection *AsmLabel = Ctx.getMachOSection(
"__LLVM", "__asm", MachO::S_REGULAR, 4, SectionKind::getReadOnly()); "__LLVM", "__asm", MachO::S_REGULAR, 4, SectionKind::getReadOnly());
Str.get()->SwitchSection(AsmLabel); Str.get()->SwitchSection(AsmLabel);
Str.get()->EmitZeros(1); Str.get()->emitZeros(1);
} }
// Assembly to object compilation should leverage assembly info. // Assembly to object compilation should leverage assembly info.

View File

@ -30,6 +30,7 @@
#include "llvm/Option/ArgList.h" #include "llvm/Option/ArgList.h"
#include "llvm/Option/OptTable.h" #include "llvm/Option/OptTable.h"
#include "llvm/Option/Option.h" #include "llvm/Option/Option.h"
#include "llvm/Support/BuryPointer.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/CrashRecoveryContext.h" #include "llvm/Support/CrashRecoveryContext.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
@ -37,6 +38,7 @@
#include "llvm/Support/Host.h" #include "llvm/Support/Host.h"
#include "llvm/Support/InitLLVM.h" #include "llvm/Support/InitLLVM.h"
#include "llvm/Support/Path.h" #include "llvm/Support/Path.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/Process.h" #include "llvm/Support/Process.h"
#include "llvm/Support/Program.h" #include "llvm/Support/Program.h"
#include "llvm/Support/Regex.h" #include "llvm/Support/Regex.h"
@ -60,7 +62,7 @@ std::string GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) {
if (llvm::ErrorOr<std::string> P = if (llvm::ErrorOr<std::string> P =
llvm::sys::findProgramByName(ExecutablePath)) llvm::sys::findProgramByName(ExecutablePath))
ExecutablePath = *P; ExecutablePath = *P;
return ExecutablePath.str(); return std::string(ExecutablePath.str());
} }
// This just needs to be some symbol in the binary; C++ doesn't // This just needs to be some symbol in the binary; C++ doesn't
@ -71,7 +73,7 @@ std::string GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) {
static const char *GetStableCStr(std::set<std::string> &SavedStrings, static const char *GetStableCStr(std::set<std::string> &SavedStrings,
StringRef S) { StringRef S) {
return SavedStrings.insert(S).first->c_str(); return SavedStrings.insert(std::string(S)).first->c_str();
} }
/// ApplyQAOverride - Apply a list of edits to the input argument lists. /// ApplyQAOverride - Apply a list of edits to the input argument lists.
@ -263,7 +265,7 @@ static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,
StringRef ExeBasename(llvm::sys::path::stem(Path)); StringRef ExeBasename(llvm::sys::path::stem(Path));
if (ExeBasename.equals_lower("cl")) if (ExeBasename.equals_lower("cl"))
ExeBasename = "clang-cl"; ExeBasename = "clang-cl";
DiagClient->setPrefix(ExeBasename); DiagClient->setPrefix(std::string(ExeBasename));
} }
// This lets us create the DiagnosticsEngine with a properly-filled-out // This lets us create the DiagnosticsEngine with a properly-filled-out
@ -323,7 +325,7 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) {
StringRef Tool = ArgV[1]; StringRef Tool = ArgV[1];
void *GetExecutablePathVP = (void *)(intptr_t)GetExecutablePath; void *GetExecutablePathVP = (void *)(intptr_t)GetExecutablePath;
if (Tool == "-cc1") if (Tool == "-cc1")
return cc1_main(makeArrayRef(ArgV).slice(2), ArgV[0], GetExecutablePathVP); return cc1_main(makeArrayRef(ArgV).slice(1), ArgV[0], GetExecutablePathVP);
if (Tool == "-cc1as") if (Tool == "-cc1as")
return cc1as_main(makeArrayRef(ArgV).slice(2), ArgV[0], return cc1as_main(makeArrayRef(ArgV).slice(2), ArgV[0],
GetExecutablePathVP); GetExecutablePathVP);
@ -337,6 +339,9 @@ extern "C" int ZigClang_main(int argc_, const char **argv_);
int ZigClang_main(int argc_, const char **argv_) { int ZigClang_main(int argc_, const char **argv_) {
noteBottomOfStack(); noteBottomOfStack();
llvm::InitLLVM X(argc_, argv_); 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; size_t argv_offset = (strcmp(argv_[1], "-cc1") == 0 || strcmp(argv_[1], "-cc1as") == 0) ? 0 : 1;
SmallVector<const char *, 256> argv(argv_ + argv_offset, argv_ + argc_); SmallVector<const char *, 256> argv(argv_ + argv_offset, argv_ + argc_);
@ -488,6 +493,7 @@ int ZigClang_main(int argc_, const char **argv_) {
std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(argv)); std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(argv));
int Res = 1; int Res = 1;
bool IsCrash = false;
if (C && !C->containsError()) { if (C && !C->containsError()) {
SmallVector<std::pair<int, const Command *>, 4> FailingCommands; SmallVector<std::pair<int, const Command *>, 4> FailingCommands;
Res = TheDriver.ExecuteCompilation(*C, FailingCommands); Res = TheDriver.ExecuteCompilation(*C, FailingCommands);
@ -502,6 +508,11 @@ int ZigClang_main(int argc_, const char **argv_) {
for (const auto &J : C->getJobs()) for (const auto &J : C->getJobs())
if (const Command *C = dyn_cast<Command>(&J)) if (const Command *C = dyn_cast<Command>(&J))
FailingCommands.push_back(std::make_pair(-1, C)); FailingCommands.push_back(std::make_pair(-1, C));
// Print the bug report message that would be printed if we did actually
// crash, but only if we're crashing due to FORCE_CLANG_DIAGNOSTICS_CRASH.
if (::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH"))
llvm::dbgs() << llvm::getBugReportMsg();
} }
for (const auto &P : FailingCommands) { for (const auto &P : FailingCommands) {
@ -514,11 +525,11 @@ int ZigClang_main(int argc_, const char **argv_) {
// If result status is 70, then the driver command reported a fatal error. // If result status is 70, then the driver command reported a fatal error.
// On Windows, abort will return an exit code of 3. In these cases, // On Windows, abort will return an exit code of 3. In these cases,
// generate additional diagnostic information if possible. // generate additional diagnostic information if possible.
bool DiagnoseCrash = CommandRes < 0 || CommandRes == 70; IsCrash = CommandRes < 0 || CommandRes == 70;
#ifdef _WIN32 #ifdef _WIN32
DiagnoseCrash |= CommandRes == 3; IsCrash |= CommandRes == 3;
#endif #endif
if (DiagnoseCrash) { if (IsCrash) {
TheDriver.generateCompilationDiagnostics(*C, *FailingCommand); TheDriver.generateCompilationDiagnostics(*C, *FailingCommand);
break; break;
} }
@ -527,10 +538,16 @@ int ZigClang_main(int argc_, const char **argv_) {
Diags.getClient()->finish(); Diags.getClient()->finish();
// If any timers were active but haven't been destroyed yet, print their if (!UseNewCC1Process && IsCrash) {
// results now. This happens in -disable-free mode. // When crashing in -fintegrated-cc1 mode, bury the timer pointers, because
llvm::TimerGroup::printAll(llvm::errs()); // the internal linked list might point to already released stack frames.
llvm::TimerGroup::clearAll(); llvm::BuryPointer(llvm::TimerGroup::aquireDefaultGroup());
} else {
// If any timers were active but haven't been destroyed yet, print their
// results now. This happens in -disable-free mode.
llvm::TimerGroup::printAll(llvm::errs());
llvm::TimerGroup::clearAll();
}
#ifdef _WIN32 #ifdef _WIN32
// Exit status should not be negative on Win32, unless abnormal termination. // Exit status should not be negative on Win32, unless abnormal termination.