//===--- FunctionOrderPrinter.cpp - Function ordering test pass -----------===// // // 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 // //===----------------------------------------------------------------------===// // // This pass prints a bottom-up ordering of functions in the module (in the // sense that each function is printed before functions that call it). // //===----------------------------------------------------------------------===// #include "swift/SILOptimizer/Analysis/FunctionOrder.h" #include "swift/Demangling/Demangle.h" #include "swift/SILOptimizer/Analysis/BasicCalleeAnalysis.h" #include "swift/SIL/SILFunction.h" #include "swift/SIL/SILModule.h" #include "swift/SILOptimizer/PassManager/Transforms.h" #include "llvm/Support/raw_ostream.h" using namespace swift; #define DEBUG_TYPE "function-order-printer" namespace { class FunctionOrderPrinterPass : public SILModuleTransform { BasicCalleeAnalysis *BCA; /// The entry point to the transformation. void run() override { BCA = getAnalysis(); auto &M = *getModule(); BottomUpFunctionOrder Orderer(M, BCA); llvm::outs() << "Bottom up function order:\n"; auto SCCs = Orderer.getSCCs(); for (auto &SCC : SCCs) { std::string Indent; if (SCC.size() != 1) { llvm::outs() << "Non-trivial SCC:\n"; Indent = std::string(2, ' '); } for (auto *F : SCC) { llvm::outs() << Indent << Demangle::demangleSymbolAsString(F->getName()) << "\n"; } } llvm::outs() << "\n"; } }; } // end anonymous namespace SILTransform *swift::createFunctionOrderPrinter() { return new FunctionOrderPrinterPass(); }