Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(364)

Unified Diff: lib/Transforms/MinSFI/SandboxIndirectCalls.cpp

Issue 1151093004: Changes from 3.7 merge to files not in upstream (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/Transforms/MinSFI/SandboxIndirectCalls.cpp
diff --git a/lib/Transforms/MinSFI/SandboxIndirectCalls.cpp b/lib/Transforms/MinSFI/SandboxIndirectCalls.cpp
index 7ac4b5803a15b85093f121511616043461ca4f63..319129a1f777ae8f300bcc9578515a200add5be3 100644
--- a/lib/Transforms/MinSFI/SandboxIndirectCalls.cpp
+++ b/lib/Transforms/MinSFI/SandboxIndirectCalls.cpp
@@ -67,10 +67,10 @@ static inline size_t RoundToPowerOf2(size_t n) {
return NextPowerOf2(n);
}
-static inline bool IsPtrToIntUse(const Function::user_iterator &FuncUser) {
- if (isa<PtrToIntInst>(*FuncUser))
+static inline bool IsPtrToIntUse(const Use &FuncUse) {
+ if (isa<PtrToIntInst>(FuncUse.getUser()))
return true;
- else if (ConstantExpr *Expr = dyn_cast<ConstantExpr>(*FuncUser))
+ else if (auto *Expr = dyn_cast<ConstantExpr>(FuncUse.getUser()))
return Expr->getOpcode() == Instruction::PtrToInt;
else
return false;
@@ -78,11 +78,11 @@ static inline bool IsPtrToIntUse(const Function::user_iterator &FuncUser) {
// Function use is a direct call if the user is a call instruction and
// the function is its last operand.
-static inline bool IsDirectCallUse(const Function::user_iterator &FuncUser) {
- if (CallInst *Call = dyn_cast<CallInst>(*FuncUser))
- return FuncUser.getOperandNo() == Call->getNumArgOperands();
- else
- return false;
+static inline bool IsDirectCallUse(const Use &FuncUse) {
+ if (auto *Call = dyn_cast<CallInst>(FuncUse.getUser())) {
+ return FuncUse.getOperandNo() == Call->getNumOperands() - 1;
+ }
+ return false;
}
bool SandboxIndirectCalls::runOnModule(Module &M) {
@@ -98,15 +98,13 @@ bool SandboxIndirectCalls::runOnModule(Module &M) {
for (Module::iterator Func = M.begin(), E = M.end(); Func != E; ++Func) {
bool HasIndirectUse = false;
Constant *Index = ConstantInt::get(IntPtrType, AddrTakenFuncs.size() + 1);
- for (Function::user_iterator User = Func->user_begin(),
- E = Func->user_end();
- User != E; ++User) {
- if (IsPtrToIntUse(User)) {
+ for (auto &Use : Func->uses()) {
+ if (IsPtrToIntUse(Use)) {
HasIndirectUse = true;
- (*User)->replaceAllUsesWith(Index);
- if (Instruction *UserInst = dyn_cast<Instruction>(*User))
+ Use.getUser()->replaceAllUsesWith(Index);
+ if (auto *UserInst = dyn_cast<Instruction>(Use.getUser()))
UserInst->eraseFromParent();
- } else if (!IsDirectCallUse(User)) {
+ } else if (!IsDirectCallUse(Use)) {
report_fatal_error("SandboxIndirectCalls: Invalid reference to "
"function @" + Func->getName());
}
@@ -176,8 +174,9 @@ bool SandboxIndirectCalls::runOnModule(Module &M) {
Instruction *MaskedIndex =
BinaryOperator::CreateAnd(FuncIndex, IndexMask, "", Call);
Value *Indexes[] = { ConstantInt::get(I32, 0), MaskedIndex };
- Instruction *TableElemPtr =
- GetElementPtrInst::Create(GlobalVar, Indexes, "", Call);
+ Instruction *TableElemPtr = GetElementPtrInst::Create(
+ cast<PointerType>(GlobalVar->getType())->getElementType(),
+ GlobalVar, Indexes, "", Call);
FuncPtr = CopyDebug(new LoadInst(TableElemPtr, "", Call), Cast);
} else {
// There is no function table for this signature, i.e. the module

Powered by Google App Engine
This is Rietveld 408576698