diff options
author | dim <dim@FreeBSD.org> | 2015-07-05 14:23:59 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2015-07-05 14:23:59 +0000 |
commit | e7bcad327814a78ecb8d5f5545d2e3df84c67a5c (patch) | |
tree | ac719b5984165053bf83d71142e4d96b609b9784 /tools | |
parent | 9dd834653b811ad20382e98a87dff824980c9916 (diff) | |
download | FreeBSD-src-e7bcad327814a78ecb8d5f5545d2e3df84c67a5c.zip FreeBSD-src-e7bcad327814a78ecb8d5f5545d2e3df84c67a5c.tar.gz |
Vendor import of clang trunk r241361:
https://llvm.org/svn/llvm-project/cfe/trunk@241361
Diffstat (limited to 'tools')
-rw-r--r-- | tools/clang-fuzzer/ClangFuzzer.cpp | 5 | ||||
-rw-r--r-- | tools/driver/cc1as_main.cpp | 75 | ||||
-rw-r--r-- | tools/driver/driver.cpp | 8 | ||||
-rw-r--r-- | tools/libclang/CIndex.cpp | 28 | ||||
-rw-r--r-- | tools/libclang/CXCursor.cpp | 6 | ||||
-rwxr-xr-x | tools/scan-build/ccc-analyzer | 75 | ||||
-rwxr-xr-x | tools/scan-build/scan-build | 35 |
7 files changed, 122 insertions, 110 deletions
diff --git a/tools/clang-fuzzer/ClangFuzzer.cpp b/tools/clang-fuzzer/ClangFuzzer.cpp index 17ef052..124911c 100644 --- a/tools/clang-fuzzer/ClangFuzzer.cpp +++ b/tools/clang-fuzzer/ClangFuzzer.cpp @@ -39,5 +39,8 @@ extern "C" void LLVMFuzzerTestOneInput(uint8_t *data, size_t size) { Invocation->getPreprocessorOpts().addRemappedFile("./test.cc", Input.release()); std::unique_ptr<tooling::ToolAction> action( tooling::newFrontendActionFactory<clang::SyntaxOnlyAction>()); - action->runInvocation(Invocation.release(), Files.get(), &Diags); + std::shared_ptr<PCHContainerOperations> PCHContainerOps = + std::make_shared<RawPCHContainerOperations>(); + action->runInvocation(Invocation.release(), Files.get(), PCHContainerOps, + &Diags); } diff --git a/tools/driver/cc1as_main.cpp b/tools/driver/cc1as_main.cpp index f7ac17f..aa92541 100644 --- a/tools/driver/cc1as_main.cpp +++ b/tools/driver/cc1as_main.cpp @@ -161,68 +161,68 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, const unsigned IncludedFlagsBitmask = options::CC1AsOption; unsigned MissingArgIndex, MissingArgCount; - std::unique_ptr<InputArgList> Args( - OptTbl->ParseArgs(Argv.begin(), Argv.end(), MissingArgIndex, MissingArgCount, - IncludedFlagsBitmask)); + InputArgList Args = OptTbl->ParseArgs(Argv, MissingArgIndex, MissingArgCount, + IncludedFlagsBitmask); // Check for missing argument error. if (MissingArgCount) { Diags.Report(diag::err_drv_missing_argument) - << Args->getArgString(MissingArgIndex) << MissingArgCount; + << Args.getArgString(MissingArgIndex) << MissingArgCount; Success = false; } // Issue errors on unknown arguments. - for (const Arg *A : Args->filtered(OPT_UNKNOWN)) { - Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(*Args); + for (const Arg *A : Args.filtered(OPT_UNKNOWN)) { + Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(Args); Success = false; } // Construct the invocation. // Target Options - Opts.Triple = llvm::Triple::normalize(Args->getLastArgValue(OPT_triple)); - Opts.CPU = Args->getLastArgValue(OPT_target_cpu); - Opts.Features = Args->getAllArgValues(OPT_target_feature); + Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple)); + Opts.CPU = Args.getLastArgValue(OPT_target_cpu); + Opts.Features = Args.getAllArgValues(OPT_target_feature); // Use the default target triple if unspecified. if (Opts.Triple.empty()) Opts.Triple = llvm::sys::getDefaultTargetTriple(); // Language Options - Opts.IncludePaths = Args->getAllArgValues(OPT_I); - Opts.NoInitialTextSection = Args->hasArg(OPT_n); - Opts.SaveTemporaryLabels = Args->hasArg(OPT_msave_temp_labels); - Opts.GenDwarfForAssembly = Args->hasArg(OPT_g_Flag); - Opts.CompressDebugSections = Args->hasArg(OPT_compress_debug_sections); - if (Args->hasArg(OPT_gdwarf_2)) + Opts.IncludePaths = Args.getAllArgValues(OPT_I); + Opts.NoInitialTextSection = Args.hasArg(OPT_n); + Opts.SaveTemporaryLabels = Args.hasArg(OPT_msave_temp_labels); + Opts.GenDwarfForAssembly = Args.hasArg(OPT_g_Flag); + Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections); + if (Args.hasArg(OPT_gdwarf_2)) Opts.DwarfVersion = 2; - if (Args->hasArg(OPT_gdwarf_3)) + if (Args.hasArg(OPT_gdwarf_3)) Opts.DwarfVersion = 3; - if (Args->hasArg(OPT_gdwarf_4)) + if (Args.hasArg(OPT_gdwarf_4)) Opts.DwarfVersion = 4; - Opts.DwarfDebugFlags = Args->getLastArgValue(OPT_dwarf_debug_flags); - Opts.DwarfDebugProducer = Args->getLastArgValue(OPT_dwarf_debug_producer); - Opts.DebugCompilationDir = Args->getLastArgValue(OPT_fdebug_compilation_dir); - Opts.MainFileName = Args->getLastArgValue(OPT_main_file_name); + Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags); + Opts.DwarfDebugProducer = Args.getLastArgValue(OPT_dwarf_debug_producer); + Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir); + Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name); // Frontend Options - if (Args->hasArg(OPT_INPUT)) { + if (Args.hasArg(OPT_INPUT)) { bool First = true; - for (arg_iterator it = Args->filtered_begin(OPT_INPUT), - ie = Args->filtered_end(); it != ie; ++it, First=false) { + for (arg_iterator it = Args.filtered_begin(OPT_INPUT), + ie = Args.filtered_end(); + it != ie; ++it, First = false) { const Arg *A = it; if (First) Opts.InputFile = A->getValue(); else { - Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(*Args); + Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(Args); Success = false; } } } - Opts.LLVMArgs = Args->getAllArgValues(OPT_mllvm); - Opts.OutputPath = Args->getLastArgValue(OPT_o); - if (Arg *A = Args->getLastArg(OPT_filetype)) { + Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm); + Opts.OutputPath = Args.getLastArgValue(OPT_o); + if (Arg *A = Args.getLastArg(OPT_filetype)) { StringRef Name = A->getValue(); unsigned OutputType = StringSwitch<unsigned>(Name) .Case("asm", FT_Asm) @@ -230,25 +230,24 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, .Case("obj", FT_Obj) .Default(~0U); if (OutputType == ~0U) { - Diags.Report(diag::err_drv_invalid_value) - << A->getAsString(*Args) << Name; + Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; Success = false; } else Opts.OutputType = FileType(OutputType); } - Opts.ShowHelp = Args->hasArg(OPT_help); - Opts.ShowVersion = Args->hasArg(OPT_version); + Opts.ShowHelp = Args.hasArg(OPT_help); + Opts.ShowVersion = Args.hasArg(OPT_version); // Transliterate Options Opts.OutputAsmVariant = - getLastArgIntValue(*Args.get(), OPT_output_asm_variant, 0, Diags); - Opts.ShowEncoding = Args->hasArg(OPT_show_encoding); - Opts.ShowInst = Args->hasArg(OPT_show_inst); + getLastArgIntValue(Args, OPT_output_asm_variant, 0, Diags); + Opts.ShowEncoding = Args.hasArg(OPT_show_encoding); + Opts.ShowInst = Args.hasArg(OPT_show_inst); // Assemble Options - Opts.RelaxAll = Args->hasArg(OPT_mrelax_all); - Opts.NoExecStack = Args->hasArg(OPT_mno_exec_stack); - Opts.FatalWarnings = Args->hasArg(OPT_massembler_fatal_warnings); + Opts.RelaxAll = Args.hasArg(OPT_mrelax_all); + Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack); + Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings); return Success; } diff --git a/tools/driver/driver.cpp b/tools/driver/driver.cpp index ff81b8a..5925447 100644 --- a/tools/driver/driver.cpp +++ b/tools/driver/driver.cpp @@ -321,16 +321,16 @@ static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient, // This lets us create the DiagnosticsEngine with a properly-filled-out // DiagnosticOptions instance. static DiagnosticOptions * -CreateAndPopulateDiagOpts(SmallVectorImpl<const char *> &argv) { +CreateAndPopulateDiagOpts(ArrayRef<const char *> argv) { auto *DiagOpts = new DiagnosticOptions; std::unique_ptr<OptTable> Opts(createDriverOptTable()); unsigned MissingArgIndex, MissingArgCount; - std::unique_ptr<InputArgList> Args(Opts->ParseArgs( - argv.begin() + 1, argv.end(), MissingArgIndex, MissingArgCount)); + InputArgList Args = + Opts->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); + (void)ParseDiagnosticArgs(*DiagOpts, Args); return DiagOpts; } diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 2216ec6..bf5b582 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -1880,6 +1880,9 @@ public: void VisitOMPBarrierDirective(const OMPBarrierDirective *D); void VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D); void VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *D); + void + VisitOMPCancellationPointDirective(const OMPCancellationPointDirective *D); + void VisitOMPCancelDirective(const OMPCancelDirective *D); void VisitOMPFlushDirective(const OMPFlushDirective *D); void VisitOMPOrderedDirective(const OMPOrderedDirective *D); void VisitOMPAtomicDirective(const OMPAtomicDirective *D); @@ -1934,8 +1937,8 @@ void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) { } void EnqueueVisitor::EnqueueChildren(const Stmt *S) { unsigned size = WL.size(); - for (Stmt::const_child_range Child = S->children(); Child; ++Child) { - AddStmt(*Child); + for (const Stmt *SubStmt : S->children()) { + AddStmt(SubStmt); } if (size == WL.size()) return; @@ -2098,6 +2101,9 @@ OMPClauseEnqueue::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) { void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) { VisitOMPClauseList(C); } +void OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) { + VisitOMPClauseList(C); +} } void EnqueueVisitor::EnqueueChildren(const OMPClause *S) { @@ -2504,6 +2510,15 @@ void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) { VisitOMPExecutableDirective(D); } +void EnqueueVisitor::VisitOMPCancellationPointDirective( + const OMPCancellationPointDirective *D) { + VisitOMPExecutableDirective(D); +} + +void EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) { + VisitOMPExecutableDirective(D); +} + void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) { EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S); } @@ -3827,12 +3842,11 @@ CXString clang_Cursor_getMangling(CXCursor C) { // Now apply backend mangling. std::unique_ptr<llvm::DataLayout> DL( new llvm::DataLayout(Ctx.getTargetInfo().getTargetDescription())); - llvm::Mangler BackendMangler(DL.get()); std::string FinalBuf; llvm::raw_string_ostream FinalBufOS(FinalBuf); - BackendMangler.getNameWithPrefix(FinalBufOS, - llvm::Twine(FrontendBufOS.str())); + llvm::Mangler::getNameWithPrefix(FinalBufOS, llvm::Twine(FrontendBufOS.str()), + *DL); return cxstring::createDup(FinalBufOS.str()); } @@ -4281,6 +4295,10 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return cxstring::createRef("OMPTargetDirective"); case CXCursor_OMPTeamsDirective: return cxstring::createRef("OMPTeamsDirective"); + case CXCursor_OMPCancellationPointDirective: + return cxstring::createRef("OMPCancellationPointDirective"); + case CXCursor_OMPCancelDirective: + return cxstring::createRef("OMPCancelDirective"); case CXCursor_OverloadCandidate: return cxstring::createRef("OverloadCandidate"); } diff --git a/tools/libclang/CXCursor.cpp b/tools/libclang/CXCursor.cpp index b8bb28e..fe9ba4e 100644 --- a/tools/libclang/CXCursor.cpp +++ b/tools/libclang/CXCursor.cpp @@ -588,6 +588,12 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent, case Stmt::OMPTeamsDirectiveClass: K = CXCursor_OMPTeamsDirective; break; + case Stmt::OMPCancellationPointDirectiveClass: + K = CXCursor_OMPCancellationPointDirective; + break; + case Stmt::OMPCancelDirectiveClass: + K = CXCursor_OMPCancelDirective; + break; } CXCursor C = { K, 0, { Parent, S, TU } }; diff --git a/tools/scan-build/ccc-analyzer b/tools/scan-build/ccc-analyzer index ffe6859..14591ae 100755 --- a/tools/scan-build/ccc-analyzer +++ b/tools/scan-build/ccc-analyzer @@ -22,6 +22,33 @@ use File::Basename; use Text::ParseWords; ##===----------------------------------------------------------------------===## +# List form 'system' with STDOUT and STDERR captured. +##===----------------------------------------------------------------------===## + +sub silent_system { + my $HtmlDir = shift; + my $Command = shift; + + # Save STDOUT and STDERR and redirect to a temporary file. + open OLDOUT, ">&", \*STDOUT; + open OLDERR, ">&", \*STDERR; + my ($TmpFH, $TmpFile) = tempfile("temp_buf_XXXXXX", + DIR => $HtmlDir, + UNLINK => 1); + open(STDOUT, ">$TmpFile"); + open(STDERR, ">&", \*STDOUT); + + # Invoke 'system', STDOUT and STDERR are output to a temporary file. + system $Command, @_; + + # Restore STDOUT and STDERR. + open STDOUT, ">&", \*OLDOUT; + open STDERR, ">&", \*OLDERR; + + return $TmpFH; +} + +##===----------------------------------------------------------------------===## # Compiler command setup. ##===----------------------------------------------------------------------===## @@ -145,7 +172,7 @@ sub ProcessClangFailure { print OUT "@$Args\n"; close OUT; `uname -a >> $PPFile.info.txt 2>&1`; - `$Compiler -v >> $PPFile.info.txt 2>&1`; + `"$Compiler" -v >> $PPFile.info.txt 2>&1`; rename($ofile, "$PPFile.stderr.txt"); return (basename $PPFile); } @@ -155,27 +182,15 @@ sub ProcessClangFailure { ##----------------------------------------------------------------------------## sub GetCCArgs { + my $HtmlDir = shift; my $mode = shift; my $Args = shift; - - pipe (FROM_CHILD, TO_PARENT); - my $pid = fork(); - if ($pid == 0) { - close FROM_CHILD; - open(STDOUT,">&", \*TO_PARENT); - open(STDERR,">&", \*TO_PARENT); - exec $Clang, "-###", $mode, @$Args; - } - close(TO_PARENT); my $line; - while (<FROM_CHILD>) { + my $OutputStream = silent_system($HtmlDir, $Clang, "-###", $mode, @$Args); + while (<$OutputStream>) { next if (!/\s"?-cc1"?\s/); $line = $_; } - - waitpid($pid,0); - close(FROM_CHILD); - die "could not find clang line\n" if (!defined $line); # Strip leading and trailing whitespace characters. $line =~ s/^\s+|\s+$//g; @@ -207,7 +222,7 @@ sub Analyze { $Cmd = $Clang; # Create arguments for doing regular parsing. - my $SyntaxArgs = GetCCArgs("-fsyntax-only", \@Args); + my $SyntaxArgs = GetCCArgs($HtmlDir, "-fsyntax-only", \@Args); @CmdArgsSansAnalyses = @$SyntaxArgs; # Create arguments for doing static analysis. @@ -230,7 +245,7 @@ sub Analyze { push @Args, "-Xclang", "-analyzer-viz-egraph-ubigraph"; } - my $AnalysisArgs = GetCCArgs("--analyze", \@Args); + my $AnalysisArgs = GetCCArgs($HtmlDir, "--analyze", \@Args); @CmdArgs = @$AnalysisArgs; } @@ -255,31 +270,19 @@ sub Analyze { print STDERR "#SHELL (cd '$dir' && @PrintArgs)\n"; } - # Capture the STDERR of clang and send it to a temporary file. - # Capture the STDOUT of clang and reroute it to ccc-analyzer's STDERR. + # Save STDOUT and STDERR of clang to a temporary file and reroute + # all clang output to ccc-analyzer's STDERR. # We save the output file in the 'crashes' directory if clang encounters # any problems with the file. - pipe (FROM_CHILD, TO_PARENT); - my $pid = fork(); - if ($pid == 0) { - close FROM_CHILD; - open(STDOUT,">&", \*TO_PARENT); - open(STDERR,">&", \*TO_PARENT); - exec $Cmd, @CmdArgs; - } - - close TO_PARENT; my ($ofh, $ofile) = tempfile("clang_output_XXXXXX", DIR => $HtmlDir); - - while (<FROM_CHILD>) { + + my $OutputStream = silent_system($HtmlDir, $Cmd, @CmdArgs); + while ( <$OutputStream> ) { print $ofh $_; print STDERR $_; } - close $ofh; - - waitpid($pid,0); - close(FROM_CHILD); my $Result = $?; + close $ofh; # Did the command die because of a signal? if ($ReportFailures) { diff --git a/tools/scan-build/scan-build b/tools/scan-build/scan-build index ac8e22e..d7cadc3 100755 --- a/tools/scan-build/scan-build +++ b/tools/scan-build/scan-build @@ -1232,16 +1232,9 @@ ENDTEXT } my %EnabledCheckers; foreach my $lang ("c", "objective-c", "objective-c++", "c++") { - pipe(FROM_CHILD, TO_PARENT); - my $pid = fork(); - if ($pid == 0) { - close FROM_CHILD; - open(STDOUT,">&", \*TO_PARENT); - open(STDERR,">&", \*TO_PARENT); - exec $Clang, ( @PluginLoadCommandline_xclang, '--analyze', '-x', $lang, '-', '-###'); - } - close(TO_PARENT); - while(<FROM_CHILD>) { + my $ExecLine = join(' ', qq/"$Clang"/, @PluginLoadCommandline_xclang, "--analyze", "-x", $lang, "-", "-###", "2>&1", "|"); + open(PS, $ExecLine); + while (<PS>) { foreach my $val (split /\s+/) { $val =~ s/\"//g; if ($val =~ /-analyzer-checker\=([^\s]+)/) { @@ -1249,23 +1242,14 @@ ENDTEXT } } } - waitpid($pid,0); - close(FROM_CHILD); } # Query clang for complete list of checkers. if (defined $Clang && -x $Clang) { - pipe(FROM_CHILD, TO_PARENT); - my $pid = fork(); - if ($pid == 0) { - close FROM_CHILD; - open(STDOUT,">&", \*TO_PARENT); - open(STDERR,">&", \*TO_PARENT); - exec $Clang, ('-cc1', @PluginsToLoad , '-analyzer-checker-help'); - } - close(TO_PARENT); + my $ExecLine = join(' ', qq/"$Clang"/, "-cc1", @PluginsToLoad, "-analyzer-checker-help", "2>&1", "|"); + open(PS, $ExecLine); my $foundCheckers = 0; - while(<FROM_CHILD>) { + while (<PS>) { if (/CHECKERS:/) { $foundCheckers = 1; last; @@ -1277,7 +1261,7 @@ ENDTEXT else { print("\nAVAILABLE CHECKERS:\n\n"); my $skip = 0; - while(<FROM_CHILD>) { + while(<PS>) { if (/experimental/) { $skip = 1; next; @@ -1314,10 +1298,9 @@ ENDTEXT } print $_; } - print "\nNOTE: \"+\" indicates that an analysis is enabled by default.\n" + print "\nNOTE: \"+\" indicates that an analysis is enabled by default.\n"; } - waitpid($pid,0); - close(FROM_CHILD); + close PS; } print <<ENDTEXT |