|
clang 23.0.0git
|
#include "CGDebugInfo.h"#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"#include "clang/AST/Stmt.h"#include "clang/AST/StmtVisitor.h"#include "clang/Basic/Builtins.h"#include "clang/Basic/DiagnosticSema.h"#include "clang/Basic/PrettyStackTrace.h"#include "clang/Basic/SourceManager.h"#include "clang/Basic/TargetInfo.h"#include "llvm/ADT/ArrayRef.h"#include "llvm/ADT/DenseMap.h"#include "llvm/ADT/SmallSet.h"#include "llvm/ADT/StringExtras.h"#include "llvm/IR/Assumptions.h"#include "llvm/IR/DataLayout.h"#include "llvm/IR/InlineAsm.h"#include "llvm/IR/Intrinsics.h"#include "llvm/IR/MDBuilder.h"#include "llvm/Support/SaveAndRestore.h"#include <optional>#include "clang/AST/StmtNodes.inc"Go to the source code of this file.
Namespaces | |
| namespace | llvm |
| Diagnostic wrappers for TextAPI types for error reporting. | |
Macros | |
| #define | STMT(Type, Base) |
| #define | ABSTRACT_STMT(Op) |
| #define | EXPR(Type, Base) |
Enumerations | |
| enum | CSFC_Result { CSFC_Failure , CSFC_FallThrough , CSFC_Success } |
| CollectStatementsForCase - Given the body of a 'switch' statement and a constant value that is being switched on, see if we can dead code eliminate the body of the switch to a simple series of statements to emit. More... | |
Functions | |
| template<typename LoopStmt> | |
| static bool | hasEmptyLoopBody (const LoopStmt &S) |
| static bool | isSwiftAsyncCallee (const CallExpr *CE) |
| Determine if the given call uses the swiftasync calling convention. | |
| static CSFC_Result | CollectStatementsForCase (const Stmt *S, const SwitchCase *Case, bool &FoundCase, SmallVectorImpl< const Stmt * > &ResultStmts) |
| static bool | FindCaseStatementsForValue (const SwitchStmt &S, const llvm::APSInt &ConstantCondValue, SmallVectorImpl< const Stmt * > &ResultStmts, ASTContext &C, const SwitchCase *&ResultCase) |
| FindCaseStatementsForValue - Find the case statement being jumped to and then invoke CollectStatementsForCase to find the list of statements to emit for a switch on constant. | |
| static std::optional< SmallVector< uint64_t, 16 > > | getLikelihoodWeights (ArrayRef< Stmt::Likelihood > Likelihoods) |
| static llvm::MDNode * | getAsmSrcLocInfo (const StringLiteral *Str, CodeGenFunction &CGF) |
| getAsmSrcLocInfo - Return the !srcloc metadata node to attach to an inline asm call instruction. | |
| static void | UpdateAsmCallInst (llvm::CallBase &Result, bool HasSideEffect, bool HasUnwindClobber, bool ReadOnly, bool ReadNone, bool NoMerge, bool NoConvergent, const AsmStmt &S, const std::vector< llvm::Type * > &ResultRegTypes, const std::vector< llvm::Type * > &ArgElemTypes, CodeGenFunction &CGF, std::vector< llvm::Value * > &RegResults) |
| static void | EmitAsmStores (CodeGenFunction &CGF, const AsmStmt &S, const llvm::ArrayRef< llvm::Value * > RegResults, const llvm::ArrayRef< llvm::Type * > ResultRegTypes, const llvm::ArrayRef< llvm::Type * > ResultTruncRegTypes, const llvm::ArrayRef< LValue > ResultRegDests, const llvm::ArrayRef< QualType > ResultRegQualTys, const llvm::BitVector &ResultTypeRequiresCast, const std::vector< std::optional< std::pair< unsigned, unsigned > > > &ResultBounds) |
| static void | EmitHipStdParUnsupportedAsm (CodeGenFunction *CGF, const AsmStmt &S) |
| static llvm::ConvergenceControlInst * | getConvergenceToken (llvm::BasicBlock *BB) |
| #define ABSTRACT_STMT | ( | Op | ) |
| #define EXPR | ( | Type, | |
| Base ) |
| #define STMT | ( | Type, | |
| Base ) |
| enum CSFC_Result |
CollectStatementsForCase - Given the body of a 'switch' statement and a constant value that is being switched on, see if we can dead code eliminate the body of the switch to a simple series of statements to emit.
Basically, on a switch (5) we want to find these statements: case 5: printf(...); <– ++i; <– break;
and add them to the ResultStmts vector. If it is unsafe to do this transformation (for example, one of the elided statements contains a label that might be jumped to), return CSFC_Failure. If we handled it and 'S' should include statements after it (e.g. the printf() line is a substmt of the case) then return CSFC_FallThrough. If we handled it and found a break statement, then return CSFC_Success.
If Case is non-null, then we are looking for the specified case, checking that nothing we jump over contains labels. If Case is null, then we found the case and are looking for the break.
If the recursive walk actually finds our Case, then we set FoundCase to true.
| Enumerator | |
|---|---|
| CSFC_Failure | |
| CSFC_FallThrough | |
| CSFC_Success | |
Definition at line 2111 of file CGStmt.cpp.
|
static |
Definition at line 2112 of file CGStmt.cpp.
References CollectStatementsForCase(), clang::CodeGen::CodeGenFunction::containsBreak(), clang::CodeGen::CodeGenFunction::ContainsLabel(), CSFC_Failure, CSFC_FallThrough, CSFC_Success, clang::isa(), and clang::CodeGen::CodeGenFunction::mightAddDeclToScope().
Referenced by CollectStatementsForCase(), and FindCaseStatementsForValue().
|
static |
Definition at line 2714 of file CGStmt.cpp.
References clang::CodeGen::CodeGenFunction::addInstToCurrentSourceAtom(), clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::EmitStoreThroughLValue(), clang::CodeGen::RValue::get(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenModule::getDataLayout(), clang::CodeGen::CodeGenFunction::getDebugInfo(), clang::CodeGen::CodeGenModule::getDiags(), clang::Expr::getExprLoc(), clang::CodeGen::CodeGenModule::getIntrinsic(), clang::ASTContext::getIntTypeForBitwidth(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::AsmStmt::getOutputExpr(), clang::CodeGen::CodeGenFunction::getTargetHooks(), clang::ASTContext::getTypeSize(), clang::QualType::isNull(), clang::CodeGen::TargetCodeGenInfo::isScalarizableAsmOperand(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), and clang::DiagnosticsEngine::Report().
Referenced by clang::CodeGen::CodeGenFunction::EmitAsmStmt().
|
static |
Definition at line 2804 of file CGStmt.cpp.
References clang::Asm, clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenModule::getLLVMContext(), and clang::CodeGen::CodeGenModule::getModule().
Referenced by clang::CodeGen::CodeGenFunction::EmitAsmStmt().
|
static |
FindCaseStatementsForValue - Find the case statement being jumped to and then invoke CollectStatementsForCase to find the list of statements to emit for a switch on constant.
See the comment above CollectStatementsForCase for more details.
Definition at line 2267 of file CGStmt.cpp.
References clang::C, clang::cast(), CollectStatementsForCase(), clang::CodeGen::CodeGenFunction::ContainsLabel(), CSFC_Failure, clang::Expr::EvaluateKnownConstInt(), clang::SwitchStmt::getBody(), clang::CaseStmt::getLHS(), clang::SwitchCase::getNextSwitchCase(), clang::CaseStmt::getRHS(), and clang::SwitchStmt::getSwitchCaseList().
Referenced by clang::CodeGen::CodeGenFunction::EmitSwitchStmt().
|
static |
getAsmSrcLocInfo - Return the !srcloc metadata node to attach to an inline asm call instruction.
The !srcloc MDNode contains a list of constant integers which are the source locations of the start of each line in the asm.
Definition at line 2619 of file CGStmt.cpp.
References clang::CodeGen::CodeGenFunction::CGM, clang::StringLiteral::getBeginLoc(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::StringLiteral::getLocationOfByte(), clang::SourceLocation::getRawEncoding(), clang::ASTContext::getSourceManager(), clang::StringLiteral::getString(), clang::CodeGen::CodeGenFunction::getTarget(), clang::CodeGen::CodeGenTypeCache::Int64Ty, and SM.
Referenced by UpdateAsmCallInst().
|
static |
Definition at line 3410 of file CGStmt.cpp.
|
static |
Definition at line 2321 of file CGStmt.cpp.
References clang::Stmt::LH_Likely, clang::Stmt::LH_None, clang::Stmt::LH_Unlikely, and clang::None.
Referenced by clang::CodeGen::CodeGenFunction::EmitSwitchStmt().
|
static |
Definition at line 1066 of file CGStmt.cpp.
References clang::isa().
Referenced by clang::CodeGen::CodeGenFunction::EmitDoStmt(), clang::CodeGen::CodeGenFunction::EmitForStmt(), and clang::CodeGen::CodeGenFunction::EmitWhileStmt().
Determine if the given call uses the swiftasync calling convention.
Definition at line 1591 of file CGStmt.cpp.
References clang::Type::castAs(), clang::CC_SwiftAsync, clang::FunctionType::getCallConv(), clang::CallExpr::getCallee(), clang::Type::getPointeeType(), and clang::Expr::getType().
Referenced by clang::CodeGen::CodeGenFunction::EmitReturnStmt().
|
static |
Definition at line 2646 of file CGStmt.cpp.
References clang::CodeGen::CodeGenFunction::addInstToNewSourceAtom(), clang::LangOptions::assumeFunctionsAreConvergent(), clang::CodeGen::CodeGenFunction::Builder, clang::AsmStmt::getAsmLoc(), getAsmSrcLocInfo(), clang::CodeGen::CodeGenFunction::getLangOpts(), clang::CodeGen::CodeGenFunction::getLLVMContext(), clang::SourceLocation::getRawEncoding(), and clang::CodeGen::CodeGenTypeCache::Int64Ty.
Referenced by clang::CodeGen::CodeGenFunction::EmitAsmStmt().