mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[opaque pointer type] Explicit pointee type for GEPOperator/GEPConstantExpr.
Also a couple of other changes to avoid use of PointerType::getElementType here & there too. llvm-svn: 236799
This commit is contained in:
parent
9792622ab9
commit
e23b8a68b9
@ -400,10 +400,7 @@ public:
|
||||
return getPointerOperand()->getType();
|
||||
}
|
||||
|
||||
Type *getSourceElementType() const {
|
||||
return cast<SequentialType>(getPointerOperandType()->getScalarType())
|
||||
->getElementType();
|
||||
}
|
||||
Type *getSourceElementType() const;
|
||||
|
||||
/// Method to return the address space of the pointer operand.
|
||||
unsigned getPointerAddressSpace() const {
|
||||
|
@ -3523,10 +3523,12 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr))
|
||||
return Error("Invalid record");
|
||||
|
||||
if (Ty &&
|
||||
Ty !=
|
||||
cast<SequentialType>(BasePtr->getType()->getScalarType())
|
||||
->getElementType())
|
||||
if (!Ty)
|
||||
Ty = cast<SequentialType>(BasePtr->getType()->getScalarType())
|
||||
->getElementType();
|
||||
else if (Ty !=
|
||||
cast<SequentialType>(BasePtr->getType()->getScalarType())
|
||||
->getElementType())
|
||||
return Error(
|
||||
"Explicit gep type does not match pointee type of pointer operand");
|
||||
|
||||
|
@ -34,6 +34,7 @@ add_llvm_library(LLVMCore
|
||||
Metadata.cpp
|
||||
MetadataTracking.cpp
|
||||
Module.cpp
|
||||
Operator.cpp
|
||||
Pass.cpp
|
||||
PassManager.cpp
|
||||
PassRegistry.cpp
|
||||
|
@ -2050,7 +2050,8 @@ Constant *ConstantExpr::getGetElementPtr(Type *Ty, Constant *C,
|
||||
ArgVec.push_back(cast<Constant>(Idxs[i]));
|
||||
}
|
||||
const ConstantExprKeyType Key(Instruction::GetElementPtr, ArgVec, 0,
|
||||
InBounds ? GEPOperator::IsInBounds : 0);
|
||||
InBounds ? GEPOperator::IsInBounds : 0, None,
|
||||
Ty);
|
||||
|
||||
LLVMContextImpl *pImpl = C->getContext().pImpl;
|
||||
return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
|
||||
@ -2380,19 +2381,22 @@ const char *ConstantExpr::getOpcodeName() const {
|
||||
return Instruction::getOpcodeName(getOpcode());
|
||||
}
|
||||
|
||||
|
||||
|
||||
GetElementPtrConstantExpr::
|
||||
GetElementPtrConstantExpr(Constant *C, ArrayRef<Constant*> IdxList,
|
||||
Type *DestTy)
|
||||
: ConstantExpr(DestTy, Instruction::GetElementPtr,
|
||||
OperandTraits<GetElementPtrConstantExpr>::op_end(this)
|
||||
- (IdxList.size()+1), IdxList.size()+1) {
|
||||
GetElementPtrConstantExpr::GetElementPtrConstantExpr(
|
||||
Type *SrcElementTy, Constant *C, ArrayRef<Constant *> IdxList, Type *DestTy)
|
||||
: ConstantExpr(DestTy, Instruction::GetElementPtr,
|
||||
OperandTraits<GetElementPtrConstantExpr>::op_end(this) -
|
||||
(IdxList.size() + 1),
|
||||
IdxList.size() + 1),
|
||||
SrcElementTy(SrcElementTy) {
|
||||
OperandList[0] = C;
|
||||
for (unsigned i = 0, E = IdxList.size(); i != E; ++i)
|
||||
OperandList[i+1] = IdxList[i];
|
||||
}
|
||||
|
||||
Type *GetElementPtrConstantExpr::getSourceElementType() const {
|
||||
return SrcElementTy;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ConstantData* implementations
|
||||
|
||||
|
@ -211,19 +211,29 @@ public:
|
||||
/// GetElementPtrConstantExpr - This class is private to Constants.cpp, and is
|
||||
/// used behind the scenes to implement getelementpr constant exprs.
|
||||
class GetElementPtrConstantExpr : public ConstantExpr {
|
||||
Type *SrcElementTy;
|
||||
void anchor() override;
|
||||
GetElementPtrConstantExpr(Constant *C, ArrayRef<Constant*> IdxList,
|
||||
Type *DestTy);
|
||||
GetElementPtrConstantExpr(Type *SrcElementTy, Constant *C,
|
||||
ArrayRef<Constant *> IdxList, Type *DestTy);
|
||||
|
||||
public:
|
||||
static GetElementPtrConstantExpr *Create(Constant *C,
|
||||
ArrayRef<Constant*> IdxList,
|
||||
Type *DestTy,
|
||||
unsigned Flags) {
|
||||
GetElementPtrConstantExpr *Result =
|
||||
new(IdxList.size() + 1) GetElementPtrConstantExpr(C, IdxList, DestTy);
|
||||
return Create(
|
||||
cast<PointerType>(C->getType()->getScalarType())->getElementType(), C,
|
||||
IdxList, DestTy, Flags);
|
||||
}
|
||||
static GetElementPtrConstantExpr *Create(Type *SrcElementTy, Constant *C,
|
||||
ArrayRef<Constant *> IdxList,
|
||||
Type *DestTy, unsigned Flags) {
|
||||
GetElementPtrConstantExpr *Result = new (IdxList.size() + 1)
|
||||
GetElementPtrConstantExpr(SrcElementTy, C, IdxList, DestTy);
|
||||
Result->SubclassOptionalData = Flags;
|
||||
return Result;
|
||||
}
|
||||
Type *getSourceElementType() const;
|
||||
/// Transparently provide more efficient getOperand methods.
|
||||
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
|
||||
};
|
||||
@ -420,13 +430,16 @@ struct ConstantExprKeyType {
|
||||
uint16_t SubclassData;
|
||||
ArrayRef<Constant *> Ops;
|
||||
ArrayRef<unsigned> Indexes;
|
||||
Type *ExplicitTy;
|
||||
|
||||
ConstantExprKeyType(unsigned Opcode, ArrayRef<Constant *> Ops,
|
||||
unsigned short SubclassData = 0,
|
||||
unsigned short SubclassOptionalData = 0,
|
||||
ArrayRef<unsigned> Indexes = None)
|
||||
ArrayRef<unsigned> Indexes = None,
|
||||
Type *ExplicitTy = nullptr)
|
||||
: Opcode(Opcode), SubclassOptionalData(SubclassOptionalData),
|
||||
SubclassData(SubclassData), Ops(Ops), Indexes(Indexes) {}
|
||||
SubclassData(SubclassData), Ops(Ops), Indexes(Indexes),
|
||||
ExplicitTy(ExplicitTy) {}
|
||||
ConstantExprKeyType(ArrayRef<Constant *> Operands, const ConstantExpr *CE)
|
||||
: Opcode(CE->getOpcode()),
|
||||
SubclassOptionalData(CE->getRawSubclassOptionalData()),
|
||||
@ -497,8 +510,11 @@ struct ConstantExprKeyType {
|
||||
case Instruction::ExtractValue:
|
||||
return new ExtractValueConstantExpr(Ops[0], Indexes, Ty);
|
||||
case Instruction::GetElementPtr:
|
||||
return GetElementPtrConstantExpr::Create(Ops[0], Ops.slice(1), Ty,
|
||||
SubclassOptionalData);
|
||||
return GetElementPtrConstantExpr::Create(
|
||||
ExplicitTy ? ExplicitTy
|
||||
: cast<PointerType>(Ops[0]->getType()->getScalarType())
|
||||
->getElementType(),
|
||||
Ops[0], Ops.slice(1), Ty, SubclassOptionalData);
|
||||
case Instruction::ICmp:
|
||||
return new CompareConstantExpr(Ty, Instruction::ICmp, SubclassData,
|
||||
Ops[0], Ops[1]);
|
||||
|
13
lib/IR/Operator.cpp
Normal file
13
lib/IR/Operator.cpp
Normal file
@ -0,0 +1,13 @@
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
|
||||
#include "ConstantsContext.h"
|
||||
|
||||
namespace llvm {
|
||||
Type *GEPOperator::getSourceElementType() const {
|
||||
if (auto *I = dyn_cast<GetElementPtrInst>(this))
|
||||
return I->getSourceElementType();
|
||||
return cast<GetElementPtrConstantExpr>(this)->getSourceElementType();
|
||||
}
|
||||
}
|
@ -437,7 +437,7 @@ void Verifier::visitGlobalValue(const GlobalValue &GV) {
|
||||
|
||||
if (GV.hasAppendingLinkage()) {
|
||||
const GlobalVariable *GVar = dyn_cast<GlobalVariable>(&GV);
|
||||
Assert(GVar && GVar->getType()->getElementType()->isArrayTy(),
|
||||
Assert(GVar && GVar->getValueType()->isArrayTy(),
|
||||
"Only global arrays can have appending linkage!", GVar);
|
||||
}
|
||||
}
|
||||
@ -469,7 +469,7 @@ void Verifier::visitGlobalVariable(const GlobalVariable &GV) {
|
||||
"invalid linkage for intrinsic global variable", &GV);
|
||||
// Don't worry about emitting an error for it not being an array,
|
||||
// visitGlobalValue will complain on appending non-array.
|
||||
if (ArrayType *ATy = dyn_cast<ArrayType>(GV.getType()->getElementType())) {
|
||||
if (ArrayType *ATy = dyn_cast<ArrayType>(GV.getValueType())) {
|
||||
StructType *STy = dyn_cast<StructType>(ATy->getElementType());
|
||||
PointerType *FuncPtrTy =
|
||||
FunctionType::get(Type::getVoidTy(*Context), false)->getPointerTo();
|
||||
|
Loading…
Reference in New Issue
Block a user