Module.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. //===--- Module.cpp - Describe a module -----------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines the Module class, which describes a module in the source
  11. // code.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/Basic/Module.h"
  15. #include "clang/Basic/FileManager.h"
  16. #include "clang/Basic/LangOptions.h"
  17. #include "clang/Basic/TargetInfo.h"
  18. #include "llvm/ADT/SmallVector.h"
  19. #include "llvm/ADT/StringSwitch.h"
  20. #include "llvm/Support/ErrorHandling.h"
  21. #include "llvm/Support/raw_ostream.h"
  22. using namespace clang;
  23. Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent,
  24. bool IsFramework, bool IsExplicit)
  25. : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent),
  26. Umbrella(), ASTFile(0), IsAvailable(true), IsFromModuleFile(false),
  27. IsFramework(IsFramework), IsExplicit(IsExplicit), IsSystem(false),
  28. InferSubmodules(false), InferExplicitSubmodules(false),
  29. InferExportWildcard(false), NameVisibility(Hidden)
  30. {
  31. if (Parent) {
  32. if (!Parent->isAvailable())
  33. IsAvailable = false;
  34. if (Parent->IsSystem)
  35. IsSystem = true;
  36. Parent->SubModuleIndex[Name] = Parent->SubModules.size();
  37. Parent->SubModules.push_back(this);
  38. }
  39. }
  40. Module::~Module() {
  41. for (submodule_iterator I = submodule_begin(), IEnd = submodule_end();
  42. I != IEnd; ++I) {
  43. delete *I;
  44. }
  45. }
  46. /// \brief Determine whether a translation unit built using the current
  47. /// language options has the given feature.
  48. static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
  49. const TargetInfo &Target) {
  50. return llvm::StringSwitch<bool>(Feature)
  51. .Case("altivec", LangOpts.AltiVec)
  52. .Case("blocks", LangOpts.Blocks)
  53. .Case("cplusplus", LangOpts.CPlusPlus)
  54. .Case("cplusplus11", LangOpts.CPlusPlus0x)
  55. .Case("objc", LangOpts.ObjC1)
  56. .Case("objc_arc", LangOpts.ObjCAutoRefCount)
  57. .Case("opencl", LangOpts.OpenCL)
  58. .Case("tls", Target.isTLSSupported())
  59. .Default(Target.hasFeature(Feature));
  60. }
  61. bool
  62. Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target,
  63. StringRef &Feature) const {
  64. if (IsAvailable)
  65. return true;
  66. for (const Module *Current = this; Current; Current = Current->Parent) {
  67. for (unsigned I = 0, N = Current->Requires.size(); I != N; ++I) {
  68. if (!hasFeature(Current->Requires[I], LangOpts, Target)) {
  69. Feature = Current->Requires[I];
  70. return false;
  71. }
  72. }
  73. }
  74. llvm_unreachable("could not find a reason why module is unavailable");
  75. }
  76. bool Module::isSubModuleOf(Module *Other) const {
  77. const Module *This = this;
  78. do {
  79. if (This == Other)
  80. return true;
  81. This = This->Parent;
  82. } while (This);
  83. return false;
  84. }
  85. const Module *Module::getTopLevelModule() const {
  86. const Module *Result = this;
  87. while (Result->Parent)
  88. Result = Result->Parent;
  89. return Result;
  90. }
  91. std::string Module::getFullModuleName() const {
  92. llvm::SmallVector<StringRef, 2> Names;
  93. // Build up the set of module names (from innermost to outermost).
  94. for (const Module *M = this; M; M = M->Parent)
  95. Names.push_back(M->Name);
  96. std::string Result;
  97. for (llvm::SmallVector<StringRef, 2>::reverse_iterator I = Names.rbegin(),
  98. IEnd = Names.rend();
  99. I != IEnd; ++I) {
  100. if (!Result.empty())
  101. Result += '.';
  102. Result += *I;
  103. }
  104. return Result;
  105. }
  106. const DirectoryEntry *Module::getUmbrellaDir() const {
  107. if (const FileEntry *Header = getUmbrellaHeader())
  108. return Header->getDir();
  109. return Umbrella.dyn_cast<const DirectoryEntry *>();
  110. }
  111. void Module::addRequirement(StringRef Feature, const LangOptions &LangOpts,
  112. const TargetInfo &Target) {
  113. Requires.push_back(Feature);
  114. // If this feature is currently available, we're done.
  115. if (hasFeature(Feature, LangOpts, Target))
  116. return;
  117. if (!IsAvailable)
  118. return;
  119. llvm::SmallVector<Module *, 2> Stack;
  120. Stack.push_back(this);
  121. while (!Stack.empty()) {
  122. Module *Current = Stack.back();
  123. Stack.pop_back();
  124. if (!Current->IsAvailable)
  125. continue;
  126. Current->IsAvailable = false;
  127. for (submodule_iterator Sub = Current->submodule_begin(),
  128. SubEnd = Current->submodule_end();
  129. Sub != SubEnd; ++Sub) {
  130. if ((*Sub)->IsAvailable)
  131. Stack.push_back(*Sub);
  132. }
  133. }
  134. }
  135. Module *Module::findSubmodule(StringRef Name) const {
  136. llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name);
  137. if (Pos == SubModuleIndex.end())
  138. return 0;
  139. return SubModules[Pos->getValue()];
  140. }
  141. static void printModuleId(llvm::raw_ostream &OS, const ModuleId &Id) {
  142. for (unsigned I = 0, N = Id.size(); I != N; ++I) {
  143. if (I)
  144. OS << ".";
  145. OS << Id[I].first;
  146. }
  147. }
  148. void Module::print(llvm::raw_ostream &OS, unsigned Indent) const {
  149. OS.indent(Indent);
  150. if (IsFramework)
  151. OS << "framework ";
  152. if (IsExplicit)
  153. OS << "explicit ";
  154. OS << "module " << Name;
  155. if (IsSystem) {
  156. OS.indent(Indent + 2);
  157. OS << " [system]";
  158. }
  159. OS << " {\n";
  160. if (!Requires.empty()) {
  161. OS.indent(Indent + 2);
  162. OS << "requires ";
  163. for (unsigned I = 0, N = Requires.size(); I != N; ++I) {
  164. if (I)
  165. OS << ", ";
  166. OS << Requires[I];
  167. }
  168. OS << "\n";
  169. }
  170. if (const FileEntry *UmbrellaHeader = getUmbrellaHeader()) {
  171. OS.indent(Indent + 2);
  172. OS << "umbrella header \"";
  173. OS.write_escaped(UmbrellaHeader->getName());
  174. OS << "\"\n";
  175. } else if (const DirectoryEntry *UmbrellaDir = getUmbrellaDir()) {
  176. OS.indent(Indent + 2);
  177. OS << "umbrella \"";
  178. OS.write_escaped(UmbrellaDir->getName());
  179. OS << "\"\n";
  180. }
  181. for (unsigned I = 0, N = Headers.size(); I != N; ++I) {
  182. OS.indent(Indent + 2);
  183. OS << "header \"";
  184. OS.write_escaped(Headers[I]->getName());
  185. OS << "\"\n";
  186. }
  187. for (unsigned I = 0, N = ExcludedHeaders.size(); I != N; ++I) {
  188. OS.indent(Indent + 2);
  189. OS << "exclude header \"";
  190. OS.write_escaped(ExcludedHeaders[I]->getName());
  191. OS << "\"\n";
  192. }
  193. for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end();
  194. MI != MIEnd; ++MI)
  195. (*MI)->print(OS, Indent + 2);
  196. for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
  197. OS.indent(Indent + 2);
  198. OS << "export ";
  199. if (Module *Restriction = Exports[I].getPointer()) {
  200. OS << Restriction->getFullModuleName();
  201. if (Exports[I].getInt())
  202. OS << ".*";
  203. } else {
  204. OS << "*";
  205. }
  206. OS << "\n";
  207. }
  208. for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) {
  209. OS.indent(Indent + 2);
  210. OS << "export ";
  211. printModuleId(OS, UnresolvedExports[I].Id);
  212. if (UnresolvedExports[I].Wildcard) {
  213. if (UnresolvedExports[I].Id.empty())
  214. OS << "*";
  215. else
  216. OS << ".*";
  217. }
  218. OS << "\n";
  219. }
  220. if (InferSubmodules) {
  221. OS.indent(Indent + 2);
  222. if (InferExplicitSubmodules)
  223. OS << "explicit ";
  224. OS << "module * {\n";
  225. if (InferExportWildcard) {
  226. OS.indent(Indent + 4);
  227. OS << "export *\n";
  228. }
  229. OS.indent(Indent + 2);
  230. OS << "}\n";
  231. }
  232. OS.indent(Indent);
  233. OS << "}\n";
  234. }
  235. void Module::dump() const {
  236. print(llvm::errs());
  237. }