xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Module.cpp (revision 38d94a4bc75a18f53ffd0ff8f65eefc739fef028)
1  //===- Module.cpp - Describe a module -------------------------------------===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  //
9  // This file defines the Module class, which describes a module in the source
10  // code.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "clang/Basic/Module.h"
15  #include "clang/Basic/CharInfo.h"
16  #include "clang/Basic/FileManager.h"
17  #include "clang/Basic/LangOptions.h"
18  #include "clang/Basic/SourceLocation.h"
19  #include "clang/Basic/TargetInfo.h"
20  #include "llvm/ADT/ArrayRef.h"
21  #include "llvm/ADT/SmallVector.h"
22  #include "llvm/ADT/StringMap.h"
23  #include "llvm/ADT/StringRef.h"
24  #include "llvm/ADT/StringSwitch.h"
25  #include "llvm/Support/Compiler.h"
26  #include "llvm/Support/ErrorHandling.h"
27  #include "llvm/Support/raw_ostream.h"
28  #include <algorithm>
29  #include <cassert>
30  #include <functional>
31  #include <string>
32  #include <utility>
33  #include <vector>
34  
35  using namespace clang;
36  
37  Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent,
38                 bool IsFramework, bool IsExplicit, unsigned VisibilityID)
39      : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent),
40        VisibilityID(VisibilityID), IsUnimportable(false),
41        HasIncompatibleModuleFile(false), IsAvailable(true),
42        IsFromModuleFile(false), IsFramework(IsFramework), IsExplicit(IsExplicit),
43        IsSystem(false), IsExternC(false), IsInferred(false),
44        InferSubmodules(false), InferExplicitSubmodules(false),
45        InferExportWildcard(false), ConfigMacrosExhaustive(false),
46        NoUndeclaredIncludes(false), ModuleMapIsPrivate(false),
47        HasUmbrellaDir(false), NameVisibility(Hidden) {
48    if (Parent) {
49      IsAvailable = Parent->isAvailable();
50      IsUnimportable = Parent->isUnimportable();
51      IsSystem = Parent->IsSystem;
52      IsExternC = Parent->IsExternC;
53      NoUndeclaredIncludes = Parent->NoUndeclaredIncludes;
54      ModuleMapIsPrivate = Parent->ModuleMapIsPrivate;
55  
56      Parent->SubModuleIndex[Name] = Parent->SubModules.size();
57      Parent->SubModules.push_back(this);
58    }
59  }
60  
61  Module::~Module() {
62    for (submodule_iterator I = submodule_begin(), IEnd = submodule_end();
63         I != IEnd; ++I) {
64      delete *I;
65    }
66  }
67  
68  static bool isPlatformEnvironment(const TargetInfo &Target, StringRef Feature) {
69    StringRef Platform = Target.getPlatformName();
70    StringRef Env = Target.getTriple().getEnvironmentName();
71  
72    // Attempt to match platform and environment.
73    if (Platform == Feature || Target.getTriple().getOSName() == Feature ||
74        Env == Feature)
75      return true;
76  
77    auto CmpPlatformEnv = [](StringRef LHS, StringRef RHS) {
78      auto Pos = LHS.find("-");
79      if (Pos == StringRef::npos)
80        return false;
81      SmallString<128> NewLHS = LHS.slice(0, Pos);
82      NewLHS += LHS.slice(Pos+1, LHS.size());
83      return NewLHS == RHS;
84    };
85  
86    SmallString<128> PlatformEnv = Target.getTriple().getOSAndEnvironmentName();
87    // Darwin has different but equivalent variants for simulators, example:
88    //   1. x86_64-apple-ios-simulator
89    //   2. x86_64-apple-iossimulator
90    // where both are valid examples of the same platform+environment but in the
91    // variant (2) the simulator is hardcoded as part of the platform name. Both
92    // forms above should match for "iossimulator" requirement.
93    if (Target.getTriple().isOSDarwin() && PlatformEnv.endswith("simulator"))
94      return PlatformEnv == Feature || CmpPlatformEnv(PlatformEnv, Feature);
95  
96    return PlatformEnv == Feature;
97  }
98  
99  /// Determine whether a translation unit built using the current
100  /// language options has the given feature.
101  static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
102                         const TargetInfo &Target) {
103    bool HasFeature = llvm::StringSwitch<bool>(Feature)
104                          .Case("altivec", LangOpts.AltiVec)
105                          .Case("blocks", LangOpts.Blocks)
106                          .Case("coroutines", LangOpts.Coroutines)
107                          .Case("cplusplus", LangOpts.CPlusPlus)
108                          .Case("cplusplus11", LangOpts.CPlusPlus11)
109                          .Case("cplusplus14", LangOpts.CPlusPlus14)
110                          .Case("cplusplus17", LangOpts.CPlusPlus17)
111                          .Case("c99", LangOpts.C99)
112                          .Case("c11", LangOpts.C11)
113                          .Case("c17", LangOpts.C17)
114                          .Case("freestanding", LangOpts.Freestanding)
115                          .Case("gnuinlineasm", LangOpts.GNUAsm)
116                          .Case("objc", LangOpts.ObjC)
117                          .Case("objc_arc", LangOpts.ObjCAutoRefCount)
118                          .Case("opencl", LangOpts.OpenCL)
119                          .Case("tls", Target.isTLSSupported())
120                          .Case("zvector", LangOpts.ZVector)
121                          .Default(Target.hasFeature(Feature) ||
122                                   isPlatformEnvironment(Target, Feature));
123    if (!HasFeature)
124      HasFeature = std::find(LangOpts.ModuleFeatures.begin(),
125                             LangOpts.ModuleFeatures.end(),
126                             Feature) != LangOpts.ModuleFeatures.end();
127    return HasFeature;
128  }
129  
130  bool Module::isUnimportable(const LangOptions &LangOpts,
131                              const TargetInfo &Target, Requirement &Req,
132                              Module *&ShadowingModule) const {
133    if (!IsUnimportable)
134      return false;
135  
136    for (const Module *Current = this; Current; Current = Current->Parent) {
137      if (Current->ShadowingModule) {
138        ShadowingModule = Current->ShadowingModule;
139        return true;
140      }
141      for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) {
142        if (hasFeature(Current->Requirements[I].first, LangOpts, Target) !=
143                Current->Requirements[I].second) {
144          Req = Current->Requirements[I];
145          return true;
146        }
147      }
148    }
149  
150    llvm_unreachable("could not find a reason why module is unimportable");
151  }
152  
153  bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target,
154                           Requirement &Req,
155                           UnresolvedHeaderDirective &MissingHeader,
156                           Module *&ShadowingModule) const {
157    if (IsAvailable)
158      return true;
159  
160    if (isUnimportable(LangOpts, Target, Req, ShadowingModule))
161      return false;
162  
163    // FIXME: All missing headers are listed on the top-level module. Should we
164    // just look there?
165    for (const Module *Current = this; Current; Current = Current->Parent) {
166      if (!Current->MissingHeaders.empty()) {
167        MissingHeader = Current->MissingHeaders.front();
168        return false;
169      }
170    }
171  
172    llvm_unreachable("could not find a reason why module is unavailable");
173  }
174  
175  bool Module::isSubModuleOf(const Module *Other) const {
176    const Module *This = this;
177    do {
178      if (This == Other)
179        return true;
180  
181      This = This->Parent;
182    } while (This);
183  
184    return false;
185  }
186  
187  const Module *Module::getTopLevelModule() const {
188    const Module *Result = this;
189    while (Result->Parent)
190      Result = Result->Parent;
191  
192    return Result;
193  }
194  
195  static StringRef getModuleNameFromComponent(
196      const std::pair<std::string, SourceLocation> &IdComponent) {
197    return IdComponent.first;
198  }
199  
200  static StringRef getModuleNameFromComponent(StringRef R) { return R; }
201  
202  template<typename InputIter>
203  static void printModuleId(raw_ostream &OS, InputIter Begin, InputIter End,
204                            bool AllowStringLiterals = true) {
205    for (InputIter It = Begin; It != End; ++It) {
206      if (It != Begin)
207        OS << ".";
208  
209      StringRef Name = getModuleNameFromComponent(*It);
210      if (!AllowStringLiterals || isValidIdentifier(Name))
211        OS << Name;
212      else {
213        OS << '"';
214        OS.write_escaped(Name);
215        OS << '"';
216      }
217    }
218  }
219  
220  template<typename Container>
221  static void printModuleId(raw_ostream &OS, const Container &C) {
222    return printModuleId(OS, C.begin(), C.end());
223  }
224  
225  std::string Module::getFullModuleName(bool AllowStringLiterals) const {
226    SmallVector<StringRef, 2> Names;
227  
228    // Build up the set of module names (from innermost to outermost).
229    for (const Module *M = this; M; M = M->Parent)
230      Names.push_back(M->Name);
231  
232    std::string Result;
233  
234    llvm::raw_string_ostream Out(Result);
235    printModuleId(Out, Names.rbegin(), Names.rend(), AllowStringLiterals);
236    Out.flush();
237  
238    return Result;
239  }
240  
241  bool Module::fullModuleNameIs(ArrayRef<StringRef> nameParts) const {
242    for (const Module *M = this; M; M = M->Parent) {
243      if (nameParts.empty() || M->Name != nameParts.back())
244        return false;
245      nameParts = nameParts.drop_back();
246    }
247    return nameParts.empty();
248  }
249  
250  Module::DirectoryName Module::getUmbrellaDir() const {
251    if (Header U = getUmbrellaHeader())
252      return {"", U.Entry->getDir()};
253  
254    return {UmbrellaAsWritten, static_cast<const DirectoryEntry *>(Umbrella)};
255  }
256  
257  void Module::addTopHeader(const FileEntry *File) {
258    assert(File);
259    TopHeaders.insert(File);
260  }
261  
262  ArrayRef<const FileEntry *> Module::getTopHeaders(FileManager &FileMgr) {
263    if (!TopHeaderNames.empty()) {
264      for (std::vector<std::string>::iterator
265             I = TopHeaderNames.begin(), E = TopHeaderNames.end(); I != E; ++I) {
266        if (auto FE = FileMgr.getFile(*I))
267          TopHeaders.insert(*FE);
268      }
269      TopHeaderNames.clear();
270    }
271  
272    return llvm::makeArrayRef(TopHeaders.begin(), TopHeaders.end());
273  }
274  
275  bool Module::directlyUses(const Module *Requested) const {
276    auto *Top = getTopLevelModule();
277  
278    // A top-level module implicitly uses itself.
279    if (Requested->isSubModuleOf(Top))
280      return true;
281  
282    for (auto *Use : Top->DirectUses)
283      if (Requested->isSubModuleOf(Use))
284        return true;
285  
286    // Anyone is allowed to use our builtin stddef.h and its accompanying module.
287    if (!Requested->Parent && Requested->Name == "_Builtin_stddef_max_align_t")
288      return true;
289  
290    return false;
291  }
292  
293  void Module::addRequirement(StringRef Feature, bool RequiredState,
294                              const LangOptions &LangOpts,
295                              const TargetInfo &Target) {
296    Requirements.push_back(Requirement(std::string(Feature), RequiredState));
297  
298    // If this feature is currently available, we're done.
299    if (hasFeature(Feature, LangOpts, Target) == RequiredState)
300      return;
301  
302    markUnavailable(/*Unimportable*/true);
303  }
304  
305  void Module::markUnavailable(bool Unimportable) {
306    auto needUpdate = [Unimportable](Module *M) {
307      return M->IsAvailable || (!M->IsUnimportable && Unimportable);
308    };
309  
310    if (!needUpdate(this))
311      return;
312  
313    SmallVector<Module *, 2> Stack;
314    Stack.push_back(this);
315    while (!Stack.empty()) {
316      Module *Current = Stack.back();
317      Stack.pop_back();
318  
319      if (!needUpdate(Current))
320        continue;
321  
322      Current->IsAvailable = false;
323      Current->IsUnimportable |= Unimportable;
324      for (submodule_iterator Sub = Current->submodule_begin(),
325                           SubEnd = Current->submodule_end();
326           Sub != SubEnd; ++Sub) {
327        if (needUpdate(*Sub))
328          Stack.push_back(*Sub);
329      }
330    }
331  }
332  
333  Module *Module::findSubmodule(StringRef Name) const {
334    llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name);
335    if (Pos == SubModuleIndex.end())
336      return nullptr;
337  
338    return SubModules[Pos->getValue()];
339  }
340  
341  Module *Module::findOrInferSubmodule(StringRef Name) {
342    llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name);
343    if (Pos != SubModuleIndex.end())
344      return SubModules[Pos->getValue()];
345    if (!InferSubmodules)
346      return nullptr;
347    Module *Result = new Module(Name, SourceLocation(), this, false, InferExplicitSubmodules, 0);
348    Result->InferExplicitSubmodules = InferExplicitSubmodules;
349    Result->InferSubmodules = InferSubmodules;
350    Result->InferExportWildcard = InferExportWildcard;
351    if (Result->InferExportWildcard)
352      Result->Exports.push_back(Module::ExportDecl(nullptr, true));
353    return Result;
354  }
355  
356  void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const {
357    // All non-explicit submodules are exported.
358    for (std::vector<Module *>::const_iterator I = SubModules.begin(),
359                                               E = SubModules.end();
360         I != E; ++I) {
361      Module *Mod = *I;
362      if (!Mod->IsExplicit)
363        Exported.push_back(Mod);
364    }
365  
366    // Find re-exported modules by filtering the list of imported modules.
367    bool AnyWildcard = false;
368    bool UnrestrictedWildcard = false;
369    SmallVector<Module *, 4> WildcardRestrictions;
370    for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
371      Module *Mod = Exports[I].getPointer();
372      if (!Exports[I].getInt()) {
373        // Export a named module directly; no wildcards involved.
374        Exported.push_back(Mod);
375  
376        continue;
377      }
378  
379      // Wildcard export: export all of the imported modules that match
380      // the given pattern.
381      AnyWildcard = true;
382      if (UnrestrictedWildcard)
383        continue;
384  
385      if (Module *Restriction = Exports[I].getPointer())
386        WildcardRestrictions.push_back(Restriction);
387      else {
388        WildcardRestrictions.clear();
389        UnrestrictedWildcard = true;
390      }
391    }
392  
393    // If there were any wildcards, push any imported modules that were
394    // re-exported by the wildcard restriction.
395    if (!AnyWildcard)
396      return;
397  
398    for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
399      Module *Mod = Imports[I];
400      bool Acceptable = UnrestrictedWildcard;
401      if (!Acceptable) {
402        // Check whether this module meets one of the restrictions.
403        for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) {
404          Module *Restriction = WildcardRestrictions[R];
405          if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) {
406            Acceptable = true;
407            break;
408          }
409        }
410      }
411  
412      if (!Acceptable)
413        continue;
414  
415      Exported.push_back(Mod);
416    }
417  }
418  
419  void Module::buildVisibleModulesCache() const {
420    assert(VisibleModulesCache.empty() && "cache does not need building");
421  
422    // This module is visible to itself.
423    VisibleModulesCache.insert(this);
424  
425    // Every imported module is visible.
426    SmallVector<Module *, 16> Stack(Imports.begin(), Imports.end());
427    while (!Stack.empty()) {
428      Module *CurrModule = Stack.pop_back_val();
429  
430      // Every module transitively exported by an imported module is visible.
431      if (VisibleModulesCache.insert(CurrModule).second)
432        CurrModule->getExportedModules(Stack);
433    }
434  }
435  
436  void Module::print(raw_ostream &OS, unsigned Indent) const {
437    OS.indent(Indent);
438    if (IsFramework)
439      OS << "framework ";
440    if (IsExplicit)
441      OS << "explicit ";
442    OS << "module ";
443    printModuleId(OS, &Name, &Name + 1);
444  
445    if (IsSystem || IsExternC) {
446      OS.indent(Indent + 2);
447      if (IsSystem)
448        OS << " [system]";
449      if (IsExternC)
450        OS << " [extern_c]";
451    }
452  
453    OS << " {\n";
454  
455    if (!Requirements.empty()) {
456      OS.indent(Indent + 2);
457      OS << "requires ";
458      for (unsigned I = 0, N = Requirements.size(); I != N; ++I) {
459        if (I)
460          OS << ", ";
461        if (!Requirements[I].second)
462          OS << "!";
463        OS << Requirements[I].first;
464      }
465      OS << "\n";
466    }
467  
468    if (Header H = getUmbrellaHeader()) {
469      OS.indent(Indent + 2);
470      OS << "umbrella header \"";
471      OS.write_escaped(H.NameAsWritten);
472      OS << "\"\n";
473    } else if (DirectoryName D = getUmbrellaDir()) {
474      OS.indent(Indent + 2);
475      OS << "umbrella \"";
476      OS.write_escaped(D.NameAsWritten);
477      OS << "\"\n";
478    }
479  
480    if (!ConfigMacros.empty() || ConfigMacrosExhaustive) {
481      OS.indent(Indent + 2);
482      OS << "config_macros ";
483      if (ConfigMacrosExhaustive)
484        OS << "[exhaustive]";
485      for (unsigned I = 0, N = ConfigMacros.size(); I != N; ++I) {
486        if (I)
487          OS << ", ";
488        OS << ConfigMacros[I];
489      }
490      OS << "\n";
491    }
492  
493    struct {
494      StringRef Prefix;
495      HeaderKind Kind;
496    } Kinds[] = {{"", HK_Normal},
497                 {"textual ", HK_Textual},
498                 {"private ", HK_Private},
499                 {"private textual ", HK_PrivateTextual},
500                 {"exclude ", HK_Excluded}};
501  
502    for (auto &K : Kinds) {
503      assert(&K == &Kinds[K.Kind] && "kinds in wrong order");
504      for (auto &H : Headers[K.Kind]) {
505        OS.indent(Indent + 2);
506        OS << K.Prefix << "header \"";
507        OS.write_escaped(H.NameAsWritten);
508        OS << "\" { size " << H.Entry->getSize()
509           << " mtime " << H.Entry->getModificationTime() << " }\n";
510      }
511    }
512    for (auto *Unresolved : {&UnresolvedHeaders, &MissingHeaders}) {
513      for (auto &U : *Unresolved) {
514        OS.indent(Indent + 2);
515        OS << Kinds[U.Kind].Prefix << "header \"";
516        OS.write_escaped(U.FileName);
517        OS << "\"";
518        if (U.Size || U.ModTime) {
519          OS << " {";
520          if (U.Size)
521            OS << " size " << *U.Size;
522          if (U.ModTime)
523            OS << " mtime " << *U.ModTime;
524          OS << " }";
525        }
526        OS << "\n";
527      }
528    }
529  
530    if (!ExportAsModule.empty()) {
531      OS.indent(Indent + 2);
532      OS << "export_as" << ExportAsModule << "\n";
533    }
534  
535    for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end();
536         MI != MIEnd; ++MI)
537      // Print inferred subframework modules so that we don't need to re-infer
538      // them (requires expensive directory iteration + stat calls) when we build
539      // the module. Regular inferred submodules are OK, as we need to look at all
540      // those header files anyway.
541      if (!(*MI)->IsInferred || (*MI)->IsFramework)
542        (*MI)->print(OS, Indent + 2);
543  
544    for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
545      OS.indent(Indent + 2);
546      OS << "export ";
547      if (Module *Restriction = Exports[I].getPointer()) {
548        OS << Restriction->getFullModuleName(true);
549        if (Exports[I].getInt())
550          OS << ".*";
551      } else {
552        OS << "*";
553      }
554      OS << "\n";
555    }
556  
557    for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) {
558      OS.indent(Indent + 2);
559      OS << "export ";
560      printModuleId(OS, UnresolvedExports[I].Id);
561      if (UnresolvedExports[I].Wildcard)
562        OS << (UnresolvedExports[I].Id.empty() ? "*" : ".*");
563      OS << "\n";
564    }
565  
566    for (unsigned I = 0, N = DirectUses.size(); I != N; ++I) {
567      OS.indent(Indent + 2);
568      OS << "use ";
569      OS << DirectUses[I]->getFullModuleName(true);
570      OS << "\n";
571    }
572  
573    for (unsigned I = 0, N = UnresolvedDirectUses.size(); I != N; ++I) {
574      OS.indent(Indent + 2);
575      OS << "use ";
576      printModuleId(OS, UnresolvedDirectUses[I]);
577      OS << "\n";
578    }
579  
580    for (unsigned I = 0, N = LinkLibraries.size(); I != N; ++I) {
581      OS.indent(Indent + 2);
582      OS << "link ";
583      if (LinkLibraries[I].IsFramework)
584        OS << "framework ";
585      OS << "\"";
586      OS.write_escaped(LinkLibraries[I].Library);
587      OS << "\"";
588    }
589  
590    for (unsigned I = 0, N = UnresolvedConflicts.size(); I != N; ++I) {
591      OS.indent(Indent + 2);
592      OS << "conflict ";
593      printModuleId(OS, UnresolvedConflicts[I].Id);
594      OS << ", \"";
595      OS.write_escaped(UnresolvedConflicts[I].Message);
596      OS << "\"\n";
597    }
598  
599    for (unsigned I = 0, N = Conflicts.size(); I != N; ++I) {
600      OS.indent(Indent + 2);
601      OS << "conflict ";
602      OS << Conflicts[I].Other->getFullModuleName(true);
603      OS << ", \"";
604      OS.write_escaped(Conflicts[I].Message);
605      OS << "\"\n";
606    }
607  
608    if (InferSubmodules) {
609      OS.indent(Indent + 2);
610      if (InferExplicitSubmodules)
611        OS << "explicit ";
612      OS << "module * {\n";
613      if (InferExportWildcard) {
614        OS.indent(Indent + 4);
615        OS << "export *\n";
616      }
617      OS.indent(Indent + 2);
618      OS << "}\n";
619    }
620  
621    OS.indent(Indent);
622    OS << "}\n";
623  }
624  
625  LLVM_DUMP_METHOD void Module::dump() const {
626    print(llvm::errs());
627  }
628  
629  void VisibleModuleSet::setVisible(Module *M, SourceLocation Loc,
630                                    VisibleCallback Vis, ConflictCallback Cb) {
631    assert(Loc.isValid() && "setVisible expects a valid import location");
632    if (isVisible(M))
633      return;
634  
635    ++Generation;
636  
637    struct Visiting {
638      Module *M;
639      Visiting *ExportedBy;
640    };
641  
642    std::function<void(Visiting)> VisitModule = [&](Visiting V) {
643      // Nothing to do for a module that's already visible.
644      unsigned ID = V.M->getVisibilityID();
645      if (ImportLocs.size() <= ID)
646        ImportLocs.resize(ID + 1);
647      else if (ImportLocs[ID].isValid())
648        return;
649  
650      ImportLocs[ID] = Loc;
651      Vis(M);
652  
653      // Make any exported modules visible.
654      SmallVector<Module *, 16> Exports;
655      V.M->getExportedModules(Exports);
656      for (Module *E : Exports) {
657        // Don't import non-importable modules.
658        if (!E->isUnimportable())
659          VisitModule({E, &V});
660      }
661  
662      for (auto &C : V.M->Conflicts) {
663        if (isVisible(C.Other)) {
664          llvm::SmallVector<Module*, 8> Path;
665          for (Visiting *I = &V; I; I = I->ExportedBy)
666            Path.push_back(I->M);
667          Cb(Path, C.Other, C.Message);
668        }
669      }
670    };
671    VisitModule({M, nullptr});
672  }
673  
674  ASTSourceDescriptor::ASTSourceDescriptor(Module &M)
675      : Signature(M.Signature), ClangModule(&M) {
676    if (M.Directory)
677      Path = M.Directory->getName();
678    if (auto *File = M.getASTFile())
679      ASTFile = File->getName();
680  }
681  
682  std::string ASTSourceDescriptor::getModuleName() const {
683    if (ClangModule)
684      return ClangModule->Name;
685    else
686      return std::string(PCHModuleName);
687  }
688