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), NameVisibility(Hidden) 32 { 33 if (Parent) { 34 if (!Parent->isAvailable()) 35 IsAvailable = false; 36 if (Parent->IsSystem) 37 IsSystem = true; 38 39 Parent->SubModuleIndex[Name] = Parent->SubModules.size(); 40 Parent->SubModules.push_back(this); 41 } 42 } 43 44 Module::~Module() { 45 for (submodule_iterator I = submodule_begin(), IEnd = submodule_end(); 46 I != IEnd; ++I) { 47 delete *I; 48 } 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 (SmallVector<StringRef, 2>::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::print(raw_ostream &OS, unsigned Indent) const { 246 OS.indent(Indent); 247 if (IsFramework) 248 OS << "framework "; 249 if (IsExplicit) 250 OS << "explicit "; 251 OS << "module " << Name; 252 253 if (IsSystem) { 254 OS.indent(Indent + 2); 255 OS << " [system]"; 256 } 257 258 OS << " {\n"; 259 260 if (!Requires.empty()) { 261 OS.indent(Indent + 2); 262 OS << "requires "; 263 for (unsigned I = 0, N = Requires.size(); I != N; ++I) { 264 if (I) 265 OS << ", "; 266 OS << Requires[I]; 267 } 268 OS << "\n"; 269 } 270 271 if (const FileEntry *UmbrellaHeader = getUmbrellaHeader()) { 272 OS.indent(Indent + 2); 273 OS << "umbrella header \""; 274 OS.write_escaped(UmbrellaHeader->getName()); 275 OS << "\"\n"; 276 } else if (const DirectoryEntry *UmbrellaDir = getUmbrellaDir()) { 277 OS.indent(Indent + 2); 278 OS << "umbrella \""; 279 OS.write_escaped(UmbrellaDir->getName()); 280 OS << "\"\n"; 281 } 282 283 for (unsigned I = 0, N = Headers.size(); I != N; ++I) { 284 OS.indent(Indent + 2); 285 OS << "header \""; 286 OS.write_escaped(Headers[I]->getName()); 287 OS << "\"\n"; 288 } 289 290 for (unsigned I = 0, N = ExcludedHeaders.size(); I != N; ++I) { 291 OS.indent(Indent + 2); 292 OS << "exclude header \""; 293 OS.write_escaped(ExcludedHeaders[I]->getName()); 294 OS << "\"\n"; 295 } 296 297 for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end(); 298 MI != MIEnd; ++MI) 299 (*MI)->print(OS, Indent + 2); 300 301 for (unsigned I = 0, N = Exports.size(); I != N; ++I) { 302 OS.indent(Indent + 2); 303 OS << "export "; 304 if (Module *Restriction = Exports[I].getPointer()) { 305 OS << Restriction->getFullModuleName(); 306 if (Exports[I].getInt()) 307 OS << ".*"; 308 } else { 309 OS << "*"; 310 } 311 OS << "\n"; 312 } 313 314 for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) { 315 OS.indent(Indent + 2); 316 OS << "export "; 317 printModuleId(OS, UnresolvedExports[I].Id); 318 if (UnresolvedExports[I].Wildcard) { 319 if (UnresolvedExports[I].Id.empty()) 320 OS << "*"; 321 else 322 OS << ".*"; 323 } 324 OS << "\n"; 325 } 326 327 for (unsigned I = 0, N = LinkLibraries.size(); I != N; ++I) { 328 OS.indent(Indent + 2); 329 OS << "link "; 330 if (LinkLibraries[I].IsFramework) 331 OS << "framework "; 332 OS << "\""; 333 OS.write_escaped(LinkLibraries[I].Library); 334 OS << "\""; 335 } 336 337 if (InferSubmodules) { 338 OS.indent(Indent + 2); 339 if (InferExplicitSubmodules) 340 OS << "explicit "; 341 OS << "module * {\n"; 342 if (InferExportWildcard) { 343 OS.indent(Indent + 4); 344 OS << "export *\n"; 345 } 346 OS.indent(Indent + 2); 347 OS << "}\n"; 348 } 349 350 OS.indent(Indent); 351 OS << "}\n"; 352 } 353 354 void Module::dump() const { 355 print(llvm::errs()); 356 } 357 358 359