Skip to content

Commit

Permalink
[CrossDSOCFI] Change the pass so that it doesn't require doInitializa…
Browse files Browse the repository at this point in the history
…tion()

Differential Revision:  http://reviews.llvm.org/D21357

llvm-svn: 274910
  • Loading branch information
dcci committed Jul 8, 2016
1 parent 6091492 commit b4b9db8
Showing 1 changed file with 10 additions and 19 deletions.
29 changes: 10 additions & 19 deletions llvm/lib/Transforms/IPO/CrossDSOCFI.cpp
Expand Up @@ -46,13 +46,10 @@ struct CrossDSOCFI : public ModulePass {
initializeCrossDSOCFIPass(*PassRegistry::getPassRegistry());
}

Module *M;
MDNode *VeryLikelyWeights;

ConstantInt *extractNumericTypeId(MDNode *MD);
void buildCFICheck();

bool doInitialization(Module &M) override;
void buildCFICheck(Module &M);
bool runOnModule(Module &M) override;
};

Expand All @@ -65,14 +62,6 @@ char CrossDSOCFI::ID = 0;

ModulePass *llvm::createCrossDSOCFIPass() { return new CrossDSOCFI; }

bool CrossDSOCFI::doInitialization(Module &Mod) {
M = &Mod;
VeryLikelyWeights =
MDBuilder(M->getContext()).createBranchWeights((1U << 20) - 1, 1);

return false;
}

/// Extracts a numeric type identifier from an MDNode containing type metadata.
ConstantInt *CrossDSOCFI::extractNumericTypeId(MDNode *MD) {
// This check excludes vtables for classes inside anonymous namespaces.
Expand All @@ -88,12 +77,12 @@ ConstantInt *CrossDSOCFI::extractNumericTypeId(MDNode *MD) {
}

/// buildCFICheck - emits __cfi_check for the current module.
void CrossDSOCFI::buildCFICheck() {
void CrossDSOCFI::buildCFICheck(Module &M) {
// FIXME: verify that __cfi_check ends up near the end of the code section,
// but before the jump slots created in LowerTypeTests.
llvm::DenseSet<uint64_t> TypeIds;
SmallVector<MDNode *, 2> Types;
for (GlobalObject &GO : M->global_objects()) {
for (GlobalObject &GO : M.global_objects()) {
Types.clear();
GO.getMetadata(LLVMContext::MD_type, Types);
for (MDNode *Type : Types) {
Expand All @@ -105,8 +94,8 @@ void CrossDSOCFI::buildCFICheck() {
}
}

LLVMContext &Ctx = M->getContext();
Constant *C = M->getOrInsertFunction(
LLVMContext &Ctx = M.getContext();
Constant *C = M.getOrInsertFunction(
"__cfi_check", Type::getVoidTy(Ctx), Type::getInt64Ty(Ctx),
Type::getInt8PtrTy(Ctx), Type::getInt8PtrTy(Ctx), nullptr);
Function *F = dyn_cast<Function>(C);
Expand All @@ -125,7 +114,7 @@ void CrossDSOCFI::buildCFICheck() {

BasicBlock *TrapBB = BasicBlock::Create(Ctx, "fail", F);
IRBuilder<> IRBFail(TrapBB);
Constant *CFICheckFailFn = M->getOrInsertFunction(
Constant *CFICheckFailFn = M.getOrInsertFunction(
"__cfi_check_fail", Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx),
Type::getInt8PtrTy(Ctx), nullptr);
IRBFail.CreateCall(CFICheckFailFn, {&CFICheckFailData, &Addr});
Expand All @@ -140,7 +129,7 @@ void CrossDSOCFI::buildCFICheck() {
ConstantInt *CaseTypeId = ConstantInt::get(Type::getInt64Ty(Ctx), TypeId);
BasicBlock *TestBB = BasicBlock::Create(Ctx, "test", F);
IRBuilder<> IRBTest(TestBB);
Function *BitsetTestFn = Intrinsic::getDeclaration(M, Intrinsic::type_test);
Function *BitsetTestFn = Intrinsic::getDeclaration(&M, Intrinsic::type_test);

Value *Test = IRBTest.CreateCall(
BitsetTestFn, {&Addr, MetadataAsValue::get(
Expand All @@ -157,8 +146,10 @@ bool CrossDSOCFI::runOnModule(Module &M) {
if (skipModule(M))
return false;

VeryLikelyWeights =
MDBuilder(M.getContext()).createBranchWeights((1U << 20) - 1, 1);
if (M.getModuleFlag("Cross-DSO CFI") == nullptr)
return false;
buildCFICheck();
buildCFICheck(M);
return true;
}

0 comments on commit b4b9db8

Please sign in to comment.