diff options
| author | Pavel Labath <pavel@labath.sk> | 2019-04-26 08:52:04 +0000 |
|---|---|---|
| committer | Pavel Labath <pavel@labath.sk> | 2019-04-26 08:52:04 +0000 |
| commit | 0eadd988662533f5ef89a2024dc7ebf830f16b67 (patch) | |
| tree | 03ec674849fa9f86f9046f79abd66d7257816231 /lldb/source/Plugins/SymbolFile/NativePDB | |
| parent | 5d5ee4aff748c827d54fa8c3224ad7090bb018bc (diff) | |
| download | bcm5719-llvm-0eadd988662533f5ef89a2024dc7ebf830f16b67.tar.gz bcm5719-llvm-0eadd988662533f5ef89a2024dc7ebf830f16b67.zip | |
PostfixExpression: move DWARF generator out of NativePDB internals
Summary:
The new dwarf generator is pretty much a verbatim copy of the one in
PDB.
In order to write a pdb-independent test for it, I needed to write a
dummy "symbol resolver", which (together with the fact that I'll need
one more for breakpad-specific resolution logic) prompted me to create a
more simple interface for algorithms which replace or "resolve"
SymbolNodes. The resolving algorithms in NativePDB have been updated to
make use of that too.
I have removed a couple of NativePDB tests which weren't testing
anything pdb-specific and where the tested functionality was covered by
the new format-agnostic tests I have added.
Reviewers: amccarth, clayborg, aleksandr.urakov
Subscribers: aprantl, markmentovai, lldb-commits, jasonmolenda, JDevlieghere
Differential Revision: https://reviews.llvm.org/D61056
llvm-svn: 359288
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/NativePDB')
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp | 199 |
1 files changed, 16 insertions, 183 deletions
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp index 785cfe82171..fcee7cd1f98 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp @@ -10,7 +10,6 @@ #include "CodeViewRegisterMapping.h" #include "lldb/Core/StreamBuffer.h" -#include "lldb/Core/dwarf.h" #include "lldb/Symbol/PostfixExpression.h" #include "lldb/Utility/LLDBAssert.h" #include "lldb/Utility/Stream.h" @@ -24,83 +23,6 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::postfix; -namespace { - -class FPOProgramASTVisitorMergeDependent : public Visitor<> { -public: - void Visit(BinaryOpNode &binary, Node *&) override { - Dispatch(binary.Left()); - Dispatch(binary.Right()); - } - - void Visit(UnaryOpNode &unary, Node *&) override { - Dispatch(unary.Operand()); - } - - void Visit(RegisterNode &, Node *&) override {} - void Visit(IntegerNode &, Node *&) override {} - void Visit(SymbolNode &symbol, Node *&ref) override; - - static void - Merge(const llvm::DenseMap<llvm::StringRef, Node *> &dependent_programs, - Node *&ast) { - FPOProgramASTVisitorMergeDependent(dependent_programs).Dispatch(ast); - } - -private: - FPOProgramASTVisitorMergeDependent( - const llvm::DenseMap<llvm::StringRef, Node *> &dependent_programs) - : m_dependent_programs(dependent_programs) {} - - const llvm::DenseMap<llvm::StringRef, Node *> &m_dependent_programs; -}; - -void FPOProgramASTVisitorMergeDependent::Visit(SymbolNode &symbol, Node *&ref) { - auto it = m_dependent_programs.find(symbol.GetName()); - if (it == m_dependent_programs.end()) - return; - - ref = it->second; - Dispatch(ref); -} - -class FPOProgramASTVisitorResolveRegisterRefs : public Visitor<bool> { -public: - static bool - Resolve(const llvm::DenseMap<llvm::StringRef, Node *> &dependent_programs, - llvm::Triple::ArchType arch_type, llvm::BumpPtrAllocator &alloc, - Node *&ast) { - return FPOProgramASTVisitorResolveRegisterRefs(dependent_programs, - arch_type, alloc) - .Dispatch(ast); - } - - bool Visit(BinaryOpNode &binary, Node *&) override { - return Dispatch(binary.Left()) && Dispatch(binary.Right()); - } - - bool Visit(UnaryOpNode &unary, Node *&) override { - return Dispatch(unary.Operand()); - } - - bool Visit(RegisterNode &, Node *&) override { return true; } - - bool Visit(IntegerNode &, Node *&) override { return true; } - - bool Visit(SymbolNode &symbol, Node *&ref) override; - -private: - FPOProgramASTVisitorResolveRegisterRefs( - const llvm::DenseMap<llvm::StringRef, Node *> &dependent_programs, - llvm::Triple::ArchType arch_type, llvm::BumpPtrAllocator &alloc) - : m_dependent_programs(dependent_programs), m_arch_type(arch_type), - m_alloc(alloc) {} - - const llvm::DenseMap<llvm::StringRef, Node *> &m_dependent_programs; - llvm::Triple::ArchType m_arch_type; - llvm::BumpPtrAllocator &m_alloc; -}; - static uint32_t ResolveLLDBRegisterNum(llvm::StringRef reg_name, llvm::Triple::ArchType arch_type) { // lookup register name to get lldb register number llvm::ArrayRef<llvm::EnumEntry<uint16_t>> register_names = @@ -118,102 +40,6 @@ static uint32_t ResolveLLDBRegisterNum(llvm::StringRef reg_name, llvm::Triple::A return npdb::GetLLDBRegisterNumber(arch_type, reg_id); } -bool FPOProgramASTVisitorResolveRegisterRefs::Visit(SymbolNode &symbol, - Node *&ref) { - // Look up register reference as lvalue in preceding assignments. - auto it = m_dependent_programs.find(symbol.GetName()); - if (it != m_dependent_programs.end()) { - // Dependent programs are handled elsewhere. - return true; - } - - uint32_t reg_num = - ResolveLLDBRegisterNum(symbol.GetName().drop_front(1), m_arch_type); - - if (reg_num == LLDB_INVALID_REGNUM) - return false; - - ref = MakeNode<RegisterNode>(m_alloc, reg_num); - return true; -} - -class FPOProgramASTVisitorDWARFCodegen : public Visitor<> { -public: - static void Emit(Stream &stream, Node *&ast) { - FPOProgramASTVisitorDWARFCodegen(stream).Dispatch(ast); - } - - void Visit(RegisterNode ®, Node *&); - void Visit(BinaryOpNode &binary, Node *&); - void Visit(UnaryOpNode &unary, Node *&); - void Visit(SymbolNode &symbol, Node *&) { - llvm_unreachable("Symbols should have been resolved by now!"); - } - void Visit(IntegerNode &integer, Node *&); - -private: - FPOProgramASTVisitorDWARFCodegen(Stream &stream) : m_out_stream(stream) {} - - Stream &m_out_stream; -}; - -void FPOProgramASTVisitorDWARFCodegen::Visit(RegisterNode ®, Node *&) { - uint32_t reg_num = reg.GetRegNum(); - lldbassert(reg_num != LLDB_INVALID_REGNUM); - - if (reg_num > 31) { - m_out_stream.PutHex8(DW_OP_bregx); - m_out_stream.PutULEB128(reg_num); - } else - m_out_stream.PutHex8(DW_OP_breg0 + reg_num); - - m_out_stream.PutSLEB128(0); -} - -void FPOProgramASTVisitorDWARFCodegen::Visit(IntegerNode &integer, Node *&) { - uint32_t value = integer.GetValue(); - m_out_stream.PutHex8(DW_OP_constu); - m_out_stream.PutULEB128(value); -} - -void FPOProgramASTVisitorDWARFCodegen::Visit(BinaryOpNode &binary, Node *&) { - Dispatch(binary.Left()); - Dispatch(binary.Right()); - - switch (binary.GetOpType()) { - case BinaryOpNode::Plus: - m_out_stream.PutHex8(DW_OP_plus); - // NOTE: can be optimized by using DW_OP_plus_uconst opcpode - // if right child node is constant value - break; - case BinaryOpNode::Minus: - m_out_stream.PutHex8(DW_OP_minus); - break; - case BinaryOpNode::Align: - // emit align operator a @ b as - // a & ~(b - 1) - // NOTE: implicitly assuming that b is power of 2 - m_out_stream.PutHex8(DW_OP_lit1); - m_out_stream.PutHex8(DW_OP_minus); - m_out_stream.PutHex8(DW_OP_not); - - m_out_stream.PutHex8(DW_OP_and); - break; - } -} - -void FPOProgramASTVisitorDWARFCodegen::Visit(UnaryOpNode &unary, Node *&) { - Dispatch(unary.Operand()); - - switch (unary.GetOpType()) { - case UnaryOpNode::Deref: - m_out_stream.PutHex8(DW_OP_deref); - break; - } -} - -} // namespace - static bool ParseFPOSingleAssignmentProgram(llvm::StringRef program, llvm::BumpPtrAllocator &alloc, llvm::StringRef ®ister_name, @@ -256,18 +82,25 @@ static Node *ParseFPOProgram(llvm::StringRef program, lldbassert(rvalue_ast); - // check & resolve assignment program - if (!FPOProgramASTVisitorResolveRegisterRefs::Resolve( - dependent_programs, arch_type, alloc, rvalue_ast)) + // Emplace valid dependent subtrees to make target assignment independent + // from predecessors. Resolve all other SymbolNodes as registers. + bool success = + ResolveSymbols(rvalue_ast, [&](SymbolNode &symbol) -> Node * { + if (Node *node = dependent_programs.lookup(symbol.GetName())) + return node; + uint32_t reg_num = + ResolveLLDBRegisterNum(symbol.GetName().drop_front(1), arch_type); + + if (reg_num == LLDB_INVALID_REGNUM) + return nullptr; + + return MakeNode<RegisterNode>(alloc, reg_num); + }); + if (!success) return nullptr; if (lvalue_name == register_name) { // found target assignment program - no need to parse further - - // emplace valid dependent subtrees to make target assignment independent - // from predecessors - FPOProgramASTVisitorMergeDependent::Merge(dependent_programs, rvalue_ast); - return rvalue_ast; } @@ -288,6 +121,6 @@ bool lldb_private::npdb::TranslateFPOProgramToDWARFExpression( return false; } - FPOProgramASTVisitorDWARFCodegen::Emit(stream, target_program); + ToDWARF(*target_program, stream); return true; } |

