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/ArrayRef.h" 19 #include "llvm/ADT/SmallVector.h" 20 #include "llvm/ADT/StringSwitch.h" 21 #include "llvm/Support/ErrorHandling.h" 22 #include "llvm/Support/raw_ostream.h" 23 using namespace clang; 24 25 Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent, 26 bool IsFramework, bool IsExplicit) 27 : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), 28 Umbrella(), ASTFile(0), IsAvailable(true), IsFromModuleFile(false), 29 IsFramework(IsFramework), IsExplicit(IsExplicit), IsSystem(false), 30 InferSubmodules(false), InferExplicitSubmodules(false), 31 InferExportWildcard(false), ConfigMacrosExhaustive(false), 32 NameVisibility(Hidden) 33 { 34 if (Parent) { 35 if (!Parent->isAvailable()) 36 IsAvailable = false; 37 if (Parent->IsSystem) 38 IsSystem = true; 39 40 Parent->SubModuleIndex[Name] = Parent->SubModules.size(); 41 Parent->SubModules.push_back(this); 42 } 43 } 44 45 Module::~Module() { 46 for (submodule_iterator I = submodule_begin(), IEnd = submodule_end(); 47 I != IEnd; ++I) { 48 delete *I; 49 } 50 } 51 52 /// \brief Determine whether a translation unit built using the current 53 /// language options has the given feature. 54 static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, 55 const TargetInfo &Target) { 56 return llvm::StringSwitch<bool>(Feature) 57 .Case("altivec", LangOpts.AltiVec) 58 .Case("blocks", LangOpts.Blocks) 59 .Case("cplusplus", LangOpts.CPlusPlus) 60 .Case("cplusplus11", LangOpts.CPlusPlus11) 61 .Case("objc", LangOpts.ObjC1) 62 .Case("objc_arc", LangOpts.ObjCAutoRefCount) 63 .Case("opencl", LangOpts.OpenCL) 64 .Case("tls", Target.isTLSSupported()) 65 .Default(Target.hasFeature(Feature)); 66 } 67 68 bool 69 Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target, 70 StringRef &Feature) const { 71 if (IsAvailable) 72 return true; 73 74 for (const Module *Current = this; Current; Current = Current->Parent) { 75 for (unsigned I = 0, N = Current->Requires.size(); I != N; ++I) { 76 if (!hasFeature(Current->Requires[I], LangOpts, Target)) { 77 Feature = Current->Requires[I]; 78 return false; 79 } 80 } 81 } 82 83 llvm_unreachable("could not find a reason why module is unavailable"); 84 } 85 86 bool Module::isSubModuleOf(Module *Other) const { 87 const Module *This = this; 88 do { 89 if (This == Other) 90 return true; 91 92 This = This->Parent; 93 } while (This); 94 95 return false; 96 } 97 98 const Module *Module::getTopLevelModule() const { 99 const Module *Result = this; 100 while (Result->Parent) 101 Result = Result->Parent; 102 103 return Result; 104 } 105 106 std::string Module::getFullModuleName() const { 107 SmallVector<StringRef, 2> Names; 108 109 // Build up the set of module names (from innermost to outermost). 110 for (const Module *M = this; M; M = M->Parent) 111 Names.push_back(M->Name); 112 113 std::string Result; 114 for (SmallVectorImpl<StringRef>::reverse_iterator I = Names.rbegin(), 115 IEnd = Names.rend(); 116 I != IEnd; ++I) { 117 if (!Result.empty()) 118 Result += '.'; 119 120 Result += *I; 121 } 122 123 return Result; 124 } 125 126 const DirectoryEntry *Module::getUmbrellaDir() const { 127 if (const FileEntry *Header = getUmbrellaHeader()) 128 return Header->getDir(); 129 130 return Umbrella.dyn_cast<const DirectoryEntry *>(); 131 } 132 133 ArrayRef<const FileEntry *> Module::getTopHeaders(FileManager &FileMgr) { 134 if (!TopHeaderNames.empty()) { 135 for (std::vector<std::string>::iterator 136 I = TopHeaderNames.begin(), E = TopHeaderNames.end(); I != E; ++I) { 137 if (const FileEntry *FE = FileMgr.getFile(*I)) 138 TopHeaders.insert(FE); 139 } 140 TopHeaderNames.clear(); 141 } 142 143 return llvm::makeArrayRef(TopHeaders.begin(), TopHeaders.end()); 144 } 145 146 void Module::addRequirement(StringRef Feature, const LangOptions &LangOpts, 147 const TargetInfo &Target) { 148 Requires.push_back(Feature); 149 150 // If this feature is currently available, we're done. 151 if (hasFeature(Feature, LangOpts, Target)) 152 return; 153 154 if (!IsAvailable) 155 return; 156 157 SmallVector<Module *, 2> Stack; 158 Stack.push_back(this); 159 while (!Stack.empty()) { 160 Module *Current = Stack.back(); 161 Stack.pop_back(); 162 163 if (!Current->IsAvailable) 164 continue; 165 166 Current->IsAvailable = false; 167 for (submodule_iterator Sub = Current->submodule_begin(), 168 SubEnd = Current->submodule_end(); 169 Sub != SubEnd; ++Sub) { 170 if ((*Sub)->IsAvailable) 171 Stack.push_back(*Sub); 172 } 173 } 174 } 175 176 Module *Module::findSubmodule(StringRef Name) const { 177 llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name); 178 if (Pos == SubModuleIndex.end()) 179 return 0; 180 181 return SubModules[Pos->getValue()]; 182 } 183 184 static void printModuleId(raw_ostream &OS, const ModuleId &Id) { 185 for (unsigned I = 0, N = Id.size(); I != N; ++I) { 186 if (I) 187 OS << "."; 188 OS << Id[I].first; 189 } 190 } 191 192 void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const { 193 bool AnyWildcard = false; 194 bool UnrestrictedWildcard = false; 195 SmallVector<Module *, 4> WildcardRestrictions; 196 for (unsigned I = 0, N = Exports.size(); I != N; ++I) { 197 Module *Mod = Exports[I].getPointer(); 198 if (!Exports[I].getInt()) { 199 // Export a named module directly; no wildcards involved. 200 Exported.push_back(Mod); 201 202 continue; 203 } 204 205 // Wildcard export: export all of the imported modules that match 206 // the given pattern. 207 AnyWildcard = true; 208 if (UnrestrictedWildcard) 209 continue; 210 211 if (Module *Restriction = Exports[I].getPointer()) 212 WildcardRestrictions.push_back(Restriction); 213 else { 214 WildcardRestrictions.clear(); 215 UnrestrictedWildcard = true; 216 } 217 } 218 219 // If there were any wildcards, push any imported modules that were 220 // re-exported by the wildcard restriction. 221 if (!AnyWildcard) 222 return; 223 224 for (unsigned I = 0, N = Imports.size(); I != N; ++I) { 225 Module *Mod = Imports[I]; 226 bool Acceptable = UnrestrictedWildcard; 227 if (!Acceptable) { 228 // Check whether this module meets one of the restrictions. 229 for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) { 230 Module *Restriction = WildcardRestrictions[R]; 231 if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) { 232 Acceptable = true; 233 break; 234 } 235 } 236 } 237 238 if (!Acceptable) 239 continue; 240 241 Exported.push_back(Mod); 242 } 243 } 244 245 void Module::buildVisibleModulesCache() const { 246 assert(VisibleModulesCache.empty() && "cache does not need building"); 247 248 // This module is visible to itself. 249 VisibleModulesCache.insert(this); 250 251 llvm::SmallVector<Module*, 4> Exported; 252 for (unsigned I = 0, N = Imports.size(); I != N; ++I) { 253 // Every imported module is visible. 254 VisibleModulesCache.insert(Imports[I]); 255 256 // Every module exported by an imported module is visible. 257 Imports[I]->getExportedModules(Exported); 258 VisibleModulesCache.insert(Exported.begin(), Exported.end()); 259 Exported.clear(); 260 } 261 } 262 263 void Module::print(raw_ostream &OS, unsigned Indent) const { 264 OS.indent(Indent); 265 if (IsFramework) 266 OS << "framework "; 267 if (IsExplicit) 268 OS << "explicit "; 269 OS << "module " << Name; 270 271 if (IsSystem) { 272 OS.indent(Indent + 2); 273 OS << " [system]"; 274 } 275 276 OS << " {\n"; 277 278 if (!Requires.empty()) { 279 OS.indent(Indent + 2); 280 OS << "requires "; 281 for (unsigned I = 0, N = Requires.size(); I != N; ++I) { 282 if (I) 283 OS << ", "; 284 OS << Requires[I]; 285 } 286 OS << "\n"; 287 } 288 289 if (const FileEntry *UmbrellaHeader = getUmbrellaHeader()) { 290 OS.indent(Indent + 2); 291 OS << "umbrella header \""; 292 OS.write_escaped(UmbrellaHeader->getName()); 293 OS << "\"\n"; 294 } else if (const DirectoryEntry *UmbrellaDir = getUmbrellaDir()) { 295 OS.indent(Indent + 2); 296 OS << "umbrella \""; 297 OS.write_escaped(UmbrellaDir->getName()); 298 OS << "\"\n"; 299 } 300 301 if (!ConfigMacros.empty() || ConfigMacrosExhaustive) { 302 OS.indent(Indent + 2); 303 OS << "config_macros "; 304 if (ConfigMacrosExhaustive) 305 OS << "[exhaustive]"; 306 for (unsigned I = 0, N = ConfigMacros.size(); I != N; ++I) { 307 if (I) 308 OS << ", "; 309 OS << ConfigMacros[I]; 310 } 311 OS << "\n"; 312 } 313 314 for (unsigned I = 0, N = NormalHeaders.size(); I != N; ++I) { 315 OS.indent(Indent + 2); 316 OS << "header \""; 317 OS.write_escaped(NormalHeaders[I]->getName()); 318 OS << "\"\n"; 319 } 320 321 for (unsigned I = 0, N = ExcludedHeaders.size(); I != N; ++I) { 322 OS.indent(Indent + 2); 323 OS << "exclude header \""; 324 OS.write_escaped(ExcludedHeaders[I]->getName()); 325 OS << "\"\n"; 326 } 327 328 for (unsigned I = 0, N = PrivateHeaders.size(); I != N; ++I) { 329 OS.indent(Indent + 2); 330 OS << "private header \""; 331 OS.write_escaped(PrivateHeaders[I]->getName()); 332 OS << "\"\n"; 333 } 334 335 for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end(); 336 MI != MIEnd; ++MI) 337 (*MI)->print(OS, Indent + 2); 338 339 for (unsigned I = 0, N = Exports.size(); I != N; ++I) { 340 OS.indent(Indent + 2); 341 OS << "export "; 342 if (Module *Restriction = Exports[I].getPointer()) { 343 OS << Restriction->getFullModuleName(); 344 if (Exports[I].getInt()) 345 OS << ".*"; 346 } else { 347 OS << "*"; 348 } 349 OS << "\n"; 350 } 351 352 for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) { 353 OS.indent(Indent + 2); 354 OS << "export "; 355 printModuleId(OS, UnresolvedExports[I].Id); 356 if (UnresolvedExports[I].Wildcard) { 357 if (UnresolvedExports[I].Id.empty()) 358 OS << "*"; 359 else 360 OS << ".*"; 361 } 362 OS << "\n"; 363 } 364 365 for (unsigned I = 0, N = LinkLibraries.size(); I != N; ++I) { 366 OS.indent(Indent + 2); 367 OS << "link "; 368 if (LinkLibraries[I].IsFramework) 369 OS << "framework "; 370 OS << "\""; 371 OS.write_escaped(LinkLibraries[I].Library); 372 OS << "\""; 373 } 374 375 for (unsigned I = 0, N = UnresolvedConflicts.size(); I != N; ++I) { 376 OS.indent(Indent + 2); 377 OS << "conflict "; 378 printModuleId(OS, UnresolvedConflicts[I].Id); 379 OS << ", \""; 380 OS.write_escaped(UnresolvedConflicts[I].Message); 381 OS << "\"\n"; 382 } 383 384 for (unsigned I = 0, N = Conflicts.size(); I != N; ++I) { 385 OS.indent(Indent + 2); 386 OS << "conflict "; 387 OS << Conflicts[I].Other->getFullModuleName(); 388 OS << ", \""; 389 OS.write_escaped(Conflicts[I].Message); 390 OS << "\"\n"; 391 } 392 393 if (InferSubmodules) { 394 OS.indent(Indent + 2); 395 if (InferExplicitSubmodules) 396 OS << "explicit "; 397 OS << "module * {\n"; 398 if (InferExportWildcard) { 399 OS.indent(Indent + 4); 400 OS << "export *\n"; 401 } 402 OS.indent(Indent + 2); 403 OS << "}\n"; 404 } 405 406 OS.indent(Indent); 407 OS << "}\n"; 408 } 409 410 void Module::dump() const { 411 print(llvm::errs()); 412 } 413 414 415