https://github.com/nikic created https://github.com/llvm/llvm-project/pull/142155
The InstrProf headers are very expensive. Avoid including them in all of CodeGen/ by making the CodeGenPGO member behind a unqiue_ptr. This reduces clang build time by 0.8%: https://llvm-compile-time-tracker.com/compare.php?from=273e463f4526691ede59dbda738a8b24d2d1d13c&to=3d2a17c59deca7d9956772017bf94682e45760d3&stat=instructions:u >From 95e168fdbfdd4307c5559b82e04a7ae2aaf66917 Mon Sep 17 00:00:00 2001 From: Nikita Popov <nikita....@gmail.com> Date: Thu, 29 May 2025 22:15:08 +0200 Subject: [PATCH] [CodeGen] Move CodeGenPGO behind unique_ptr (NFC) The InstrProf headers are very expensive. Avoid including them in all of CodeGen/ by making the CodeGenPGO member behind a unqiue_ptr. This reduces clang build time by 0.8%: https://llvm-compile-time-tracker.com/compare.php?from=273e463f4526691ede59dbda738a8b24d2d1d13c&to=3d2a17c59deca7d9956772017bf94682e45760d3&stat=instructions:u --- clang/lib/CodeGen/CGBlocks.cpp | 3 +- clang/lib/CodeGen/CGCall.cpp | 3 +- clang/lib/CodeGen/CGDecl.cpp | 7 +-- clang/lib/CodeGen/CGExpr.cpp | 3 +- clang/lib/CodeGen/CGObjC.cpp | 3 +- clang/lib/CodeGen/CGStmt.cpp | 13 ++--- clang/lib/CodeGen/CGStmtOpenMP.cpp | 3 +- clang/lib/CodeGen/CodeGenFunction.cpp | 11 +++-- clang/lib/CodeGen/CodeGenFunction.h | 52 +++++--------------- clang/lib/CodeGen/CodeGenPGO.cpp | 60 ++++++++++++++++++++++-- clang/lib/CodeGen/CoverageMappingGen.cpp | 1 + clang/lib/CodeGen/Targets/AMDGPU.cpp | 1 + clang/lib/CodeGen/Targets/MSP430.cpp | 1 + clang/lib/CodeGen/Targets/NVPTX.cpp | 1 + 14 files changed, 99 insertions(+), 63 deletions(-) diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index adb353d568cd2..729758ddce560 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -17,6 +17,7 @@ #include "CGOpenCLRuntime.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "ConstantEmitter.h" #include "TargetInfo.h" #include "clang/AST/Attr.h" @@ -1522,7 +1523,7 @@ llvm::Function *CodeGenFunction::GenerateBlockFunction( if (IsLambdaConversionToBlock) EmitLambdaBlockInvokeBody(); else { - PGO.assignRegionCounters(GlobalDecl(blockDecl), fn); + PGO->assignRegionCounters(GlobalDecl(blockDecl), fn); incrementProfileCounter(blockDecl->getBody()); EmitStmt(blockDecl->getBody()); } diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index bd920a2e3f2dd..c58b8dc67410b 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -21,6 +21,7 @@ #include "CGRecordLayout.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "TargetInfo.h" #include "clang/AST/Attr.h" #include "clang/AST/Decl.h" @@ -5900,7 +5901,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, // For more details, see the comment before the definition of // IPVK_IndirectCallTarget in InstrProfData.inc. if (!CI->getCalledFunction()) - PGO.valueProfile(Builder, llvm::IPVK_IndirectCallTarget, CI, CalleePtr); + PGO->valueProfile(Builder, llvm::IPVK_IndirectCallTarget, CI, CalleePtr); // In ObjC ARC mode with no ObjC ARC exception safety, tell the ARC // optimizer it can aggressively ignore unwind edges. diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index f4549ab3033b2..e487a2bc0353d 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -18,6 +18,7 @@ #include "CGOpenMPRuntime.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "ConstantEmitter.h" #include "EHScopeStack.h" #include "PatternInit.h" @@ -368,7 +369,7 @@ CodeGenFunction::AddInitializerToStaticVarDecl(const VarDecl &D, return GV; } - PGO.markStmtMaybeUsed(D.getInit()); // FIXME: Too lazy + PGO->markStmtMaybeUsed(D.getInit()); // FIXME: Too lazy #ifndef NDEBUG CharUnits VarSize = CGM.getContext().getTypeSizeInChars(D.getType()) + @@ -1944,7 +1945,7 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) { // unless it contains a label. if (!HaveInsertPoint()) { if (!Init || !ContainsLabel(Init)) { - PGO.markStmtMaybeUsed(Init); + PGO->markStmtMaybeUsed(Init); return; } EnsureInsertPoint(); @@ -2057,7 +2058,7 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) { return EmitExprAsInit(Init, &D, lv, capturedByInit); } - PGO.markStmtMaybeUsed(Init); + PGO->markStmtMaybeUsed(Init); if (!emission.IsConstantAggregate) { // For simple scalar/complex initialization, store the value directly. diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index d1c631d48dd2b..40419deea07b3 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -21,6 +21,7 @@ #include "CGRecordLayout.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "ConstantEmitter.h" #include "TargetInfo.h" #include "clang/AST/ASTContext.h" @@ -207,7 +208,7 @@ RawAddress CodeGenFunction::CreateMemTempWithoutCast(QualType Ty, /// EvaluateExprAsBool - Perform the usual unary conversions on the specified /// expression and compare the result against zero, returning an Int1Ty value. llvm::Value *CodeGenFunction::EvaluateExprAsBool(const Expr *E) { - PGO.setCurrentStmt(E); + PGO->setCurrentStmt(E); if (const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>()) { llvm::Value *MemPtr = EmitScalarExpr(E); return CGM.getCXXABI().EmitMemberPointerIsNotNull(*this, MemPtr, MPT); diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 73071bc60901b..ff1dae7de9cb6 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -14,6 +14,7 @@ #include "CGObjCRuntime.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "ConstantEmitter.h" #include "TargetInfo.h" #include "clang/AST/ASTContext.h" @@ -805,7 +806,7 @@ static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF, /// its pointer, name, and types registered in the class structure. void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) { StartObjCMethod(OMD, OMD->getClassInterface()); - PGO.assignRegionCounters(GlobalDecl(OMD), CurFn); + PGO->assignRegionCounters(GlobalDecl(OMD), CurFn); assert(isa<CompoundStmt>(OMD->getBody())); incrementProfileCounter(OMD->getBody()); EmitCompoundStmtWithoutScope(*cast<CompoundStmt>(OMD->getBody())); diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index 31d64a5a788ee..2ae7372211fa4 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -14,6 +14,7 @@ #include "CGOpenMPRuntime.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "TargetInfo.h" #include "clang/AST/Attr.h" #include "clang/AST/Expr.h" @@ -59,7 +60,7 @@ void CodeGenFunction::EmitStopPoint(const Stmt *S) { void CodeGenFunction::EmitStmt(const Stmt *S, ArrayRef<const Attr *> Attrs) { assert(S && "Null statement?"); - PGO.setCurrentStmt(S); + PGO->setCurrentStmt(S); // These statements have their own debug info handling. if (EmitSimpleStmt(S, Attrs)) @@ -76,7 +77,7 @@ void CodeGenFunction::EmitStmt(const Stmt *S, ArrayRef<const Attr *> Attrs) { // Verify that any decl statements were handled as simple, they may be in // scope of subsequent reachable statements. assert(!isa<DeclStmt>(*S) && "Unexpected DeclStmt!"); - PGO.markStmtMaybeUsed(S); + PGO->markStmtMaybeUsed(S); return; } @@ -917,7 +918,7 @@ void CodeGenFunction::EmitIfStmt(const IfStmt &S) { RunCleanupsScope ExecutedScope(*this); EmitStmt(Executed); } - PGO.markStmtMaybeUsed(Skipped); + PGO->markStmtMaybeUsed(Skipped); return; } } @@ -2265,7 +2266,7 @@ void CodeGenFunction::EmitSwitchStmt(const SwitchStmt &S) { for (unsigned i = 0, e = CaseStmts.size(); i != e; ++i) EmitStmt(CaseStmts[i]); incrementProfileCounter(&S); - PGO.markStmtMaybeUsed(S.getBody()); + PGO->markStmtMaybeUsed(S.getBody()); // Now we want to restore the saved switch instance so that nested // switches continue to function properly @@ -2308,7 +2309,7 @@ void CodeGenFunction::EmitSwitchStmt(const SwitchStmt &S) { llvm::MDNode::get(CGM.getLLVMContext(), Vals)); } - if (PGO.haveRegionCounts()) { + if (PGO->haveRegionCounts()) { // Walk the SwitchCase list to find how many there are. uint64_t DefaultCount = 0; unsigned NumCases = 0; @@ -3329,7 +3330,7 @@ CodeGenFunction::GenerateCapturedStmtFunction(const CapturedStmt &S) { CXXThisValue = EmitLoadOfLValue(ThisLValue, Loc).getScalarVal(); } - PGO.assignRegionCounters(GlobalDecl(CD), F); + PGO->assignRegionCounters(GlobalDecl(CD), F); CapturedStmtInfo->EmitBody(*this, CD->getBody()); FinishFunction(CD->getBodyRBrace()); diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index 89a79a7579e03..7fa6bfa75c350 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -15,6 +15,7 @@ #include "CGOpenMPRuntime.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "CodeGenPGO.h" #include "TargetInfo.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" @@ -710,7 +711,7 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S, (void)LocalScope.Privatize(); for (const auto &VLASizePair : WrapperVLASizes) VLASizeMap[VLASizePair.second.first] = VLASizePair.second.second; - PGO.assignRegionCounters(GlobalDecl(CD), F); + PGO->assignRegionCounters(GlobalDecl(CD), F); CapturedStmtInfo->EmitBody(*this, CD->getBody()); (void)LocalScope.ForceCleanup(); FinishFunction(CD->getBodyRBrace()); diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 4193f0a1b278f..0388c67d0100d 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -80,7 +80,8 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext) Builder(cgm, cgm.getModule().getContext(), llvm::ConstantFolder(), CGBuilderInserterTy(this)), SanOpts(CGM.getLangOpts().Sanitize), CurFPFeatures(CGM.getLangOpts()), - DebugInfo(CGM.getModuleDebugInfo()), PGO(cgm), + DebugInfo(CGM.getModuleDebugInfo()), + PGO(std::make_unique<CodeGenPGO>(cgm)), ShouldEmitLifetimeMarkers( shouldEmitLifetimeMarkers(CGM.getCodeGenOpts(), CGM.getLangOpts())) { if (!suppressNewContext) @@ -1564,7 +1565,7 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn, CurFn->addFnAttr(llvm::Attribute::MustProgress); // Generate the body of the function. - PGO.assignRegionCounters(GD, CurFn); + PGO->assignRegionCounters(GD, CurFn); if (isa<CXXDestructorDecl>(FD)) EmitDestructorBody(Args); else if (isa<CXXConstructorDecl>(FD)) @@ -1650,7 +1651,7 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn, // Emit the standard function epilogue. FinishFunction(BodyRange.getEnd()); - PGO.verifyCounterMap(); + PGO->verifyCounterMap(); // If we haven't marked the function nothrow through other means, do // a quick pass now to see if we can. @@ -1774,7 +1775,7 @@ bool CodeGenFunction::ConstantFoldsToSimpleInteger(const Expr *Cond, if (!AllowLabels && CodeGenFunction::ContainsLabel(Cond)) return false; // Contains a label. - PGO.markStmtMaybeUsed(Cond); + PGO->markStmtMaybeUsed(Cond); ResultInt = Int; return true; } @@ -3355,4 +3356,4 @@ void CodeGenFunction::addInstToNewSourceAtom(llvm::Instruction *KeyInstruction, ApplyAtomGroup Grp(getDebugInfo()); DI->addInstToCurrentSourceAtom(KeyInstruction, Backup); } -} \ No newline at end of file +} diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 92e9ab8156ad2..bdd19f4811b62 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -17,7 +17,6 @@ #include "CGLoopInfo.h" #include "CGValue.h" #include "CodeGenModule.h" -#include "CodeGenPGO.h" #include "EHScopeStack.h" #include "VarBypassDetector.h" #include "clang/AST/CharUnits.h" @@ -90,6 +89,7 @@ class OSLogBufferLayout; namespace CodeGen { class CodeGenTypes; +class CodeGenPGO; class CGCallee; class CGFunctionInfo; class CGBlockInfo; @@ -1670,7 +1670,7 @@ class CodeGenFunction : public CodeGenTypeCache { llvm::Value *emitCondLikelihoodViaExpectIntrinsic(llvm::Value *Cond, Stmt::Likelihood LH); - CodeGenPGO PGO; + std::unique_ptr<CodeGenPGO> PGO; /// Bitmap used by MC/DC to track condition outcomes of a boolean expression. Address MCDCCondBitmapAddr = Address::invalid(); @@ -1683,12 +1683,9 @@ class CodeGenFunction : public CodeGenTypeCache { uint64_t LoopCount) const; public: - auto getIsCounterPair(const Stmt *S) const { return PGO.getIsCounterPair(S); } - - void markStmtAsUsed(bool Skipped, const Stmt *S) { - PGO.markStmtAsUsed(Skipped, S); - } - void markStmtMaybeUsed(const Stmt *S) { PGO.markStmtMaybeUsed(S); } + std::pair<bool, bool> getIsCounterPair(const Stmt *S) const; + void markStmtAsUsed(bool Skipped, const Stmt *S); + void markStmtMaybeUsed(const Stmt *S); /// Increment the profiler's counter for the given statement by \p StepV. /// If \p StepV is null, the default increment is 1. @@ -1702,13 +1699,7 @@ class CodeGenFunction : public CodeGenTypeCache { /// Allocate a temp value on the stack that MCDC can use to track condition /// results. - void maybeCreateMCDCCondBitmap() { - if (isMCDCCoverageEnabled()) { - PGO.emitMCDCParameters(Builder); - MCDCCondBitmapAddr = - CreateIRTemp(getContext().UnsignedIntTy, "mcdc.addr"); - } - } + void maybeCreateMCDCCondBitmap(); bool isBinaryLogicalOp(const Expr *E) const { const BinaryOperator *BOp = dyn_cast<BinaryOperator>(E->IgnoreParens()); @@ -1716,43 +1707,24 @@ class CodeGenFunction : public CodeGenTypeCache { } /// Zero-init the MCDC temp value. - void maybeResetMCDCCondBitmap(const Expr *E) { - if (isMCDCCoverageEnabled() && isBinaryLogicalOp(E)) { - PGO.emitMCDCCondBitmapReset(Builder, E, MCDCCondBitmapAddr); - PGO.setCurrentStmt(E); - } - } + void maybeResetMCDCCondBitmap(const Expr *E); /// Increment the profiler's counter for the given expression by \p StepV. /// If \p StepV is null, the default increment is 1. - void maybeUpdateMCDCTestVectorBitmap(const Expr *E) { - if (isMCDCCoverageEnabled() && isBinaryLogicalOp(E)) { - PGO.emitMCDCTestVectorBitmapUpdate(Builder, E, MCDCCondBitmapAddr, *this); - PGO.setCurrentStmt(E); - } - } + void maybeUpdateMCDCTestVectorBitmap(const Expr *E); /// Update the MCDC temp value with the condition's evaluated result. - void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val) { - if (isMCDCCoverageEnabled()) { - PGO.emitMCDCCondBitmapUpdate(Builder, E, MCDCCondBitmapAddr, Val, *this); - PGO.setCurrentStmt(E); - } - } + void maybeUpdateMCDCCondBitmap(const Expr *E, llvm::Value *Val); /// Get the profiler's count for the given statement. - uint64_t getProfileCount(const Stmt *S) { - return PGO.getStmtCount(S).value_or(0); - } + uint64_t getProfileCount(const Stmt *S); /// Set the profiler's current count. - void setCurrentProfileCount(uint64_t Count) { - PGO.setCurrentRegionCount(Count); - } + void setCurrentProfileCount(uint64_t Count); /// Get the profiler's current count. This is generally the count for the most /// recently incremented counter. - uint64_t getCurrentProfileCount() { return PGO.getCurrentRegionCount(); } + uint64_t getCurrentProfileCount(); /// See CGDebugInfo::addInstToCurrentSourceAtom. void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction, diff --git a/clang/lib/CodeGen/CodeGenPGO.cpp b/clang/lib/CodeGen/CodeGenPGO.cpp index 8197c5f9d37ba..a80bebbb4cf41 100644 --- a/clang/lib/CodeGen/CodeGenPGO.cpp +++ b/clang/lib/CodeGen/CodeGenPGO.cpp @@ -1505,9 +1505,9 @@ CodeGenFunction::createProfileWeights(ArrayRef<uint64_t> Weights) const { llvm::MDNode * CodeGenFunction::createProfileWeightsForLoop(const Stmt *Cond, uint64_t LoopCount) const { - if (!PGO.haveRegionCounts()) + if (!PGO->haveRegionCounts()) return nullptr; - std::optional<uint64_t> CondCount = PGO.getStmtCount(Cond); + std::optional<uint64_t> CondCount = PGO->getStmtCount(Cond); if (!CondCount || *CondCount == 0) return nullptr; return createProfileWeights(LoopCount, @@ -1520,7 +1520,59 @@ void CodeGenFunction::incrementProfileCounter(const Stmt *S, !CurFn->hasFnAttribute(llvm::Attribute::NoProfile) && !CurFn->hasFnAttribute(llvm::Attribute::SkipProfile)) { auto AL = ApplyDebugLocation::CreateArtificial(*this); - PGO.emitCounterSetOrIncrement(Builder, S, StepV); + PGO->emitCounterSetOrIncrement(Builder, S, StepV); } - PGO.setCurrentStmt(S); + PGO->setCurrentStmt(S); +} + +std::pair<bool, bool> CodeGenFunction::getIsCounterPair(const Stmt *S) const { + return PGO->getIsCounterPair(S); +} +void CodeGenFunction::markStmtAsUsed(bool Skipped, const Stmt *S) { + PGO->markStmtAsUsed(Skipped, S); +} +void CodeGenFunction::markStmtMaybeUsed(const Stmt *S) { + PGO->markStmtMaybeUsed(S); +} + +void CodeGenFunction::maybeCreateMCDCCondBitmap() { + if (isMCDCCoverageEnabled()) { + PGO->emitMCDCParameters(Builder); + MCDCCondBitmapAddr = CreateIRTemp(getContext().UnsignedIntTy, "mcdc.addr"); + } +} +void CodeGenFunction::maybeResetMCDCCondBitmap(const Expr *E) { + if (isMCDCCoverageEnabled() && isBinaryLogicalOp(E)) { + PGO->emitMCDCCondBitmapReset(Builder, E, MCDCCondBitmapAddr); + PGO->setCurrentStmt(E); + } +} +void CodeGenFunction::maybeUpdateMCDCTestVectorBitmap(const Expr *E) { + if (isMCDCCoverageEnabled() && isBinaryLogicalOp(E)) { + PGO->emitMCDCTestVectorBitmapUpdate(Builder, E, MCDCCondBitmapAddr, *this); + PGO->setCurrentStmt(E); + } +} + +void CodeGenFunction::maybeUpdateMCDCCondBitmap(const Expr *E, + llvm::Value *Val) { + if (isMCDCCoverageEnabled()) { + PGO->emitMCDCCondBitmapUpdate(Builder, E, MCDCCondBitmapAddr, Val, *this); + PGO->setCurrentStmt(E); + } +} + +uint64_t CodeGenFunction::getProfileCount(const Stmt *S) { + return PGO->getStmtCount(S).value_or(0); +} + +/// Set the profiler's current count. +void CodeGenFunction::setCurrentProfileCount(uint64_t Count) { + PGO->setCurrentRegionCount(Count); +} + +/// Get the profiler's current count. This is generally the count for the most +/// recently incremented counter. +uint64_t CodeGenFunction::getCurrentProfileCount() { + return PGO->getCurrentRegionCount(); } diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 6170dc7f59107..1788bb4f28697 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -12,6 +12,7 @@ #include "CoverageMappingGen.h" #include "CodeGenFunction.h" +#include "CodeGenPGO.h" #include "clang/AST/StmtVisitor.h" #include "clang/Basic/Diagnostic.h" #include "clang/Lex/Lexer.h" diff --git a/clang/lib/CodeGen/Targets/AMDGPU.cpp b/clang/lib/CodeGen/Targets/AMDGPU.cpp index 02314d27abe65..452b2e6858673 100644 --- a/clang/lib/CodeGen/Targets/AMDGPU.cpp +++ b/clang/lib/CodeGen/Targets/AMDGPU.cpp @@ -8,6 +8,7 @@ #include "ABIInfoImpl.h" #include "TargetInfo.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Support/AMDGPUAddrSpace.h" using namespace clang; diff --git a/clang/lib/CodeGen/Targets/MSP430.cpp b/clang/lib/CodeGen/Targets/MSP430.cpp index 8ce70e2111ccf..523165c117502 100644 --- a/clang/lib/CodeGen/Targets/MSP430.cpp +++ b/clang/lib/CodeGen/Targets/MSP430.cpp @@ -8,6 +8,7 @@ #include "ABIInfoImpl.h" #include "TargetInfo.h" +#include "llvm/ADT/StringExtras.h" using namespace clang; using namespace clang::CodeGen; diff --git a/clang/lib/CodeGen/Targets/NVPTX.cpp b/clang/lib/CodeGen/Targets/NVPTX.cpp index 25ab28c54b659..0ceca6192d8ea 100644 --- a/clang/lib/CodeGen/Targets/NVPTX.cpp +++ b/clang/lib/CodeGen/Targets/NVPTX.cpp @@ -9,6 +9,7 @@ #include "ABIInfoImpl.h" #include "TargetInfo.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/IR/CallingConv.h" #include "llvm/IR/IntrinsicsNVPTX.h" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits