Manna created this revision. Manna added a reviewer: tahonermann. Herald added a subscriber: arphaman. Herald added a project: All. Manna requested review of this revision. Herald added a project: clang.
Reported By Static Analyzer Tool, Coverity: Big parameter passed by value Copying large values is inefficient, consider passing by reference; Low, medium, and high size thresholds for detection can be adjusted. 1. Inside "CodeGenModule.cpp" file, in clang::CodeGen::CodeGenModule::EmitBackendOptionsMetadata(clang::CodeGenOptions): A very large function call parameter exceeding the high threshold is passed by value. pass_by_value: Passing parameter CodeGenOpts of type clang::CodeGenOptions const (size 2168 bytes) by value, which exceeds the high threshold of 512 bytes. 2. Inside "CodeCompleteConsumer.cpp" file, in clang::PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(clang::Sema &, clang::CodeCompletionContext, clang::CodeCompletionResult *, unsigned int): A large function call parameter exceeding the low threshold is passed by value. pass_by_value: Passing parameter Context of type clang::CodeCompletionContext (size 200 bytes) by value, which exceeds the low threshold of 128 bytes. 3. Inside "CodeCompleteConsumer.h" file, in clang::CodeCompleteConsumer::ProcessCodeCompleteResults(clang::Sema &, clang::CodeCompletionContext, clang::CodeCompletionResult *, unsigned int): A large function call parameter exceeding the low threshold is passed by value. pass_by_value: Passing parameter Context of type clang::CodeCompletionContext (size 200 bytes) by value, which exceeds the low threshold of 128 bytes. 4. Inside "ASTUnit.cpp" file, in <unnamed>::AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(clang::Sema &, clang::CodeCompletionContext, clang::CodeCompletionResult *, unsigned int): A large function call parameter exceeding the low threshold is passed by value. pass_by_value: Passing parameter Context of type clang::CodeCompletionContext (size 200 bytes) by value, which exceeds the low threshold of 128 bytes. 5. Inside "SemaType.cpp" file, in IsNoDerefableChunk(clang::DeclaratorChunk): A large function call parameter exceeding the low threshold is passed by value. pass_by_value: Passing parameter Chunk of type clang::DeclaratorChunk (size 176 bytes) by value, which exceeds the low threshold of 128 bytes. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D149163 Files: clang/include/clang/Sema/CodeCompleteConsumer.h clang/lib/CodeGen/CodeGenModule.cpp clang/lib/CodeGen/CodeGenModule.h clang/lib/Frontend/ASTUnit.cpp clang/lib/Sema/CodeCompleteConsumer.cpp clang/lib/Sema/SemaType.cpp clang/tools/libclang/CIndexCodeCompletion.cpp clang/unittests/Sema/CodeCompleteTest.cpp
Index: clang/unittests/Sema/CodeCompleteTest.cpp =================================================================== --- clang/unittests/Sema/CodeCompleteTest.cpp +++ clang/unittests/Sema/CodeCompleteTest.cpp @@ -54,7 +54,7 @@ CompletedFuncDecls(CompletedFuncDecls), CCTUInfo(std::make_shared<GlobalCodeCompletionAllocator>()) {} - void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context, + void ProcessCodeCompleteResults(Sema &S, const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults) override { for (unsigned I = 0; I < NumResults; ++I) { @@ -89,7 +89,7 @@ : CodeCompleteConsumer(/*CodeCompleteOpts=*/{}), ResultCtx(ResultCtx), CCTUInfo(std::make_shared<GlobalCodeCompletionAllocator>()) {} - void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context, + void ProcessCodeCompleteResults(Sema &S, const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults) override { ResultCtx.VisitedNamespaces = Index: clang/tools/libclang/CIndexCodeCompletion.cpp =================================================================== --- clang/tools/libclang/CIndexCodeCompletion.cpp +++ clang/tools/libclang/CIndexCodeCompletion.cpp @@ -572,8 +572,8 @@ CCTUInfo(Results.CodeCompletionAllocator), TU(TranslationUnit) {} ~CaptureCompletionResults() override { Finish(); } - void ProcessCodeCompleteResults(Sema &S, - CodeCompletionContext Context, + void ProcessCodeCompleteResults(Sema &S, + const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults) override { StoredResults.reserve(StoredResults.size() + NumResults); Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -4553,7 +4553,7 @@ return false; } -static bool IsNoDerefableChunk(DeclaratorChunk Chunk) { +static bool IsNoDerefableChunk(const DeclaratorChunk &Chunk) { return (Chunk.Kind == DeclaratorChunk::Pointer || Chunk.Kind == DeclaratorChunk::Array); } Index: clang/lib/Sema/CodeCompleteConsumer.cpp =================================================================== --- clang/lib/Sema/CodeCompleteConsumer.cpp +++ clang/lib/Sema/CodeCompleteConsumer.cpp @@ -638,8 +638,8 @@ } void PrintingCodeCompleteConsumer::ProcessCodeCompleteResults( - Sema &SemaRef, CodeCompletionContext Context, CodeCompletionResult *Results, - unsigned NumResults) { + Sema &SemaRef, const CodeCompletionContext &Context, + CodeCompletionResult *Results, unsigned NumResults) { std::stable_sort(Results, Results + NumResults); if (!Context.getPreferredType().isNull()) Index: clang/lib/Frontend/ASTUnit.cpp =================================================================== --- clang/lib/Frontend/ASTUnit.cpp +++ clang/lib/Frontend/ASTUnit.cpp @@ -1952,7 +1952,8 @@ | (1LL << CodeCompletionContext::CCC_ClassOrStructTag); } - void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context, + void ProcessCodeCompleteResults(Sema &S, + const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults) override; @@ -2063,10 +2064,9 @@ } } -void AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &S, - CodeCompletionContext Context, - CodeCompletionResult *Results, - unsigned NumResults) { +void AugmentedCodeCompleteConsumer::ProcessCodeCompleteResults( + Sema &S, const CodeCompletionContext &Context, + CodeCompletionResult *Results, unsigned NumResults) { // Merge the results we were given with the results we cached. bool AddedResult = false; uint64_t InContexts = Index: clang/lib/CodeGen/CodeGenModule.h =================================================================== --- clang/lib/CodeGen/CodeGenModule.h +++ clang/lib/CodeGen/CodeGenModule.h @@ -1711,7 +1711,7 @@ /// Emit the module flag metadata used to pass options controlling the /// the backend to LLVM. - void EmitBackendOptionsMetadata(const CodeGenOptions CodeGenOpts); + void EmitBackendOptionsMetadata(const CodeGenOptions &CodeGenOpts); /// Emits OpenCL specific Metadata e.g. OpenCL version. void EmitOpenCLMetadata(); Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -990,7 +990,7 @@ } void CodeGenModule::EmitBackendOptionsMetadata( - const CodeGenOptions CodeGenOpts) { + const CodeGenOptions &CodeGenOpts) { if (getTriple().isRISCV()) { getModule().addModuleFlag(llvm::Module::Min, "SmallDataLimit", CodeGenOpts.SmallDataLimit); Index: clang/include/clang/Sema/CodeCompleteConsumer.h =================================================================== --- clang/include/clang/Sema/CodeCompleteConsumer.h +++ clang/include/clang/Sema/CodeCompleteConsumer.h @@ -1201,7 +1201,7 @@ //@{ /// Process the finalized code-completion results. virtual void ProcessCodeCompleteResults(Sema &S, - CodeCompletionContext Context, + const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults) {} @@ -1264,7 +1264,7 @@ CCTUInfo(std::make_shared<GlobalCodeCompletionAllocator>()) {} /// Prints the finalized code-completion results. - void ProcessCodeCompleteResults(Sema &S, CodeCompletionContext Context, + void ProcessCodeCompleteResults(Sema &S, const CodeCompletionContext &Context, CodeCompletionResult *Results, unsigned NumResults) override;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits