//===--- DeserializeSIL.h - Read SIL ---------------------------*- C++ -*--===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2015 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/Serialization/ModuleFile.h" #include "SILFormat.h" #include "swift/SIL/SILModule.h" #include "swift/Serialization/SerializedSILLoader.h" #include "llvm/ADT/DenseMap.h" namespace llvm { template class OnDiskIterableChainedHashTable; } namespace swift { class SILDeserializer { ModuleFile *MF; SILModule &SILMod; SerializedSILLoader::Callback *Callback; /// The cursor used to lazily load SILFunctions. llvm::BitstreamCursor SILCursor; llvm::BitstreamCursor SILIndexCursor; class FuncTableInfo; using SerializedFuncTable = llvm::OnDiskIterableChainedHashTable; std::unique_ptr FuncTable; std::vector> Funcs; std::unique_ptr VTableList; std::vector> VTables; std::unique_ptr GlobalVarList; std::vector> GlobalVars; std::unique_ptr WitnessTableList; std::vector> WitnessTables; /// A declaration will only llvm::DenseMap ConformanceToWitnessTableMap; /// Data structures used to perform name lookup for local values. llvm::DenseMap LocalValues; llvm::DenseMap> ForwardMRVLocalValues; serialization::ValueID LastValueID = 0; /// Data structures used to perform lookup of basic blocks. llvm::DenseMap BlocksByID; llvm::DenseMap UndefinedBlocks; unsigned BasicBlockID = 0; /// Return the SILBasicBlock of a given ID. SILBasicBlock *getBBForReference(SILFunction *Fn, unsigned ID); SILBasicBlock *getBBForDefinition(SILFunction *Fn, unsigned ID); /// Read a SIL function. SILFunction *readSILFunction(serialization::DeclID, SILFunction *InFunc, StringRef Name, bool declarationOnly); /// Read a SIL basic block within a given SIL function. SILBasicBlock *readSILBasicBlock(SILFunction *Fn, SmallVectorImpl &scratch); /// Read a SIL instruction within a given SIL basic block. bool readSILInstruction(SILFunction *Fn, SILBasicBlock *BB, unsigned RecordKind, SmallVectorImpl &scratch); /// Read the SIL function table. std::unique_ptr readFuncTable(ArrayRef fields, StringRef blobData); /// When an instruction or block argument is defined, this method is used to /// register it and update our symbol table. void setLocalValue(ValueBase *Value, serialization::ValueID Id); /// Get a reference to a local value with the specified ID and type. SILValue getLocalValue(serialization::ValueID Id, unsigned ResultNum, SILType Type); SILFunction *getFuncForReference(StringRef Name, SILType Ty); SILFunction *getFuncForReference(StringRef Name); SILFunction *lookupSILFunction(StringRef Name); SILVTable *readVTable(serialization::DeclID); SILGlobalVariable *readGlobalVar(StringRef Name); SILWitnessTable *readWitnessTable(serialization::DeclID, SILWitnessTable *existingWt, bool declarationOnly); public: Identifier getModuleIdentifier() const { return MF->getAssociatedModule()->getName(); } SILFunction *lookupSILFunction(SILFunction *InFunc); SILVTable *lookupVTable(Identifier Name); SILWitnessTable *lookupWitnessTable(SILWitnessTable *wt); /// Deserialize all SILFunctions, VTables, and WitnessTables inside the /// module and add them to SILMod. /// /// TODO: Globals. void getAll() { getAllSILFunctions(); getAllVTables(); getAllWitnessTables(); } /// Deserialize all SILFunctions inside the module and add them to SILMod. void getAllSILFunctions(); /// Deserialize all VTables inside the module and add them to SILMod. void getAllVTables(); /// Deserialize all WitnessTables inside the module and add them to SILMod. void getAllWitnessTables(); SILDeserializer(ModuleFile *MF, SILModule &M, SerializedSILLoader::Callback *callback); // Out of line to avoid instantiation OnDiskChainedHashTable here. ~SILDeserializer(); }; } // end namespace swift