14a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner//===--- ModuleLoader.h - Module Loader Interface ---------------*- C++ -*-===// 22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 94a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner// 104a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner// This file defines the ModuleLoader interface, which is responsible for 114a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner// loading named modules. 124a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner// 134a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner//===----------------------------------------------------------------------===// 144a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner#ifndef LLVM_CLANG_LEX_MODULE_LOADER_H 154a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner#define LLVM_CLANG_LEX_MODULE_LOADER_H 164a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner 174a81067a84e18c44898149f5afdbaa3e18b3e821Chris Lattner#include "clang/Basic/Module.h" 18be577659d3c1222cc58c33628c0baddb94d241abChris Lattner#include "clang/Basic/SourceLocation.h" 193251e81d793a293b78f4914be6093b405c24fc2aChandler Carruth#include "llvm/ADT/ArrayRef.h" 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/PointerIntPair.h" 2108e322db8a544d100f7518cfbd39ef8c13067698Chris Lattner 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruthnamespace clang { 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthclass IdentifierInfo; 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruthclass Module; 2608e322db8a544d100f7518cfbd39ef8c13067698Chris Lattner 27be577659d3c1222cc58c33628c0baddb94d241abChris Lattner/// \brief A sequence of identifier/location pairs used to describe a particular 28a782e75d487006cafffdc256b3c623307fee4dcfChris Lattner/// module or submodule, e.g., std.vector. 2945cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattnertypedef ArrayRef<std::pair<IdentifierInfo *, SourceLocation> > ModuleIdPath; 30a10df5028211fc897751d23e91d035db47d23facChris Lattner 31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke/// \brief Describes the result of attempting to load a module. 3208e322db8a544d100f7518cfbd39ef8c13067698Chris Lattnerclass ModuleLoadResult { 336da12e6767100d3f874c2e05aae74e4fe24357b1Chris Lattner llvm::PointerIntPair<Module *, 1, bool> Storage; 3408e322db8a544d100f7518cfbd39ef8c13067698Chris Lattner 3508e322db8a544d100f7518cfbd39ef8c13067698Chris Lattnerpublic: 3608e322db8a544d100f7518cfbd39ef8c13067698Chris Lattner ModuleLoadResult() : Storage() { } 3775f9abf51706242a745e05841598f68e64143494Devang Patel 3875f9abf51706242a745e05841598f68e64143494Devang Patel ModuleLoadResult(Module *module, bool missingExpected) 3975f9abf51706242a745e05841598f68e64143494Devang Patel : Storage(module, missingExpected) { } 40db2659be58a5d9a820eeb5884f284143f6676f86Dale Johannesen 4175f9abf51706242a745e05841598f68e64143494Devang Patel operator Module *() const { return Storage.getPointer(); } 42844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 43844731a7f1909f55935e3514c9e713a62d67662eDan Gohman /// \brief Determines whether the module, which failed to load, was 4475f9abf51706242a745e05841598f68e64143494Devang Patel /// actually a submodule that we expected to see (based on implying the 4575f9abf51706242a745e05841598f68e64143494Devang Patel /// submodule from header structure), but didn't materialize in the actual 461997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel /// module. 470e122d1c2422285c872f68fc0ae1f7e5d2739572Andrew Trick bool isMissingExpected() const { return Storage.getInt(); } 480e122d1c2422285c872f68fc0ae1f7e5d2739572Andrew Trick}; 4975f9abf51706242a745e05841598f68e64143494Devang Patel 5075f9abf51706242a745e05841598f68e64143494Devang Patel/// \brief Abstract interface for a module loader. 5175f9abf51706242a745e05841598f68e64143494Devang Patel/// 5275f9abf51706242a745e05841598f68e64143494Devang Patel/// This abstract interface describes a module loader, which is responsible 5375f9abf51706242a745e05841598f68e64143494Devang Patel/// for resolving a module name (e.g., "std") to an actual module file, and 5440b6fdb81e12b40dd41c9f9f07befb60ec7291c3Owen Anderson/// then loading that module. 5540b6fdb81e12b40dd41c9f9f07befb60ec7291c3Owen Andersonclass ModuleLoader { 5640b6fdb81e12b40dd41c9f9f07befb60ec7291c3Owen Andersonpublic: 57905c7e9a0459ffdffbee3e6fffe0dbf5e5c9583cBill Wendling ModuleLoader() : HadFatalFailure(false) {} 58905c7e9a0459ffdffbee3e6fffe0dbf5e5c9583cBill Wendling 5975f9abf51706242a745e05841598f68e64143494Devang Patel virtual ~ModuleLoader(); 6075f9abf51706242a745e05841598f68e64143494Devang Patel 6175f9abf51706242a745e05841598f68e64143494Devang Patel /// \brief Attempt to load the given module. 6275f9abf51706242a745e05841598f68e64143494Devang Patel /// 6375f9abf51706242a745e05841598f68e64143494Devang Patel /// This routine attempts to load the module described by the given 6475f9abf51706242a745e05841598f68e64143494Devang Patel /// parameters. 6575f9abf51706242a745e05841598f68e64143494Devang Patel /// 6675f9abf51706242a745e05841598f68e64143494Devang Patel /// \param ImportLoc The location of the 'import' keyword. 67505f36aedec873d99bdaabb8836eac704185f086Devang Patel /// 68505f36aedec873d99bdaabb8836eac704185f086Devang Patel /// \param Path The identifiers (and their locations) of the module 69505f36aedec873d99bdaabb8836eac704185f086Devang Patel /// "path", e.g., "std.vector" would be split into "std" and "vector". 70505f36aedec873d99bdaabb8836eac704185f086Devang Patel /// 713660ecabbb85b31308f38938ce3f56f0a330a84bChris Lattner /// \param Visibility The visibility provided for the names in the loaded 723660ecabbb85b31308f38938ce3f56f0a330a84bChris Lattner /// module. 733660ecabbb85b31308f38938ce3f56f0a330a84bChris Lattner /// 7475f9abf51706242a745e05841598f68e64143494Devang Patel /// \param IsInclusionDirective Indicates that this module is being loaded 7575f9abf51706242a745e05841598f68e64143494Devang Patel /// implicitly, due to the presence of an inclusion directive. Otherwise, 762e48e53d980ee9af1bc96d8ffd9d089cb8d3b5efDavid Greene /// it is being loaded due to an import declaration. 7775f9abf51706242a745e05841598f68e64143494Devang Patel /// 7875f9abf51706242a745e05841598f68e64143494Devang Patel /// \returns If successful, returns the loaded module. Otherwise, returns 798a757aeac436ecd27e28a39b10032fd6fda33780Dan Gohman /// NULL to indicate that the module could not be loaded. 8075f9abf51706242a745e05841598f68e64143494Devang Patel virtual ModuleLoadResult loadModule(SourceLocation ImportLoc, 8175f9abf51706242a745e05841598f68e64143494Devang Patel ModuleIdPath Path, 8275f9abf51706242a745e05841598f68e64143494Devang Patel Module::NameVisibilityKind Visibility, 8375f9abf51706242a745e05841598f68e64143494Devang Patel bool IsInclusionDirective) = 0; 8475f9abf51706242a745e05841598f68e64143494Devang Patel 8545cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner /// \brief Make the given module visible. 8645cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner virtual void makeModuleVisible(Module *Mod, 8775f9abf51706242a745e05841598f68e64143494Devang Patel Module::NameVisibilityKind Visibility, 8875f9abf51706242a745e05841598f68e64143494Devang Patel SourceLocation ImportLoc, 8984da80d10b472332d079c58d21aa48b82e636274Devang Patel bool Complain) = 0; 9075f9abf51706242a745e05841598f68e64143494Devang Patel 9175f9abf51706242a745e05841598f68e64143494Devang Patel bool HadFatalFailure; 92f3a1c15b750c63accd3597b42d73792458b247a9Chris Lattner}; 93f3a1c15b750c63accd3597b42d73792458b247a9Chris Lattner 9408e322db8a544d100f7518cfbd39ef8c13067698Chris Lattner} 9508e322db8a544d100f7518cfbd39ef8c13067698Chris Lattner 9608e322db8a544d100f7518cfbd39ef8c13067698Chris Lattner#endif 972decb22222cac46bb1d9163e7b89d7e5be8ef65fChris Lattner