Summary: When evaluating an expression referencing a constexpr static member variable, an error is issued because the PDB does not specify a symbol with an address that can be relocated against. Rather than attempt to resolve the variable's value within the IR execution, the values of all constants can be looked up and incorporated into the AST of the record type as a literal, mirroring the original compiler AST. This change applies to DIA and native PDB loaders. Patch By: jackoalan Reviewers: aleksandr.urakov, jasonmolenda, zturner, jdoerfert, teemperor Reviewed By: aleksandr.urakov Subscribers: sstefan1, lldb-commits, llvm-commits, #lldb Tags: #lldb, #llvm Differential Revision: https://reviews.llvm.org/D82160
85 lines
2.7 KiB
C++
85 lines
2.7 KiB
C++
//===-- UdtRecordCompleter.h ------------------------------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
|
|
#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
|
|
|
|
#include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
|
|
#include "llvm/DebugInfo/CodeView/CVRecord.h"
|
|
#include "llvm/DebugInfo/CodeView/TypeRecord.h"
|
|
#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
|
|
|
|
#include "PdbSymUid.h"
|
|
|
|
namespace clang {
|
|
class CXXBaseSpecifier;
|
|
class QualType;
|
|
class TagDecl;
|
|
} // namespace clang
|
|
|
|
namespace llvm {
|
|
namespace pdb {
|
|
class TpiStream;
|
|
class GlobalsStream;
|
|
}
|
|
} // namespace llvm
|
|
|
|
namespace lldb_private {
|
|
class Type;
|
|
class CompilerType;
|
|
namespace npdb {
|
|
class PdbAstBuilder;
|
|
class PdbIndex;
|
|
|
|
class UdtRecordCompleter : public llvm::codeview::TypeVisitorCallbacks {
|
|
using IndexedBase =
|
|
std::pair<uint64_t, std::unique_ptr<clang::CXXBaseSpecifier>>;
|
|
|
|
union UdtTagRecord {
|
|
UdtTagRecord() {}
|
|
llvm::codeview::UnionRecord ur;
|
|
llvm::codeview::ClassRecord cr;
|
|
llvm::codeview::EnumRecord er;
|
|
} m_cvr;
|
|
|
|
PdbTypeSymId m_id;
|
|
CompilerType &m_derived_ct;
|
|
clang::TagDecl &m_tag_decl;
|
|
PdbAstBuilder &m_ast_builder;
|
|
PdbIndex &m_index;
|
|
std::vector<IndexedBase> m_bases;
|
|
ClangASTImporter::LayoutInfo m_layout;
|
|
|
|
public:
|
|
UdtRecordCompleter(PdbTypeSymId id, CompilerType &derived_ct,
|
|
clang::TagDecl &tag_decl, PdbAstBuilder &ast_builder,
|
|
PdbIndex &index);
|
|
|
|
#define MEMBER_RECORD(EnumName, EnumVal, Name) \
|
|
llvm::Error visitKnownMember(llvm::codeview::CVMemberRecord &CVR, \
|
|
llvm::codeview::Name##Record &Record) override;
|
|
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
|
|
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
|
|
|
|
void complete();
|
|
|
|
private:
|
|
clang::QualType AddBaseClassForTypeIndex(
|
|
llvm::codeview::TypeIndex ti, llvm::codeview::MemberAccess access,
|
|
llvm::Optional<uint64_t> vtable_idx = llvm::Optional<uint64_t>());
|
|
void AddMethod(llvm::StringRef name, llvm::codeview::TypeIndex type_idx,
|
|
llvm::codeview::MemberAccess access,
|
|
llvm::codeview::MethodOptions options,
|
|
llvm::codeview::MemberAttributes attrs);
|
|
};
|
|
|
|
} // namespace npdb
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
|