Faster stack-protector for Android/AArch64.
Bionic has a defined thread-local location for the stack protector cookie. Emit a direct load instead of going through __stack_chk_guard. llvm-svn: 265481
This commit is contained in:
@@ -333,24 +333,20 @@ static bool CreatePrologue(Function *F, Module *M, ReturnInst *RI,
|
||||
AllocaInst *&AI, Value *&StackGuardVar) {
|
||||
bool SupportsSelectionDAGSP = false;
|
||||
PointerType *PtrTy = Type::getInt8PtrTy(RI->getContext());
|
||||
unsigned AddressSpace, Offset;
|
||||
if (TLI->getStackCookieLocation(AddressSpace, Offset)) {
|
||||
Constant *OffsetVal =
|
||||
ConstantInt::get(Type::getInt32Ty(RI->getContext()), Offset);
|
||||
IRBuilder<> B(&F->getEntryBlock().front());
|
||||
|
||||
StackGuardVar =
|
||||
ConstantExpr::getIntToPtr(OffsetVal, PointerType::get(PtrTy,
|
||||
AddressSpace));
|
||||
} else if (TT.isOSOpenBSD()) {
|
||||
StackGuardVar = M->getOrInsertGlobal("__guard_local", PtrTy);
|
||||
cast<GlobalValue>(StackGuardVar)
|
||||
->setVisibility(GlobalValue::HiddenVisibility);
|
||||
} else {
|
||||
SupportsSelectionDAGSP = true;
|
||||
StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);
|
||||
StackGuardVar = TLI->getStackCookieLocation(B);
|
||||
if (!StackGuardVar) {
|
||||
if (TT.isOSOpenBSD()) {
|
||||
StackGuardVar = M->getOrInsertGlobal("__guard_local", PtrTy);
|
||||
cast<GlobalValue>(StackGuardVar)
|
||||
->setVisibility(GlobalValue::HiddenVisibility);
|
||||
} else {
|
||||
SupportsSelectionDAGSP = true;
|
||||
StackGuardVar = M->getOrInsertGlobal("__stack_chk_guard", PtrTy);
|
||||
}
|
||||
}
|
||||
|
||||
IRBuilder<> B(&F->getEntryBlock().front());
|
||||
AI = B.CreateAlloca(PtrTy, nullptr, "StackGuardSlot");
|
||||
LoadInst *LI = B.CreateLoad(StackGuardVar, "StackGuard");
|
||||
B.CreateCall(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
|
||||
|
||||
Reference in New Issue
Block a user