//===- DebugTypes.cpp -----------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "DebugTypes.h" #include "InputFiles.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" using namespace lld; using namespace lld::coff; using namespace llvm; using namespace llvm::codeview; namespace { class TypeServerSource : public TpiSource { public: TypeServerSource(ObjFile *F) : TpiSource(PDB, F) {} }; class UseTypeServerSource : public TpiSource { public: UseTypeServerSource(ObjFile *F, TypeServer2Record *TS) : TpiSource(UsingPDB, F), TypeServerDependency(*TS) {} // Information about the PDB type server dependency, that needs to be loaded // in before merging this OBJ. TypeServer2Record TypeServerDependency; }; class PrecompSource : public TpiSource { public: PrecompSource(ObjFile *F) : TpiSource(PCH, F) {} }; class UsePrecompSource : public TpiSource { public: UsePrecompSource(ObjFile *F, PrecompRecord *Precomp) : TpiSource(UsingPCH, F), PrecompDependency(*Precomp) {} // Information about the Precomp OBJ dependency, that needs to be loaded in // before merging this OBJ. PrecompRecord PrecompDependency; }; } // namespace static std::vector> GC; TpiSource::TpiSource(TpiKind K, ObjFile *F) : Kind(K), File(F) { GC.push_back(std::unique_ptr(this)); } TpiSource *coff::makeTpiSource(ObjFile *F) { return new TpiSource(TpiSource::Regular, F); } TpiSource *coff::makeTypeServerSource(ObjFile *F) { return new TypeServerSource(F); } TpiSource *coff::makeUseTypeServerSource(ObjFile *F, TypeServer2Record *TS) { return new UseTypeServerSource(F, TS); } TpiSource *coff::makePrecompSource(ObjFile *F) { return new PrecompSource(F); } TpiSource *coff::makeUsePrecompSource(ObjFile *F, PrecompRecord *Precomp) { return new UsePrecompSource(F, Precomp); } namespace lld { namespace coff { template <> const PrecompRecord &retrieveDependencyInfo(TpiSource *Source) { assert(Source->Kind == TpiSource::UsingPCH); return ((UsePrecompSource *)Source)->PrecompDependency; } template <> const TypeServer2Record &retrieveDependencyInfo(TpiSource *Source) { assert(Source->Kind == TpiSource::UsingPDB); return ((UseTypeServerSource *)Source)->TypeServerDependency; } } // namespace coff } // namespace lld