| //===--- SerializeSILPass.cpp ---------------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #define DEBUG_TYPE "serialize-sil" |
| #include "swift/Strings.h" |
| #include "swift/SILOptimizer/PassManager/Passes.h" |
| #include "swift/SILOptimizer/PassManager/Transforms.h" |
| |
| using namespace swift; |
| |
| /// A utility pass to serialize a SILModule at any place inside the optimization |
| /// pipeline. |
| class SerializeSILPass : public SILModuleTransform { |
| /// Removes [serialized] from all functions. This allows for more |
| /// optimizations and for a better dead function elimination. |
| void removeSerializedFlagFromAllFunctions(SILModule &M) { |
| for (auto &F : M) { |
| F.setSerialized(IsSerialized_t::IsNotSerialized); |
| } |
| } |
| |
| public: |
| SerializeSILPass() {} |
| void run() override { |
| auto &M = *getModule(); |
| // Nothing to do if the module was serialized already. |
| if (M.isSerialized()) |
| return; |
| |
| // Mark all reachable functions as "anchors" so that they are not |
| // removed later by the dead function elimination pass. This |
| // is required, because clients may reference any of the |
| // serialized functions or anything referenced from them. Therefore, |
| // to avoid linker errors, the object file of the current module should |
| // contain all the symbols which were alive at the time of serialization. |
| DEBUG(llvm::dbgs() << "Serializing SILModule in SerializeSILPass\n"); |
| getModule()->serialize(); |
| removeSerializedFlagFromAllFunctions(M); |
| } |
| }; |
| |
| SILTransform *swift::createSerializeSILPass() { |
| return new SerializeSILPass(); |
| } |