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