summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins')
-rw-r--r--lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp108
1 files changed, 12 insertions, 96 deletions
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp
index 360658e0235..785cfe82171 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.cpp
@@ -26,19 +26,6 @@ using namespace lldb_private::postfix;
namespace {
-class NodeAllocator {
-public:
- template <typename T, typename... Args> T *makeNode(Args &&... args) {
- static_assert(std::is_trivially_destructible<T>::value,
- "This object will not be destroyed!");
- void *new_node_mem = m_alloc.Allocate(sizeof(T), alignof(T));
- return new (new_node_mem) T(std::forward<Args>(args)...);
- }
-
-private:
- llvm::BumpPtrAllocator m_alloc;
-};
-
class FPOProgramASTVisitorMergeDependent : public Visitor<> {
public:
void Visit(BinaryOpNode &binary, Node *&) override {
@@ -81,7 +68,8 @@ class FPOProgramASTVisitorResolveRegisterRefs : public Visitor<bool> {
public:
static bool
Resolve(const llvm::DenseMap<llvm::StringRef, Node *> &dependent_programs,
- llvm::Triple::ArchType arch_type, NodeAllocator &alloc, Node *&ast) {
+ llvm::Triple::ArchType arch_type, llvm::BumpPtrAllocator &alloc,
+ Node *&ast) {
return FPOProgramASTVisitorResolveRegisterRefs(dependent_programs,
arch_type, alloc)
.Dispatch(ast);
@@ -104,13 +92,13 @@ public:
private:
FPOProgramASTVisitorResolveRegisterRefs(
const llvm::DenseMap<llvm::StringRef, Node *> &dependent_programs,
- llvm::Triple::ArchType arch_type, NodeAllocator &alloc)
+ 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;
- NodeAllocator &m_alloc;
+ llvm::BumpPtrAllocator &m_alloc;
};
static uint32_t ResolveLLDBRegisterNum(llvm::StringRef reg_name, llvm::Triple::ArchType arch_type) {
@@ -145,7 +133,7 @@ bool FPOProgramASTVisitorResolveRegisterRefs::Visit(SymbolNode &symbol,
if (reg_num == LLDB_INVALID_REGNUM)
return false;
- ref = m_alloc.makeNode<RegisterNode>(reg_num);
+ ref = MakeNode<RegisterNode>(m_alloc, reg_num);
return true;
}
@@ -227,95 +215,23 @@ void FPOProgramASTVisitorDWARFCodegen::Visit(UnaryOpNode &unary, Node *&) {
} // namespace
static bool ParseFPOSingleAssignmentProgram(llvm::StringRef program,
- NodeAllocator &alloc,
+ llvm::BumpPtrAllocator &alloc,
llvm::StringRef &register_name,
Node *&ast) {
- llvm::SmallVector<llvm::StringRef, 16> tokens;
- llvm::SplitString(program, tokens, " ");
-
- if (tokens.empty())
- return false;
-
- llvm::SmallVector<Node *, 4> eval_stack;
-
- llvm::DenseMap<llvm::StringRef, BinaryOpNode::OpType> ops_binary = {
- {"+", BinaryOpNode::Plus},
- {"-", BinaryOpNode::Minus},
- {"@", BinaryOpNode::Align},
- };
-
- llvm::DenseMap<llvm::StringRef, UnaryOpNode::OpType> ops_unary = {
- {"^", UnaryOpNode::Deref},
- };
-
- constexpr llvm::StringLiteral ra_search_keyword = ".raSearch";
-
// lvalue of assignment is always first token
// rvalue program goes next
- for (size_t i = 1; i < tokens.size(); ++i) {
- llvm::StringRef cur = tokens[i];
-
- auto ops_binary_it = ops_binary.find(cur);
- if (ops_binary_it != ops_binary.end()) {
- // token is binary operator
- if (eval_stack.size() < 2) {
- return false;
- }
- Node *right = eval_stack.pop_back_val();
- Node *left = eval_stack.pop_back_val();
- Node *node =
- alloc.makeNode<BinaryOpNode>(ops_binary_it->second, *left, *right);
- eval_stack.push_back(node);
- continue;
- }
-
- auto ops_unary_it = ops_unary.find(cur);
- if (ops_unary_it != ops_unary.end()) {
- // token is unary operator
- if (eval_stack.empty()) {
- return false;
- }
- Node *operand = eval_stack.pop_back_val();
- Node *node = alloc.makeNode<UnaryOpNode>(ops_unary_it->second, *operand);
- eval_stack.push_back(node);
- continue;
- }
-
- if (cur.startswith("$")) {
- eval_stack.push_back(alloc.makeNode<SymbolNode>(cur));
- continue;
- }
-
- if (cur == ra_search_keyword) {
- // TODO: .raSearch is unsupported
- return false;
- }
-
- uint32_t value;
- if (!cur.getAsInteger(10, value)) {
- // token is integer literal
- eval_stack.push_back(alloc.makeNode<IntegerNode>(value));
- continue;
- }
-
- // unexpected token
+ std::tie(register_name, program) = getToken(program);
+ if (register_name.empty())
return false;
- }
- if (eval_stack.size() != 1) {
- return false;
- }
-
- register_name = tokens[0];
- ast = eval_stack.pop_back_val();
-
- return true;
+ ast = Parse(program, alloc);
+ return ast != nullptr;
}
static Node *ParseFPOProgram(llvm::StringRef program,
llvm::StringRef register_name,
llvm::Triple::ArchType arch_type,
- NodeAllocator &alloc) {
+ llvm::BumpPtrAllocator &alloc) {
llvm::DenseMap<llvm::StringRef, Node *> dependent_programs;
size_t cur = 0;
@@ -365,7 +281,7 @@ static Node *ParseFPOProgram(llvm::StringRef program,
bool lldb_private::npdb::TranslateFPOProgramToDWARFExpression(
llvm::StringRef program, llvm::StringRef register_name,
llvm::Triple::ArchType arch_type, Stream &stream) {
- NodeAllocator node_alloc;
+ llvm::BumpPtrAllocator node_alloc;
Node *target_program =
ParseFPOProgram(program, register_name, arch_type, node_alloc);
if (target_program == nullptr) {
OpenPOWER on IntegriCloud