blob: 0b9c2c1448b44f0687629475fdaf7e452048e881 [file] [log] [blame]
//===--- SILPrintContext.h - Context for SIL print functions ----*- C++ -*-===//
// This source file is part of the 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 for license information
// See for the list of Swift project authors
#include "swift/AST/SILOptions.h"
#include "swift/SIL/SILDebugScope.h"
#include "swift/SIL/SILValue.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/raw_ostream.h"
namespace swift {
class SILDebugScope;
class SILInstruction;
class SILFunction;
class SILBasicBlock;
/// Used as context for the SIL print functions.
class SILPrintContext {
struct ID {
enum ID_Kind { SILBasicBlock, SILUndef, SSAValue, Null } Kind;
unsigned Number;
// A stable ordering of ID objects.
bool operator<(ID Other) const {
if (unsigned(Kind) < unsigned(Other.Kind))
return true;
if (Number < Other.Number)
return true;
return false;
void print(raw_ostream &OS);
// Cache block and value identifiers for this function. This is useful in
// general for identifying entities, not just emitting textual SIL.
const void *ContextFunctionOrBlock = nullptr;
llvm::DenseMap<const SILBasicBlock *, unsigned> BlocksToIDMap;
llvm::DenseMap<const SILNode *, unsigned> ValueToIDMap;
llvm::raw_ostream &OutStream;
llvm::DenseMap<const SILDebugScope *, unsigned> ScopeToIDMap;
/// Dump more information in the SIL output.
bool Verbose;
/// Sort all kind of tables to ease diffing.
bool SortedSIL;
/// Print debug locations and scopes.
bool DebugInfo;
/// See \ref FrontendOptions.PrintFullConvention.
bool PrintFullConvention;
/// Constructor with default values for options.
/// DebugInfo will be set according to the -sil-print-debuginfo option.
SILPrintContext(llvm::raw_ostream &OS, bool Verbose = false,
bool SortedSIL = false, bool PrintFullConvention = false);
/// Constructor based on SILOptions.
/// DebugInfo will be set according to the -sil-print-debuginfo option.
SILPrintContext(llvm::raw_ostream &OS, const SILOptions &Opts);
SILPrintContext(llvm::raw_ostream &OS, bool Verbose, bool SortedSIL,
bool DebugInfo, bool PrintFullConvention);
virtual ~SILPrintContext();
void setContext(const void *FunctionOrBlock);
// Initialized block IDs from the order provided in `blocks`.
void initBlockIDs(ArrayRef<const SILBasicBlock *> Blocks);
/// Returns the output stream for printing.
llvm::raw_ostream &OS() const { return OutStream; }
/// Returns true if the SIL output should be sorted.
bool sortSIL() const { return SortedSIL; }
/// Returns true if verbose SIL should be printed.
bool printVerbose() const { return Verbose; }
/// Returns true if debug locations and scopes should be printed.
bool printDebugInfo() const { return DebugInfo; }
/// Returns true if the entire @convention(c, cType: ..) should be printed.
bool printFullConvention() const { return PrintFullConvention; }
SILPrintContext::ID getID(const SILBasicBlock *Block);
SILPrintContext::ID getID(const SILNode *node);
/// Returns true if the \p Scope has and ID assigned.
bool hasScopeID(const SILDebugScope *Scope) const {
return ScopeToIDMap.count(Scope) != 0;
/// Returns the ID of \p Scope.
unsigned getScopeID(const SILDebugScope *Scope) const {
return ScopeToIDMap.lookup(Scope);
/// Assigns the next available ID to \p Scope.
unsigned assignScopeID(const SILDebugScope *Scope) {
unsigned ID = ScopeToIDMap.size() + 1;
ScopeToIDMap.insert({Scope, ID});
return ID;
/// Callback which is invoked by the SILPrinter before the instruction \p I
/// is written.
virtual void printInstructionCallBack(const SILInstruction *I);
raw_ostream &operator<<(raw_ostream &OS, SILPrintContext::ID i);
} // end namespace swift