forked from OSchip/llvm-project
Refactor ASTSourceDescriptor to not store copies of all strings. (NFC)
llvm-svn: 248509
This commit is contained in:
parent
b6be1ebb7d
commit
6083b08580
|
@ -145,17 +145,24 @@ public:
|
|||
/// Abstracts clang modules and precompiled header files and holds
|
||||
/// everything needed to generate debug info for an imported module
|
||||
/// or PCH.
|
||||
struct ASTSourceDescriptor {
|
||||
class ASTSourceDescriptor {
|
||||
StringRef PCHModuleName;
|
||||
StringRef Path;
|
||||
StringRef ASTFile;
|
||||
uint64_t Signature = 0;
|
||||
const Module *ClangModule = nullptr;
|
||||
|
||||
public:
|
||||
ASTSourceDescriptor(){};
|
||||
ASTSourceDescriptor(std::string Name, std::string Path, std::string ASTFile,
|
||||
ASTSourceDescriptor(StringRef Name, StringRef Path, StringRef ASTFile,
|
||||
uint64_t Signature)
|
||||
: FullModuleName(std::move(Name)), Path(std::move(Path)),
|
||||
: PCHModuleName(std::move(Name)), Path(std::move(Path)),
|
||||
ASTFile(std::move(ASTFile)), Signature(Signature){};
|
||||
ASTSourceDescriptor(const Module &M);
|
||||
std::string FullModuleName;
|
||||
std::string Path;
|
||||
std::string ASTFile;
|
||||
uint64_t Signature = 0;
|
||||
std::string getFullModuleName() const;
|
||||
StringRef getPath() const { return Path; }
|
||||
StringRef getASTFile() const { return ASTFile; }
|
||||
uint64_t getSignature() const { return Signature; }
|
||||
};
|
||||
|
||||
/// Return a descriptor for the corresponding module, if one exists.
|
||||
|
|
|
@ -29,13 +29,20 @@ ExternalASTSource::getSourceDescriptor(unsigned ID) {
|
|||
}
|
||||
|
||||
ExternalASTSource::ASTSourceDescriptor::ASTSourceDescriptor(const Module &M)
|
||||
: FullModuleName(M.getFullModuleName()), Signature(M.Signature) {
|
||||
: Signature(M.Signature), ClangModule(&M) {
|
||||
if (M.Directory)
|
||||
Path = M.Directory->getName();
|
||||
if (auto *File = M.getASTFile())
|
||||
ASTFile = File->getName();
|
||||
}
|
||||
|
||||
std::string ExternalASTSource::ASTSourceDescriptor::getFullModuleName() const {
|
||||
if (ClangModule)
|
||||
return ClangModule->getFullModuleName();
|
||||
else
|
||||
return PCHModuleName;
|
||||
}
|
||||
|
||||
void ExternalASTSource::FindFileRegionDecls(FileID File, unsigned Offset,
|
||||
unsigned Length,
|
||||
SmallVectorImpl<Decl *> &Decls) {}
|
||||
|
|
|
@ -1676,7 +1676,8 @@ llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
|
|||
llvm::DIModule *
|
||||
CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod,
|
||||
bool CreateSkeletonCU) {
|
||||
auto &ModRef = ModuleRefCache[Mod.FullModuleName];
|
||||
std::string FullModuleName = Mod.getFullModuleName();
|
||||
auto &ModRef = ModuleRefCache[FullModuleName];
|
||||
if (ModRef)
|
||||
return cast<llvm::DIModule>(ModRef);
|
||||
|
||||
|
@ -1705,14 +1706,14 @@ CGDebugInfo::getOrCreateModuleRef(ExternalASTSource::ASTSourceDescriptor Mod,
|
|||
|
||||
if (CreateSkeletonCU) {
|
||||
llvm::DIBuilder DIB(CGM.getModule());
|
||||
DIB.createCompileUnit(TheCU->getSourceLanguage(), Mod.FullModuleName,
|
||||
Mod.Path, TheCU->getProducer(), true, StringRef(), 0,
|
||||
Mod.ASTFile, llvm::DIBuilder::FullDebug,
|
||||
Mod.Signature);
|
||||
DIB.createCompileUnit(TheCU->getSourceLanguage(), FullModuleName,
|
||||
Mod.getPath(), TheCU->getProducer(), true,
|
||||
StringRef(), 0, Mod.getASTFile(),
|
||||
llvm::DIBuilder::FullDebug, Mod.getSignature());
|
||||
DIB.finalize();
|
||||
}
|
||||
llvm::DIModule *M =
|
||||
DBuilder.createModule(TheCU, Mod.FullModuleName, ConfigMacros, Mod.Path,
|
||||
DBuilder.createModule(TheCU, FullModuleName, ConfigMacros, Mod.getPath(),
|
||||
CGM.getHeaderSearchOpts().Sysroot);
|
||||
ModRef.reset(M);
|
||||
return M;
|
||||
|
|
Loading…
Reference in New Issue