[lld] r323893 - [LLD][PDB] Implement FIXME: Warn on missing TypeServer PDB rather than error

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 13 06:03:33 PST 2018


Merged to 6.0 in r325005 as suggested in PR36340.

On Wed, Jan 31, 2018 at 6:48 PM, Colden Cullen via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: colden
> Date: Wed Jan 31 09:48:04 2018
> New Revision: 323893
>
> URL: http://llvm.org/viewvc/llvm-project?rev=323893&view=rev
> Log:
> [LLD][PDB] Implement FIXME: Warn on missing TypeServer PDB rather than error
>
> Summary: Instead of fatal-ing out when missing a type server PDB, insead warn and cache the miss.
>
> Reviewers: rnk, zturner
>
> Reviewed By: rnk
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D42188
>
> Modified:
>     lld/trunk/COFF/PDB.cpp
>     lld/trunk/test/COFF/pdb-type-server-missing.yaml
>
> Modified: lld/trunk/COFF/PDB.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=323893&r1=323892&r2=323893&view=diff
> ==============================================================================
> --- lld/trunk/COFF/PDB.cpp (original)
> +++ lld/trunk/COFF/PDB.cpp Wed Jan 31 09:48:04 2018
> @@ -107,10 +107,11 @@ public:
>    /// If the object does not use a type server PDB (compiled with /Z7), we merge
>    /// all the type and item records from the .debug$S stream and fill in the
>    /// caller-provided ObjectIndexMap.
> -  const CVIndexMap &mergeDebugT(ObjFile *File, CVIndexMap &ObjectIndexMap);
> +  Expected<const CVIndexMap&> mergeDebugT(ObjFile *File,
> +                                          CVIndexMap &ObjectIndexMap);
>
> -  const CVIndexMap &maybeMergeTypeServerPDB(ObjFile *File,
> -                                            TypeServer2Record &TS);
> +  Expected<const CVIndexMap&> maybeMergeTypeServerPDB(ObjFile *File,
> +                                                      TypeServer2Record &TS);
>
>    /// Add the section map and section contributions to the PDB.
>    void addSections(ArrayRef<OutputSection *> OutputSections,
> @@ -151,6 +152,10 @@ private:
>
>    /// Type index mappings of type server PDBs that we've loaded so far.
>    std::map<GUID, CVIndexMap> TypeServerIndexMappings;
> +
> +  /// List of TypeServer PDBs which cannot be loaded.
> +  /// Cached to prevent repeated load attempts.
> +  std::set<GUID> MissingTypeServerPDBs;
>  };
>  }
>
> @@ -241,8 +246,8 @@ maybeReadTypeServerRecord(CVTypeArray &T
>    return std::move(TS);
>  }
>
> -const CVIndexMap &PDBLinker::mergeDebugT(ObjFile *File,
> -                                         CVIndexMap &ObjectIndexMap) {
> +Expected<const CVIndexMap&> PDBLinker::mergeDebugT(ObjFile *File,
> +                                                   CVIndexMap &ObjectIndexMap) {
>    ScopedTimer T(TypeMergingTimer);
>
>    ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
> @@ -317,11 +322,19 @@ tryToLoadPDB(const GUID &GuidFromObj, St
>    return std::move(NS);
>  }
>
> -const CVIndexMap &PDBLinker::maybeMergeTypeServerPDB(ObjFile *File,
> -                                                     TypeServer2Record &TS) {
> -  // First, check if we already loaded a PDB with this GUID. Return the type
> +Expected<const CVIndexMap&> PDBLinker::maybeMergeTypeServerPDB(ObjFile *File,
> +                                                               TypeServer2Record &TS) {
> +  const GUID& TSId = TS.getGuid();
> +  StringRef TSPath = TS.getName();
> +
> +  // First, check if the PDB has previously failed to load.
> +  if (MissingTypeServerPDBs.count(TSId))
> +    return make_error<pdb::GenericError>(
> +      pdb::generic_error_code::type_server_not_found, TSPath);
> +
> +  // Second, check if we already loaded a PDB with this GUID. Return the type
>    // index mapping if we have it.
> -  auto Insertion = TypeServerIndexMappings.insert({TS.getGuid(), CVIndexMap()});
> +  auto Insertion = TypeServerIndexMappings.insert({TSId, CVIndexMap()});
>    CVIndexMap &IndexMap = Insertion.first->second;
>    if (!Insertion.second)
>      return IndexMap;
> @@ -332,18 +345,21 @@ const CVIndexMap &PDBLinker::maybeMergeT
>    // Check for a PDB at:
>    // 1. The given file path
>    // 2. Next to the object file or archive file
> -  auto ExpectedSession = tryToLoadPDB(TS.getGuid(), TS.getName());
> +  auto ExpectedSession = tryToLoadPDB(TSId, TSPath);
>    if (!ExpectedSession) {
>      consumeError(ExpectedSession.takeError());
>      StringRef LocalPath =
>          !File->ParentName.empty() ? File->ParentName : File->getName();
>      SmallString<128> Path = sys::path::parent_path(LocalPath);
>      sys::path::append(
> -        Path, sys::path::filename(TS.getName(), sys::path::Style::windows));
> -    ExpectedSession = tryToLoadPDB(TS.getGuid(), Path);
> +        Path, sys::path::filename(TSPath, sys::path::Style::windows));
> +    ExpectedSession = tryToLoadPDB(TSId, Path);
> +  }
> +  if (auto E = ExpectedSession.takeError()) {
> +    TypeServerIndexMappings.erase(TSId);
> +    MissingTypeServerPDBs.emplace(TSId);
> +    return std::move(E);
>    }
> -  if (auto E = ExpectedSession.takeError())
> -    fatal("Type server PDB was not found: " + toString(std::move(E)));
>
>    auto ExpectedTpi = (*ExpectedSession)->getPDBFile().getPDBTpiStream();
>    if (auto E = ExpectedTpi.takeError())
> @@ -764,7 +780,16 @@ void PDBLinker::addObjFile(ObjFile *File
>    // the PDB first, so that we can get the map from object file type and item
>    // indices to PDB type and item indices.
>    CVIndexMap ObjectIndexMap;
> -  const CVIndexMap &IndexMap = mergeDebugT(File, ObjectIndexMap);
> +  auto IndexMapResult = mergeDebugT(File, ObjectIndexMap);
> +
> +  // If the .debug$T sections fail to merge, assume there is no debug info.
> +  if (!IndexMapResult) {
> +    warn("Type server PDB for " + Name + " is invalid, ignoring debug info. " +
> +         toString(IndexMapResult.takeError()));
> +    return;
> +  }
> +
> +  const CVIndexMap &IndexMap = *IndexMapResult;
>
>    ScopedTimer T(SymbolMergingTimer);
>
>
> Modified: lld/trunk/test/COFF/pdb-type-server-missing.yaml
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/pdb-type-server-missing.yaml?rev=323893&r1=323892&r2=323893&view=diff
> ==============================================================================
> --- lld/trunk/test/COFF/pdb-type-server-missing.yaml (original)
> +++ lld/trunk/test/COFF/pdb-type-server-missing.yaml Wed Jan 31 09:48:04 2018
> @@ -1,13 +1,10 @@
>  # This is an object compiled with /Zi (see the LF_TYPESERVER2 record) without an
>  # adjacent type server PDB. Test that LLD fails gracefully on it.
>
> -# FIXME: Ideally we'd do what MSVC does, which is to warn and drop all debug
> -# info in the object with the missing PDB.
> -
>  # RUN: yaml2obj %s -o %t.obj
> -# RUN: not lld-link %t.obj -out:%t.exe -debug -pdb:%t.pdb -nodefaultlib -entry:main 2>&1 | FileCheck %s
> +# RUN: lld-link %t.obj -out:%t.exe -debug -pdb:%t.pdb -nodefaultlib -entry:main 2>&1 | FileCheck %s
>
> -# CHECK: error: Type server PDB was not found
> +# CHECK: warning: Type server PDB was not found
>
>  --- !COFF
>  header:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list