nitesh.jain updated this revision to Diff 83012.
nitesh.jain added a comment.
Update diff as per suggestion.
https://reviews.llvm.org/D27088
Files:
include/lldb/API/SBDwarf.h
packages/Python/lldbsuite/test/lldbtest.py
packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py
scripts/lldb.swig
Index: scripts/lldb.swig
===================================================================
--- scripts/lldb.swig
+++ scripts/lldb.swig
@@ -66,6 +66,7 @@
#include "lldb/API/SBCommunication.h"
#include "lldb/API/SBCompileUnit.h"
#include "lldb/API/SBData.h"
+#include "lldb/API/SBDwarf.h"
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBDeclaration.h"
#include "lldb/API/SBError.h"
@@ -133,6 +134,7 @@
%include "lldb/lldb-enumerations.h"
%include "lldb/lldb-forward.h"
%include "lldb/lldb-types.h"
+%include "lldb/API/SBDwarf.h"
/* Forward declaration of SB classes. */
%include "lldb/API/SBDefines.h"
Index: packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py
===================================================================
--- packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py
+++ packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py
@@ -541,6 +541,10 @@
self.assertIsNotNone(reg_infos)
self.assertTrue(len(reg_infos) > 0)
+ inferior_exe_path = os.path.abspath("a.out")
+ Target = self.dbg.CreateTarget(inferior_exe_path)
+ byte_order = Target.GetByteOrder()
+
# Read value for each register.
reg_index = 0
for reg_info in reg_infos:
@@ -565,6 +569,9 @@
# Verify the response length.
p_response = context.get("p_response")
self.assertIsNotNone(p_response)
+
+ if "dynamic_size_dwarf_expr_bytes" in reg_info:
+ self.updateRegInfoBitsize(reg_info, byte_order)
self.assertEqual(len(p_response), 2 * int(reg_info["bitsize"]) / 8)
# Increment loop
Index: packages/Python/lldbsuite/test/lldbtest.py
===================================================================
--- packages/Python/lldbsuite/test/lldbtest.py
+++ packages/Python/lldbsuite/test/lldbtest.py
@@ -1260,6 +1260,94 @@
return self.lldbArchitecture
+ def updateRegInfoBitsize(self, reg_info, byte_order):
+ """ Update the regInfo bit size. """
+
+ # Evaluate Dwarf Expression
+ expr_result = self.evaluateDwarfExpression(reg_info["dynamic_size_dwarf_expr_bytes"],
+ byte_order)
+
+ if expr_result == 0:
+ reg_info["bitsize"] = 32
+ elif expr_result == 1:
+ reg_info["bitsize"] = 64
+
+ def evaluateDwarfExpression(self, dwarf_opcode, byte_order):
+ """Evaluate Dwarf Expression. """
+
+ dwarf_opcode = [dwarf_opcode[i:i+2] for i in range(0,len(dwarf_opcode),2)]
+ dwarf_data = []
+ for index in range(len(dwarf_opcode)):
+
+ if index < len(dwarf_opcode):
+ val = int(dwarf_opcode[index], 16)
+ else:
+ break
+
+ if val == lldb.DW_OP_regx:
+ # Read register number
+ self.assertTrue(len(dwarf_opcode) > (index + 1))
+ reg_no = int(dwarf_opcode.pop(index + 1), 16)
+
+ self.reset_test_sequence()
+ # Read register value
+ self.test_sequence.add_log_lines(
+ ["read packet: $p{0:x}#00".format(reg_no),
+ {"direction": "send", "regex": r"^\$([0-9a-fA-F]+)#",
+ "capture": {1: "p_response"}}],True)
+
+ Context = self.expect_gdbremote_sequence()
+ self.assertIsNotNone(Context)
+ p_response = Context.get("p_response")
+ self.assertIsNotNone(p_response)
+
+ if byte_order == lldb.eByteOrderLittle:
+ # In case of little endian
+ # first decode the HEX ASCII bytes and then reverse it
+ # to get actual value of SR register
+ p_response = "".join(reversed([p_response[i:i+2] for i in range(0,
+ len(p_response),2)]))
+ # Push register value
+ dwarf_data.append(int(p_response,16))
+
+ elif val == lldb.DW_OP_lit1:
+ # Push literal 1
+ dwarf_data.append(1)
+
+ elif val == lldb.DW_OP_lit26:
+ # Push literal 26
+ dwarf_data.append(26)
+
+ elif val == lldb.DW_OP_shl:
+ # left shift and push the result back
+ self.assertTrue(len(dwarf_data) > 1)
+ shift_amount = dwarf_data.pop()
+ val_to_shift = dwarf_data.pop()
+ result = val_to_shift << shift_amount
+ dwarf_data.append(result)
+
+ elif val == lldb.DW_OP_shr:
+ # Right shift and push the result back
+ self.assertTrue(len(dwarf_data) > 1)
+ shift_amount = dwarf_data.pop()
+ val_to_shift = dwarf_data.pop()
+ result = val_to_shift >> shift_amount
+ dwarf_data.append(result)
+
+ elif val == lldb.DW_OP_and:
+ # And of topmost 2 elements and push the result back
+ first_ele = dwarf_data.pop()
+ second_ele = dwarf_data.pop()
+ result = first_ele & second_ele
+ dwarf_data.append(result)
+
+ else:
+ self.assertTrue(False and "Unprocess Dwarf Opcode")
+
+ self.assertTrue(len(dwarf_data) == 1)
+ expr_result = dwarf_data.pop()
+ return expr_result
+
def getCompiler(self):
"""Returns the compiler in effect the test suite is running with."""
module = builder_module()
Index: include/lldb/API/SBDwarf.h
===================================================================
--- /dev/null
+++ include/lldb/API/SBDwarf.h
@@ -0,0 +1,182 @@
+//===-- SBDwarf.h ---------------------------------------------*- C++ -*-===//
+////
+//// The LLVM Compiler Infrastructure
+////
+//// This file is distributed under the University of Illinois Open Source
+//// License. See LICENSE.TXT for details.
+////
+////===----------------------------------------------------------------------===//
+//
+
+
+#define HANDLE_DW_OP(ID, NAME) DW_OP_##NAME = ID,
+
+namespace lldb {
+enum LocationAtom {
+ // DWARF Expression operators.
+ HANDLE_DW_OP(0x03, addr)
+ HANDLE_DW_OP(0x06, deref)
+ HANDLE_DW_OP(0x08, const1u)
+ HANDLE_DW_OP(0x09, const1s)
+ HANDLE_DW_OP(0x0a, const2u)
+ HANDLE_DW_OP(0x0b, const2s)
+ HANDLE_DW_OP(0x0c, const4u)
+ HANDLE_DW_OP(0x0d, const4s)
+ HANDLE_DW_OP(0x0e, const8u)
+ HANDLE_DW_OP(0x0f, const8s)
+ HANDLE_DW_OP(0x10, constu)
+ HANDLE_DW_OP(0x11, consts)
+ HANDLE_DW_OP(0x12, dup)
+ HANDLE_DW_OP(0x13, drop)
+ HANDLE_DW_OP(0x14, over)
+ HANDLE_DW_OP(0x15, pick)
+ HANDLE_DW_OP(0x16, swap)
+ HANDLE_DW_OP(0x17, rot)
+ HANDLE_DW_OP(0x18, xderef)
+ HANDLE_DW_OP(0x19, abs)
+ HANDLE_DW_OP(0x1a, and)
+ HANDLE_DW_OP(0x1b, div)
+ HANDLE_DW_OP(0x1c, minus)
+ HANDLE_DW_OP(0x1d, mod)
+ HANDLE_DW_OP(0x1e, mul)
+ HANDLE_DW_OP(0x1f, neg)
+ HANDLE_DW_OP(0x20, not)
+ HANDLE_DW_OP(0x21, or)
+ HANDLE_DW_OP(0x22, plus)
+ HANDLE_DW_OP(0x23, plus_uconst)
+ HANDLE_DW_OP(0x24, shl)
+ HANDLE_DW_OP(0x25, shr)
+ HANDLE_DW_OP(0x26, shra)
+ HANDLE_DW_OP(0x27, xor)
+ HANDLE_DW_OP(0x2f, skip)
+ HANDLE_DW_OP(0x28, bra)
+ HANDLE_DW_OP(0x29, eq)
+ HANDLE_DW_OP(0x2a, ge)
+ HANDLE_DW_OP(0x2b, gt)
+ HANDLE_DW_OP(0x2c, le)
+ HANDLE_DW_OP(0x2d, lt)
+ HANDLE_DW_OP(0x2e, ne)
+ HANDLE_DW_OP(0x30, lit0)
+ HANDLE_DW_OP(0x31, lit1)
+ HANDLE_DW_OP(0x32, lit2)
+ HANDLE_DW_OP(0x33, lit3)
+ HANDLE_DW_OP(0x34, lit4)
+ HANDLE_DW_OP(0x35, lit5)
+ HANDLE_DW_OP(0x36, lit6)
+ HANDLE_DW_OP(0x37, lit7)
+ HANDLE_DW_OP(0x38, lit8)
+ HANDLE_DW_OP(0x39, lit9)
+ HANDLE_DW_OP(0x3a, lit10)
+ HANDLE_DW_OP(0x3b, lit11)
+ HANDLE_DW_OP(0x3c, lit12)
+ HANDLE_DW_OP(0x3d, lit13)
+ HANDLE_DW_OP(0x3e, lit14)
+ HANDLE_DW_OP(0x3f, lit15)
+ HANDLE_DW_OP(0x40, lit16)
+ HANDLE_DW_OP(0x41, lit17)
+ HANDLE_DW_OP(0x42, lit18)
+ HANDLE_DW_OP(0x43, lit19)
+ HANDLE_DW_OP(0x44, lit20)
+ HANDLE_DW_OP(0x45, lit21)
+ HANDLE_DW_OP(0x46, lit22)
+ HANDLE_DW_OP(0x47, lit23)
+ HANDLE_DW_OP(0x48, lit24)
+ HANDLE_DW_OP(0x49, lit25)
+ HANDLE_DW_OP(0x4a, lit26)
+ HANDLE_DW_OP(0x4b, lit27)
+ HANDLE_DW_OP(0x4c, lit28)
+ HANDLE_DW_OP(0x4d, lit29)
+ HANDLE_DW_OP(0x4e, lit30)
+ HANDLE_DW_OP(0x4f, lit31)
+ HANDLE_DW_OP(0x50, reg0)
+ HANDLE_DW_OP(0x51, reg1)
+ HANDLE_DW_OP(0x52, reg2)
+ HANDLE_DW_OP(0x53, reg3)
+ HANDLE_DW_OP(0x54, reg4)
+ HANDLE_DW_OP(0x55, reg5)
+ HANDLE_DW_OP(0x56, reg6)
+ HANDLE_DW_OP(0x57, reg7)
+ HANDLE_DW_OP(0x58, reg8)
+ HANDLE_DW_OP(0x59, reg9)
+ HANDLE_DW_OP(0x5a, reg10)
+ HANDLE_DW_OP(0x5b, reg11)
+ HANDLE_DW_OP(0x5c, reg12)
+ HANDLE_DW_OP(0x5d, reg13)
+ HANDLE_DW_OP(0x5e, reg14)
+ HANDLE_DW_OP(0x5f, reg15)
+ HANDLE_DW_OP(0x60, reg16)
+ HANDLE_DW_OP(0x61, reg17)
+ HANDLE_DW_OP(0x62, reg18)
+ HANDLE_DW_OP(0x63, reg19)
+ HANDLE_DW_OP(0x64, reg20)
+ HANDLE_DW_OP(0x65, reg21)
+ HANDLE_DW_OP(0x66, reg22)
+ HANDLE_DW_OP(0x67, reg23)
+ HANDLE_DW_OP(0x68, reg24)
+ HANDLE_DW_OP(0x69, reg25)
+ HANDLE_DW_OP(0x6a, reg26)
+ HANDLE_DW_OP(0x6b, reg27)
+ HANDLE_DW_OP(0x6c, reg28)
+ HANDLE_DW_OP(0x6d, reg29)
+ HANDLE_DW_OP(0x6e, reg30)
+ HANDLE_DW_OP(0x6f, reg31)
+ HANDLE_DW_OP(0x70, breg0)
+ HANDLE_DW_OP(0x71, breg1)
+ HANDLE_DW_OP(0x72, breg2)
+ HANDLE_DW_OP(0x73, breg3)
+ HANDLE_DW_OP(0x74, breg4)
+ HANDLE_DW_OP(0x75, breg5)
+ HANDLE_DW_OP(0x76, breg6)
+ HANDLE_DW_OP(0x77, breg7)
+ HANDLE_DW_OP(0x78, breg8)
+ HANDLE_DW_OP(0x79, breg9)
+ HANDLE_DW_OP(0x7a, breg10)
+ HANDLE_DW_OP(0x7b, breg11)
+ HANDLE_DW_OP(0x7c, breg12)
+ HANDLE_DW_OP(0x7d, breg13)
+ HANDLE_DW_OP(0x7e, breg14)
+ HANDLE_DW_OP(0x7f, breg15)
+ HANDLE_DW_OP(0x80, breg16)
+ HANDLE_DW_OP(0x81, breg17)
+ HANDLE_DW_OP(0x82, breg18)
+ HANDLE_DW_OP(0x83, breg19)
+ HANDLE_DW_OP(0x84, breg20)
+ HANDLE_DW_OP(0x85, breg21)
+ HANDLE_DW_OP(0x86, breg22)
+ HANDLE_DW_OP(0x87, breg23)
+ HANDLE_DW_OP(0x88, breg24)
+ HANDLE_DW_OP(0x89, breg25)
+ HANDLE_DW_OP(0x8a, breg26)
+ HANDLE_DW_OP(0x8b, breg27)
+ HANDLE_DW_OP(0x8c, breg28)
+ HANDLE_DW_OP(0x8d, breg29)
+ HANDLE_DW_OP(0x8e, breg30)
+ HANDLE_DW_OP(0x8f, breg31)
+ HANDLE_DW_OP(0x90, regx)
+ HANDLE_DW_OP(0x91, fbreg)
+ HANDLE_DW_OP(0x92, bregx)
+ HANDLE_DW_OP(0x93, piece)
+ HANDLE_DW_OP(0x94, deref_size)
+ HANDLE_DW_OP(0x95, xderef_size)
+ HANDLE_DW_OP(0x96, nop)
+ HANDLE_DW_OP(0x97, push_object_address)
+ HANDLE_DW_OP(0x98, call2)
+ HANDLE_DW_OP(0x99, call4)
+ HANDLE_DW_OP(0x9a, call_ref)
+ HANDLE_DW_OP(0x9b, form_tls_address)
+ HANDLE_DW_OP(0x9c, call_frame_cfa)
+ HANDLE_DW_OP(0x9d, bit_piece)
+ HANDLE_DW_OP(0x9e, implicit_value)
+ HANDLE_DW_OP(0x9f, stack_value)
+ HANDLE_DW_OP(0xa0, implicit_pointer)
+ HANDLE_DW_OP(0xa1, addrx)
+ HANDLE_DW_OP(0xa2, constx)
+ HANDLE_DW_OP(0xa3, entry_value)
+ HANDLE_DW_OP(0xa4, const_type)
+ HANDLE_DW_OP(0xa5, regval_type)
+ HANDLE_DW_OP(0xa6, deref_type)
+ HANDLE_DW_OP(0xa7, xderef_type)
+ HANDLE_DW_OP(0xa8, convert)
+ HANDLE_DW_OP(0xa9, reinterpret)
+}; // enum LocationAtom
+} // namespace lldb
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits