//===--- LLVMSwiftAA.cpp - LLVM Alias Analysis for Swift ------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #include "swift/LLVMPasses/Passes.h" #include "LLVMARCOpts.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Module.h" using namespace llvm; using swift::SwiftAAResult; using swift::SwiftAAWrapperPass; //===----------------------------------------------------------------------===// // Alias Analysis Result //===----------------------------------------------------------------------===// llvm::ModRefInfo SwiftAAResult::getModRefInfo(llvm::ImmutableCallSite CS, const llvm::MemoryLocation &Loc) { // We know the mod-ref behavior of various runtime functions. switch (classifyInstruction(*CS.getInstruction())) { case RT_AllocObject: case RT_NoMemoryAccessed: case RT_Retain: case RT_RetainUnowned: case RT_CheckUnowned: case RT_ObjCRetain: case RT_BridgeRetain: case RT_UnknownRetain: case RT_RetainN: case RT_UnknownRetainN: case RT_BridgeRetainN: case RT_FixLifetime: // These entrypoints don't modify any compiler-visible state. return MRI_NoModRef; case RT_ReleaseN: case RT_UnknownReleaseN: case RT_BridgeReleaseN: case RT_Release: case RT_ObjCRelease: case RT_BridgeRelease: case RT_UnknownRelease: case RT_Unknown: break; } return AAResultBase::getModRefInfo(CS, Loc); } //===----------------------------------------------------------------------===// // Alias Analysis Wrapper Pass //===----------------------------------------------------------------------===// char SwiftAAWrapperPass::ID = 0; INITIALIZE_PASS_BEGIN(SwiftAAWrapperPass, "swift-aa", "Swift Alias Analysis", false, true) INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) INITIALIZE_PASS_END(SwiftAAWrapperPass, "swift-aa", "Swift Alias Analysis", false, true) SwiftAAWrapperPass::SwiftAAWrapperPass() : ImmutablePass(ID) { initializeSwiftAAWrapperPassPass(*PassRegistry::getPassRegistry()); } bool SwiftAAWrapperPass::doInitialization(Module &M) { Result.reset(new SwiftAAResult( getAnalysis().getTLI())); return false; } bool SwiftAAWrapperPass::doFinalization(Module &M) { Result.reset(); return false; } void SwiftAAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequired(); } //===----------------------------------------------------------------------===// // Top Level Entry Point //===----------------------------------------------------------------------===// llvm::ImmutablePass *swift::createSwiftAAWrapperPass() { return new SwiftAAWrapperPass(); }