mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-26 07:24:25 +00:00
[asan] fix the ObjC support (asan Issue #33)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149300 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -155,6 +155,7 @@ struct AddressSanitizer : public ModulePass {
|
|||||||
Instruction *InsertBefore, bool IsWrite);
|
Instruction *InsertBefore, bool IsWrite);
|
||||||
Value *memToShadow(Value *Shadow, IRBuilder<> &IRB);
|
Value *memToShadow(Value *Shadow, IRBuilder<> &IRB);
|
||||||
bool handleFunction(Module &M, Function &F);
|
bool handleFunction(Module &M, Function &F);
|
||||||
|
bool maybeInsertAsanInitAtFunctionEntry(Function &F);
|
||||||
bool poisonStackInFunction(Module &M, Function &F);
|
bool poisonStackInFunction(Module &M, Function &F);
|
||||||
virtual bool runOnModule(Module &M);
|
virtual bool runOnModule(Module &M);
|
||||||
bool insertGlobalRedzones(Module &M);
|
bool insertGlobalRedzones(Module &M);
|
||||||
@ -617,9 +618,29 @@ bool AddressSanitizer::runOnModule(Module &M) {
|
|||||||
return Res;
|
return Res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) {
|
||||||
|
// For each NSObject descendant having a +load method, this method is invoked
|
||||||
|
// by the ObjC runtime before any of the static constructors is called.
|
||||||
|
// Therefore we need to instrument such methods with a call to __asan_init
|
||||||
|
// at the beginning in order to initialize our runtime before any access to
|
||||||
|
// the shadow memory.
|
||||||
|
// We cannot just ignore these methods, because they may call other
|
||||||
|
// instrumented functions.
|
||||||
|
if (F.getName().find(" load]") != std::string::npos) {
|
||||||
|
IRBuilder<> IRB(F.begin()->begin());
|
||||||
|
IRB.CreateCall(AsanInitFunction);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool AddressSanitizer::handleFunction(Module &M, Function &F) {
|
bool AddressSanitizer::handleFunction(Module &M, Function &F) {
|
||||||
if (BL->isIn(F)) return false;
|
if (BL->isIn(F)) return false;
|
||||||
if (&F == AsanCtorFunction) return false;
|
if (&F == AsanCtorFunction) return false;
|
||||||
|
|
||||||
|
// If needed, insert __asan_init before checking for AddressSafety attr.
|
||||||
|
maybeInsertAsanInitAtFunctionEntry(F);
|
||||||
|
|
||||||
if (!F.hasFnAttr(Attribute::AddressSafety)) return false;
|
if (!F.hasFnAttr(Attribute::AddressSafety)) return false;
|
||||||
|
|
||||||
if (!ClDebugFunc.empty() && ClDebugFunc != F.getName())
|
if (!ClDebugFunc.empty() && ClDebugFunc != F.getName())
|
||||||
@ -673,19 +694,6 @@ bool AddressSanitizer::handleFunction(Module &M, Function &F) {
|
|||||||
DEBUG(dbgs() << F);
|
DEBUG(dbgs() << F);
|
||||||
|
|
||||||
bool ChangedStack = poisonStackInFunction(M, F);
|
bool ChangedStack = poisonStackInFunction(M, F);
|
||||||
|
|
||||||
// For each NSObject descendant having a +load method, this method is invoked
|
|
||||||
// by the ObjC runtime before any of the static constructors is called.
|
|
||||||
// Therefore we need to instrument such methods with a call to __asan_init
|
|
||||||
// at the beginning in order to initialize our runtime before any access to
|
|
||||||
// the shadow memory.
|
|
||||||
// We cannot just ignore these methods, because they may call other
|
|
||||||
// instrumented functions.
|
|
||||||
if (F.getName().find(" load]") != std::string::npos) {
|
|
||||||
IRBuilder<> IRB(F.begin()->begin());
|
|
||||||
IRB.CreateCall(AsanInitFunction);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NumInstrumented > 0 || ChangedStack;
|
return NumInstrumented > 0 || ChangedStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user