| author | |
| committer | |
| log | b7a8c045efab89c0fab0d3d1c678442c2b373066 |
| tree | ad21afbd9d3e92aeabdf5ec0743bf73938ff6822 |
| parent | 008affa64559487c6886e27075bb5377ca915b4a |
| signature |
4 files changed, 57 insertions(+), 34 deletions(-)
src/zig_clang_cc1_main.cpp+27-13| ... | ... | @@ -111,9 +111,10 @@ static void ensureSufficientStack() {} |
| 111 | 111 | |
| 112 | 112 | /// Print supported cpus of the given target. |
| 113 | 113 | static int PrintSupportedCPUs(std::string TargetStr) { |
| 114 | llvm::Triple Triple(TargetStr); | |
| 114 | 115 | std::string Error; |
| 115 | 116 | const llvm::Target *TheTarget = |
| 116 | llvm::TargetRegistry::lookupTarget(TargetStr, Error); | |
| 117 | llvm::TargetRegistry::lookupTarget(Triple, Error); | |
| 117 | 118 | if (!TheTarget) { |
| 118 | 119 | llvm::errs() << Error; |
| 119 | 120 | return 1; |
| ... | ... | @@ -122,15 +123,16 @@ static int PrintSupportedCPUs(std::string TargetStr) { |
| 122 | 123 | // the target machine will handle the mcpu printing |
| 123 | 124 | llvm::TargetOptions Options; |
| 124 | 125 | std::unique_ptr<llvm::TargetMachine> TheTargetMachine( |
| 125 | TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options, | |
| 126 | TheTarget->createTargetMachine(Triple, "", "+cpuhelp", Options, | |
| 126 | 127 | std::nullopt)); |
| 127 | 128 | return 0; |
| 128 | 129 | } |
| 129 | 130 | |
| 130 | 131 | static int PrintSupportedExtensions(std::string TargetStr) { |
| 132 | llvm::Triple Triple(TargetStr); | |
| 131 | 133 | std::string Error; |
| 132 | 134 | const llvm::Target *TheTarget = |
| 133 | llvm::TargetRegistry::lookupTarget(TargetStr, Error); | |
| 135 | llvm::TargetRegistry::lookupTarget(Triple, Error); | |
| 134 | 136 | if (!TheTarget) { |
| 135 | 137 | llvm::errs() << Error; |
| 136 | 138 | return 1; |
| ... | ... | @@ -138,7 +140,7 @@ static int PrintSupportedExtensions(std::string TargetStr) { |
| 138 | 140 | |
| 139 | 141 | llvm::TargetOptions Options; |
| 140 | 142 | std::unique_ptr<llvm::TargetMachine> TheTargetMachine( |
| 141 | TheTarget->createTargetMachine(TargetStr, "", "", Options, std::nullopt)); | |
| 143 | TheTarget->createTargetMachine(Triple, "", "", Options, std::nullopt)); | |
| 142 | 144 | const llvm::Triple &MachineTriple = TheTargetMachine->getTargetTriple(); |
| 143 | 145 | const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo(); |
| 144 | 146 | const llvm::ArrayRef<llvm::SubtargetFeatureKV> Features = |
| ... | ... | @@ -165,9 +167,10 @@ static int PrintSupportedExtensions(std::string TargetStr) { |
| 165 | 167 | } |
| 166 | 168 | |
| 167 | 169 | static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { |
| 170 | llvm::Triple Triple(TargetOpts.Triple); | |
| 168 | 171 | std::string Error; |
| 169 | 172 | const llvm::Target *TheTarget = |
| 170 | llvm::TargetRegistry::lookupTarget(TargetOpts.Triple, Error); | |
| 173 | llvm::TargetRegistry::lookupTarget(Triple, Error); | |
| 171 | 174 | if (!TheTarget) { |
| 172 | 175 | llvm::errs() << Error; |
| 173 | 176 | return 1; |
| ... | ... | @@ -179,7 +182,8 @@ static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { |
| 179 | 182 | llvm::TargetOptions BackendOptions; |
| 180 | 183 | std::string FeaturesStr = llvm::join(TargetOpts.FeaturesAsWritten, ","); |
| 181 | 184 | std::unique_ptr<llvm::TargetMachine> TheTargetMachine( |
| 182 | TheTarget->createTargetMachine(TargetOpts.Triple, TargetOpts.CPU, FeaturesStr, BackendOptions, std::nullopt)); | |
| 185 | TheTarget->createTargetMachine(Triple, TargetOpts.CPU, FeaturesStr, | |
| 186 | BackendOptions, std::nullopt)); | |
| 183 | 187 | const llvm::Triple &MachineTriple = TheTargetMachine->getTargetTriple(); |
| 184 | 188 | const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo(); |
| 185 | 189 | |
| ... | ... | @@ -213,11 +217,10 @@ static int PrintEnabledExtensions(const TargetOptions& TargetOpts) { |
| 213 | 217 | int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) { |
| 214 | 218 | ensureSufficientStack(); |
| 215 | 219 | |
| 216 | std::unique_ptr<CompilerInstance> Clang(new CompilerInstance()); | |
| 217 | 220 | IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); |
| 218 | 221 | |
| 219 | 222 | // Register the support for object-file-wrapped Clang modules. |
| 220 | auto PCHOps = Clang->getPCHContainerOperations(); | |
| 223 | auto PCHOps = std::make_shared<PCHContainerOperations>(); | |
| 221 | 224 | PCHOps->registerWriter(std::make_unique<ObjectFilePCHContainerWriter>()); |
| 222 | 225 | PCHOps->registerReader(std::make_unique<ObjectFilePCHContainerReader>()); |
| 223 | 226 | |
| ... | ... | @@ -229,17 +232,21 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) { |
| 229 | 232 | |
| 230 | 233 | // Buffer diagnostics from argument parsing so that we can output them using a |
| 231 | 234 | // well formed diagnostic object. |
| 232 | IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); | |
| 235 | DiagnosticOptions DiagOpts; | |
| 233 | 236 | TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer; |
| 234 | DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagsBuffer); | |
| 237 | DiagnosticsEngine Diags(DiagID, DiagOpts, DiagsBuffer); | |
| 235 | 238 | |
| 236 | 239 | // Setup round-trip remarks for the DiagnosticsEngine used in CreateFromArgs. |
| 237 | 240 | if (find(Argv, StringRef("-Rround-trip-cc1-args")) != Argv.end()) |
| 238 | 241 | Diags.setSeverity(diag::remark_cc1_round_trip_generated, |
| 239 | 242 | diag::Severity::Remark, {}); |
| 240 | 243 | |
| 241 | bool Success = CompilerInvocation::CreateFromArgs(Clang->getInvocation(), | |
| 242 | Argv, Diags, Argv0); | |
| 244 | auto Invocation = std::make_shared<CompilerInvocation>(); | |
| 245 | bool Success = | |
| 246 | CompilerInvocation::CreateFromArgs(*Invocation, Argv, Diags, Argv0); | |
| 247 | ||
| 248 | auto Clang = std::make_unique<CompilerInstance>(std::move(Invocation), | |
| 249 | std::move(PCHOps)); | |
| 243 | 250 | |
| 244 | 251 | if (!Clang->getFrontendOpts().TimeTracePath.empty()) { |
| 245 | 252 | llvm::timeTraceProfilerInitialize( |
| ... | ... | @@ -292,7 +299,14 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) { |
| 292 | 299 | |
| 293 | 300 | // If any timers were active but haven't been destroyed yet, print their |
| 294 | 301 | // results now. This happens in -disable-free mode. |
| 295 | llvm::TimerGroup::printAll(llvm::errs()); | |
| 302 | std::unique_ptr<raw_ostream> IOFile = llvm::CreateInfoOutputFile(); | |
| 303 | if (Clang->getCodeGenOpts().TimePassesJson) { | |
| 304 | *IOFile << "{\n"; | |
| 305 | llvm::TimerGroup::printAllJSONValues(*IOFile, ""); | |
| 306 | *IOFile << "\n}\n"; | |
| 307 | } else { | |
| 308 | llvm::TimerGroup::printAll(*IOFile); | |
| 309 | } | |
| 296 | 310 | llvm::TimerGroup::clearAll(); |
| 297 | 311 | |
| 298 | 312 | if (llvm::timeTraceProfilerEnabled()) { |
src/zig_clang_cc1as_main.cpp+13-12| ... | ... | @@ -26,6 +26,7 @@ |
| 26 | 26 | #include "llvm/MC/MCAsmInfo.h" |
| 27 | 27 | #include "llvm/MC/MCCodeEmitter.h" |
| 28 | 28 | #include "llvm/MC/MCContext.h" |
| 29 | #include "llvm/MC/MCInstPrinter.h" | |
| 29 | 30 | #include "llvm/MC/MCInstrInfo.h" |
| 30 | 31 | #include "llvm/MC/MCObjectFileInfo.h" |
| 31 | 32 | #include "llvm/MC/MCObjectWriter.h" |
| ... | ... | @@ -541,8 +542,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 541 | 542 | |
| 542 | 543 | // FIXME: There is a bit of code duplication with addPassesToEmitFile. |
| 543 | 544 | if (Opts.OutputType == AssemblerInvocation::FT_Asm) { |
| 544 | MCInstPrinter *IP = TheTarget->createMCInstPrinter( | |
| 545 | llvm::Triple(Opts.Triple), Opts.OutputAsmVariant, *MAI, *MCII, *MRI); | |
| 545 | std::unique_ptr<MCInstPrinter> IP(TheTarget->createMCInstPrinter( | |
| 546 | llvm::Triple(Opts.Triple), Opts.OutputAsmVariant, *MAI, *MCII, *MRI)); | |
| 546 | 547 | |
| 547 | 548 | std::unique_ptr<MCCodeEmitter> CE; |
| 548 | 549 | if (Opts.ShowEncoding) |
| ... | ... | @@ -551,7 +552,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 551 | 552 | TheTarget->createMCAsmBackend(*STI, *MRI, MCOptions)); |
| 552 | 553 | |
| 553 | 554 | auto FOut = std::make_unique<formatted_raw_ostream>(*Out); |
| 554 | Str.reset(TheTarget->createAsmStreamer(Ctx, std::move(FOut), IP, | |
| 555 | Str.reset(TheTarget->createAsmStreamer(Ctx, std::move(FOut), std::move(IP), | |
| 555 | 556 | std::move(CE), std::move(MAB))); |
| 556 | 557 | } else if (Opts.OutputType == AssemblerInvocation::FT_Null) { |
| 557 | 558 | Str.reset(createNullStreamer(Ctx)); |
| ... | ... | @@ -576,7 +577,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 576 | 577 | Triple T(Opts.Triple); |
| 577 | 578 | Str.reset(TheTarget->createMCObjectStreamer( |
| 578 | 579 | T, Ctx, std::move(MAB), std::move(OW), std::move(CE), *STI)); |
| 579 | Str.get()->initSections(Opts.NoExecStack, *STI); | |
| 580 | Str->initSections(Opts.NoExecStack, *STI); | |
| 580 | 581 | if (T.isOSBinFormatMachO() && T.isOSDarwin()) { |
| 581 | 582 | Triple *TVT = Opts.DarwinTargetVariantTriple |
| 582 | 583 | ? &*Opts.DarwinTargetVariantTriple |
| ... | ... | @@ -591,14 +592,14 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 591 | 592 | if (Opts.EmbedBitcode && Ctx.getObjectFileType() == MCContext::IsMachO) { |
| 592 | 593 | MCSection *AsmLabel = Ctx.getMachOSection( |
| 593 | 594 | "__LLVM", "__asm", MachO::S_REGULAR, 4, SectionKind::getReadOnly()); |
| 594 | Str.get()->switchSection(AsmLabel); | |
| 595 | Str.get()->emitZeros(1); | |
| 595 | Str->switchSection(AsmLabel); | |
| 596 | Str->emitZeros(1); | |
| 596 | 597 | } |
| 597 | 598 | |
| 598 | 599 | bool Failed = false; |
| 599 | 600 | |
| 600 | 601 | std::unique_ptr<MCAsmParser> Parser( |
| 601 | createMCAsmParser(SrcMgr, Ctx, *Str.get(), *MAI)); | |
| 602 | createMCAsmParser(SrcMgr, Ctx, *Str, *MAI)); | |
| 602 | 603 | |
| 603 | 604 | // FIXME: init MCTargetOptions from sanitizer flags here. |
| 604 | 605 | std::unique_ptr<MCTargetAsmParser> TAP( |
| ... | ... | @@ -618,7 +619,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 618 | 619 | } |
| 619 | 620 | |
| 620 | 621 | if (!Failed) { |
| 621 | Parser->setTargetParser(*TAP.get()); | |
| 622 | Parser->setTargetParser(*TAP); | |
| 622 | 623 | Failed = Parser->Run(Opts.NoInitialTextSection); |
| 623 | 624 | } |
| 624 | 625 | |
| ... | ... | @@ -657,12 +658,12 @@ int cc1as_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) { |
| 657 | 658 | InitializeAllAsmParsers(); |
| 658 | 659 | |
| 659 | 660 | // Construct our diagnostic client. |
| 660 | IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); | |
| 661 | TextDiagnosticPrinter *DiagClient | |
| 662 | = new TextDiagnosticPrinter(errs(), &*DiagOpts); | |
| 661 | DiagnosticOptions DiagOpts; | |
| 662 | TextDiagnosticPrinter *DiagClient = | |
| 663 | new TextDiagnosticPrinter(errs(), DiagOpts); | |
| 663 | 664 | DiagClient->setPrefix("clang -cc1as"); |
| 664 | 665 | IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); |
| 665 | DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagClient); | |
| 666 | DiagnosticsEngine Diags(DiagID, DiagOpts, DiagClient); | |
| 666 | 667 | |
| 667 | 668 | // Set an error handler, so that any LLVM backend diagnostics go through our |
| 668 | 669 | // error handler. |
src/zig_clang_driver.cpp+16-8| ... | ... | @@ -153,6 +153,11 @@ static bool SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { |
| 153 | 153 | } |
| 154 | 154 | |
| 155 | 155 | const char *FilteringStr = ::getenv("CC_PRINT_HEADERS_FILTERING"); |
| 156 | if (!FilteringStr) { | |
| 157 | TheDriver.Diag(clang::diag::err_drv_print_header_env_var_invalid_format) | |
| 158 | << EnvVar; | |
| 159 | return false; | |
| 160 | } | |
| 156 | 161 | HeaderIncludeFilteringKind Filtering; |
| 157 | 162 | if (!stringToHeaderIncludeFiltering(FilteringStr, Filtering)) { |
| 158 | 163 | TheDriver.Diag(clang::diag::err_drv_print_header_env_var) |
| ... | ... | @@ -163,7 +168,7 @@ static bool SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { |
| 163 | 168 | if ((TheDriver.CCPrintHeadersFormat == HIFMT_Textual && |
| 164 | 169 | Filtering != HIFIL_None) || |
| 165 | 170 | (TheDriver.CCPrintHeadersFormat == HIFMT_JSON && |
| 166 | Filtering != HIFIL_Only_Direct_System)) { | |
| 171 | Filtering == HIFIL_None)) { | |
| 167 | 172 | TheDriver.Diag(clang::diag::err_drv_print_header_env_var_combination) |
| 168 | 173 | << EnvVar << FilteringStr; |
| 169 | 174 | return false; |
| ... | ... | @@ -295,7 +300,7 @@ static int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContex |
| 295 | 300 | if (const char *OverrideStr = ::getenv("CCC_OVERRIDE_OPTIONS")) { |
| 296 | 301 | // FIXME: Driver shouldn't take extra initial argument. |
| 297 | 302 | driver::applyOverrideOptions(Args, OverrideStr, SavedStrings, |
| 298 | &llvm::errs()); | |
| 303 | "CCC_OVERRIDE_OPTIONS", &llvm::errs()); | |
| 299 | 304 | } |
| 300 | 305 | |
| 301 | 306 | std::string Path = GetExecutablePath(ToolContext.Path, CanonicalPrefixes); |
| ... | ... | @@ -311,21 +316,24 @@ static int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContex |
| 311 | 316 | .Case("-fintegrated-cc1", false) |
| 312 | 317 | .Default(UseNewCC1Process); |
| 313 | 318 | |
| 314 | IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = | |
| 315 | CreateAndPopulateDiagOpts(Args); | |
| 319 | std::unique_ptr<DiagnosticOptions> DiagOpts = CreateAndPopulateDiagOpts(Args); | |
| 320 | // Driver's diagnostics don't use suppression mappings, so don't bother | |
| 321 | // parsing them. CC1 still receives full args, so this doesn't impact other | |
| 322 | // actions. | |
| 323 | DiagOpts->DiagnosticSuppressionMappingsFile.clear(); | |
| 316 | 324 | |
| 317 | TextDiagnosticPrinter *DiagClient | |
| 318 | = new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); | |
| 325 | TextDiagnosticPrinter *DiagClient = | |
| 326 | new TextDiagnosticPrinter(llvm::errs(), *DiagOpts); | |
| 319 | 327 | FixupDiagPrefixExeName(DiagClient, ProgName); |
| 320 | 328 | |
| 321 | 329 | IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); |
| 322 | 330 | |
| 323 | DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagClient); | |
| 331 | DiagnosticsEngine Diags(DiagID, *DiagOpts, DiagClient); | |
| 324 | 332 | |
| 325 | 333 | if (!DiagOpts->DiagnosticSerializationFile.empty()) { |
| 326 | 334 | auto SerializedConsumer = |
| 327 | 335 | clang::serialized_diags::create(DiagOpts->DiagnosticSerializationFile, |
| 328 | &*DiagOpts, /*MergeChildRecords=*/true); | |
| 336 | *DiagOpts, /*MergeChildRecords=*/true); | |
| 329 | 337 | Diags.setClient(new ChainedDiagnosticConsumer( |
| 330 | 338 | Diags.takeClient(), std::move(SerializedConsumer))); |
| 331 | 339 | } |
src/zig_llvm-ar.cpp+1-1| ... | ... | @@ -130,7 +130,7 @@ MODIFIERS: |
| 130 | 130 | << "USAGE: " + ToolName + |
| 131 | 131 | " [options] [-]<operation>[modifiers] [relpos] " |
| 132 | 132 | "[count] <archive> [files]\n" |
| 133 | << " " + ToolName + " -M [<mri-script]\n\n"; | |
| 133 | << " " + ToolName + " -M [< mri-script]\n\n"; | |
| 134 | 134 | |
| 135 | 135 | outs() << ArOptions; |
| 136 | 136 | } |