void NullDerefProtectionTransformer::Transform() { using namespace clang; FunctionDecl* FD = getTransaction()->getWrapperFD(); if (!FD) return; // Copied from Interpreter.cpp; if (!m_MangleCtx) m_MangleCtx.reset(FD->getASTContext().createMangleContext()); std::string mangledName; if (m_MangleCtx->shouldMangleDeclName(FD)) { llvm::raw_string_ostream RawStr(mangledName); switch(FD->getKind()) { case Decl::CXXConstructor: //Ctor_Complete, // Complete object ctor //Ctor_Base, // Base object ctor //Ctor_CompleteAllocating // Complete object allocating ctor (unused) m_MangleCtx->mangleCXXCtor(cast<CXXConstructorDecl>(FD), Ctor_Complete, RawStr); break; case Decl::CXXDestructor: //Dtor_Deleting, // Deleting dtor //Dtor_Complete, // Complete object dtor //Dtor_Base // Base object dtor m_MangleCtx->mangleCXXDtor(cast<CXXDestructorDecl>(FD), Dtor_Deleting, RawStr); break; default : m_MangleCtx->mangleName(FD, RawStr); break; } RawStr.flush(); } else { mangledName = FD->getNameAsString(); } // Find the function in the module. llvm::Function* F = getTransaction()->getModule()->getFunction(mangledName); if (F) runOnFunction(*F); }
bool ReplaceCallExprVisitor::VisitCallExpr(CallExpr *CE) { if (ConsumerInstance->isInIncludedFile(CE)) return true; FunctionDecl *FD = CE->getDirectCallee(); if (!FD) return true; const Type *T; // Because CE->getCallReturnType() fails on builtin functions, // try to get returntype from FD (probably not really accurate thought) if (FD->getBuiltinID()) T = FD->getReturnType().getTypePtr(); else T = CE->getCallReturnType(FD->getASTContext()).getTypePtr(); if (T->isVoidType()) return true; ConsumerInstance->AllCallExprs.push_back(CE); return true; }