diff options
author | Owen Anderson <resistor@mac.com> | 2009-08-04 22:41:48 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-08-04 22:41:48 +0000 |
commit | 48b2f3e4850cd27d54224cd42da8a160d6b95984 (patch) | |
tree | 4a9d1fe3a0e3feacea1d637131b754943e0939f1 | |
parent | 57035994f7329d63582365df278826dbbac5b046 (diff) |
Factor some of the constants+context related code out into a separate header, to make LLVMContextImpl.h
not hideous. Also, fix some MSVC compile errors.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78115 91177308-0d34-0410-b5e6-96231b3b80d8
38 files changed, 56 insertions, 834 deletions
diff --git a/include/llvm/Analysis/ConstantFolding.h b/include/llvm/Analysis/ConstantFolding.h index 3e393ff691..3293d263a0 100644 --- a/include/llvm/Analysis/ConstantFolding.h +++ b/include/llvm/Analysis/ConstantFolding.h @@ -22,7 +22,7 @@ namespace llvm { class TargetData; class Function; class Type; - class LLVMContext; + struct LLVMContext; /// ConstantFoldInstruction - Attempt to constant fold the specified /// instruction. If successful, the constant result is returned, if not, null diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h index 5e24a57cfe..53934d8e9a 100644 --- a/include/llvm/Analysis/DebugInfo.h +++ b/include/llvm/Analysis/DebugInfo.h @@ -40,7 +40,7 @@ namespace llvm { class DebugLoc; struct DebugLocTracker; class Instruction; - class LLVMContext; + struct LLVMContext; class DIDescriptor { protected: diff --git a/include/llvm/Analysis/ScalarEvolution.h b/include/llvm/Analysis/ScalarEvolution.h index 739f06bfc8..1a648df5db 100644 --- a/include/llvm/Analysis/ScalarEvolution.h +++ b/include/llvm/Analysis/ScalarEvolution.h @@ -40,7 +40,7 @@ namespace llvm { class Type; class ScalarEvolution; class TargetData; - class LLVMContext; + struct LLVMContext; class Loop; class LoopInfo; class Operator; diff --git a/include/llvm/Analysis/SparsePropagation.h b/include/llvm/Analysis/SparsePropagation.h index 638008d78c..877823303f 100644 --- a/include/llvm/Analysis/SparsePropagation.h +++ b/include/llvm/Analysis/SparsePropagation.h @@ -31,7 +31,7 @@ namespace llvm { class BasicBlock; class Function; class SparseSolver; - class LLVMContext; + struct LLVMContext; template<typename T> class SmallVectorImpl; diff --git a/include/llvm/Analysis/ValueTracking.h b/include/llvm/Analysis/ValueTracking.h index 1ebd9c26c4..fa46921b59 100644 --- a/include/llvm/Analysis/ValueTracking.h +++ b/include/llvm/Analysis/ValueTracking.h @@ -23,7 +23,7 @@ namespace llvm { class Instruction; class APInt; class TargetData; - class LLVMContext; + struct LLVMContext; /// ComputeMaskedBits - Determine which of the bits specified in Mask are /// known to be either zero or one and return them in the KnownZero/KnownOne diff --git a/include/llvm/Assembly/Parser.h b/include/llvm/Assembly/Parser.h index 966abaaa20..6ab43825c8 100644 --- a/include/llvm/Assembly/Parser.h +++ b/include/llvm/Assembly/Parser.h @@ -21,7 +21,7 @@ namespace llvm { class Module; class SMDiagnostic; class raw_ostream; -class LLVMContext; +struct LLVMContext; /// This function is the main interface to the LLVM Assembly Parser. It parses /// an ASCII file that (presumably) contains LLVM Assembly code. It returns a diff --git a/include/llvm/BasicBlock.h b/include/llvm/BasicBlock.h index eabc1a0d2b..cc5c8355db 100644 --- a/include/llvm/BasicBlock.h +++ b/include/llvm/BasicBlock.h @@ -22,7 +22,7 @@ namespace llvm { class TerminatorInst; -class LLVMContext; +struct LLVMContext; template<> struct ilist_traits<Instruction> : public SymbolTableListTraits<Instruction, BasicBlock> { diff --git a/include/llvm/Bitcode/Archive.h b/include/llvm/Bitcode/Archive.h index 13583c0d5e..8a1d3125ee 100644 --- a/include/llvm/Bitcode/Archive.h +++ b/include/llvm/Bitcode/Archive.h @@ -32,7 +32,7 @@ class ModuleProvider; // From VMCore class Module; // From VMCore class Archive; // Declared below class ArchiveMemberHeader; // Internal implementation class -class LLVMContext; // Global data +struct LLVMContext; // Global data /// This class is the main class manipulated by users of the Archive class. It /// holds information about one member of the Archive. It is also the element diff --git a/include/llvm/Bitcode/ReaderWriter.h b/include/llvm/Bitcode/ReaderWriter.h index 3d33d75a06..9890f29307 100644 --- a/include/llvm/Bitcode/ReaderWriter.h +++ b/include/llvm/Bitcode/ReaderWriter.h @@ -23,7 +23,7 @@ namespace llvm { class MemoryBuffer; class ModulePass; class BitstreamWriter; - class LLVMContext; + struct LLVMContext; class raw_ostream; /// getBitcodeModuleProvider - Read the header of the specified bitcode buffer diff --git a/include/llvm/CodeGen/ValueTypes.h b/include/llvm/CodeGen/ValueTypes.h index 5069f9e00a..7ba657205e 100644 --- a/include/llvm/CodeGen/ValueTypes.h +++ b/include/llvm/CodeGen/ValueTypes.h @@ -23,7 +23,7 @@ namespace llvm { class Type; - class LLVMContext; + struct LLVMContext; struct MVT { // MVT = Machine Value Type public: diff --git a/include/llvm/Constant.h b/include/llvm/Constant.h index a42c7d4371..9c4365febe 100644 --- a/include/llvm/Constant.h +++ b/include/llvm/Constant.h @@ -20,7 +20,7 @@ namespace llvm { class APInt; template<typename T> class SmallVectorImpl; - class LLVMContext; + struct LLVMContext; /// This is an important base class in LLVM. It provides the common facilities /// of all constant values in an LLVM program. A constant is a value that is diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index f6989fae62..0785492335 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -231,7 +231,7 @@ class ConstantFP : public Constant { APFloat Val; void *operator new(size_t, unsigned);// DO NOT IMPLEMENT ConstantFP(const ConstantFP &); // DO NOT IMPLEMENT - friend class LLVMContextImpl; + friend struct LLVMContextImpl; protected: ConstantFP(const Type *Ty, const APFloat& V); protected: diff --git a/include/llvm/Debugger/Debugger.h b/include/llvm/Debugger/Debugger.h index 42de35660c..69b13c8a18 100644 --- a/include/llvm/Debugger/Debugger.h +++ b/include/llvm/Debugger/Debugger.h @@ -20,7 +20,7 @@ namespace llvm { class Module; class InferiorProcess; - class LLVMContext; + struct LLVMContext; /// Debugger class - This class implements the LLVM source-level debugger. /// This allows clients to handle the user IO processing without having to diff --git a/include/llvm/Function.h b/include/llvm/Function.h index 90d9b0ee46..7eec336c3b 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -26,7 +26,7 @@ namespace llvm { class FunctionType; -class LLVMContext; +struct LLVMContext; // Traits for intrusive list of basic blocks... template<> struct ilist_traits<BasicBlock> diff --git a/include/llvm/GlobalVariable.h b/include/llvm/GlobalVariable.h index f18554d53b..7855befb93 100644 --- a/include/llvm/GlobalVariable.h +++ b/include/llvm/GlobalVariable.h @@ -28,7 +28,7 @@ namespace llvm { class Module; class Constant; -class LLVMContext; +struct LLVMContext; template<typename ValueSubClass, typename ItemParentClass> class SymbolTableListTraits; diff --git a/include/llvm/InstrTypes.h b/include/llvm/InstrTypes.h index ddb6ad377d..550849bc8a 100644 --- a/include/llvm/InstrTypes.h +++ b/include/llvm/InstrTypes.h @@ -22,7 +22,7 @@ namespace llvm { -class LLVMContext; +struct LLVMContext; //===----------------------------------------------------------------------===// // TerminatorInst Class diff --git a/include/llvm/Instruction.h b/include/llvm/Instruction.h index 924b19554a..3ce1745d1a 100644 --- a/include/llvm/Instruction.h +++ b/include/llvm/Instruction.h @@ -20,7 +20,7 @@ namespace llvm { -class LLVMContext; +struct LLVMContext; template<typename ValueSubClass, typename ItemParentClass> class SymbolTableListTraits; diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h index ad5a4a9d3e..afae6291e8 100644 --- a/include/llvm/Instructions.h +++ b/include/llvm/Instructions.h @@ -29,7 +29,7 @@ namespace llvm { class ConstantInt; class ConstantRange; class APInt; -class LLVMContext; +struct LLVMContext; //===----------------------------------------------------------------------===// // AllocationInst Class diff --git a/include/llvm/Intrinsics.h b/include/llvm/Intrinsics.h index f2d6ef32cb..0b99204bb1 100644 --- a/include/llvm/Intrinsics.h +++ b/include/llvm/Intrinsics.h @@ -23,7 +23,7 @@ namespace llvm { class Type; class FunctionType; class Function; -class LLVMContext; +struct LLVMContext; class Module; class AttrListPtr; diff --git a/include/llvm/LLVMContext.h b/include/llvm/LLVMContext.h index f5be3bbd8b..0aea6b8922 100644 --- a/include/llvm/LLVMContext.h +++ b/include/llvm/LLVMContext.h @@ -34,7 +34,7 @@ class ConstantStruct; class ConstantVector; class FunctionType; class IntegerType; -class LLVMContextImpl; +struct LLVMContextImpl; class MDNode; class MDString; class OpaqueType; diff --git a/include/llvm/Linker.h b/include/llvm/Linker.h index 2f3d374082..43db5961d4 100644 --- a/include/llvm/Linker.h +++ b/include/llvm/Linker.h @@ -21,7 +21,7 @@ namespace llvm { class Module; -class LLVMContext; +struct LLVMContext; /// This class provides the core functionality of linking in LLVM. It retains a /// Module object which is the composite of the modules and libraries linked diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index d0f3477e72..d383fc4357 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -27,7 +27,7 @@ namespace llvm { class Constant; -class LLVMContext; +struct LLVMContext; //===----------------------------------------------------------------------===// // MetadataBase - A base class for MDNode, MDString and NamedMDNode. @@ -206,7 +206,7 @@ template<typename ValueSubClass, typename ItemParentClass> class NamedMDNode : public MetadataBase, public ilist_node<NamedMDNode> { friend class SymbolTableListTraits<NamedMDNode, Module>; - friend class LLVMContextImpl; + friend struct LLVMContextImpl; NamedMDNode(const NamedMDNode &); // DO NOT IMPLEMENT void *operator new(size_t, unsigned); // DO NOT IMPLEMENT diff --git a/include/llvm/Module.h b/include/llvm/Module.h index 8b0c104a2b..f816561254 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -26,7 +26,7 @@ namespace llvm { class GlobalValueRefMap; // Used by ConstantVals.cpp class FunctionType; -class LLVMContext; +struct LLVMContext; template<> struct ilist_traits<Function> : public SymbolTableListTraits<Function, Module> { diff --git a/include/llvm/Support/TargetFolder.h b/include/llvm/Support/TargetFolder.h index 93c50269fa..cdcc4a8ad5 100644 --- a/include/llvm/Support/TargetFolder.h +++ b/include/llvm/Support/TargetFolder.h @@ -25,7 +25,7 @@ namespace llvm { class TargetData; -class LLVMContext; +struct LLVMContext; /// TargetFolder - Create constants with target dependent folding. class TargetFolder { diff --git a/include/llvm/Transforms/Utils/Cloning.h b/include/llvm/Transforms/Utils/Cloning.h index 66cac9fea4..b709edfac1 100644 --- a/include/llvm/Transforms/Utils/Cloning.h +++ b/include/llvm/Transforms/Utils/Cloning.h @@ -38,7 +38,7 @@ class CallGraph; class TargetData; class Loop; class LoopInfo; -class LLVMContext; +struct LLVMContext; /// CloneModule - Return an exact copy of the specified module /// diff --git a/include/llvm/Transforms/Utils/Local.h b/include/llvm/Transforms/Utils/Local.h index 32e7ae81b1..db5793166c 100644 --- a/include/llvm/Transforms/Utils/Local.h +++ b/include/llvm/Transforms/Utils/Local.h @@ -27,7 +27,7 @@ class PHINode; class AllocaInst; class ConstantExpr; class TargetData; -class LLVMContext; +struct LLVMContext; struct DbgInfoIntrinsic; template<typename T> class SmallVectorImpl; diff --git a/include/llvm/Transforms/Utils/PromoteMemToReg.h b/include/llvm/Transforms/Utils/PromoteMemToReg.h index 71a077e862..3dba38ee26 100644 --- a/include/llvm/Transforms/Utils/PromoteMemToReg.h +++ b/include/llvm/Transforms/Utils/PromoteMemToReg.h @@ -23,7 +23,7 @@ class AllocaInst; class DominatorTree; class DominanceFrontier; class AliasSetTracker; -class LLVMContext; +struct LLVMContext; /// isAllocaPromotable - Return true if this alloca is legal for promotion. /// This is true if there are only loads and stores to the alloca... diff --git a/include/llvm/Transforms/Utils/ValueMapper.h b/include/llvm/Transforms/Utils/ValueMapper.h index d31edab5b5..ed3ea2bdc4 100644 --- a/include/llvm/Transforms/Utils/ValueMapper.h +++ b/include/llvm/Transforms/Utils/ValueMapper.h @@ -20,7 +20,7 @@ namespace llvm { class Value; class Instruction; - class LLVMContext; + struct LLVMContext; typedef DenseMap<const Value *, Value *> ValueMapTy; Value *MapValue(const Value *V, ValueMapTy &VM, LLVMContext &Context); diff --git a/include/llvm/Value.h b/include/llvm/Value.h index a7f8774e03..83a523233b 100644 --- a/include/llvm/Value.h +++ b/include/llvm/Value.h @@ -42,7 +42,7 @@ typedef StringMapEntry<AssertingVH<> > ValueName; class raw_ostream; class AssemblyAnnotationWriter; class ValueHandleBase; -class LLVMContext; +struct LLVMContext; //===----------------------------------------------------------------------===// // Value Class diff --git a/lib/Archive/ArchiveInternals.h b/lib/Archive/ArchiveInternals.h index d187ed91d7..98f9c896c5 100644 --- a/lib/Archive/ArchiveInternals.h +++ b/lib/Archive/ArchiveInternals.h @@ -31,7 +31,7 @@ namespace llvm { - class LLVMContext; + struct LLVMContext; /// The ArchiveMemberHeader structure is used internally for bitcode /// archives. diff --git a/lib/AsmParser/LLLexer.h b/lib/AsmParser/LLLexer.h index de39272f45..667ab2c2ed 100644 --- a/lib/AsmParser/LLLexer.h +++ b/lib/AsmParser/LLLexer.h @@ -24,7 +24,7 @@ namespace llvm { class MemoryBuffer; class Type; class SMDiagnostic; - class LLVMContext; + struct LLVMContext; class LLLexer { const char *CurPtr; diff --git a/lib/Bitcode/Reader/BitcodeReader.h b/lib/Bitcode/Reader/BitcodeReader.h index bd048885a6..a1f91133ea 100644 --- a/lib/Bitcode/Reader/BitcodeReader.h +++ b/lib/Bitcode/Reader/BitcodeReader.h @@ -26,7 +26,7 @@ namespace llvm { class MemoryBuffer; - class LLVMContext; + struct LLVMContext; //===----------------------------------------------------------------------===// // BitcodeReaderValueList Class diff --git a/lib/VMCore/ConstantFold.h b/lib/VMCore/ConstantFold.h index afa9978767..c70a04b7fc 100644 --- a/lib/VMCore/ConstantFold.h +++ b/lib/VMCore/ConstantFold.h @@ -23,7 +23,7 @@ namespace llvm { class Value; class Constant; class Type; - class LLVMContext; + struct LLVMContext; // Constant fold various types of instruction... Constant *ConstantFoldCastInstruction( diff --git a/lib/VMCore/LLVMContext.cpp b/lib/VMCore/LLVMContext.cpp index 3cd715866e..22882711a0 100644 --- a/lib/VMCore/LLVMContext.cpp +++ b/lib/VMCore/LLVMContext.cpp @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// // // This file implements LLVMContext, as a wrapper around the opaque -// class LLVMContextImpl. +// struct LLVMContextImpl. // //===----------------------------------------------------------------------===// @@ -29,5 +29,18 @@ LLVMContext& llvm::getGlobalContext() { return *GlobalContext; } -LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) { } +LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl()) { } LLVMContext::~LLVMContext() { delete pImpl; } + +GetElementPtrConstantExpr::GetElementPtrConstantExpr + (Constant *C, + const std::vector<Constant*> &IdxList, + const Type *DestTy) + : ConstantExpr(DestTy, Instruction::GetElementPtr, + OperandTraits<GetElementPtrConstantExpr>::op_end(this) + - (IdxList.size()+1), + IdxList.size()+1) { + OperandList[0] = C; + for (unsigned i = 0, E = IdxList.size(); i != E; ++i) + OperandList[i+1] = IdxList[i]; +} diff --git a/lib/VMCore/LLVMContextImpl.cpp b/lib/VMCore/LLVMContextImpl.cpp deleted file mode 100644 index 83c9b7daf4..0000000000 --- a/lib/VMCore/LLVMContextImpl.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//===--------------- LLVMContextImpl.cpp - Implementation ------*- C++ -*--===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements LLVMContextImpl, the opaque implementation -// of LLVMContext. -// -//===----------------------------------------------------------------------===// - -#include "LLVMContextImpl.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/LLVMContext.h" -#include "llvm/Metadata.h" -using namespace llvm; - -LLVMContextImpl::LLVMContextImpl(LLVMContext &C) : - Context(C), TheTrueVal(0), TheFalseVal(0) { } - -GetElementPtrConstantExpr::GetElementPtrConstantExpr - (Constant *C, - const std::vector<Constant*> &IdxList, - const Type *DestTy) - : ConstantExpr(DestTy, Instruction::GetElementPtr, - OperandTraits<GetElementPtrConstantExpr>::op_end(this) - - (IdxList.size()+1), - IdxList.size()+1) { - OperandList[0] = C; - for (unsigned i = 0, E = IdxList.size(); i != E; ++i) - OperandList[i+1] = IdxList[i]; -}
\ No newline at end of file diff --git a/lib/VMCore/LLVMContextImpl.h b/lib/VMCore/LLVMContextImpl.h index d7ad74fa1a..5a3056ad8f 100644 --- a/lib/VMCore/LLVMContextImpl.h +++ b/lib/VMCore/LLVMContextImpl.h @@ -15,776 +15,25 @@ #ifndef LLVM_LLVMCONTEXT_IMPL_H #define LLVM_LLVMCONTEXT_IMPL_H +#include "ConstantsContext.h" #include "llvm/LLVMContext.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" -#include "llvm/Instructions.h" -#include "llvm/Operator.h" -#include "llvm/Support/Debug.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/System/Mutex.h" #include "llvm/System/RWMutex.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/StringMap.h" -#include <map> #include <vector> namespace llvm { -template<class ValType> -struct ConstantTraits; - - -/// UnaryConstantExpr - This class is private to Constants.cpp, and is used -/// behind the scenes to implement unary constant exprs. -class UnaryConstantExpr : public ConstantExpr { - void *operator new(size_t, unsigned); // DO NOT IMPLEMENT -public: - // allocate space for exactly one operand - void *operator new(size_t s) { - return User::operator new(s, 1); - } - UnaryConstantExpr(unsigned Opcode, Constant *C, const Type *Ty) - : ConstantExpr(Ty, Opcode, &Op<0>(), 1) { - Op<0>() = C; - } - DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); -}; - -/// BinaryConstantExpr - This class is private to Constants.cpp, and is used -/// behind the scenes to implement binary constant exprs. -class BinaryConstantExpr : public ConstantExpr { - void *operator new(size_t, unsigned); // DO NOT IMPLEMENT -public: - // allocate space for exactly two operands - void *operator new(size_t s) { - return User::operator new(s, 2); - } - BinaryConstantExpr(unsigned Opcode, Constant *C1, Constant *C2) - : ConstantExpr(C1->getType(), Opcode, &Op<0>(), 2) { - Op<0>() = C1; - Op<1>() = C2; - } - /// Transparently provide more efficient getOperand methods. - DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); -}; - -/// SelectConstantExpr - This class is private to Constants.cpp, and is used -/// behind the scenes to implement select constant exprs. -class SelectConstantExpr : public ConstantExpr { - void *operator new(size_t, unsigned); // DO NOT IMPLEMENT -public: - // allocate space for exactly three operands - void *operator new(size_t s) { - return User::operator new(s, 3); - } - SelectConstantExpr(Constant *C1, Constant *C2, Constant *C3) - : ConstantExpr(C2->getType(), Instruction::Select, &Op<0>(), 3) { - Op<0>() = C1; - Op<1>() = C2; - Op<2>() = C3; - } - /// Transparently provide more efficient getOperand methods. - DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); -}; - -/// ExtractElementConstantExpr - This class is private to -/// Constants.cpp, and is used behind the scenes to implement -/// extractelement constant exprs. -class ExtractElementConstantExpr : public ConstantExpr { - void *operator new(size_t, unsigned); // DO NOT IMPLEMENT -public: - // allocate space for exactly two operands - void *operator new(size_t s) { - return User::operator new(s, 2); - } - ExtractElementConstantExpr(Constant *C1, Constant *C2) - : ConstantExpr(cast<VectorType>(C1->getType())->getElementType(), - Instruction::ExtractElement, &Op<0>(), 2) { - Op<0>() = C1; - Op<1>() = C2; - } - /// Transparently provide more efficient getOperand methods. - DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); -}; - -/// InsertElementConstantExpr - This class is private to -/// Constants.cpp, and is used behind the scenes to implement -/// insertelement constant exprs. -class InsertElementConstantExpr : public ConstantExpr { - void *operator new(size_t, unsigned); // DO NOT IMPLEMENT -public: - // allocate space for exactly three operands - void *operator new(size_t s) { - return User::operator new(s, 3); - } - InsertElementConstantExpr(Constant *C1, Constant *C2, Constant *C3) - : ConstantExpr(C1->getType(), Instruction::InsertElement, - &Op<0>(), 3) { - Op<0>() = C1; - Op<1>() = C2; - Op<2>() = C3; - } - /// Transparently provide more efficient getOperand methods. - DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); -}; - -/// ShuffleVectorConstantExpr - This class is private to -/// Constants.cpp, and is used behind the scenes to implement -/// shufflevector constant exprs. -class ShuffleVectorConstantExpr : public ConstantExpr { - void *operator new(size_t, unsigned); // DO NOT IMPLEMENT -public: - // allocate space for exactly three operands - void *operator new(size_t s) { - return User::operator new(s, 3); - } - ShuffleVectorConstantExpr(Constant *C1, Constant *C2, Constant *C3) - : ConstantExpr(VectorType::get( - cast<VectorType>(C1->getType())->getElementType(), - cast<VectorType>(C3->getType())->getNumElements()), - Instruction::ShuffleVector, - &Op<0>(), 3) { - Op<0>() = C1; - Op<1>() = C2; - Op<2>() = C3; - } - /// Transparently provide more efficient getOperand met |