003 File Manager
Current Path:
/usr/src/contrib/llvm-project/clang/lib/CodeGen
usr
/
src
/
contrib
/
llvm-project
/
clang
/
lib
/
CodeGen
/
📁
..
📄
ABIInfo.h
(5.01 KB)
📄
Address.h
(3.28 KB)
📄
BackendUtil.cpp
(67.92 KB)
📄
CGAtomic.cpp
(85.95 KB)
📄
CGBlocks.cpp
(111.14 KB)
📄
CGBlocks.h
(8.94 KB)
📄
CGBuilder.h
(13.78 KB)
📄
CGBuiltin.cpp
(695.8 KB)
📄
CGCUDANV.cpp
(35.16 KB)
📄
CGCUDARuntime.cpp
(1.53 KB)
📄
CGCUDARuntime.h
(3.4 KB)
📄
CGCXX.cpp
(11.8 KB)
📄
CGCXXABI.cpp
(12.47 KB)
📄
CGCXXABI.h
(27.9 KB)
📄
CGCall.cpp
(197.3 KB)
📄
CGCall.h
(11.62 KB)
📄
CGClass.cpp
(113.54 KB)
📄
CGCleanup.cpp
(46.97 KB)
📄
CGCleanup.h
(19.28 KB)
📄
CGCoroutine.cpp
(27.82 KB)
📄
CGDebugInfo.cpp
(191.42 KB)
📄
CGDebugInfo.h
(34.73 KB)
📄
CGDecl.cpp
(97.98 KB)
📄
CGDeclCXX.cpp
(34.73 KB)
📄
CGException.cpp
(80.38 KB)
📄
CGExpr.cpp
(209.78 KB)
📄
CGExprAgg.cpp
(77.04 KB)
📄
CGExprCXX.cpp
(90.39 KB)
📄
CGExprComplex.cpp
(44.9 KB)
📄
CGExprConstant.cpp
(86.17 KB)
📄
CGExprScalar.cpp
(196.29 KB)
📄
CGGPUBuiltin.cpp
(6.17 KB)
📄
CGLoopInfo.cpp
(29.17 KB)
📄
CGLoopInfo.h
(10.5 KB)
📄
CGNonTrivialStruct.cpp
(41.4 KB)
📄
CGObjC.cpp
(142.79 KB)
📄
CGObjCGNU.cpp
(168.38 KB)
📄
CGObjCMac.cpp
(304.84 KB)
📄
CGObjCRuntime.cpp
(14.68 KB)
📄
CGObjCRuntime.h
(14.81 KB)
📄
CGOpenCLRuntime.cpp
(7.08 KB)
📄
CGOpenCLRuntime.h
(3.44 KB)
📄
CGOpenMPRuntime.cpp
(501.86 KB)
📄
CGOpenMPRuntime.h
(111.87 KB)
📄
CGOpenMPRuntimeNVPTX.cpp
(215.42 KB)
📄
CGOpenMPRuntimeNVPTX.h
(22.59 KB)
📄
CGRecordLayout.h
(7.84 KB)
📄
CGRecordLayoutBuilder.cpp
(38.24 KB)
📄
CGStmt.cpp
(92.92 KB)
📄
CGStmtOpenMP.cpp
(278.04 KB)
📄
CGVTT.cpp
(6.81 KB)
📄
CGVTables.cpp
(55.02 KB)
📄
CGVTables.h
(6.38 KB)
📄
CGValue.h
(21.24 KB)
📄
CodeGenABITypes.cpp
(5 KB)
📄
CodeGenAction.cpp
(46.2 KB)
📄
CodeGenFunction.cpp
(95.34 KB)
📄
CodeGenFunction.h
(200.94 KB)
📄
CodeGenModule.cpp
(228.13 KB)
📄
CodeGenModule.h
(60.91 KB)
📄
CodeGenPGO.cpp
(36.17 KB)
📄
CodeGenPGO.h
(4.36 KB)
📄
CodeGenTBAA.cpp
(16.92 KB)
📄
CodeGenTBAA.h
(9.19 KB)
📄
CodeGenTypeCache.h
(3.28 KB)
📄
CodeGenTypes.cpp
(32.35 KB)
📄
CodeGenTypes.h
(13.42 KB)
📄
ConstantEmitter.h
(6.65 KB)
📄
ConstantInitBuilder.cpp
(10.29 KB)
📄
CoverageMappingGen.cpp
(54.64 KB)
📄
CoverageMappingGen.h
(4.04 KB)
📄
EHScopeStack.h
(14.38 KB)
📄
ItaniumCXXABI.cpp
(176.66 KB)
📄
MacroPPCallbacks.cpp
(6.41 KB)
📄
MacroPPCallbacks.h
(4.54 KB)
📄
MicrosoftCXXABI.cpp
(175.41 KB)
📄
ModuleBuilder.cpp
(11.79 KB)
📄
ObjectFilePCHContainerOperations.cpp
(12.93 KB)
📄
PatternInit.cpp
(4.1 KB)
📄
PatternInit.h
(722 B)
📄
SanitizerMetadata.cpp
(4.21 KB)
📄
SanitizerMetadata.h
(1.63 KB)
📄
SwiftCallingConv.cpp
(29.76 KB)
📄
TargetInfo.cpp
(403.11 KB)
📄
TargetInfo.h
(15.43 KB)
📄
VarBypassDetector.cpp
(5.1 KB)
📄
VarBypassDetector.h
(2.29 KB)
Editing: ConstantEmitter.h
//===--- ConstantEmitter.h - IR constant emission ---------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // A helper class for emitting expressions and values as llvm::Constants // and as initializers for global variables. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_LIB_CODEGEN_CONSTANTEMITTER_H #define LLVM_CLANG_LIB_CODEGEN_CONSTANTEMITTER_H #include "CodeGenFunction.h" #include "CodeGenModule.h" namespace clang { namespace CodeGen { class ConstantEmitter { public: CodeGenModule &CGM; CodeGenFunction *const CGF; private: bool Abstract = false; /// Whether non-abstract components of the emitter have been initialized. bool InitializedNonAbstract = false; /// Whether the emitter has been finalized. bool Finalized = false; /// Whether the constant-emission failed. bool Failed = false; /// Whether we're in a constant context. bool InConstantContext = false; /// The AST address space where this (non-abstract) initializer is going. /// Used for generating appropriate placeholders. LangAS DestAddressSpace; llvm::SmallVector<std::pair<llvm::Constant *, llvm::GlobalVariable*>, 4> PlaceholderAddresses; public: ConstantEmitter(CodeGenModule &CGM, CodeGenFunction *CGF = nullptr) : CGM(CGM), CGF(CGF) {} /// Initialize this emission in the context of the given function. /// Use this if the expression might contain contextual references like /// block addresses or PredefinedExprs. ConstantEmitter(CodeGenFunction &CGF) : CGM(CGF.CGM), CGF(&CGF) {} ConstantEmitter(const ConstantEmitter &other) = delete; ConstantEmitter &operator=(const ConstantEmitter &other) = delete; ~ConstantEmitter(); /// Is the current emission context abstract? bool isAbstract() const { return Abstract; } /// Try to emit the initiaizer of the given declaration as an abstract /// constant. If this succeeds, the emission must be finalized. llvm::Constant *tryEmitForInitializer(const VarDecl &D); llvm::Constant *tryEmitForInitializer(const Expr *E, LangAS destAddrSpace, QualType destType); llvm::Constant *emitForInitializer(const APValue &value, LangAS destAddrSpace, QualType destType); void finalize(llvm::GlobalVariable *global); // All of the "abstract" emission methods below permit the emission to // be immediately discarded without finalizing anything. Therefore, they // must also promise not to do anything that will, in the future, require // finalization: // // - using the CGF (if present) for anything other than establishing // semantic context; for example, an expression with ignored // side-effects must not be emitted as an abstract expression // // - doing anything that would not be safe to duplicate within an // initializer or to propagate to another context; for example, // side effects, or emitting an initialization that requires a // reference to its current location. /// Try to emit the initializer of the given declaration as an abstract /// constant. llvm::Constant *tryEmitAbstractForInitializer(const VarDecl &D); /// Emit the result of the given expression as an abstract constant, /// asserting that it succeeded. This is only safe to do when the /// expression is known to be a constant expression with either a fairly /// simple type or a known simple form. llvm::Constant *emitAbstract(const Expr *E, QualType T); llvm::Constant *emitAbstract(SourceLocation loc, const APValue &value, QualType T); /// Try to emit the result of the given expression as an abstract constant. llvm::Constant *tryEmitAbstract(const Expr *E, QualType T); llvm::Constant *tryEmitAbstractForMemory(const Expr *E, QualType T); llvm::Constant *tryEmitAbstract(const APValue &value, QualType T); llvm::Constant *tryEmitAbstractForMemory(const APValue &value, QualType T); llvm::Constant *tryEmitConstantExpr(const ConstantExpr *CE); llvm::Constant *emitNullForMemory(QualType T) { return emitNullForMemory(CGM, T); } llvm::Constant *emitForMemory(llvm::Constant *C, QualType T) { return emitForMemory(CGM, C, T); } static llvm::Constant *emitNullForMemory(CodeGenModule &CGM, QualType T); static llvm::Constant *emitForMemory(CodeGenModule &CGM, llvm::Constant *C, QualType T); // These are private helper routines of the constant emitter that // can't actually be private because things are split out into helper // functions and classes. llvm::Constant *tryEmitPrivateForVarInit(const VarDecl &D); llvm::Constant *tryEmitPrivate(const Expr *E, QualType T); llvm::Constant *tryEmitPrivateForMemory(const Expr *E, QualType T); llvm::Constant *tryEmitPrivate(const APValue &value, QualType T); llvm::Constant *tryEmitPrivateForMemory(const APValue &value, QualType T); /// Get the address of the current location. This is a constant /// that will resolve, after finalization, to the address of the /// 'signal' value that is registered with the emitter later. llvm::GlobalValue *getCurrentAddrPrivate(); /// Register a 'signal' value with the emitter to inform it where to /// resolve a placeholder. The signal value must be unique in the /// initializer; it might, for example, be the address of a global that /// refers to the current-address value in its own initializer. /// /// Uses of the placeholder must be properly anchored before finalizing /// the emitter, e.g. by being installed as the initializer of a global /// variable. That is, it must be possible to replaceAllUsesWith /// the placeholder with the proper address of the signal. void registerCurrentAddrPrivate(llvm::Constant *signal, llvm::GlobalValue *placeholder); private: void initializeNonAbstract(LangAS destAS) { assert(!InitializedNonAbstract); InitializedNonAbstract = true; DestAddressSpace = destAS; } llvm::Constant *markIfFailed(llvm::Constant *init) { if (!init) Failed = true; return init; } struct AbstractState { bool OldValue; size_t OldPlaceholdersSize; }; AbstractState pushAbstract() { AbstractState saved = { Abstract, PlaceholderAddresses.size() }; Abstract = true; return saved; } llvm::Constant *validateAndPopAbstract(llvm::Constant *C, AbstractState save); }; } } #endif
Upload File
Create Folder