[opaque pointer type] Update for GEP API changes in LLVM
Now the GEP constant utility functions require the type to be explicitly passed (since eventually the pointer type will be opaque and not convey the required type information). For now callers can still pass nullptr (though none were needed here in Clang, which is nice) if convenienc/necessary, but eventually that will be disallowed as well. llvm-svn: 233937
This commit is contained in:
parent
a64723c2bf
commit
e3b172afc3
|
|
@ -1115,7 +1115,7 @@ llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value,
|
|||
unsigned AS = C->getType()->getPointerAddressSpace();
|
||||
llvm::Type *CharPtrTy = Int8Ty->getPointerTo(AS);
|
||||
llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, CharPtrTy);
|
||||
Casted = llvm::ConstantExpr::getGetElementPtr(Casted, Offset);
|
||||
Casted = llvm::ConstantExpr::getGetElementPtr(Int8Ty, Casted, Offset);
|
||||
C = llvm::ConstantExpr::getPointerCast(Casted, C->getType());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -171,8 +171,9 @@ protected:
|
|||
/// where the C code specifies const char*.
|
||||
llvm::Constant *MakeConstantString(const std::string &Str,
|
||||
const std::string &Name="") {
|
||||
llvm::Constant *ConstStr = CGM.GetAddrOfConstantCString(Str, Name.c_str());
|
||||
return llvm::ConstantExpr::getGetElementPtr(ConstStr, Zeros);
|
||||
auto *ConstStr = CGM.GetAddrOfConstantCString(Str, Name.c_str());
|
||||
return llvm::ConstantExpr::getGetElementPtr(ConstStr->getValueType(),
|
||||
ConstStr, Zeros);
|
||||
}
|
||||
/// Emits a linkonce_odr string, whose name is the prefix followed by the
|
||||
/// string value. This allows the linker to combine the strings between
|
||||
|
|
@ -181,13 +182,14 @@ protected:
|
|||
llvm::Constant *ExportUniqueString(const std::string &Str,
|
||||
const std::string prefix) {
|
||||
std::string name = prefix + Str;
|
||||
llvm::Constant *ConstStr = TheModule.getGlobalVariable(name);
|
||||
auto *ConstStr = TheModule.getGlobalVariable(name);
|
||||
if (!ConstStr) {
|
||||
llvm::Constant *value = llvm::ConstantDataArray::getString(VMContext,Str);
|
||||
ConstStr = new llvm::GlobalVariable(TheModule, value->getType(), true,
|
||||
llvm::GlobalValue::LinkOnceODRLinkage, value, prefix + Str);
|
||||
}
|
||||
return llvm::ConstantExpr::getGetElementPtr(ConstStr, Zeros);
|
||||
return llvm::ConstantExpr::getGetElementPtr(ConstStr->getValueType(),
|
||||
ConstStr, Zeros);
|
||||
}
|
||||
/// Generates a global structure, initialized by the elements in the vector.
|
||||
/// The element types must match the types of the structure elements in the
|
||||
|
|
@ -237,8 +239,9 @@ protected:
|
|||
NameAndAttributes += TypeStr;
|
||||
NameAndAttributes += '\0';
|
||||
NameAndAttributes += PD->getNameAsString();
|
||||
return llvm::ConstantExpr::getGetElementPtr(
|
||||
CGM.GetAddrOfConstantCString(NameAndAttributes), Zeros);
|
||||
auto *ConstStr = CGM.GetAddrOfConstantCString(NameAndAttributes);
|
||||
return llvm::ConstantExpr::getGetElementPtr(ConstStr->getValueType(),
|
||||
ConstStr, Zeros);
|
||||
}
|
||||
return MakeConstantString(PD->getNameAsString());
|
||||
}
|
||||
|
|
@ -1143,21 +1146,22 @@ llvm::Constant *CGObjCGNUstep::GetEHType(QualType T) {
|
|||
// It's quite ugly hard-coding this. Ideally we'd generate it using the host
|
||||
// platform's name mangling.
|
||||
const char *vtableName = "_ZTVN7gnustep7libobjc22__objc_class_type_infoE";
|
||||
llvm::Constant *Vtable = TheModule.getGlobalVariable(vtableName);
|
||||
auto *Vtable = TheModule.getGlobalVariable(vtableName);
|
||||
if (!Vtable) {
|
||||
Vtable = new llvm::GlobalVariable(TheModule, PtrToInt8Ty, true,
|
||||
llvm::GlobalValue::ExternalLinkage,
|
||||
nullptr, vtableName);
|
||||
}
|
||||
llvm::Constant *Two = llvm::ConstantInt::get(IntTy, 2);
|
||||
Vtable = llvm::ConstantExpr::getGetElementPtr(Vtable, Two);
|
||||
Vtable = llvm::ConstantExpr::getBitCast(Vtable, PtrToInt8Ty);
|
||||
auto *BVtable = llvm::ConstantExpr::getBitCast(
|
||||
llvm::ConstantExpr::getGetElementPtr(Vtable->getValueType(), Vtable, Two),
|
||||
PtrToInt8Ty);
|
||||
|
||||
llvm::Constant *typeName =
|
||||
ExportUniqueString(className, "__objc_eh_typename_");
|
||||
|
||||
std::vector<llvm::Constant*> fields;
|
||||
fields.push_back(Vtable);
|
||||
fields.push_back(BVtable);
|
||||
fields.push_back(typeName);
|
||||
llvm::Constant *TI =
|
||||
MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty,
|
||||
|
|
@ -2294,7 +2298,8 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) {
|
|||
offsetPointerIndexes[2] = llvm::ConstantInt::get(IndexTy, ivarIndex);
|
||||
// Get the correct ivar field
|
||||
llvm::Constant *offsetValue = llvm::ConstantExpr::getGetElementPtr(
|
||||
IvarList, offsetPointerIndexes);
|
||||
cast<llvm::GlobalVariable>(IvarList)->getValueType(), IvarList,
|
||||
offsetPointerIndexes);
|
||||
// Get the existing variable, if one exists.
|
||||
llvm::GlobalVariable *offset = TheModule.getNamedGlobal(Name);
|
||||
if (offset) {
|
||||
|
|
@ -2439,8 +2444,8 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
|
|||
|
||||
// Number of static selectors
|
||||
Elements.push_back(llvm::ConstantInt::get(LongTy, SelectorCount));
|
||||
llvm::Constant *SelectorList = MakeGlobalArray(SelStructTy, Selectors,
|
||||
".objc_selector_list");
|
||||
llvm::GlobalVariable *SelectorList =
|
||||
MakeGlobalArray(SelStructTy, Selectors, ".objc_selector_list");
|
||||
Elements.push_back(llvm::ConstantExpr::getBitCast(SelectorList,
|
||||
SelStructPtrTy));
|
||||
|
||||
|
|
@ -2450,8 +2455,8 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() {
|
|||
llvm::Constant *Idxs[] = {Zeros[0],
|
||||
llvm::ConstantInt::get(Int32Ty, i), Zeros[0]};
|
||||
// FIXME: We're generating redundant loads and stores here!
|
||||
llvm::Constant *SelPtr = llvm::ConstantExpr::getGetElementPtr(SelectorList,
|
||||
makeArrayRef(Idxs, 2));
|
||||
llvm::Constant *SelPtr = llvm::ConstantExpr::getGetElementPtr(
|
||||
SelectorList->getValueType(), SelectorList, makeArrayRef(Idxs, 2));
|
||||
// If selectors are defined as an opaque type, cast the pointer to this
|
||||
// type.
|
||||
SelPtr = llvm::ConstantExpr::getBitCast(SelPtr, SelectorTy);
|
||||
|
|
|
|||
|
|
@ -1678,14 +1678,13 @@ struct NullReturnState {
|
|||
|
||||
/// getConstantGEP() - Help routine to construct simple GEPs.
|
||||
static llvm::Constant *getConstantGEP(llvm::LLVMContext &VMContext,
|
||||
llvm::Constant *C,
|
||||
unsigned idx0,
|
||||
llvm::GlobalVariable *C, unsigned idx0,
|
||||
unsigned idx1) {
|
||||
llvm::Value *Idxs[] = {
|
||||
llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx0),
|
||||
llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx1)
|
||||
};
|
||||
return llvm::ConstantExpr::getGetElementPtr(C, Idxs);
|
||||
return llvm::ConstantExpr::getGetElementPtr(C->getValueType(), C, Idxs);
|
||||
}
|
||||
|
||||
/// hasObjCExceptionAttribute - Return true if this class or any super
|
||||
|
|
@ -6999,10 +6998,10 @@ CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
|
|||
llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2);
|
||||
|
||||
llvm::Constant *Values[] = {
|
||||
llvm::ConstantExpr::getGetElementPtr(VTableGV, VTableIdx),
|
||||
GetClassName(ID->getObjCRuntimeNameAsString()),
|
||||
GetClassGlobal(ClassName.str())
|
||||
};
|
||||
llvm::ConstantExpr::getGetElementPtr(VTableGV->getValueType(), VTableGV,
|
||||
VTableIdx),
|
||||
GetClassName(ID->getObjCRuntimeNameAsString()),
|
||||
GetClassGlobal(ClassName.str())};
|
||||
llvm::Constant *Init =
|
||||
llvm::ConstantStruct::get(ObjCTypes.EHTypeTy, Values);
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
using namespace clang;
|
||||
using namespace CodeGen;
|
||||
|
||||
static llvm::Constant *
|
||||
static llvm::GlobalVariable *
|
||||
GetAddrOfVTTVTable(CodeGenVTables &CGVT, CodeGenModule &CGM,
|
||||
const CXXRecordDecl *MostDerivedClass,
|
||||
const VTTVTable &VTable,
|
||||
|
|
@ -47,8 +47,8 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT,
|
|||
llvm::Type *Int8PtrTy = CGM.Int8PtrTy, *Int64Ty = CGM.Int64Ty;
|
||||
llvm::ArrayType *ArrayType =
|
||||
llvm::ArrayType::get(Int8PtrTy, Builder.getVTTComponents().size());
|
||||
|
||||
SmallVector<llvm::Constant *, 8> VTables;
|
||||
|
||||
SmallVector<llvm::GlobalVariable *, 8> VTables;
|
||||
SmallVector<VTableAddressPointsMapTy, 8> VTableAddressPoints;
|
||||
for (const VTTVTable *i = Builder.getVTTVTables().begin(),
|
||||
*e = Builder.getVTTVTables().end(); i != e; ++i) {
|
||||
|
|
@ -61,7 +61,7 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT,
|
|||
for (const VTTComponent *i = Builder.getVTTComponents().begin(),
|
||||
*e = Builder.getVTTComponents().end(); i != e; ++i) {
|
||||
const VTTVTable &VTTVT = Builder.getVTTVTables()[i->VTableIndex];
|
||||
llvm::Constant *VTable = VTables[i->VTableIndex];
|
||||
llvm::GlobalVariable *VTable = VTables[i->VTableIndex];
|
||||
uint64_t AddressPoint;
|
||||
if (VTTVT.getBase() == RD) {
|
||||
// Just get the address point for the regular vtable.
|
||||
|
|
@ -79,8 +79,8 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT,
|
|||
llvm::ConstantInt::get(Int64Ty, AddressPoint)
|
||||
};
|
||||
|
||||
llvm::Constant *Init =
|
||||
llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Idxs);
|
||||
llvm::Constant *Init = llvm::ConstantExpr::getInBoundsGetElementPtr(
|
||||
VTable->getValueType(), VTable, Idxs);
|
||||
|
||||
Init = llvm::ConstantExpr::getBitCast(Init, Int8PtrTy);
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#include "clang/AST/CharUnits.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
|
||||
namespace llvm {
|
||||
class Constant;
|
||||
|
|
@ -299,6 +300,7 @@ public:
|
|||
|
||||
LValue R;
|
||||
R.LVType = Simple;
|
||||
assert(address->getType()->isPointerTy());
|
||||
R.V = address;
|
||||
R.Initialize(type, qs, alignment, TBAAInfo);
|
||||
return R;
|
||||
|
|
|
|||
|
|
@ -2633,7 +2633,7 @@ CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
|
|||
llvm::Constant *GV = CreateRuntimeVariable(Ty,
|
||||
"__CFConstantStringClassReference");
|
||||
// Decay array -> ptr
|
||||
V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
|
||||
V = llvm::ConstantExpr::getGetElementPtr(Ty, GV, Zeros);
|
||||
CFConstantStringClassRef = V;
|
||||
}
|
||||
else
|
||||
|
|
@ -2686,7 +2686,7 @@ CodeGenModule::GetAddrOfConstantCFString(const StringLiteral *Literal) {
|
|||
}
|
||||
|
||||
// String.
|
||||
Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
|
||||
Fields[2] = llvm::ConstantExpr::getGetElementPtr(GV->getType(), GV, Zeros);
|
||||
|
||||
if (isUTF16)
|
||||
// Cast the UTF16 string to the correct type.
|
||||
|
|
@ -2740,7 +2740,7 @@ CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
|
|||
llvm::Type *PTy = llvm::ArrayType::get(Ty, 0);
|
||||
GV = CreateRuntimeVariable(PTy, str);
|
||||
// Decay array -> ptr
|
||||
V = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
|
||||
V = llvm::ConstantExpr::getGetElementPtr(PTy, GV, Zeros);
|
||||
ConstantStringClassRef = V;
|
||||
}
|
||||
}
|
||||
|
|
@ -2800,8 +2800,9 @@ CodeGenModule::GetAddrOfConstantString(const StringLiteral *Literal) {
|
|||
// of the string is via this class initializer.
|
||||
CharUnits Align = getContext().getTypeAlignInChars(getContext().CharTy);
|
||||
GV->setAlignment(Align.getQuantity());
|
||||
Fields[1] = llvm::ConstantExpr::getGetElementPtr(GV, Zeros);
|
||||
|
||||
Fields[1] =
|
||||
llvm::ConstantExpr::getGetElementPtr(GV->getValueType(), GV, Zeros);
|
||||
|
||||
// String length.
|
||||
llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
|
||||
Fields[2] = llvm::ConstantInt::get(Ty, StringLength);
|
||||
|
|
|
|||
|
|
@ -1388,7 +1388,7 @@ llvm::Value *ItaniumCXXABI::getVTableAddressPointInStructor(
|
|||
|
||||
llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
|
||||
BaseSubobject Base, const CXXRecordDecl *VTableClass) {
|
||||
llvm::Constant *VTable = getAddrOfVTable(VTableClass, CharUnits());
|
||||
auto *VTable = getAddrOfVTable(VTableClass, CharUnits());
|
||||
|
||||
// Find the appropriate vtable within the vtable group.
|
||||
uint64_t AddressPoint = CGM.getItaniumVTableContext()
|
||||
|
|
@ -1399,7 +1399,8 @@ llvm::Constant *ItaniumCXXABI::getVTableAddressPointForConstExpr(
|
|||
llvm::ConstantInt::get(CGM.Int64Ty, AddressPoint)
|
||||
};
|
||||
|
||||
return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Indices);
|
||||
return llvm::ConstantExpr::getInBoundsGetElementPtr(VTable->getValueType(),
|
||||
VTable, Indices);
|
||||
}
|
||||
|
||||
llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
|
||||
|
|
@ -2606,7 +2607,8 @@ void ItaniumRTTIBuilder::BuildVTablePointer(const Type *Ty) {
|
|||
|
||||
// The vtable address point is 2.
|
||||
llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2);
|
||||
VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, Two);
|
||||
VTable =
|
||||
llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two);
|
||||
VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy);
|
||||
|
||||
Fields.push_back(VTable);
|
||||
|
|
|
|||
|
|
@ -1550,8 +1550,8 @@ llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
|
|||
llvm::ConstantInt::get(CGM.IntTy, 1)};
|
||||
// Create a GEP which points just after the first entry in the VFTable,
|
||||
// this should be the location of the first virtual method.
|
||||
llvm::Constant *VTableGEP =
|
||||
llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, GEPIndices);
|
||||
llvm::Constant *VTableGEP = llvm::ConstantExpr::getInBoundsGetElementPtr(
|
||||
VTable->getValueType(), VTable, GEPIndices);
|
||||
if (llvm::GlobalValue::isWeakForLinker(VFTableLinkage)) {
|
||||
VFTableLinkage = llvm::GlobalValue::ExternalLinkage;
|
||||
if (C)
|
||||
|
|
@ -3020,13 +3020,15 @@ llvm::GlobalVariable *MSRTTIBuilder::getClassHierarchyDescriptor() {
|
|||
if (CHD->isWeakForLinker())
|
||||
CHD->setComdat(CGM.getModule().getOrInsertComdat(CHD->getName()));
|
||||
|
||||
auto *Bases = getBaseClassArray(Classes);
|
||||
|
||||
// Initialize the base class ClassHierarchyDescriptor.
|
||||
llvm::Constant *Fields[] = {
|
||||
llvm::ConstantInt::get(CGM.IntTy, 0), // Unknown
|
||||
llvm::ConstantInt::get(CGM.IntTy, Flags),
|
||||
llvm::ConstantInt::get(CGM.IntTy, Classes.size()),
|
||||
ABI.getImageRelativeConstant(llvm::ConstantExpr::getInBoundsGetElementPtr(
|
||||
getBaseClassArray(Classes),
|
||||
Bases->getValueType(), Bases,
|
||||
llvm::ArrayRef<llvm::Value *>(GEPIndices))),
|
||||
};
|
||||
CHD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
|
||||
|
|
|
|||
Loading…
Reference in New Issue