本文整理汇总了C++中ConstantExpr类的典型用法代码示例。如果您正苦于以下问题:C++ ConstantExpr类的具体用法?C++ ConstantExpr怎么用?C++ ConstantExpr使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ConstantExpr类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getMatInsertPt
/// \brief Emit materialization code for all rebased constants and update their
/// users.
void ConstantHoisting::EmitBaseConstants(Function &F, User *U,
Instruction *Base, Constant *Offset,
ConstantInt *OriginalConstant) {
if (Instruction *I = dyn_cast<Instruction>(U)) {
Instruction *Mat = Base;
if (!Offset->isNullValue()) {
Mat = BinaryOperator::Create(Instruction::Add, Base, Offset,
"const_mat", getMatInsertPt(I, DT));
// Use the same debug location as the instruction we are about to update.
Mat->setDebugLoc(I->getDebugLoc());
DEBUG(dbgs() << "Materialize constant (" << *Base->getOperand(0)
<< " + " << *Offset << ") in BB "
<< I->getParent()->getName() << '\n' << *Mat << '\n');
}
DEBUG(dbgs() << "Update: " << *I << '\n');
I->replaceUsesOfWith(OriginalConstant, Mat);
DEBUG(dbgs() << "To: " << *I << '\n');
return;
}
assert(isa<ConstantExpr>(U) && "Expected a ConstantExpr.");
ConstantExpr *CE = cast<ConstantExpr>(U);
for (Value::use_iterator UU = CE->use_begin(), E = CE->use_end();
UU != E; ++UU) {
// We only handel instructions here and won't walk down a ConstantExpr chain
// to replace all ConstExpr with instructions.
if (Instruction *I = dyn_cast<Instruction>(*UU)) {
// Only update constant expressions in the current function.
if (I->getParent()->getParent() != &F)
continue;
Instruction *Mat = Base;
Instruction *InsertBefore = getMatInsertPt(I, DT);
if (!Offset->isNullValue()) {
Mat = BinaryOperator::Create(Instruction::Add, Base, Offset,
"const_mat", InsertBefore);
// Use the same debug location as the instruction we are about to
// update.
Mat->setDebugLoc(I->getDebugLoc());
DEBUG(dbgs() << "Materialize constant (" << *Base->getOperand(0)
<< " + " << *Offset << ") in BB "
<< I->getParent()->getName() << '\n' << *Mat << '\n');
}
Instruction *ICE = CE->getAsInstruction();
ICE->replaceUsesOfWith(OriginalConstant, Mat);
ICE->insertBefore(InsertBefore);
// Use the same debug location as the instruction we are about to update.
ICE->setDebugLoc(I->getDebugLoc());
DEBUG(dbgs() << "Create instruction: " << *ICE << '\n');
DEBUG(dbgs() << "Update: " << *I << '\n');
I->replaceUsesOfWith(CE, ICE);
DEBUG(dbgs() << "To: " << *I << '\n');
}
}
}
示例2: runOnFunction
virtual bool runOnFunction(Function &F) {
//F.dump();
bool changed = false;
for (inst_iterator inst_it = inst_begin(F), _inst_end = inst_end(F); inst_it != _inst_end; ++inst_it) {
LoadInst *li = dyn_cast<LoadInst>(&*inst_it);
if (!li) continue;
ConstantExpr *ce = dyn_cast<ConstantExpr>(li->getOperand(0));
// Not 100% sure what the isGEPWithNoNotionalOverIndexing() means, but
// at least it checks if it's a gep:
if (ce && ce->isGEPWithNoNotionalOverIndexing() && ce->getOperand(0)->getType() == g.llvm_flavor_type_ptr) {
changed = handleFlavor(li, ce);
}
GlobalVariable *gv = dyn_cast<GlobalVariable>(li->getOperand(0));
if (!gv) continue;
llvm::Type* gv_t = gv->getType();
if (gv_t == g.llvm_bool_type_ptr->getPointerTo()) {
changed = handleBool(li, gv) || changed;
continue;
}
if (gv_t == g.llvm_class_type_ptr->getPointerTo()) {
changed = handleCls(li, gv) || changed;
continue;
}
}
return changed;
}
示例3: getAllIndependentConstraintsSets
// Breaks down a constraint into all of it's individual pieces, returning a
// list of IndependentElementSets or the independent factors.
//
// Caller takes ownership of returned std::list.
static std::list<IndependentElementSet>*
getAllIndependentConstraintsSets(const Query &query) {
std::list<IndependentElementSet> *factors = new std::list<IndependentElementSet>();
ConstantExpr *CE = dyn_cast<ConstantExpr>(query.expr);
if (CE) {
assert(CE && CE->isFalse() && "the expr should always be false and "
"therefore not included in factors");
} else {
ref<Expr> neg = Expr::createIsZero(query.expr);
factors->push_back(IndependentElementSet(neg));
}
for (ConstraintManager::const_iterator it = query.constraints.begin(),
ie = query.constraints.end();
it != ie; ++it) {
// iterate through all the previously separated constraints. Until we
// actually return, factors is treated as a queue of expressions to be
// evaluated. If the queue property isn't maintained, then the exprs
// could be returned in an order different from how they came it, negatively
// affecting later stages.
factors->push_back(IndependentElementSet(*it));
}
bool doneLoop = false;
do {
doneLoop = true;
std::list<IndependentElementSet> *done =
new std::list<IndependentElementSet>;
while (factors->size() > 0) {
IndependentElementSet current = factors->front();
factors->pop_front();
// This list represents the set of factors that are separate from current.
// Those that are not inserted into this list (queue) intersect with
// current.
std::list<IndependentElementSet> *keep =
new std::list<IndependentElementSet>;
while (factors->size() > 0) {
IndependentElementSet compare = factors->front();
factors->pop_front();
if (current.intersects(compare)) {
if (current.add(compare)) {
// Means that we have added (z=y)added to (x=y)
// Now need to see if there are any (z=?)'s
doneLoop = false;
}
} else {
keep->push_back(compare);
}
}
done->push_back(current);
delete factors;
factors = keep;
}
delete factors;
factors = done;
} while (!doneLoop);
return factors;
}
示例4: report_fatal_error
void ControlFlowIntegrity::PatchDtorFunctions(void) {
GlobalVariable *global_dtors = _M.getNamedGlobal("llvm.global_dtors");
// check for dtor section
if (!global_dtors || !global_dtors->getOperand(0)) {
return;
}
Constant *c = global_dtors->getInitializer();
if (!c)
report_fatal_error("llvm.global_dtors without initializer!", false);
ConstantArray *CA = dyn_cast<ConstantArray>(c);
if (!CA)
report_fatal_error("Cast to ConstantArray failed", true);
for (Value *Op : ValueOpRange(*CA)) {
ConstantStruct *CS = dyn_cast<ConstantStruct>(Op);
if (!CS)
report_fatal_error("Cast to ConstantStruct failed", true);
Constant *FP = CS->getOperand(1);
if (FP->isNullValue())
break; // found a NULL termintator, stop here
Function *F = dyn_cast_or_null<Function>(FP);
if (F == NULL) {
// Strip off constant expression cast
ConstantExpr *CE = dyn_cast<ConstantExpr>(FP);
if (!CE)
report_fatal_error("Cast to ConstantExpr failed", true);
if (CE->isCast()) {
FP = CE->getOperand(0);
}
F = dyn_cast_or_null<Function>(FP);
}
if (!F)
report_fatal_error("Cast to Function failed", true);
// set visibility to hidden (do not export), unless it is already
// local (for ex. static), in which case we have to make it non-static
if (F->hasLocalLinkage()) {
F->setLinkage(llvm::GlobalValue::ExternalLinkage);
}
F->setVisibility(GlobalValue::HiddenVisibility);
_FiniFunctions.insert(F->getName());
}
if (global_dtors->getNumUses() > 0)
report_fatal_error("llvm.global_dtors uses count is > 0!", false);
global_dtors->removeFromParent();
}
示例5: SDEBUG
void ClassHierarchyUtils::findClassHierarchy(Module& M) {
// extract call hierarchy using std::type_info structures rather
// than debug info. The former works even for when there are anonymous
// namespaces. type_info structs can be obtained from vtable globals.
// (for more info, see http://mentorembedded.github.io/cxx-abi/abi.html)
for (Module::global_iterator I=M.global_begin(), E=M.global_end(); I != E; I++) {
GlobalVariable* G = &*I;
if (G->getName().startswith("_ZTV")) {
if (G->hasInitializer()) {
SDEBUG("soaap.util.classhierarchy", 3, G->dump());
ConstantArray* Ginit = cast<ConstantArray>(G->getInitializer());
// Ginit[1] is the type_info global for this vtable's type
bool typeInfoFound = false;
bool primaryVTable = true;
for (int i=0; i<Ginit->getNumOperands(); i++) {
// typeinfo will be the first global variable in the array.
// It's not always at a fixed index so we have to search for it...
if (GlobalVariable* TI = dyn_cast<GlobalVariable>(Ginit->getOperand(i)->stripPointerCasts())) {
//TI->dump();
typeInfoToVTable[TI] = G;
vTableToTypeInfo[G] = TI;
processTypeInfo(TI); // process TI recursively (it contains refs to super-class TIs)
typeInfoFound = true;
if (primaryVTable) {
primaryVTable = false;
vTableToSecondaryVTableMaps[G][0] = i+1; // i+1 is also the size of the vtable header
}
else {
// offset_to_top is at the previous index
ConstantExpr* offsetValCast = cast<ConstantExpr>(Ginit->getOperand(i-1)->stripPointerCasts());
ConstantInt* offsetVal = cast<ConstantInt>(offsetValCast->getOperand(0));
int offsetToTop = offsetVal->getSExtValue();
if (offsetToTop > 0) {
dbgs() << "ERROR: offsetToTop is positive!\n";
G->dump();
}
else {
offsetToTop *= -1;
}
SDEBUG("soaap.util.classhierarchy", 3, dbgs() << "offsetToTop: " << offsetToTop << "\n");
vTableToSecondaryVTableMaps[G][offsetToTop] = i+1;
}
}
}
if (!typeInfoFound) {
dbgs() << "ERROR: vtable initializer is not a global variable...\n";
dbgs() << *G << " = " << *Ginit << "\n";
}
}
}
}
SDEBUG("soaap.util.classhierarchy", 3, ppClassHierarchy(classToSubclasses));
}
示例6: AddCatchInfo
/// AddCatchInfo - Extract the personality and type infos from an eh.selector
/// call, and add them to the specified machine basic block.
void llvm::AddCatchInfo(CallInst &I, MachineModuleInfo *MMI,
MachineBasicBlock *MBB) {
// Inform the MachineModuleInfo of the personality for this landing pad.
ConstantExpr *CE = cast<ConstantExpr>(I.getOperand(2));
assert(CE->getOpcode() == Instruction::BitCast &&
isa<Function>(CE->getOperand(0)) &&
"Personality should be a function");
MMI->addPersonality(MBB, cast<Function>(CE->getOperand(0)));
// Gather all the type infos for this landing pad and pass them along to
// MachineModuleInfo.
std::vector<GlobalVariable *> TyInfo;
unsigned N = I.getNumOperands();
for (unsigned i = N - 1; i > 2; --i) {
if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand(i))) {
unsigned FilterLength = CI->getZExtValue();
unsigned FirstCatch = i + FilterLength + !FilterLength;
assert (FirstCatch <= N && "Invalid filter length");
if (FirstCatch < N) {
TyInfo.reserve(N - FirstCatch);
for (unsigned j = FirstCatch; j < N; ++j)
TyInfo.push_back(ExtractTypeInfo(I.getOperand(j)));
MMI->addCatchTypeInfo(MBB, TyInfo);
TyInfo.clear();
}
if (!FilterLength) {
// Cleanup.
MMI->addCleanup(MBB);
} else {
// Filter.
TyInfo.reserve(FilterLength - 1);
for (unsigned j = i + 1; j < FirstCatch; ++j)
TyInfo.push_back(ExtractTypeInfo(I.getOperand(j)));
MMI->addFilterTypeInfo(MBB, TyInfo);
TyInfo.clear();
}
N = i;
}
}
if (N > 3) {
TyInfo.reserve(N - 3);
for (unsigned j = 3; j < N; ++j)
TyInfo.push_back(ExtractTypeInfo(I.getOperand(j)));
MMI->addCatchTypeInfo(MBB, TyInfo);
}
}
示例7: assert
static GlobalValue *getAliaseeGV(GlobalAlias *GA) {
Constant *C = GA->getAliasee();
assert(C && "Must alias something");
if (GlobalValue *GV = dyn_cast<GlobalValue>(C))
return GV;
ConstantExpr *CE = cast<ConstantExpr>(C);
assert((CE->getOpcode() == Instruction::BitCast ||
CE->getOpcode() == Instruction::AddrSpaceCast ||
CE->getOpcode() == Instruction::GetElementPtr) &&
"Unsupported aliasee");
return cast<GlobalValue>(CE->getOperand(0));
}
示例8: getAliasee
GlobalValue *GlobalAlias::getAliasedGlobal() {
Constant *C = getAliasee();
if (C == 0) return 0;
if (GlobalValue *GV = dyn_cast<GlobalValue>(C))
return GV;
ConstantExpr *CE = cast<ConstantExpr>(C);
assert((CE->getOpcode() == Instruction::BitCast ||
CE->getOpcode() == Instruction::AddrSpaceCast ||
CE->getOpcode() == Instruction::GetElementPtr) &&
"Unsupported aliasee");
return cast<GlobalValue>(CE->getOperand(0));
}
示例9: getGEPBaseAndOffset
void DebugDatabase::getGEPBaseAndOffset(ConstantExpr *GEP, Value **getBase,
int *getOffset) {
int offset = 0;
Value *base = NULL;
User *baseAddress = GEP->getOperand(0);
ConstantExpr *CE = dyn_cast<ConstantExpr>(baseAddress);
if (CE && CE->getOpcode() == Instruction::GetElementPtr) {
// Nested GEP
getGEPBaseAndOffset(CE, &base, &offset);
} else if (isa<GlobalVariable>(baseAddress) ||
isa<AllocaInst>(baseAddress)) {
base = baseAddress;
} else {
assert(false);
}
assert(base);
gep_type_iterator GTI = gep_type_begin(GEP);
for (User::op_iterator i = GEP->op_begin() + 1, e = GEP->op_end(); i != e;
++i, ++GTI) {
Value *Op = *i;
// Build a mask for high order bits.
const DataLayout *TD = dbgInfo->getAlloc()->getDataLayout();
unsigned IntPtrWidth = TD->getPointerSizeInBits();
uint64_t PtrSizeMask = ~0ULL >> (64 - IntPtrWidth);
// apply mask
uint64_t Size =
TD->getTypeAllocSize(GTI.getIndexedType()) & PtrSizeMask;
assert(isa<ConstantInt>(Op));
if (ConstantInt *OpC = dyn_cast<ConstantInt>(Op)) {
// Handle a struct index, which adds its field offset.
if (StructType *STy = dyn_cast<StructType>(*GTI)) {
offset += TD->getStructLayout(STy)
->getElementOffset(OpC->getZExtValue());
} else {
offset += Size * OpC->getValue().getSExtValue();
}
}
}
*getBase = base;
*getOffset = offset;
}
示例10: sd_getDestructorFunction
static Constant*
sd_getDestructorFunction(Constant* vtblElement) {
ConstantExpr* bcExpr = NULL;
// if this a constant bitcast expression, this might be a vthunk
if ((bcExpr = dyn_cast<ConstantExpr>(vtblElement)) && bcExpr->getOpcode() == BITCAST_OPCODE) {
Constant* operand = bcExpr->getOperand(0);
// this is a vthunk
if (sd_isDestructorName(operand->getName())) {
return operand;
}
}
return NULL;
}
示例11: create
ref<Expr> BitfieldSimplifier::replaceWithConstant(ref<Expr> e, uint64_t value)
{
ConstantExpr *ce = dyn_cast<ConstantExpr>(e);
if(ce && ce->getZExtValue() == value)
return e;
// Remove kids from cache
unsigned numKids = e->getNumKids();
for(unsigned i = 0; i < numKids; ++i)
m_bitsInfoCache.erase(e->getKid(i));
// Remove e from cache
m_bitsInfoCache.erase(e);
return ConstantExpr::create(value & ~zeroMask(e->getWidth()), e->getWidth());
}
示例12: sd_isRTTI
static Constant*
sd_isRTTI(Constant* vtblElement) {
ConstantExpr* bcExpr = NULL;
// if this a constant bitcast expression, this might be a vthunk
if ((bcExpr = dyn_cast<ConstantExpr>(vtblElement)) &&
bcExpr->getOpcode() == Instruction::BitCast) {
Constant* operand = bcExpr->getOperand(0);
// this is a vthunk
if (operand->getName().startswith("_ZTI")) {
return operand;
}
}
return NULL;
}
示例13: readAnnotate
std::string readAnnotate(Function *f) {
std::string annotation = "";
// Get annotation variable
GlobalVariable *glob =
f->getParent()->getGlobalVariable("llvm.global.annotations");
if (glob != NULL) {
// Get the array
if (ConstantArray *ca = dyn_cast<ConstantArray>(glob->getInitializer())) {
for (unsigned i = 0; i < ca->getNumOperands(); ++i) {
// Get the struct
if (ConstantStruct *structAn =
dyn_cast<ConstantStruct>(ca->getOperand(i))) {
if (ConstantExpr *expr =
dyn_cast<ConstantExpr>(structAn->getOperand(0))) {
// If it's a bitcast we can check if the annotation is concerning
// the current function
if (expr->getOpcode() == Instruction::BitCast &&
expr->getOperand(0) == f) {
ConstantExpr *note = cast<ConstantExpr>(structAn->getOperand(1));
// If it's a GetElementPtr, that means we found the variable
// containing the annotations
if (note->getOpcode() == Instruction::GetElementPtr) {
if (GlobalVariable *annoteStr =
dyn_cast<GlobalVariable>(note->getOperand(0))) {
if (ConstantDataSequential *data =
dyn_cast<ConstantDataSequential>(
annoteStr->getInitializer())) {
if (data->isString()) {
annotation += data->getAsString().lower() + " ";
}
}
}
}
}
}
}
}
}
}
return annotation;
}
示例14: IsConstantOffsetFromGlobal
/// IsConstantOffsetFromGlobal - If this constant is actually a constant offset
/// from a global, return the global and the constant. Because of
/// constantexprs, this function is recursive.
static bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
int64_t &Offset, const TargetData &TD) {
// Trivial case, constant is the global.
if ((GV = dyn_cast<GlobalValue>(C))) {
Offset = 0;
return true;
}
// Otherwise, if this isn't a constant expr, bail out.
ConstantExpr *CE = dyn_cast<ConstantExpr>(C);
if (!CE) return false;
// Look through ptr->int and ptr->ptr casts.
if (CE->getOpcode() == Instruction::PtrToInt ||
CE->getOpcode() == Instruction::BitCast)
return IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD);
// i32* getelementptr ([5 x i32]* @a, i32 0, i32 5)
if (CE->getOpcode() == Instruction::GetElementPtr) {
// Cannot compute this if the element type of the pointer is missing size
// info.
if (!cast<PointerType>(CE->getOperand(0)->getType())->getElementType()->isSized())
return false;
// If the base isn't a global+constant, we aren't either.
if (!IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD))
return false;
// Otherwise, add any offset that our operands provide.
gep_type_iterator GTI = gep_type_begin(CE);
for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i, ++GTI) {
ConstantInt *CI = dyn_cast<ConstantInt>(CE->getOperand(i));
if (!CI) return false; // Index isn't a simple constant?
if (CI->getZExtValue() == 0) continue; // Not adding anything.
if (const StructType *ST = dyn_cast<StructType>(*GTI)) {
// N = N + Offset
Offset += TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue());
} else {
const SequentialType *SQT = cast<SequentialType>(*GTI);
Offset += TD.getTypeSize(SQT->getElementType())*CI->getSExtValue();
}
}
return true;
}
return false;
}
示例15: if
/**
* 将ConstantExpr转换为对应的Constant类型
*/
Constant* Transfer::expr2Constant(Expr* expr, Type* type) {
Constant* param = NULL;
if (type->isIntegerTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
param = ConstantInt::get(type, constantExpr->getAPValue());
} else if (type->isFloatTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
APFloat apValue(APFloat::IEEEsingle, constantExpr->getAPValue());
param = ConstantFP::get(type->getContext(), apValue);
} else if (type->isDoubleTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
APFloat apValue(APFloat::IEEEdouble, constantExpr->getAPValue());
param = ConstantFP::get(type->getContext(), apValue);
} else if (type->isPointerTy()) {
ConstantExpr* constantExpr = dyn_cast<ConstantExpr>(expr);
param = ConstantInt::get(
Type::getIntNTy(type->getContext(),
Context::get().getPointerWidth()),
constantExpr->getAPValue());
} else {
assert(0 && "not support type");
}
return param;
}