Introduce and use convenience methods for getting pointer types

where the element is of a basic builtin type.  For example, to get
an i8* use getInt8PtrTy.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83379 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands
2009-10-06 15:40:36 +00:00
parent 6e214805b1
commit ac53a0b272
25 changed files with 121 additions and 66 deletions

View File

@ -381,6 +381,21 @@ public:
static const IntegerType *getInt32Ty(LLVMContext &C); static const IntegerType *getInt32Ty(LLVMContext &C);
static const IntegerType *getInt64Ty(LLVMContext &C); static const IntegerType *getInt64Ty(LLVMContext &C);
//===--------------------------------------------------------------------===//
// Convenience methods for getting pointer types with one of the above builtin
// types as pointee.
//
static const PointerType *getFloatPtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getDoublePtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getX86_FP80PtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getFP128PtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getPPC_FP128PtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getInt1PtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getInt8PtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getInt16PtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getInt32PtrTy(LLVMContext &C, unsigned AS = 0);
static const PointerType *getInt64PtrTy(LLVMContext &C, unsigned AS = 0);
/// Methods for support type inquiry through isa, cast, and dyn_cast: /// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const Type *) { return true; } static inline bool classof(const Type *) { return true; }

View File

@ -48,7 +48,7 @@ void PointerTracking::getAnalysisUsage(AnalysisUsage &AU) const {
} }
bool PointerTracking::doInitialization(Module &M) { bool PointerTracking::doInitialization(Module &M) {
const Type *PTy = PointerType::getUnqual(Type::getInt8Ty(M.getContext())); const Type *PTy = Type::getInt8PtrTy(M.getContext());
// Find calloc(i64, i64) or calloc(i32, i32). // Find calloc(i64, i64) or calloc(i32, i32).
callocFunc = M.getFunction("calloc"); callocFunc = M.getFunction("calloc");

View File

@ -464,7 +464,7 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin,
if (!AnyNonZeroIndices) { if (!AnyNonZeroIndices) {
// Cast the base to i8*. // Cast the base to i8*.
V = InsertNoopCastOfTo(V, V = InsertNoopCastOfTo(V,
Type::getInt8Ty(Ty->getContext())->getPointerTo(PTy->getAddressSpace())); Type::getInt8PtrTy(Ty->getContext(), PTy->getAddressSpace()));
// Expand the operands for a plain byte offset. // Expand the operands for a plain byte offset.
Value *Idx = expandCodeFor(SE.getAddExpr(Ops), Ty); Value *Idx = expandCodeFor(SE.getAddExpr(Ops), Ty);

View File

@ -236,7 +236,7 @@ bool DwarfEHPrepare::LowerUnwinds() {
if (!RewindFunction) { if (!RewindFunction) {
LLVMContext &Ctx = UnwindInsts[0]->getContext(); LLVMContext &Ctx = UnwindInsts[0]->getContext();
std::vector<const Type*> std::vector<const Type*>
Params(1, PointerType::getUnqual(Type::getInt8Ty(Ctx))); Params(1, Type::getInt8PtrTy(Ctx));
FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx), FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx),
Params, false); Params, false);
const char *RewindName = TLI->getLibcallName(RTLIB::UNWIND_RESUME); const char *RewindName = TLI->getLibcallName(RTLIB::UNWIND_RESUME);

View File

@ -103,22 +103,22 @@ void IntrinsicLowering::AddPrototypes(Module &M) {
break; break;
case Intrinsic::memcpy: case Intrinsic::memcpy:
M.getOrInsertFunction("memcpy", M.getOrInsertFunction("memcpy",
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
TD.getIntPtrType(Context), (Type *)0); TD.getIntPtrType(Context), (Type *)0);
break; break;
case Intrinsic::memmove: case Intrinsic::memmove:
M.getOrInsertFunction("memmove", M.getOrInsertFunction("memmove",
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
TD.getIntPtrType(Context), (Type *)0); TD.getIntPtrType(Context), (Type *)0);
break; break;
case Intrinsic::memset: case Intrinsic::memset:
M.getOrInsertFunction("memset", M.getOrInsertFunction("memset",
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
PointerType::getUnqual(Type::getInt8Ty(Context)), Type::getInt8PtrTy(Context),
Type::getInt32Ty(M.getContext()), Type::getInt32Ty(M.getContext()),
TD.getIntPtrType(Context), (Type *)0); TD.getIntPtrType(Context), (Type *)0);
break; break;

View File

@ -44,7 +44,7 @@ static const char *const PSVNames[] = {
// static. For now, we can safely use the global context for the time being to // static. For now, we can safely use the global context for the time being to
// squeak by. // squeak by.
PseudoSourceValue::PseudoSourceValue() : PseudoSourceValue::PseudoSourceValue() :
Value(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext())), Value(Type::getInt8PtrTy(getGlobalContext()),
PseudoSourceValueVal) {} PseudoSourceValueVal) {}
void PseudoSourceValue::printCustom(raw_ostream &O) const { void PseudoSourceValue::printCustom(raw_ostream &O) const {

View File

@ -189,7 +189,7 @@ ShadowStackGC::ShadowStackGC() : Head(0), StackEntryTy(0) {
Constant *ShadowStackGC::GetFrameMap(Function &F) { Constant *ShadowStackGC::GetFrameMap(Function &F) {
// doInitialization creates the abstract type of this value. // doInitialization creates the abstract type of this value.
Type *VoidPtr = PointerType::getUnqual(Type::getInt8Ty(F.getContext())); const Type *VoidPtr = Type::getInt8PtrTy(F.getContext());
// Truncate the ShadowStackDescriptor if some metadata is null. // Truncate the ShadowStackDescriptor if some metadata is null.
unsigned NumMeta = 0; unsigned NumMeta = 0;

View File

@ -88,7 +88,7 @@ bool SjLjEHPass::doInitialization(Module &M) {
// Build the function context structure. // Build the function context structure.
// builtin_setjmp uses a five word jbuf // builtin_setjmp uses a five word jbuf
const Type *VoidPtrTy = const Type *VoidPtrTy =
PointerType::getUnqual(Type::getInt8Ty(M.getContext())); Type::getInt8PtrTy(M.getContext());
const Type *Int32Ty = Type::getInt32Ty(M.getContext()); const Type *Int32Ty = Type::getInt32Ty(M.getContext());
FunctionContextTy = FunctionContextTy =
StructType::get(M.getContext(), StructType::get(M.getContext(),
@ -378,7 +378,7 @@ bool SjLjEHPass::insertSjLjEHSupport(Function &F) {
// the instruction hasn't already been removed. // the instruction hasn't already been removed.
if (!I->getParent()) continue; if (!I->getParent()) continue;
Value *Val = new LoadInst(ExceptionAddr, "exception", true, I); Value *Val = new LoadInst(ExceptionAddr, "exception", true, I);
Type *Ty = PointerType::getUnqual(Type::getInt8Ty(F.getContext())); const Type *Ty = Type::getInt8PtrTy(F.getContext());
Val = CastInst::Create(Instruction::IntToPtr, Val, Ty, "", I); Val = CastInst::Create(Instruction::IntToPtr, Val, Ty, "", I);
I->replaceAllUsesWith(Val); I->replaceAllUsesWith(Val);
@ -455,8 +455,8 @@ bool SjLjEHPass::insertSjLjEHSupport(Function &F) {
// Call the setjmp instrinsic. It fills in the rest of the jmpbuf // Call the setjmp instrinsic. It fills in the rest of the jmpbuf
Value *SetjmpArg = Value *SetjmpArg =
CastInst::Create(Instruction::BitCast, FieldPtr, CastInst::Create(Instruction::BitCast, FieldPtr,
Type::getInt8Ty(F.getContext())->getPointerTo(), "", Type::getInt8PtrTy(F.getContext()), "",
EntryBB->getTerminator()); EntryBB->getTerminator());
Value *DispatchVal = CallInst::Create(BuiltinSetjmpFn, SetjmpArg, Value *DispatchVal = CallInst::Create(BuiltinSetjmpFn, SetjmpArg,
"dispatch", "dispatch",
EntryBB->getTerminator()); EntryBB->getTerminator());

View File

@ -243,7 +243,7 @@ static void *CreateArgv(LLVMContext &C, ExecutionEngine *EE,
char *Result = new char[(InputArgv.size()+1)*PtrSize]; char *Result = new char[(InputArgv.size()+1)*PtrSize];
DEBUG(errs() << "JIT: ARGV = " << (void*)Result << "\n"); DEBUG(errs() << "JIT: ARGV = " << (void*)Result << "\n");
const Type *SBytePtr = PointerType::getUnqual(Type::getInt8Ty(C)); const Type *SBytePtr = Type::getInt8PtrTy(C);
for (unsigned i = 0; i != InputArgv.size(); ++i) { for (unsigned i = 0; i != InputArgv.size(); ++i) {
unsigned Size = InputArgv[i].size()+1; unsigned Size = InputArgv[i].size()+1;

View File

@ -102,7 +102,7 @@ namespace {
{ {
std::vector<Constant *> AUGs; std::vector<Constant *> AUGs;
const Type *SBP= const Type *SBP=
PointerType::getUnqual(Type::getInt8Ty(M.getContext())); Type::getInt8PtrTy(M.getContext());
for (std::vector<GlobalValue*>::iterator GI = Named.begin(), for (std::vector<GlobalValue*>::iterator GI = Named.begin(),
GE = Named.end(); GI != GE; ++GI) { GE = Named.end(); GI != GE; ++GI) {
(*GI)->setLinkage(GlobalValue::ExternalLinkage); (*GI)->setLinkage(GlobalValue::ExternalLinkage);

View File

@ -201,7 +201,7 @@ bool LowerSetJmp::runOnModule(Module& M) {
// This function is always successful, unless it isn't. // This function is always successful, unless it isn't.
bool LowerSetJmp::doInitialization(Module& M) bool LowerSetJmp::doInitialization(Module& M)
{ {
const Type *SBPTy = PointerType::getUnqual(Type::getInt8Ty(M.getContext())); const Type *SBPTy = Type::getInt8PtrTy(M.getContext());
const Type *SBPPTy = PointerType::getUnqual(SBPTy); const Type *SBPPTy = PointerType::getUnqual(SBPTy);
// N.B. See llvm/runtime/GCCLibraries/libexception/SJLJ-Exception.h for // N.B. See llvm/runtime/GCCLibraries/libexception/SJLJ-Exception.h for
@ -266,7 +266,7 @@ bool LowerSetJmp::IsTransformableFunction(const std::string& Name) {
void LowerSetJmp::TransformLongJmpCall(CallInst* Inst) void LowerSetJmp::TransformLongJmpCall(CallInst* Inst)
{ {
const Type* SBPTy = const Type* SBPTy =
PointerType::getUnqual(Type::getInt8Ty(Inst->getContext())); Type::getInt8PtrTy(Inst->getContext());
// Create the call to "__llvm_sjljeh_throw_longjmp". This takes the // Create the call to "__llvm_sjljeh_throw_longjmp". This takes the
// same parameters as "longjmp", except that the buffer is cast to a // same parameters as "longjmp", except that the buffer is cast to a
@ -319,7 +319,7 @@ AllocaInst* LowerSetJmp::GetSetJmpMap(Function* Func)
// Fill in the alloca and call to initialize the SJ map. // Fill in the alloca and call to initialize the SJ map.
const Type *SBPTy = const Type *SBPTy =
PointerType::getUnqual(Type::getInt8Ty(Func->getContext())); Type::getInt8PtrTy(Func->getContext());
AllocaInst* Map = new AllocaInst(SBPTy, 0, "SJMap", Inst); AllocaInst* Map = new AllocaInst(SBPTy, 0, "SJMap", Inst);
CallInst::Create(InitSJMap, Map, "", Inst); CallInst::Create(InitSJMap, Map, "", Inst);
return SJMap[Func] = Map; return SJMap[Func] = Map;
@ -389,7 +389,7 @@ void LowerSetJmp::TransformSetJmpCall(CallInst* Inst)
// Add this setjmp to the setjmp map. // Add this setjmp to the setjmp map.
const Type* SBPTy = const Type* SBPTy =
PointerType::getUnqual(Type::getInt8Ty(Inst->getContext())); Type::getInt8PtrTy(Inst->getContext());
CastInst* BufPtr = CastInst* BufPtr =
new BitCastInst(Inst->getOperand(1), SBPTy, "SBJmpBuf", Inst); new BitCastInst(Inst->getOperand(1), SBPTy, "SBJmpBuf", Inst);
std::vector<Value*> Args = std::vector<Value*> Args =

View File

@ -77,7 +77,7 @@ void RaiseAllocations::doInitialization(Module &M) {
// Get the expected prototype for malloc // Get the expected prototype for malloc
const FunctionType *Malloc1Type = const FunctionType *Malloc1Type =
FunctionType::get(PointerType::getUnqual(Type::getInt8Ty(M.getContext())), FunctionType::get(Type::getInt8PtrTy(M.getContext()),
std::vector<const Type*>(1, std::vector<const Type*>(1,
Type::getInt64Ty(M.getContext())), false); Type::getInt64Ty(M.getContext())), false);
@ -229,7 +229,7 @@ bool RaiseAllocations::runOnModule(Module &M) {
Value *Source = *CS.arg_begin(); Value *Source = *CS.arg_begin();
if (!isa<PointerType>(Source->getType())) if (!isa<PointerType>(Source->getType()))
Source = new IntToPtrInst(Source, Source = new IntToPtrInst(Source,
PointerType::getUnqual(Type::getInt8Ty(M.getContext())), Type::getInt8PtrTy(M.getContext()),
"FreePtrCast", I); "FreePtrCast", I);
new FreeInst(Source, I); new FreeInst(Source, I);

View File

@ -25,9 +25,9 @@ void llvm::InsertProfilingInitCall(Function *MainFn, const char *FnName,
GlobalValue *Array) { GlobalValue *Array) {
LLVMContext &Context = MainFn->getContext(); LLVMContext &Context = MainFn->getContext();
const Type *ArgVTy = const Type *ArgVTy =
PointerType::getUnqual(PointerType::getUnqual(Type::getInt8Ty(Context))); PointerType::getUnqual(Type::getInt8PtrTy(Context));
const PointerType *UIntPtr = const PointerType *UIntPtr =
PointerType::getUnqual(Type::getInt32Ty(Context)); Type::getInt32PtrTy(Context);
Module &M = *MainFn->getParent(); Module &M = *MainFn->getParent();
Constant *InitFn = M.getOrInsertFunction(FnName, Type::getInt32Ty(Context), Constant *InitFn = M.getOrInsertFunction(FnName, Type::getInt32Ty(Context),
Type::getInt32Ty(Context), Type::getInt32Ty(Context),

View File

@ -9947,7 +9947,7 @@ Instruction *InstCombiner::visitCallSite(CallSite CS) {
// If the call and callee calling conventions don't match, this call must // If the call and callee calling conventions don't match, this call must
// be unreachable, as the call is undefined. // be unreachable, as the call is undefined.
new StoreInst(ConstantInt::getTrue(*Context), new StoreInst(ConstantInt::getTrue(*Context),
UndefValue::get(PointerType::getUnqual(Type::getInt1Ty(*Context))), UndefValue::get(Type::getInt1PtrTy(*Context)),
OldCall); OldCall);
if (!OldCall->use_empty()) if (!OldCall->use_empty())
OldCall->replaceAllUsesWith(UndefValue::get(OldCall->getType())); OldCall->replaceAllUsesWith(UndefValue::get(OldCall->getType()));
@ -9961,7 +9961,7 @@ Instruction *InstCombiner::visitCallSite(CallSite CS) {
// undef so that we know that this code is not reachable, despite the fact // undef so that we know that this code is not reachable, despite the fact
// that we can't modify the CFG here. // that we can't modify the CFG here.
new StoreInst(ConstantInt::getTrue(*Context), new StoreInst(ConstantInt::getTrue(*Context),
UndefValue::get(PointerType::getUnqual(Type::getInt1Ty(*Context))), UndefValue::get(Type::getInt1PtrTy(*Context)),
CS.getInstruction()); CS.getInstruction());
if (!CS.getInstruction()->use_empty()) if (!CS.getInstruction()->use_empty())
@ -11235,7 +11235,7 @@ Instruction *InstCombiner::visitFreeInst(FreeInst &FI) {
if (isa<UndefValue>(Op)) { if (isa<UndefValue>(Op)) {
// Insert a new store to null because we cannot modify the CFG here. // Insert a new store to null because we cannot modify the CFG here.
new StoreInst(ConstantInt::getTrue(*Context), new StoreInst(ConstantInt::getTrue(*Context),
UndefValue::get(PointerType::getUnqual(Type::getInt1Ty(*Context))), &FI); UndefValue::get(Type::getInt1PtrTy(*Context)), &FI);
return EraseInstFromFunction(FI); return EraseInstFromFunction(FI);
} }

View File

@ -443,7 +443,7 @@ bool MemCpyOpt::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {
StartPtr = Range.StartPtr; StartPtr = Range.StartPtr;
// Cast the start ptr to be i8* as memset requires. // Cast the start ptr to be i8* as memset requires.
const Type *i8Ptr = PointerType::getUnqual(Type::getInt8Ty(Context)); const Type *i8Ptr = Type::getInt8PtrTy(Context);
if (StartPtr->getType() != i8Ptr) if (StartPtr->getType() != i8Ptr)
StartPtr = new BitCastInst(StartPtr, i8Ptr, StartPtr->getName(), StartPtr = new BitCastInst(StartPtr, i8Ptr, StartPtr->getName(),
InsertPt); InsertPt);

View File

@ -124,7 +124,7 @@ public:
/// CastToCStr - Return V if it is an i8*, otherwise cast it to i8*. /// CastToCStr - Return V if it is an i8*, otherwise cast it to i8*.
Value *LibCallOptimization::CastToCStr(Value *V, IRBuilder<> &B) { Value *LibCallOptimization::CastToCStr(Value *V, IRBuilder<> &B) {
return return
B.CreateBitCast(V, PointerType::getUnqual(Type::getInt8Ty(*Context)), "cstr"); B.CreateBitCast(V, Type::getInt8PtrTy(*Context), "cstr");
} }
/// EmitStrLen - Emit a call to the strlen function to the builder, for the /// EmitStrLen - Emit a call to the strlen function to the builder, for the
@ -138,7 +138,7 @@ Value *LibCallOptimization::EmitStrLen(Value *Ptr, IRBuilder<> &B) {
Constant *StrLen =M->getOrInsertFunction("strlen", AttrListPtr::get(AWI, 2), Constant *StrLen =M->getOrInsertFunction("strlen", AttrListPtr::get(AWI, 2),
TD->getIntPtrType(*Context), TD->getIntPtrType(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
NULL); NULL);
CallInst *CI = B.CreateCall(StrLen, CastToCStr(Ptr, B), "strlen"); CallInst *CI = B.CreateCall(StrLen, CastToCStr(Ptr, B), "strlen");
if (const Function *F = dyn_cast<Function>(StrLen->stripPointerCasts())) if (const Function *F = dyn_cast<Function>(StrLen->stripPointerCasts()))
@ -169,8 +169,8 @@ Value *LibCallOptimization::EmitMemChr(Value *Ptr, Value *Val,
AWI = AttributeWithIndex::get(~0u, Attribute::ReadOnly | Attribute::NoUnwind); AWI = AttributeWithIndex::get(~0u, Attribute::ReadOnly | Attribute::NoUnwind);
Value *MemChr = M->getOrInsertFunction("memchr", AttrListPtr::get(&AWI, 1), Value *MemChr = M->getOrInsertFunction("memchr", AttrListPtr::get(&AWI, 1),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
Type::getInt32Ty(*Context), TD->getIntPtrType(*Context), Type::getInt32Ty(*Context), TD->getIntPtrType(*Context),
NULL); NULL);
CallInst *CI = B.CreateCall3(MemChr, CastToCStr(Ptr, B), Val, Len, "memchr"); CallInst *CI = B.CreateCall3(MemChr, CastToCStr(Ptr, B), Val, Len, "memchr");
@ -193,8 +193,8 @@ Value *LibCallOptimization::EmitMemCmp(Value *Ptr1, Value *Ptr2,
Value *MemCmp = M->getOrInsertFunction("memcmp", AttrListPtr::get(AWI, 3), Value *MemCmp = M->getOrInsertFunction("memcmp", AttrListPtr::get(AWI, 3),
Type::getInt32Ty(*Context), Type::getInt32Ty(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
TD->getIntPtrType(*Context), NULL); TD->getIntPtrType(*Context), NULL);
CallInst *CI = B.CreateCall3(MemCmp, CastToCStr(Ptr1, B), CastToCStr(Ptr2, B), CallInst *CI = B.CreateCall3(MemCmp, CastToCStr(Ptr1, B), CastToCStr(Ptr2, B),
Len, "memcmp"); Len, "memcmp");
@ -273,7 +273,7 @@ void LibCallOptimization::EmitPutS(Value *Str, IRBuilder<> &B) {
Value *PutS = M->getOrInsertFunction("puts", AttrListPtr::get(AWI, 2), Value *PutS = M->getOrInsertFunction("puts", AttrListPtr::get(AWI, 2),
Type::getInt32Ty(*Context), Type::getInt32Ty(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
NULL); NULL);
CallInst *CI = B.CreateCall(PutS, CastToCStr(Str, B), "puts"); CallInst *CI = B.CreateCall(PutS, CastToCStr(Str, B), "puts");
if (const Function *F = dyn_cast<Function>(PutS->stripPointerCasts())) if (const Function *F = dyn_cast<Function>(PutS->stripPointerCasts()))
@ -313,11 +313,11 @@ void LibCallOptimization::EmitFPutS(Value *Str, Value *File, IRBuilder<> &B) {
Constant *F; Constant *F;
if (isa<PointerType>(File->getType())) if (isa<PointerType>(File->getType()))
F = M->getOrInsertFunction("fputs", AttrListPtr::get(AWI, 3), Type::getInt32Ty(*Context), F = M->getOrInsertFunction("fputs", AttrListPtr::get(AWI, 3), Type::getInt32Ty(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
File->getType(), NULL); File->getType(), NULL);
else else
F = M->getOrInsertFunction("fputs", Type::getInt32Ty(*Context), F = M->getOrInsertFunction("fputs", Type::getInt32Ty(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
File->getType(), NULL); File->getType(), NULL);
CallInst *CI = B.CreateCall2(F, CastToCStr(Str, B), File, "fputs"); CallInst *CI = B.CreateCall2(F, CastToCStr(Str, B), File, "fputs");
@ -338,12 +338,12 @@ void LibCallOptimization::EmitFWrite(Value *Ptr, Value *Size, Value *File,
if (isa<PointerType>(File->getType())) if (isa<PointerType>(File->getType()))
F = M->getOrInsertFunction("fwrite", AttrListPtr::get(AWI, 3), F = M->getOrInsertFunction("fwrite", AttrListPtr::get(AWI, 3),
TD->getIntPtrType(*Context), TD->getIntPtrType(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
TD->getIntPtrType(*Context), TD->getIntPtrType(*Context), TD->getIntPtrType(*Context), TD->getIntPtrType(*Context),
File->getType(), NULL); File->getType(), NULL);
else else
F = M->getOrInsertFunction("fwrite", TD->getIntPtrType(*Context), F = M->getOrInsertFunction("fwrite", TD->getIntPtrType(*Context),
PointerType::getUnqual(Type::getInt8Ty(*Context)), Type::getInt8PtrTy(*Context),
TD->getIntPtrType(*Context), TD->getIntPtrType(*Context), TD->getIntPtrType(*Context), TD->getIntPtrType(*Context),
File->getType(), NULL); File->getType(), NULL);
CallInst *CI = B.CreateCall4(F, CastToCStr(Ptr, B), Size, CallInst *CI = B.CreateCall4(F, CastToCStr(Ptr, B), Size,
@ -510,7 +510,7 @@ struct StrCatOpt : public LibCallOptimization {
// Verify the "strcat" function prototype. // Verify the "strcat" function prototype.
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 2 || if (FT->getNumParams() != 2 ||
FT->getReturnType() != PointerType::getUnqual(Type::getInt8Ty(*Context)) || FT->getReturnType() != Type::getInt8PtrTy(*Context) ||
FT->getParamType(0) != FT->getReturnType() || FT->getParamType(0) != FT->getReturnType() ||
FT->getParamType(1) != FT->getReturnType()) FT->getParamType(1) != FT->getReturnType())
return 0; return 0;
@ -560,7 +560,7 @@ struct StrNCatOpt : public StrCatOpt {
// Verify the "strncat" function prototype. // Verify the "strncat" function prototype.
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 3 || if (FT->getNumParams() != 3 ||
FT->getReturnType() != PointerType::getUnqual(Type::getInt8Ty(*Context)) || FT->getReturnType() != Type::getInt8PtrTy(*Context) ||
FT->getParamType(0) != FT->getReturnType() || FT->getParamType(0) != FT->getReturnType() ||
FT->getParamType(1) != FT->getReturnType() || FT->getParamType(1) != FT->getReturnType() ||
!isa<IntegerType>(FT->getParamType(2))) !isa<IntegerType>(FT->getParamType(2)))
@ -608,7 +608,7 @@ struct StrChrOpt : public LibCallOptimization {
// Verify the "strchr" function prototype. // Verify the "strchr" function prototype.
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 2 || if (FT->getNumParams() != 2 ||
FT->getReturnType() != PointerType::getUnqual(Type::getInt8Ty(*Context)) || FT->getReturnType() != Type::getInt8PtrTy(*Context) ||
FT->getParamType(0) != FT->getReturnType()) FT->getParamType(0) != FT->getReturnType())
return 0; return 0;
@ -666,7 +666,7 @@ struct StrCmpOpt : public LibCallOptimization {
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 2 || FT->getReturnType() != Type::getInt32Ty(*Context) || if (FT->getNumParams() != 2 || FT->getReturnType() != Type::getInt32Ty(*Context) ||
FT->getParamType(0) != FT->getParamType(1) || FT->getParamType(0) != FT->getParamType(1) ||
FT->getParamType(0) != PointerType::getUnqual(Type::getInt8Ty(*Context))) FT->getParamType(0) != Type::getInt8PtrTy(*Context))
return 0; return 0;
Value *Str1P = CI->getOperand(1), *Str2P = CI->getOperand(2); Value *Str1P = CI->getOperand(1), *Str2P = CI->getOperand(2);
@ -713,7 +713,7 @@ struct StrNCmpOpt : public LibCallOptimization {
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 3 || FT->getReturnType() != Type::getInt32Ty(*Context) || if (FT->getNumParams() != 3 || FT->getReturnType() != Type::getInt32Ty(*Context) ||
FT->getParamType(0) != FT->getParamType(1) || FT->getParamType(0) != FT->getParamType(1) ||
FT->getParamType(0) != PointerType::getUnqual(Type::getInt8Ty(*Context)) || FT->getParamType(0) != Type::getInt8PtrTy(*Context) ||
!isa<IntegerType>(FT->getParamType(2))) !isa<IntegerType>(FT->getParamType(2)))
return 0; return 0;
@ -759,7 +759,7 @@ struct StrCpyOpt : public LibCallOptimization {
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 2 || FT->getReturnType() != FT->getParamType(0) || if (FT->getNumParams() != 2 || FT->getReturnType() != FT->getParamType(0) ||
FT->getParamType(0) != FT->getParamType(1) || FT->getParamType(0) != FT->getParamType(1) ||
FT->getParamType(0) != PointerType::getUnqual(Type::getInt8Ty(*Context))) FT->getParamType(0) != Type::getInt8PtrTy(*Context))
return 0; return 0;
Value *Dst = CI->getOperand(1), *Src = CI->getOperand(2); Value *Dst = CI->getOperand(1), *Src = CI->getOperand(2);
@ -789,7 +789,7 @@ struct StrNCpyOpt : public LibCallOptimization {
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) || if (FT->getNumParams() != 3 || FT->getReturnType() != FT->getParamType(0) ||
FT->getParamType(0) != FT->getParamType(1) || FT->getParamType(0) != FT->getParamType(1) ||
FT->getParamType(0) != PointerType::getUnqual(Type::getInt8Ty(*Context)) || FT->getParamType(0) != Type::getInt8PtrTy(*Context) ||
!isa<IntegerType>(FT->getParamType(2))) !isa<IntegerType>(FT->getParamType(2)))
return 0; return 0;
@ -837,7 +837,7 @@ struct StrLenOpt : public LibCallOptimization {
virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) {
const FunctionType *FT = Callee->getFunctionType(); const FunctionType *FT = Callee->getFunctionType();
if (FT->getNumParams() != 1 || if (FT->getNumParams() != 1 ||
FT->getParamType(0) != PointerType::getUnqual(Type::getInt8Ty(*Context)) || FT->getParamType(0) != Type::getInt8PtrTy(*Context) ||
!isa<IntegerType>(FT->getReturnType())) !isa<IntegerType>(FT->getReturnType()))
return 0; return 0;

View File

@ -316,7 +316,7 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD,
!CalledFunc->onlyReadsMemory()) { !CalledFunc->onlyReadsMemory()) {
const Type *AggTy = cast<PointerType>(I->getType())->getElementType(); const Type *AggTy = cast<PointerType>(I->getType())->getElementType();
const Type *VoidPtrTy = const Type *VoidPtrTy =
PointerType::getUnqual(Type::getInt8Ty(Context)); Type::getInt8PtrTy(Context);
// Create the alloca. If we have TargetData, use nice alignment. // Create the alloca. If we have TargetData, use nice alignment.
unsigned Align = 1; unsigned Align = 1;

View File

@ -87,7 +87,7 @@ Pass *llvm::createLowerAllocationsPass(bool LowerMallocArgToInteger) {
// This function is always successful. // This function is always successful.
// //
bool LowerAllocations::doInitialization(Module &M) { bool LowerAllocations::doInitialization(Module &M) {
const Type *BPTy = PointerType::getUnqual(Type::getInt8Ty(M.getContext())); const Type *BPTy = Type::getInt8PtrTy(M.getContext());
FreeFunc = M.getOrInsertFunction("free" , Type::getVoidTy(M.getContext()), FreeFunc = M.getOrInsertFunction("free" , Type::getVoidTy(M.getContext()),
BPTy, (Type *)0); BPTy, (Type *)0);
return true; return true;
@ -123,7 +123,7 @@ bool LowerAllocations::runOnBasicBlock(BasicBlock &BB) {
} else if (FreeInst *FI = dyn_cast<FreeInst>(I)) { } else if (FreeInst *FI = dyn_cast<FreeInst>(I)) {
Value *PtrCast = Value *PtrCast =
new BitCastInst(FI->getOperand(0), new BitCastInst(FI->getOperand(0),
PointerType::getUnqual(Type::getInt8Ty(BB.getContext())), "", I); Type::getInt8PtrTy(BB.getContext()), "", I);
// Insert a call to the free function... // Insert a call to the free function...
CallInst::Create(FreeFunc, PtrCast, "", I)->setTailCall(); CallInst::Create(FreeFunc, PtrCast, "", I)->setTailCall();

View File

@ -116,7 +116,7 @@ FunctionPass *llvm::createLowerInvokePass(const TargetLowering *TLI) {
// current module. // current module.
bool LowerInvoke::doInitialization(Module &M) { bool LowerInvoke::doInitialization(Module &M) {
const Type *VoidPtrTy = const Type *VoidPtrTy =
PointerType::getUnqual(Type::getInt8Ty(M.getContext())); Type::getInt8PtrTy(M.getContext());
AbortMessage = 0; AbortMessage = 0;
if (ExpensiveEHSupport) { if (ExpensiveEHSupport) {
// Insert a type for the linked list of jump buffers. // Insert a type for the linked list of jump buffers.
@ -530,7 +530,7 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) {
"TheJmpBuf", "TheJmpBuf",
EntryBB->getTerminator()); EntryBB->getTerminator());
JmpBufPtr = new BitCastInst(JmpBufPtr, JmpBufPtr = new BitCastInst(JmpBufPtr,
PointerType::getUnqual(Type::getInt8Ty(F.getContext())), Type::getInt8PtrTy(F.getContext()),
"tmp", EntryBB->getTerminator()); "tmp", EntryBB->getTerminator());
Value *SJRet = CallInst::Create(SetJmpFn, JmpBufPtr, "sjret", Value *SJRet = CallInst::Create(SetJmpFn, JmpBufPtr, "sjret",
EntryBB->getTerminator()); EntryBB->getTerminator());
@ -585,7 +585,7 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) {
Idx[0] = GetElementPtrInst::Create(BufPtr, Idx.begin(), Idx.end(), "JmpBuf", Idx[0] = GetElementPtrInst::Create(BufPtr, Idx.begin(), Idx.end(), "JmpBuf",
UnwindBlock); UnwindBlock);
Idx[0] = new BitCastInst(Idx[0], Idx[0] = new BitCastInst(Idx[0],
PointerType::getUnqual(Type::getInt8Ty(F.getContext())), Type::getInt8PtrTy(F.getContext()),
"tmp", UnwindBlock); "tmp", UnwindBlock);
Idx[1] = ConstantInt::get(Type::getInt32Ty(F.getContext()), 1); Idx[1] = ConstantInt::get(Type::getInt32Ty(F.getContext()), 1);
CallInst::Create(LongJmpFn, Idx.begin(), Idx.end(), "", UnwindBlock); CallInst::Create(LongJmpFn, Idx.begin(), Idx.end(), "", UnwindBlock);

View File

@ -265,7 +265,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
if (isLoadH || isLoadL) { if (isLoadH || isLoadL) {
Value *Op1 = UndefValue::get(Op0->getType()); Value *Op1 = UndefValue::get(Op0->getType());
Value *Addr = new BitCastInst(CI->getOperand(2), Value *Addr = new BitCastInst(CI->getOperand(2),
PointerType::getUnqual(Type::getDoubleTy(C)), Type::getDoublePtrTy(C),
"upgraded.", CI); "upgraded.", CI);
Value *Load = new LoadInst(Addr, "upgraded.", false, 8, CI); Value *Load = new LoadInst(Addr, "upgraded.", false, 8, CI);
Value *Idx = ConstantInt::get(Type::getInt32Ty(C), 0); Value *Idx = ConstantInt::get(Type::getInt32Ty(C), 0);

View File

@ -498,7 +498,7 @@ static Value *createMalloc(Instruction *InsertBefore, BasicBlock *InsertAtEnd,
// Create the call to Malloc. // Create the call to Malloc.
BasicBlock* BB = InsertBefore ? InsertBefore->getParent() : InsertAtEnd; BasicBlock* BB = InsertBefore ? InsertBefore->getParent() : InsertAtEnd;
Module* M = BB->getParent()->getParent(); Module* M = BB->getParent()->getParent();
const Type *BPTy = PointerType::getUnqual(Type::getInt8Ty(BB->getContext())); const Type *BPTy = Type::getInt8PtrTy(BB->getContext());
// prototype malloc as "void *malloc(size_t)" // prototype malloc as "void *malloc(size_t)"
Constant *MallocF = M->getOrInsertFunction("malloc", BPTy, IntPtrTy, NULL); Constant *MallocF = M->getOrInsertFunction("malloc", BPTy, IntPtrTy, NULL);
if (!cast<Function>(MallocF)->doesNotAlias(0)) if (!cast<Function>(MallocF)->doesNotAlias(0))

View File

@ -358,6 +358,46 @@ const IntegerType *Type::getInt64Ty(LLVMContext &C) {
return &C.pImpl->Int64Ty; return &C.pImpl->Int64Ty;
} }
const PointerType *Type::getFloatPtrTy(LLVMContext &C, unsigned AS) {
return getFloatTy(C)->getPointerTo(AS);
}
const PointerType *Type::getDoublePtrTy(LLVMContext &C, unsigned AS) {
return getDoubleTy(C)->getPointerTo(AS);
}
const PointerType *Type::getX86_FP80PtrTy(LLVMContext &C, unsigned AS) {
return getX86_FP80Ty(C)->getPointerTo(AS);
}
const PointerType *Type::getFP128PtrTy(LLVMContext &C, unsigned AS) {
return getFP128Ty(C)->getPointerTo(AS);
}
const PointerType *Type::getPPC_FP128PtrTy(LLVMContext &C, unsigned AS) {
return getPPC_FP128Ty(C)->getPointerTo(AS);
}
const PointerType *Type::getInt1PtrTy(LLVMContext &C, unsigned AS) {
return getInt1Ty(C)->getPointerTo(AS);
}
const PointerType *Type::getInt8PtrTy(LLVMContext &C, unsigned AS) {
return getInt8Ty(C)->getPointerTo(AS);
}
const PointerType *Type::getInt16PtrTy(LLVMContext &C, unsigned AS) {
return getInt16Ty(C)->getPointerTo(AS);
}
const PointerType *Type::getInt32PtrTy(LLVMContext &C, unsigned AS) {
return getInt32Ty(C)->getPointerTo(AS);
}
const PointerType *Type::getInt64PtrTy(LLVMContext &C, unsigned AS) {
return getInt64Ty(C)->getPointerTo(AS);
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Derived Type Constructors // Derived Type Constructors
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -704,8 +704,8 @@ static void CleanupAndPrepareModules(BugDriver &BD, Module *&Test,
// Prototype: void *getPointerToNamedFunction(const char* Name) // Prototype: void *getPointerToNamedFunction(const char* Name)
Constant *resolverFunc = Constant *resolverFunc =
Safe->getOrInsertFunction("getPointerToNamedFunction", Safe->getOrInsertFunction("getPointerToNamedFunction",
PointerType::getUnqual(Type::getInt8Ty(Safe->getContext())), Type::getInt8PtrTy(Safe->getContext()),
PointerType::getUnqual(Type::getInt8Ty(Safe->getContext())), Type::getInt8PtrTy(Safe->getContext()),
(Type *)0); (Type *)0);
// Use the function we just added to get addresses of functions we need. // Use the function we just added to get addresses of functions we need.

View File

@ -20,7 +20,7 @@ TEST(TypeBuilderTest, Void) {
EXPECT_EQ(Type::getVoidTy(getGlobalContext()), (TypeBuilder<void, true>::get(getGlobalContext()))); EXPECT_EQ(Type::getVoidTy(getGlobalContext()), (TypeBuilder<void, true>::get(getGlobalContext())));
EXPECT_EQ(Type::getVoidTy(getGlobalContext()), (TypeBuilder<void, false>::get(getGlobalContext()))); EXPECT_EQ(Type::getVoidTy(getGlobalContext()), (TypeBuilder<void, false>::get(getGlobalContext())));
// Special case for C compatibility: // Special case for C compatibility:
EXPECT_EQ(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext())), EXPECT_EQ(Type::getInt8PtrTy(getGlobalContext()),
(TypeBuilder<void*, false>::get(getGlobalContext()))); (TypeBuilder<void*, false>::get(getGlobalContext())));
} }
@ -64,21 +64,21 @@ TEST(TypeBuilderTest, Float) {
} }
TEST(TypeBuilderTest, Derived) { TEST(TypeBuilderTest, Derived) {
EXPECT_EQ(PointerType::getUnqual(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext()))), EXPECT_EQ(PointerType::getUnqual(Type::getInt8PtrTy(getGlobalContext())),
(TypeBuilder<int8_t**, false>::get(getGlobalContext()))); (TypeBuilder<int8_t**, false>::get(getGlobalContext())));
EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7), EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7),
(TypeBuilder<int8_t[7], false>::get(getGlobalContext()))); (TypeBuilder<int8_t[7], false>::get(getGlobalContext())));
EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 0), EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 0),
(TypeBuilder<int8_t[], false>::get(getGlobalContext()))); (TypeBuilder<int8_t[], false>::get(getGlobalContext())));
EXPECT_EQ(PointerType::getUnqual(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext()))), EXPECT_EQ(PointerType::getUnqual(Type::getInt8PtrTy(getGlobalContext())),
(TypeBuilder<types::i<8>**, false>::get(getGlobalContext()))); (TypeBuilder<types::i<8>**, false>::get(getGlobalContext())));
EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7), EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7),
(TypeBuilder<types::i<8>[7], false>::get(getGlobalContext()))); (TypeBuilder<types::i<8>[7], false>::get(getGlobalContext())));
EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 0), EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 0),
(TypeBuilder<types::i<8>[], false>::get(getGlobalContext()))); (TypeBuilder<types::i<8>[], false>::get(getGlobalContext())));
EXPECT_EQ(PointerType::getUnqual(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext()))), EXPECT_EQ(PointerType::getUnqual(Type::getInt8PtrTy(getGlobalContext())),
(TypeBuilder<types::i<8>**, true>::get(getGlobalContext()))); (TypeBuilder<types::i<8>**, true>::get(getGlobalContext())));
EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7), EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7),
(TypeBuilder<types::i<8>[7], true>::get(getGlobalContext()))); (TypeBuilder<types::i<8>[7], true>::get(getGlobalContext())));
@ -107,7 +107,7 @@ TEST(TypeBuilderTest, Derived) {
EXPECT_EQ(Type::getInt8Ty(getGlobalContext()), EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
(TypeBuilder<const volatile types::i<8>, true>::get(getGlobalContext()))); (TypeBuilder<const volatile types::i<8>, true>::get(getGlobalContext())));
EXPECT_EQ(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext())), EXPECT_EQ(Type::getInt8PtrTy(getGlobalContext()),
(TypeBuilder<const volatile int8_t*const volatile, false>::get(getGlobalContext()))); (TypeBuilder<const volatile int8_t*const volatile, false>::get(getGlobalContext())));
} }

View File

@ -64,7 +64,7 @@ TEST(CloneInstruction, OverflowBits) {
TEST(CloneInstruction, Inbounds) { TEST(CloneInstruction, Inbounds) {
LLVMContext context; LLVMContext context;
Value *V = new Argument(Type::getInt32Ty(context)->getPointerTo()); Value *V = new Argument(Type::getInt32PtrTy(context));
Constant *Z = Constant::getNullValue(Type::getInt32Ty(context)); Constant *Z = Constant::getNullValue(Type::getInt32Ty(context));
std::vector<Value *> ops; std::vector<Value *> ops;
ops.push_back(Z); ops.push_back(Z);