mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
54 lines
1.9 KiB
C++
54 lines
1.9 KiB
C++
//===--- 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();
|
|
}
|