From johnny.chen at apple.com Mon Jan 31 11:37:39 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 31 Jan 2011 17:37:39 -0000 Subject: [Lldb-commits] [lldb] r124586 - /lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h Message-ID: <20110131173739.679A12A6C12C@llvm.org> Author: johnny Date: Mon Jan 31 11:37:39 2011 New Revision: 124586 URL: http://llvm.org/viewvc/llvm-project?rev=124586&view=rev Log: Minor comment fix. Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h?rev=124586&r1=124585&r2=124586&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h Mon Jan 31 11:37:39 2011 @@ -29,7 +29,7 @@ /// - Predicting single step breakpoint locations /// - Emulating instructions for breakpoint traps /// -/// Objects can be asked to read and instruction which will cause a call +/// Objects can be asked to read an instruction which will cause a call /// to the read register callback to get the PC, followed by a read /// memory call to read the opcode. If ReadInstruction () returns true, /// then a call to EmulateInstruction::EvaluateInstruction () can be @@ -38,10 +38,10 @@ /// /// Clients that provide the callbacks can either do the read/write /// registers/memory to actually emulate the instruction on a real or -/// virtual CPU, or watch to the EmulateInstruction::Context which +/// virtual CPU, or watch for the EmulateInstruction::Context which /// is context for the read/write register/memory which explains why /// the callback is being called. Examples of a context are: -/// "pushing register 3 onto to stack at offset -12", or "adjusting +/// "pushing register 3 onto the stack at offset -12", or "adjusting /// stack pointer by -16". This extra context allows the generation of /// CFI information from assembly code without having to actually do /// the read/write register/memory. @@ -56,7 +56,7 @@ /// class that will soon be available. /// /// Implmenting all of the instructions that affect the PC can then -/// can then allow single step prediction support. +/// allow single step prediction support. /// /// Implmenting all of the instructions allows for emulation of opcodes /// for breakpoint traps and will pave the way for "thread centric" From johnny.chen at apple.com Mon Jan 31 12:02:28 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 31 Jan 2011 18:02:28 -0000 Subject: [Lldb-commits] [lldb] r124588 - /lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Message-ID: <20110131180228.5B9C82A6C12C@llvm.org> Author: johnny Date: Mon Jan 31 12:02:28 2011 New Revision: 124588 URL: http://llvm.org/viewvc/llvm-project?rev=124588&view=rev Log: Add some comments to the emulate_* functions. Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp?rev=124588&r1=124587&r2=124588&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Mon Jan 31 12:02:28 2011 @@ -68,6 +68,9 @@ const char *name; } ARMOpcode; +// Push Multiple Registers stores multiple registers to the stack, storing to +// consecutive memory locations ending just below the address in SP, and updates +// SP to point to the start of the stored data. static bool emulate_push (EmulateInstructionARM *emulator, ARMEncoding encoding) { @@ -660,7 +663,7 @@ return true; } -// A store operation to the stacks that also updates the SP. +// A store operation to the stack that also updates the SP. static bool emulate_str_rt_sp (EmulateInstructionARM *emulator, ARMEncoding encoding) { @@ -733,6 +736,8 @@ return true; } +// Vector Push stores multiple extension registers to the stack. +// It also updates SP to point to the start of the stored data. static bool emulate_vpush (EmulateInstructionARM *emulator, ARMEncoding encoding) { From ctice at apple.com Mon Jan 31 12:18:54 2011 From: ctice at apple.com (Caroline Tice) Date: Mon, 31 Jan 2011 18:18:54 -0000 Subject: [Lldb-commits] [lldb] r124589 - /lldb/trunk/test/settings/TestSettings.py Message-ID: <20110131181854.BD3182A6C12C@llvm.org> Author: ctice Date: Mon Jan 31 12:18:54 2011 New Revision: 124589 URL: http://llvm.org/viewvc/llvm-project?rev=124589&view=rev Log: Add a few more settings tests. Modified: lldb/trunk/test/settings/TestSettings.py Modified: lldb/trunk/test/settings/TestSettings.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/settings/TestSettings.py?rev=124589&r1=124588&r2=124589&view=diff ============================================================================== --- lldb/trunk/test/settings/TestSettings.py (original) +++ lldb/trunk/test/settings/TestSettings.py Mon Jan 31 12:18:54 2011 @@ -189,6 +189,37 @@ self.expect(output, exe=False, startstr = "This message should go to standard out.") + def test_print_dictionary_setting(self): + self.runCmd ("settings set -r target.process.env-vars") + self.runCmd ("settings set target.process.env-vars [\"MY_VAR\"]=some-value") + self.expect ("settings show target.process.env-vars", + substrs = [ "'MY_VAR=some-value'" ]) + self.runCmd ("settings set -r target.process.env-vars") + + def test_print_array_setting(self): + self.runCmd ("settings set -r target.process.run-args") + self.runCmd ("settings set target.process.run-args gobbledy-gook") + self.expect ("settings show target.process.run-args", + substrs = [ "[0]: 'gobbledy-gook'" ]) + self.runCmd ("settings set -r target.process.run-args") + + def test_settings_with_quotes (self): + self.runCmd ("settings set -r target.process.run-args") + self.runCmd ("settings set target.process.run-args a b c") + self.expect ("settings show target.process.run-args", + substrs = [ "[0]: 'a'", + "[1]: 'b'", + "[2]: 'c'" ]) + self.runCmd ("settings set target.process.run-args 'a b c'") + self.expect ("settings show target.process.run-args", + substrs = [ "[0]: 'a b c'" ]) + self.runCmd ("settings set -r target.process.run-args") + self.runCmd ("settings set -r target.process.env-vars") + self.runCmd ("settings set target.process.env-vars [\"MY_FILE\"]='this is a file name with spaces.txt'") + self.expect ("settings show target.process.env-vars", + substrs = [ "'MY_FILE=this is a file name with spaces.txt'" ]) + self.runCmd ("settings set -r target.process.env-vars") + if __name__ == '__main__': import atexit From ctice at apple.com Mon Jan 31 13:34:56 2011 From: ctice at apple.com (Caroline Tice) Date: Mon, 31 Jan 2011 19:34:56 -0000 Subject: [Lldb-commits] [lldb] r124594 - /lldb/trunk/test/alias_tests/TestAliases.py Message-ID: <20110131193456.38F9D2A6C12C@llvm.org> Author: ctice Date: Mon Jan 31 13:34:56 2011 New Revision: 124594 URL: http://llvm.org/viewvc/llvm-project?rev=124594&view=rev Log: Add test for help on aliased commands. Modified: lldb/trunk/test/alias_tests/TestAliases.py Modified: lldb/trunk/test/alias_tests/TestAliases.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/alias_tests/TestAliases.py?rev=124594&r1=124593&r2=124594&view=diff ============================================================================== --- lldb/trunk/test/alias_tests/TestAliases.py (original) +++ lldb/trunk/test/alias_tests/TestAliases.py Mon Jan 31 13:34:56 2011 @@ -80,6 +80,12 @@ "print frame; print bp_loc", "2: name = 'sum', locations = 1", "frame variable b" ]) + + + self.expect ("help run", + substrs = [ "'run' is an abbreviation for 'process launch --'" ]) + + self.expect ("run", patterns = [ "Process .* launched: .*a.out" ]) From johnny.chen at apple.com Mon Jan 31 14:01:01 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 31 Jan 2011 20:01:01 -0000 Subject: [Lldb-commits] [lldb] r124595 - /lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h Message-ID: <20110131200101.ABBF92A6C12C@llvm.org> Author: johnny Date: Mon Jan 31 14:01:01 2011 New Revision: 124595 URL: http://llvm.org/viewvc/llvm-project?rev=124595&view=rev Log: Align comment. Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h?rev=124595&r1=124594&r2=124595&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h Mon Jan 31 14:01:01 2011 @@ -127,7 +127,7 @@ ContextType type; lldb::addr_t arg0; // Register kind. lldb::addr_t arg1; // Register spec. - int64_t arg2; // Possible negative value. + int64_t arg2; // Possible negative value. }; union Opcode From johnny.chen at apple.com Mon Jan 31 14:09:28 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 31 Jan 2011 20:09:28 -0000 Subject: [Lldb-commits] [lldb] r124596 - /lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Message-ID: <20110131200928.EBC592A6C12C@llvm.org> Author: johnny Date: Mon Jan 31 14:09:28 2011 New Revision: 124596 URL: http://llvm.org/viewvc/llvm-project?rev=124596&view=rev Log: Add emulate_add_sp_imm entry to the g_thumb_opcodes table, which represents an operation to adjust the stack pointer by adding an imm7-scaled value to the SP. Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp?rev=124596&r1=124595&r2=124596&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Mon Jan 31 14:09:28 2011 @@ -433,6 +433,61 @@ } // An add operation to adjust the SP. +// ADD (SP plus immediate) +static bool +emulate_add_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) +{ +#if 0 + // ARM pseudo code... + if (ConditionPassed()) + { + EncodingSpecificOperations(); + (result, carry, overflow) = AddWithCarry(SP, imm32, ???0???); + if d == 15 then // Can only occur for ARM encoding + ALUWritePC(result); // setflags is always FALSE here + else + R[d] = result; + if setflags then + APSR.N = result<31>; + APSR.Z = IsZeroBit(result); + APSR.C = carry; + APSR.V = overflow; + } +#endif + + bool success = false; + const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + if (!success) + return false; + + if (emulator->ConditionPassed()) + { + const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + if (!success) + return false; + uint32_t imm32; // the immediate operand + switch (encoding) { + case eEncodingT2: + imm32 = ThumbImmScaled(opcode); // imm32 = ZeroExtend(imm7:'00', 32) + break; + default: + return false; + } + addr_t sp_offset = imm32; + addr_t addr = sp + sp_offset; // the adjusted stack pointer value + + EmulateInstruction::Context context = { EmulateInstruction::eContextAdjustStackPointer, + eRegisterKindGeneric, + LLDB_REGNUM_GENERIC_SP, + sp_offset }; + + if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) + return false; + } + return true; +} + +// An add operation to adjust the SP. // ADD (SP plus register) static bool emulate_add_sp_rm (EmulateInstructionARM *emulator, ARMEncoding encoding) @@ -833,6 +888,10 @@ static ARMOpcode g_arm_opcodes[] = { + /////////////////////////// + // Prologue instructions // + /////////////////////////// + // push register(s) { 0x0fff0000, 0x092d0000, ARMvAll, eEncodingA1, eSize32, emulate_push, "push " }, { 0x0fff0fff, 0x052d0004, ARMvAll, eEncodingA2, eSize32, emulate_push, "push " }, @@ -859,6 +918,10 @@ static ARMOpcode g_thumb_opcodes[] = { + /////////////////////////// + // Prologue instructions // + /////////////////////////// + // push register(s) { 0xfffffe00, 0x0000b400, ARMvAll, eEncodingT1, eSize16, emulate_push, "push " }, { 0xffff0000, 0xe92d0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_push, "push.w " }, @@ -881,7 +944,13 @@ // vector push consecutive extension register(s) { 0xffbf0f00, 0xed2d0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, emulate_vpush, "vpush.64 "}, - { 0xffbf0f00, 0xed2d0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_vpush, "vpush.32 "} + { 0xffbf0f00, 0xed2d0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_vpush, "vpush.32 "}, + + /////////////////////////// + // Epilogue instructions // + /////////////////////////// + + { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, emulate_add_sp_imm, "add sp, #imm"} }; static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); From ctice at apple.com Mon Jan 31 14:21:32 2011 From: ctice at apple.com (Caroline Tice) Date: Mon, 31 Jan 2011 20:21:32 -0000 Subject: [Lldb-commits] [lldb] r124598 - in /lldb/trunk/test/breakpoint_ids: ./ Makefile TestBreakpointIDs.py main.cpp Message-ID: <20110131202132.D95A02A6C12C@llvm.org> Author: ctice Date: Mon Jan 31 14:21:32 2011 New Revision: 124598 URL: http://llvm.org/viewvc/llvm-project?rev=124598&view=rev Log: Add test for breakpoint id ranges. Added: lldb/trunk/test/breakpoint_ids/ lldb/trunk/test/breakpoint_ids/Makefile lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py lldb/trunk/test/breakpoint_ids/main.cpp Added: lldb/trunk/test/breakpoint_ids/Makefile URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/breakpoint_ids/Makefile?rev=124598&view=auto ============================================================================== --- lldb/trunk/test/breakpoint_ids/Makefile (added) +++ lldb/trunk/test/breakpoint_ids/Makefile Mon Jan 31 14:21:32 2011 @@ -0,0 +1,5 @@ +LEVEL = ../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules Added: lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py?rev=124598&view=auto ============================================================================== --- lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py (added) +++ lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py Mon Jan 31 14:21:32 2011 @@ -0,0 +1,50 @@ +""" +Test lldb breakpoint ids. +""" + +import os, time +import unittest2 +import lldb +from lldbtest import * + +class BreakpointIDTestCase(TestBase): + + mydir = "breakpoint_ids" + + @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") + def test_with_dsym (self): + self.buildDsym () + self.breakpoint_id_tests () + + def test_with_dwarf (self): + self.buildDwarf () + self.breakpoint_id_tests () + + def breakpoint_id_tests (self): + exe = os.path.join (os.getcwd(), "a.out") + self.expect("file " + exe, + patterns = [ "Current executable set to .*a.out" ]) + + self.expect ("breakpoint set -n product", + startstr = "Breakpoint created: 1: name = 'product', locations = 2") + + self.expect ("breakpoint set -n sum", + startstr = "Breakpoint created: 2: name = 'sum', locations = 3") + + + self.expect ("breakpoint disable 1.2 - 2.2 ", + COMMAND_FAILED_AS_EXPECTED, error = True, + startstr = "error: Invalid range: Ranges that specify particular breakpoint locations must be within the same major breakpoint; you specified two different major breakpoints, 1 and 2.") + + self.expect ("breakpoint disable 1.1 - 1.2", + startstr = "2 breakpoints disabled.") + + self.expect ("breakpoint enable 1.*", + startstr = "2 breakpoints enabled.") + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() + Added: lldb/trunk/test/breakpoint_ids/main.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/breakpoint_ids/main.cpp?rev=124598&view=auto ============================================================================== --- lldb/trunk/test/breakpoint_ids/main.cpp (added) +++ lldb/trunk/test/breakpoint_ids/main.cpp Mon Jan 31 14:21:32 2011 @@ -0,0 +1,65 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include +#include +#include +#include + + +#define INLINE inline __attribute__((always_inline)) + +INLINE int +product (int x, int y) +{ + int result = x * y; + return result; +} + +INLINE int +sum (int a, int b) +{ + int result = a + b; + return result; +} + +int +strange_max (int m, int n) +{ + if (m > n) + return m; + else if (n > m) + return n; + else + return 0; +} + +int +foo (int i, int j) +{ + if (strange_max (i, j) == i) + return product (i, j); + else if (strange_max (i, j) == j) + return sum (i, j); + else + return product (sum (i, i), sum (j, j)); +} + +int +main(int argc, char const *argv[]) +{ + + int array[3]; + + array[0] = foo (1238, 78392); + array[1] = foo (379265, 23674); + array[2] = foo (872934, 234); + + return 0; +} From ctice at apple.com Mon Jan 31 14:27:28 2011 From: ctice at apple.com (Caroline Tice) Date: Mon, 31 Jan 2011 20:27:28 -0000 Subject: [Lldb-commits] [lldb] r124600 - /lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py Message-ID: <20110131202728.AE8602A6C12C@llvm.org> Author: ctice Date: Mon Jan 31 14:27:28 2011 New Revision: 124600 URL: http://llvm.org/viewvc/llvm-project?rev=124600&view=rev Log: Test warning for pending breakpoints. Modified: lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py Modified: lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py?rev=124600&r1=124599&r2=124600&view=diff ============================================================================== --- lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py (original) +++ lldb/trunk/test/breakpoint_ids/TestBreakpointIDs.py Mon Jan 31 14:27:28 2011 @@ -31,6 +31,9 @@ self.expect ("breakpoint set -n sum", startstr = "Breakpoint created: 2: name = 'sum', locations = 3") + self.expect ("breakpoint set -n junk", + startstr = "Breakpoint created: 3: name = 'junk', locations = 0 (pending)", + substrs = [ "WARNING: Unable to resolve breakpoint to any actual locations." ] ) self.expect ("breakpoint disable 1.2 - 2.2 ", COMMAND_FAILED_AS_EXPECTED, error = True, From johnny.chen at apple.com Mon Jan 31 17:07:41 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Mon, 31 Jan 2011 23:07:41 -0000 Subject: [Lldb-commits] [lldb] r124617 - in /lldb/trunk/source/Plugins/Process/Utility: EmulateInstruction.h EmulateInstructionARM.cpp Message-ID: <20110131230741.2850D2A6C12C@llvm.org> Author: johnny Date: Mon Jan 31 17:07:40 2011 New Revision: 124617 URL: http://llvm.org/viewvc/llvm-project?rev=124617&view=rev Log: Add emulate_pop (loads multiple registers from the stack) entries to both the g_arm_opcodes and g_thumb_opcodes tables. Plus a minor comment fix for EmulateInstruction.h. Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h?rev=124617&r1=124616&r2=124617&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h Mon Jan 31 17:07:40 2011 @@ -101,7 +101,7 @@ // stored eContextPushRegisterOnStack, - // Exclusively used when restoring a register to the stack as part of + // Exclusively used when restoring a register off the stack as part of // the epilogue // arg0 = register kind // arg1 = register number Modified: lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp?rev=124617&r1=124616&r2=124617&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp Mon Jan 31 17:07:40 2011 @@ -119,7 +119,7 @@ registers = Bits32(opcode, 7, 0); // The M bit represents LR. if (Bits32(opcode, 8, 8)) - registers |= 0x000eu; + registers |= (1u << 14); // if BitCount(registers) < 1 then UNPREDICTABLE; if (BitCount(registers) < 1) return false; @@ -196,6 +196,131 @@ return true; } +// Pop Multiple Registers loads multiple registers from the stack, loading from +// consecutive memory locations staring at the address in SP, and updates +// SP to point just above the loaded data. +static bool +emulate_pop (EmulateInstructionARM *emulator, ARMEncoding encoding) +{ +#if 0 + // ARM pseudo code... + if (ConditionPassed()) + { + EncodingSpecificOperations(); NullCheckIfThumbEE(13); + address = SP; + for i = 0 to 14 + if registers == ???1??? then + R[i} = if UnalignedAllowed then MemU[address,4] else MemA[address,4]; address = address + 4; + if registers<15> == ???1??? then + if UnalignedAllowed then + LoadWritePC(MemU[address,4]); + else + LoadWritePC(MemA[address,4]); + if registers<13> == ???0??? then SP = SP + 4*BitCount(registers); + if registers<13> == ???1??? then SP = bits(32) UNKNOWN; + } +#endif + + bool success = false; + const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + if (!success) + return false; + + if (emulator->ConditionPassed()) + { + const uint32_t addr_byte_size = emulator->GetAddressByteSize(); + const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + if (!success) + return false; + uint32_t registers = 0; + uint32_t Rt; // the destination register + switch (encoding) { + case eEncodingT1: + registers = Bits32(opcode, 7, 0); + // The P bit represents PC. + if (Bits32(opcode, 8, 8)) + registers |= (1u << 15); + // if BitCount(registers) < 1 then UNPREDICTABLE; + if (BitCount(registers) < 1) + return false; + break; + case eEncodingT2: + // Ignore bit 13. + registers = Bits32(opcode, 15, 0) & ~0x2000; + // if BitCount(registers) < 2 || (P == '1' && M == '1') then UNPREDICTABLE; + if (BitCount(registers) < 2 || (Bits32(opcode, 15, 15) && Bits32(opcode, 14, 14))) + return false; + break; + case eEncodingT3: + Rt = Bits32(opcode, 15, 12); + // if t == 13 || (t == 15 && InITBlock() && !LastInITBlock()) then UNPREDICTABLE; + if (Rt == dwarf_sp) + return false; + registers = (1u << Rt); + break; + case eEncodingA1: + registers = Bits32(opcode, 15, 0); + // Instead of return false, let's handle the following case as well, + // which amounts to popping one reg from the full descending stacks. + // if BitCount(register_list) < 2 then SEE LDM / LDMIA / LDMFD; + + // if registers<13> == ???1??? && ArchVersion() >= 7 then UNPREDICTABLE; + if (Bits32(opcode, 13, 13)) + return false; + break; + case eEncodingA2: + Rt = Bits32(opcode, 15, 12); + // if t == 13 then UNPREDICTABLE; + if (Rt == dwarf_sp) + return false; + registers = (1u << Rt); + break; + default: + return false; + } + addr_t sp_offset = addr_byte_size * BitCount (registers); + addr_t addr = sp; + uint32_t i, data; + + EmulateInstruction::Context context = { EmulateInstruction::eContextPopRegisterOffStack, eRegisterKindDWARF, 0, 0 }; + for (i=0; i<15; ++i) + { + if (BitIsSet (registers, 1u << i)) + { + context.arg1 = dwarf_r0 + i; // arg1 in the context is the DWARF register number + context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset + data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); + if (!success) + return false; + if (!emulator->WriteRegisterUnsigned(context, eRegisterKindDWARF, context.arg1, data)) + return false; + addr += addr_byte_size; + } + } + + if (BitIsSet (registers, 1u << 15)) + { + context.arg1 = dwarf_pc; // arg1 in the context is the DWARF register number + context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset + data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); + if (!success) + return false; + if (!emulator->WriteRegisterUnsigned(context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, data)) + return false; + addr += addr_byte_size; + } + + context.type = EmulateInstruction::eContextAdjustStackPointer; + context.arg0 = eRegisterKindGeneric; + context.arg1 = LLDB_REGNUM_GENERIC_SP; + context.arg2 = sp_offset; + + if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp + sp_offset)) + return false; + } + return true; +} + // Set r7 or ip to point to saved value residing within the stack. // ADD (SP plus immediate) static bool @@ -913,7 +1038,14 @@ // vector push consecutive extension register(s) { 0x0fbf0f00, 0x0d2d0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, emulate_vpush, "vpush.64 "}, - { 0x0fbf0f00, 0x0d2d0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, emulate_vpush, "vpush.32 "} + { 0x0fbf0f00, 0x0d2d0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, emulate_vpush, "vpush.32 "}, + + /////////////////////////// + // Epilogue instructions // + /////////////////////////// + + { 0x0fff0000, 0x08bd0000, ARMvAll, eEncodingA1, eSize32, emulate_pop, "pop "}, + { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, emulate_pop, "pop "} }; static ARMOpcode g_thumb_opcodes[] = @@ -950,7 +1082,10 @@ // Epilogue instructions // /////////////////////////// - { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, emulate_add_sp_imm, "add sp, #imm"} + { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, emulate_add_sp_imm, "add sp, #imm"}, + { 0xfffffe00, 0x0000bc00, ARMvAll, eEncodingT1, eSize16, emulate_pop, "pop "}, + { 0xffff0000, 0xe8bd0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_pop, "pop.w " }, + { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, emulate_pop, "pop.w " } }; static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); From gclayton at apple.com Mon Jan 31 17:14:36 2011 From: gclayton at apple.com (Greg Clayton) Date: Mon, 31 Jan 2011 23:14:36 -0000 Subject: [Lldb-commits] [lldb] r124619 - in /lldb/trunk/test/cpp: ./ virtual/ virtual/main.cpp Message-ID: <20110131231436.147852A6C12C@llvm.org> Author: gclayton Date: Mon Jan 31 17:14:35 2011 New Revision: 124619 URL: http://llvm.org/viewvc/llvm-project?rev=124619&view=rev Log: Added a virtual C++ test case that catches some interesting cases that you run into with inheritance. Added: lldb/trunk/test/cpp/ lldb/trunk/test/cpp/virtual/ lldb/trunk/test/cpp/virtual/main.cpp Added: lldb/trunk/test/cpp/virtual/main.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/cpp/virtual/main.cpp?rev=124619&view=auto ============================================================================== --- lldb/trunk/test/cpp/virtual/main.cpp (added) +++ lldb/trunk/test/cpp/virtual/main.cpp Mon Jan 31 17:14:35 2011 @@ -0,0 +1,111 @@ +#include +#include + +class A +{ +public: + A () : m_pad ('c') {} + + virtual ~A () {} + + virtual const char * a() + { + return __PRETTY_FUNCTION__; + } + + virtual const char * b() + { + return __PRETTY_FUNCTION__; + } + + virtual const char * c() + { + return __PRETTY_FUNCTION__; + } +protected: + char m_pad; +}; + +class AA +{ +public: + AA () : m_pad('A') {} + virtual ~AA () {} + + virtual const char * aa() + { + return __PRETTY_FUNCTION__; + } + +protected: + char m_pad; +}; + +class B : virtual public A, public AA +{ +public: + B () : m_pad ('c') {} + + virtual ~B () {} + + virtual const char * a() + { + return __PRETTY_FUNCTION__; + } + + virtual const char * b() + { + return __PRETTY_FUNCTION__; + } +protected: + char m_pad; +}; + +class C : public B, virtual public A +{ +public: + C () : m_pad ('c') {} + + virtual ~C () {} + + virtual const char * a() + { + return __PRETTY_FUNCTION__; + } +protected: + char m_pad; +}; + +int main (int argc, char const *argv[], char const *envp[]) +{ + A *a_as_A = new A(); + B *b_as_B = new B(); + A *b_as_A = b_as_B; + C *c_as_C = new C(); + A *c_as_A = c_as_C; + + printf ("a_as_A->a() = '%s'\n", a_as_A->a()); + printf ("a_as_A->b() = '%s'\n", a_as_A->b()); + printf ("a_as_A->c() = '%s'\n", a_as_A->c()); + printf ("b_as_A->a() = '%s'\n", b_as_A->a()); + printf ("b_as_A->b() = '%s'\n", b_as_A->b()); + printf ("b_as_A->c() = '%s'\n", b_as_A->c()); + printf ("b_as_B->aa() = '%s'\n", b_as_B->aa()); + printf ("c_as_A->a() = '%s'\n", c_as_A->a()); + printf ("c_as_A->b() = '%s'\n", c_as_A->b()); + printf ("c_as_A->c() = '%s'\n", c_as_A->c()); + printf ("c_as_C->aa() = '%s'\n", c_as_C->aa()); + return 0; // Set first breakpoint here. + // then evaluate: + // expression a_as_A->a() + // expression a_as_A->b() + // expression a_as_A->c() + // expression b_as_A->a() + // expression b_as_A->b() + // expression b_as_A->c() + // expression b_as_B->aa() + // expression c_as_A->a() + // expression c_as_A->b() + // expression c_as_A->c() + // expression c_as_C->aa() +} From gclayton at apple.com Mon Jan 31 18:04:44 2011 From: gclayton at apple.com (Greg Clayton) Date: Tue, 01 Feb 2011 00:04:44 -0000 Subject: [Lldb-commits] [lldb] r124631 - in /lldb/trunk: include/lldb/Core/ lldb.xcodeproj/ lldb.xcodeproj/xcshareddata/xcschemes/ source/Core/ source/Plugins/Instruction/ source/Plugins/Instruction/ARM/ source/Plugins/Process/Utility/ Message-ID: <20110201000444.284A02A6C12C@llvm.org> Author: gclayton Date: Mon Jan 31 18:04:43 2011 New Revision: 124631 URL: http://llvm.org/viewvc/llvm-project?rev=124631&view=rev Log: Made the EmulateInstruction class into a plug-in interface and moved the source files around into the places they need to go. Added: lldb/trunk/include/lldb/Core/EmulateInstruction.h - copied unchanged from r124630, lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h lldb/trunk/source/Core/EmulateInstruction.cpp - copied unchanged from r124630, lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.cpp lldb/trunk/source/Plugins/Instruction/ lldb/trunk/source/Plugins/Instruction/ARM/ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp - copied, changed from r124630, lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h - copied, changed from r124630, lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h Removed: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.cpp lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=124631&r1=124630&r2=124631&view=diff ============================================================================== --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original) +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Mon Jan 31 18:04:43 2011 @@ -15,10 +15,6 @@ 2618D7921240116900F2B8FE /* SectionLoadList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2618D7911240116900F2B8FE /* SectionLoadList.cpp */; }; 2618D9EB12406FE600F2B8FE /* NameToDIE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2618D9EA12406FE600F2B8FE /* NameToDIE.cpp */; }; 261B5A5411C3F2AD00AABD0A /* SharingPtr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 261B5A5211C3F2AD00AABD0A /* SharingPtr.cpp */; }; - 2621C9CD12EA009300711A30 /* EmulateInstructionARM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2621C9CB12EA009300711A30 /* EmulateInstructionARM.cpp */; }; - 2621C9CE12EA009300711A30 /* EmulateInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 2621C9CC12EA009300711A30 /* EmulateInstruction.h */; }; - 2621C9D012EA066500711A30 /* EmulateInstructionARM.h in Headers */ = {isa = PBXBuildFile; fileRef = 2621C9CF12EA066500711A30 /* EmulateInstructionARM.h */; }; - 2621CA0B12EA107700711A30 /* EmulateInstruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2621CA0A12EA107700711A30 /* EmulateInstruction.cpp */; }; 262CFC7711A4510000946C6C /* debugserver in Resources */ = {isa = PBXBuildFile; fileRef = 26CE05A0115C31E50022F371 /* debugserver */; }; 2635DA87127D0D0400675BC1 /* SharingPtr.h in Headers */ = {isa = PBXBuildFile; fileRef = 261B5A5311C3F2AD00AABD0A /* SharingPtr.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26368A3C126B697600E8659F /* darwin-debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26368A3B126B697600E8659F /* darwin-debug.cpp */; }; @@ -291,6 +287,10 @@ 26D5B15611B07550009A862E /* CommandObjectArgs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 499F381F11A5B3F300F5CE02 /* CommandObjectArgs.cpp */; }; 26D5B15A11B07550009A862E /* UnwindMacOSXFrameBackchain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26E3EEE311A9901300FBADB6 /* UnwindMacOSXFrameBackchain.cpp */; }; 26D5B15B11B07550009A862E /* RegisterContextMacOSXFrameBackchain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26E3EEF711A994E800FBADB6 /* RegisterContextMacOSXFrameBackchain.cpp */; }; + 26D9FDC712F784E60003F2EE /* EmulateInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 26D9FDC612F784E60003F2EE /* EmulateInstruction.h */; }; + 26D9FDC912F784FD0003F2EE /* EmulateInstruction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26D9FDC812F784FD0003F2EE /* EmulateInstruction.cpp */; }; + 26D9FDCE12F7853F0003F2EE /* EmulateInstructionARM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26D9FDCC12F7853F0003F2EE /* EmulateInstructionARM.cpp */; }; + 26D9FDCF12F7853F0003F2EE /* EmulateInstructionARM.h in Headers */ = {isa = PBXBuildFile; fileRef = 26D9FDCD12F7853F0003F2EE /* EmulateInstructionARM.h */; }; 26DE1E6B11616C2E00A093E2 /* lldb-forward-rtti.h in Headers */ = {isa = PBXBuildFile; fileRef = 26DE1E6911616C2E00A093E2 /* lldb-forward-rtti.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26DE1E6C11616C2E00A093E2 /* lldb-forward.h in Headers */ = {isa = PBXBuildFile; fileRef = 26DE1E6A11616C2E00A093E2 /* lldb-forward.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26DE204111618AB900A093E2 /* SBSymbolContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 26DE204011618AB900A093E2 /* SBSymbolContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -547,10 +547,6 @@ 261B5A5311C3F2AD00AABD0A /* SharingPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SharingPtr.h; path = include/lldb/Utility/SharingPtr.h; sourceTree = ""; }; 261E18CC1148966100BADCD3 /* GDBRemoteRegisterContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GDBRemoteRegisterContext.h; path = "source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h"; sourceTree = ""; }; 261E18CD1148966100BADCD3 /* GDBRemoteRegisterContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GDBRemoteRegisterContext.cpp; path = "source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp"; sourceTree = ""; }; - 2621C9CB12EA009300711A30 /* EmulateInstructionARM.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EmulateInstructionARM.cpp; path = Utility/EmulateInstructionARM.cpp; sourceTree = ""; }; - 2621C9CC12EA009300711A30 /* EmulateInstruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulateInstruction.h; path = Utility/EmulateInstruction.h; sourceTree = ""; }; - 2621C9CF12EA066500711A30 /* EmulateInstructionARM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulateInstructionARM.h; path = Utility/EmulateInstructionARM.h; sourceTree = ""; }; - 2621CA0A12EA107700711A30 /* EmulateInstruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EmulateInstruction.cpp; path = Utility/EmulateInstruction.cpp; sourceTree = ""; }; 263664921140A4930075843B /* Debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Debugger.cpp; path = source/Core/Debugger.cpp; sourceTree = ""; }; 263664941140A4C10075843B /* Debugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Debugger.h; path = include/lldb/Core/Debugger.h; sourceTree = ""; }; 26368A3B126B697600E8659F /* darwin-debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "darwin-debug.cpp"; path = "tools/darwin-debug/darwin-debug.cpp"; sourceTree = ""; }; @@ -878,6 +874,10 @@ 26D0DD5510FE555900271C65 /* BreakpointResolverName.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BreakpointResolverName.cpp; path = source/Breakpoint/BreakpointResolverName.cpp; sourceTree = ""; }; 26D27C9D11ED3A4E0024D721 /* ELFHeader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ELFHeader.cpp; sourceTree = ""; }; 26D27C9E11ED3A4E0024D721 /* ELFHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ELFHeader.h; sourceTree = ""; }; + 26D9FDC612F784E60003F2EE /* EmulateInstruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulateInstruction.h; path = include/lldb/Core/EmulateInstruction.h; sourceTree = ""; }; + 26D9FDC812F784FD0003F2EE /* EmulateInstruction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EmulateInstruction.cpp; path = source/Core/EmulateInstruction.cpp; sourceTree = ""; }; + 26D9FDCC12F7853F0003F2EE /* EmulateInstructionARM.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EmulateInstructionARM.cpp; path = Instruction/ARM/EmulateInstructionARM.cpp; sourceTree = ""; }; + 26D9FDCD12F7853F0003F2EE /* EmulateInstructionARM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EmulateInstructionARM.h; path = Instruction/ARM/EmulateInstructionARM.h; sourceTree = ""; }; 26DAFD9711529BC7005A394E /* ExecutionContextScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExecutionContextScope.h; path = include/lldb/Target/ExecutionContextScope.h; sourceTree = ""; }; 26DE1E6911616C2E00A093E2 /* lldb-forward-rtti.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lldb-forward-rtti.h"; path = "include/lldb/lldb-forward-rtti.h"; sourceTree = ""; }; 26DE1E6A11616C2E00A093E2 /* lldb-forward.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "lldb-forward.h"; path = "include/lldb/lldb-forward.h"; sourceTree = ""; }; @@ -1195,6 +1195,7 @@ 493C63D711891A8000914D5E /* ABI */, 260C897210F57C5600BB2B04 /* Disassembler */, 260C897810F57C5600BB2B04 /* DynamicLoader */, + 26D9FDCA12F785120003F2EE /* Instruction */, 4CB443651249446F00C13DC2 /* LanguageRuntime */, 260C897E10F57C5600BB2B04 /* ObjectContainer */, 260C898210F57C5600BB2B04 /* ObjectFile */, @@ -1616,10 +1617,6 @@ B2D3033612EFA5C500F84EB3 /* InstructionUtils.h */, B287E63E12EFAE2C00C9BEFE /* ARMDefines.h */, B23DD24F12EDFAC1000C3894 /* ARMUtils.h */, - 2621C9CC12EA009300711A30 /* EmulateInstruction.h */, - 2621CA0A12EA107700711A30 /* EmulateInstruction.cpp */, - 2621C9CF12EA066500711A30 /* EmulateInstructionARM.h */, - 2621C9CB12EA009300711A30 /* EmulateInstructionARM.cpp */, AF68D32F1255A110002FF25B /* UnwindLLDB.cpp */, AF68D3301255A110002FF25B /* UnwindLLDB.h */, AF68D2541255416E002FF25B /* RegisterContextLLDB.cpp */, @@ -1681,6 +1678,8 @@ 26BC7E7610F1B85900F91463 /* Disassembler.cpp */, 26BC7D5F10F1B77400F91463 /* dwarf.h */, 26BC7E7710F1B85900F91463 /* DynamicLoader.cpp */, + 26D9FDC612F784E60003F2EE /* EmulateInstruction.h */, + 26D9FDC812F784FD0003F2EE /* EmulateInstruction.cpp */, 26BC7D6010F1B77400F91463 /* Error.h */, 26BC7E7810F1B85900F91463 /* Error.cpp */, 26BC7D6110F1B77400F91463 /* Event.h */, @@ -2106,6 +2105,23 @@ name = MacOSX; sourceTree = ""; }; + 26D9FDCA12F785120003F2EE /* Instruction */ = { + isa = PBXGroup; + children = ( + 26D9FDCB12F785270003F2EE /* ARM */, + ); + name = Instruction; + sourceTree = ""; + }; + 26D9FDCB12F785270003F2EE /* ARM */ = { + isa = PBXGroup; + children = ( + 26D9FDCD12F7853F0003F2EE /* EmulateInstructionARM.h */, + 26D9FDCC12F7853F0003F2EE /* EmulateInstructionARM.cpp */, + ); + name = ARM; + sourceTree = ""; + }; 26F5C22410F3D950009D5894 /* Tools */ = { isa = PBXGroup; children = ( @@ -2310,11 +2326,11 @@ 266A42D8128E40040090CF7C /* ClangNamespaceDecl.h in Headers */, 26E6902F129C6BD500DDECD9 /* ClangExternalASTSourceCallbacks.h in Headers */, 4C7CF7E41295E10E00B4FBB5 /* ThreadPlanCallUserExpression.h in Headers */, - 2621C9CE12EA009300711A30 /* EmulateInstruction.h in Headers */, - 2621C9D012EA066500711A30 /* EmulateInstructionARM.h in Headers */, B23DD25012EDFAC1000C3894 /* ARMUtils.h in Headers */, B2D3033712EFA5C500F84EB3 /* InstructionUtils.h in Headers */, B287E63F12EFAE2C00C9BEFE /* ARMDefines.h in Headers */, + 26D9FDC712F784E60003F2EE /* EmulateInstruction.h in Headers */, + 26D9FDCF12F7853F0003F2EE /* EmulateInstructionARM.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2816,8 +2832,8 @@ 26E69031129C6BEF00DDECD9 /* ClangExternalASTSourceCallbacks.cpp in Sources */, 4C7CF7E61295E12B00B4FBB5 /* ThreadPlanCallUserExpression.cpp in Sources */, B296983712C2FB98002D92C3 /* CommandObjectVersion.cpp in Sources */, - 2621C9CD12EA009300711A30 /* EmulateInstructionARM.cpp in Sources */, - 2621CA0B12EA107700711A30 /* EmulateInstruction.cpp in Sources */, + 26D9FDC912F784FD0003F2EE /* EmulateInstruction.cpp in Sources */, + 26D9FDCE12F7853F0003F2EE /* EmulateInstructionARM.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; Modified: lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme?rev=124631&r1=124630&r2=124631&view=diff ============================================================================== --- lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme (original) +++ lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme Mon Jan 31 18:04:43 2011 @@ -28,6 +28,12 @@ buildConfiguration = "Debug"> + + + + @@ -78,6 +84,12 @@ ReferencedContainer = "container:lldb.xcodeproj"> + + + + @@ -129,6 +141,12 @@ ReferencedContainer = "container:lldb.xcodeproj"> + + + + Copied: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp (from r124630, lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp) URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp?p2=lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp&p1=lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp&r1=124630&r2=124631&rev=124631&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Mon Jan 31 18:04:43 2011 @@ -8,9 +8,11 @@ //===----------------------------------------------------------------------===// #include "EmulateInstructionARM.h" +#include "lldb/Core/ConstString.h" + #include "ARMDefines.h" #include "ARMUtils.h" -#include "lldb/Core/ConstString.h" +#include "ARM_DWARF_Registers.h" using namespace lldb; using namespace lldb_private; Copied: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h (from r124630, lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h) URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h?p2=lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h&p1=lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h&r1=124630&r2=124631&rev=124631&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h (original) +++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h Mon Jan 31 18:04:43 2011 @@ -10,9 +10,7 @@ #ifndef lldb_EmulateInstructionARM_h_ #define lldb_EmulateInstructionARM_h_ -#include "EmulateInstruction.h" -#include "ARM_DWARF_Registers.h" - +#include "lldb/Core/EmulateInstruction.h" #include "lldb/Core/Error.h" namespace lldb_private { Removed: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.cpp?rev=124630&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.cpp (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.cpp (removed) @@ -1,98 +0,0 @@ -//===-- EmulateInstruction.h ------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "EmulateInstruction.h" - -#include "lldb/Core/DataExtractor.h" -#include "lldb/Core/StreamString.h" -using namespace lldb; -using namespace lldb_private; - - -EmulateInstruction::EmulateInstruction -( - lldb::ByteOrder byte_order, - uint32_t addr_byte_size, - void *baton, - ReadMemory read_mem_callback, - WriteMemory write_mem_callback, - ReadRegister read_reg_callback, - WriteRegister write_reg_callback -) : - m_byte_order (lldb::eByteOrderHost), - m_addr_byte_size (sizeof (void *)), - m_baton (baton), - m_read_mem_callback (read_mem_callback), - m_write_mem_callback (write_mem_callback), - m_read_reg_callback (read_reg_callback), - m_write_reg_callback (write_reg_callback), - m_inst_pc (LLDB_INVALID_ADDRESS) -{ - ::bzero (&m_inst, sizeof (m_inst)); -} - -uint64_t -EmulateInstruction::ReadRegisterUnsigned (uint32_t reg_kind, uint32_t reg_num, uint64_t fail_value, bool *success_ptr) -{ - uint64_t uval64 = 0; - bool success = m_read_reg_callback (m_baton, reg_kind, reg_num, uval64); - if (success_ptr) - *success_ptr = success; - if (!success) - uval64 = fail_value; - return uval64; -} - -bool -EmulateInstruction::WriteRegisterUnsigned (const Context &context, uint32_t reg_kind, uint32_t reg_num, uint64_t reg_value) -{ - return m_write_reg_callback (m_baton, context, reg_kind, reg_num, reg_value); -} - -uint64_t -EmulateInstruction::ReadMemoryUnsigned (const Context &context, lldb::addr_t addr, size_t byte_size, uint64_t fail_value, bool *success_ptr) -{ - uint64_t uval64 = 0; - bool success = false; - if (byte_size <= 8) - { - uint8_t buf[sizeof(uint64_t)]; - size_t bytes_read = m_read_mem_callback (m_baton, context, addr, buf, byte_size); - if (bytes_read == byte_size) - { - uint32_t offset = 0; - DataExtractor data (buf, byte_size, m_byte_order, m_addr_byte_size); - uval64 = data.GetMaxU64 (&offset, byte_size); - success = true; - } - } - - if (success_ptr) - *success_ptr = success; - - if (!success) - uval64 = fail_value; - return uval64; -} - - -bool -EmulateInstruction::WriteMemoryUnsigned (const Context &context, - lldb::addr_t addr, - uint64_t uval, - size_t uval_byte_size) -{ - StreamString strm(Stream::eBinary, GetAddressByteSize(), GetByteOrder()); - strm.PutMaxHex64 (uval, uval_byte_size); - - size_t bytes_written = m_write_mem_callback (m_baton, context, addr, strm.GetData(), uval_byte_size); - if (bytes_written == uval_byte_size) - return true; - return false; -} Removed: lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h?rev=124630&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstruction.h (removed) @@ -1,280 +0,0 @@ -//===-- EmulateInstruction.h ------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef lldb_EmulateInstruction_h_ -#define lldb_EmulateInstruction_h_ - -#include "lldb/lldb-include.h" -#include "lldb/Core/PluginInterface.h" - -//---------------------------------------------------------------------- -/// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h" -/// @brief A class that allows emulation of CPU opcodes. -/// -/// This class is a plug-in interface that is accessed through the -/// standard static FindPlugin function call in the EmulateInstruction -/// class. The FindPlugin takes a target triple and returns a new object -/// if there is a plug-in that supports the architecture and OS. Four -/// callbacks and a baton are provided. The four callbacks are read -/// register, write register, read memory and write memory. -/// -/// This class is currently designed for these main use cases: -/// - Auto generation of Call Frame Information (CFI) from assembly code -/// - Predicting single step breakpoint locations -/// - Emulating instructions for breakpoint traps -/// -/// Objects can be asked to read an instruction which will cause a call -/// to the read register callback to get the PC, followed by a read -/// memory call to read the opcode. If ReadInstruction () returns true, -/// then a call to EmulateInstruction::EvaluateInstruction () can be -/// made. At this point the EmulateInstruction subclass will use all of -/// the callbacks to emulate an instruction. -/// -/// Clients that provide the callbacks can either do the read/write -/// registers/memory to actually emulate the instruction on a real or -/// virtual CPU, or watch for the EmulateInstruction::Context which -/// is context for the read/write register/memory which explains why -/// the callback is being called. Examples of a context are: -/// "pushing register 3 onto the stack at offset -12", or "adjusting -/// stack pointer by -16". This extra context allows the generation of -/// CFI information from assembly code without having to actually do -/// the read/write register/memory. -/// -/// Clients must be prepared that not all instructions for an -/// Instruction Set Architecture (ISA) will be emulated. -/// -/// Subclasses at the very least should implement the instructions that -/// save and restore regiters onto the stack and adjustment to the stack -/// pointer. By just implementing a few instructions for an ISA that are -/// the typical prologue opcodes, you can then generate CFI using a -/// class that will soon be available. -/// -/// Implmenting all of the instructions that affect the PC can then -/// allow single step prediction support. -/// -/// Implmenting all of the instructions allows for emulation of opcodes -/// for breakpoint traps and will pave the way for "thread centric" -/// debugging. The current debugging model is "process centric" where -/// all threads must be stopped when any thread is stopped since when -/// hitting software breakpoints once must disable the breakpoint by -/// restoring the original breakpoint opcde, single stepping and -/// restoring the breakpoint trap. If all threads were allowed to run -/// then other threads could miss the breakpoint. -/// -/// This class centralizes the code that usually is done in separate -/// code paths in a debugger (single step prediction, finding save -/// restore locations of registers for unwinding stack frame variables, -/// and emulating the intruction is just a bonus. -//---------------------------------------------------------------------- - -namespace lldb_private { - -class EmulateInstruction : - public PluginInterface -{ -public: - - static Disassembler* - FindPlugin (const ArchSpec &arch); - - enum ContextType - { - eContextInvalid = 0, - // Read an instruciton opcode from memory - eContextReadOpcode, - - // Usually used for writing a register value whose source value in an - // immediate - eContextImmediate, - - // Exclusively used when saving a register to the stack as part of the - // prologue - // arg0 = register kind - // arg1 = register number - // arg2 = signed offset from current SP value where register is being - // stored - eContextPushRegisterOnStack, - - // Exclusively used when restoring a register off the stack as part of - // the epilogue - // arg0 = register kind - // arg1 = register number - // arg2 = signed offset from current SP value where register is being - // restored - eContextPopRegisterOffStack, - - // Add or subtract a value from the stack - // arg0 = register kind for SP - // arg1 = register number for SP - // arg2 = signed offset being applied to the SP value - eContextAdjustStackPointer, - - // Used in WriteRegister callbacks to indicate where the - // arg0 = source register kind - // arg1 = source register number - // arg2 = source signed offset - eContextRegisterPlusOffset, - }; - - struct Context - { - ContextType type; - lldb::addr_t arg0; // Register kind. - lldb::addr_t arg1; // Register spec. - int64_t arg2; // Possible negative value. - }; - - union Opcode - { - uint8_t inst8; - uint16_t inst16; - uint32_t inst32; - uint64_t inst64; - union inst - { - uint8_t bytes[16]; - uint8_t length; - }; - }; - - enum OpcodeType - { - eOpcode8, - eOpcode16, - eOpcode32, - eOpcode64, - eOpcodeBytes, - }; - - struct Instruction - { - OpcodeType opcode_type; - Opcode opcode; - }; - - typedef size_t (*ReadMemory) (void *baton, - const Context &context, - lldb::addr_t addr, - void *dst, - size_t length); - - typedef size_t (*WriteMemory) (void *baton, - const Context &context, - lldb::addr_t addr, - const void *dst, - size_t length); - - typedef bool (*ReadRegister) (void *baton, - uint32_t reg_kind, - uint32_t reg_num, - uint64_t ®_value); - - typedef bool (*WriteRegister) (void *baton, - const Context &context, - uint32_t reg_kind, - uint32_t reg_num, - uint64_t reg_value); - - EmulateInstruction (lldb::ByteOrder byte_order, - uint32_t addr_byte_size, - void *baton, - ReadMemory read_mem_callback, - WriteMemory write_mem_callback, - ReadRegister read_reg_callback, - WriteRegister write_reg_callback); - - virtual ~EmulateInstruction() - { - } - - virtual bool - SetTargetTriple (const ConstString &triple) = 0; - - virtual bool - ReadInstruction () = 0; - - virtual bool - EvaluateInstruction () = 0; - - uint64_t - ReadRegisterUnsigned (uint32_t reg_kind, - uint32_t reg_num, - uint64_t fail_value, - bool *success_ptr); - - bool - WriteRegisterUnsigned (const Context &context, - uint32_t reg_kind, - uint32_t reg_num, - uint64_t reg_value); - - uint64_t - ReadMemoryUnsigned (const Context &context, - lldb::addr_t addr, - size_t byte_size, - uint64_t fail_value, - bool *success_ptr); - - bool - WriteMemoryUnsigned (const Context &context, - lldb::addr_t addr, - uint64_t uval, - size_t uval_byte_size); - - uint32_t - GetAddressByteSize () const - { - return m_addr_byte_size; - } - - lldb::ByteOrder - GetByteOrder () const - { - return m_byte_order; - } - - uint64_t - OpcodeAsUnsigned (bool *success_ptr) - { - if (success_ptr) - *success_ptr = true; - switch (m_inst.opcode_type) - { - eOpcode8: return m_inst.opcode.inst8; - eOpcode16: return m_inst.opcode.inst16; - eOpcode32: return m_inst.opcode.inst32; - eOpcode64: return m_inst.opcode.inst64; - eOpcodeBytes: - break; - } - if (success_ptr) - *success_ptr = false; - return 0; - } - -protected: - lldb::ByteOrder m_byte_order; - uint32_t m_addr_byte_size; - void * m_baton; - ReadMemory m_read_mem_callback; - WriteMemory m_write_mem_callback; - ReadRegister m_read_reg_callback; - WriteRegister m_write_reg_callback; - - lldb::addr_t m_inst_pc; - Instruction m_inst; - //------------------------------------------------------------------ - // For EmulateInstruction only - //------------------------------------------------------------------ - DISALLOW_COPY_AND_ASSIGN (EmulateInstruction); -}; - -} // namespace lldb_private - -#endif // lldb_EmulateInstruction_h_ Removed: lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp?rev=124630&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.cpp (removed) @@ -1,1243 +0,0 @@ -//===-- EmulateInstructionARM.cpp -------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "EmulateInstructionARM.h" -#include "ARMDefines.h" -#include "ARMUtils.h" -#include "lldb/Core/ConstString.h" - -using namespace lldb; -using namespace lldb_private; - -// ARM constants used during decoding -#define REG_RD 0 -#define LDM_REGLIST 1 -#define PC_REG 15 -#define PC_REGLIST_BIT 0x8000 - -#define ARMv4 (1u << 0) -#define ARMv4T (1u << 1) -#define ARMv5T (1u << 2) -#define ARMv5TE (1u << 3) -#define ARMv5TEJ (1u << 4) -#define ARMv6 (1u << 5) -#define ARMv6K (1u << 6) -#define ARMv6T2 (1u << 7) -#define ARMv7 (1u << 8) -#define ARMv8 (1u << 9) -#define ARMvAll (0xffffffffu) - -typedef enum -{ - eEncodingA1, - eEncodingA2, - eEncodingA3, - eEncodingA4, - eEncodingA5, - eEncodingT1, - eEncodingT2, - eEncodingT3, - eEncodingT4, - eEncodingT5, -} ARMEncoding; - -typedef enum -{ - eSize16, - eSize32 -} ARMInstrSize; - -// Typedef for the callback function used during the emulation. -// Pass along (ARMEncoding)encoding as the callback data. -typedef bool (*EmulateCallback) (EmulateInstructionARM *emulator, ARMEncoding encoding); - -typedef struct -{ - uint32_t mask; - uint32_t value; - uint32_t variants; - ARMEncoding encoding; - ARMInstrSize size; - EmulateCallback callback; - const char *name; -} ARMOpcode; - -// Push Multiple Registers stores multiple registers to the stack, storing to -// consecutive memory locations ending just below the address in SP, and updates -// SP to point to the start of the stored data. -static bool -emulate_push (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - NullCheckIfThumbEE(13); - address = SP - 4*BitCount(registers); - - for (i = 0 to 14) - { - if (registers == ???1???) - { - if i == 13 && i != LowestSetBit(registers) // Only possible for encoding A1 - MemA[address,4] = bits(32) UNKNOWN; - else - MemA[address,4] = R[i]; - address = address + 4; - } - } - - if (registers<15> == ???1???) // Only possible for encoding A1 or A2 - MemA[address,4] = PCStoreValue(); - - SP = SP - 4*BitCount(registers); - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t registers = 0; - uint32_t Rt; // the source register - switch (encoding) { - case eEncodingT1: - registers = Bits32(opcode, 7, 0); - // The M bit represents LR. - if (Bits32(opcode, 8, 8)) - registers |= (1u << 14); - // if BitCount(registers) < 1 then UNPREDICTABLE; - if (BitCount(registers) < 1) - return false; - break; - case eEncodingT2: - // Ignore bits 15 & 13. - registers = Bits32(opcode, 15, 0) & ~0xa000; - // if BitCount(registers) < 2 then UNPREDICTABLE; - if (BitCount(registers) < 2) - return false; - break; - case eEncodingT3: - Rt = Bits32(opcode, 15, 12); - // if BadReg(t) then UNPREDICTABLE; - if (BadReg(Rt)) - return false; - registers = (1u << Rt); - break; - case eEncodingA1: - registers = Bits32(opcode, 15, 0); - // Instead of return false, let's handle the following case as well, - // which amounts to pushing one reg onto the full descending stacks. - // if BitCount(register_list) < 2 then SEE STMDB / STMFD; - break; - case eEncodingA2: - Rt = Bits32(opcode, 15, 12); - // if t == 13 then UNPREDICTABLE; - if (Rt == dwarf_sp) - return false; - registers = (1u << Rt); - break; - default: - return false; - } - addr_t sp_offset = addr_byte_size * BitCount (registers); - addr_t addr = sp - sp_offset; - uint32_t i; - - EmulateInstruction::Context context = { EmulateInstruction::eContextPushRegisterOnStack, eRegisterKindDWARF, 0, 0 }; - for (i=0; i<15; ++i) - { - if (BitIsSet (registers, 1u << i)) - { - context.arg1 = dwarf_r0 + i; // arg1 in the context is the DWARF register number - context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - uint32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); - if (!success) - return false; - if (!emulator->WriteMemoryUnsigned (context, addr, reg_value, addr_byte_size)) - return false; - addr += addr_byte_size; - } - } - - if (BitIsSet (registers, 1u << 15)) - { - context.arg1 = dwarf_pc; // arg1 in the context is the DWARF register number - context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - const uint32_t pc = emulator->ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); - if (!success) - return false; - if (!emulator->WriteMemoryUnsigned (context, addr, pc + 8, addr_byte_size)) - return false; - } - - context.type = EmulateInstruction::eContextAdjustStackPointer; - context.arg0 = eRegisterKindGeneric; - context.arg1 = LLDB_REGNUM_GENERIC_SP; - context.arg2 = -sp_offset; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) - return false; - } - return true; -} - -// Pop Multiple Registers loads multiple registers from the stack, loading from -// consecutive memory locations staring at the address in SP, and updates -// SP to point just above the loaded data. -static bool -emulate_pop (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); NullCheckIfThumbEE(13); - address = SP; - for i = 0 to 14 - if registers == ???1??? then - R[i} = if UnalignedAllowed then MemU[address,4] else MemA[address,4]; address = address + 4; - if registers<15> == ???1??? then - if UnalignedAllowed then - LoadWritePC(MemU[address,4]); - else - LoadWritePC(MemA[address,4]); - if registers<13> == ???0??? then SP = SP + 4*BitCount(registers); - if registers<13> == ???1??? then SP = bits(32) UNKNOWN; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t registers = 0; - uint32_t Rt; // the destination register - switch (encoding) { - case eEncodingT1: - registers = Bits32(opcode, 7, 0); - // The P bit represents PC. - if (Bits32(opcode, 8, 8)) - registers |= (1u << 15); - // if BitCount(registers) < 1 then UNPREDICTABLE; - if (BitCount(registers) < 1) - return false; - break; - case eEncodingT2: - // Ignore bit 13. - registers = Bits32(opcode, 15, 0) & ~0x2000; - // if BitCount(registers) < 2 || (P == '1' && M == '1') then UNPREDICTABLE; - if (BitCount(registers) < 2 || (Bits32(opcode, 15, 15) && Bits32(opcode, 14, 14))) - return false; - break; - case eEncodingT3: - Rt = Bits32(opcode, 15, 12); - // if t == 13 || (t == 15 && InITBlock() && !LastInITBlock()) then UNPREDICTABLE; - if (Rt == dwarf_sp) - return false; - registers = (1u << Rt); - break; - case eEncodingA1: - registers = Bits32(opcode, 15, 0); - // Instead of return false, let's handle the following case as well, - // which amounts to popping one reg from the full descending stacks. - // if BitCount(register_list) < 2 then SEE LDM / LDMIA / LDMFD; - - // if registers<13> == ???1??? && ArchVersion() >= 7 then UNPREDICTABLE; - if (Bits32(opcode, 13, 13)) - return false; - break; - case eEncodingA2: - Rt = Bits32(opcode, 15, 12); - // if t == 13 then UNPREDICTABLE; - if (Rt == dwarf_sp) - return false; - registers = (1u << Rt); - break; - default: - return false; - } - addr_t sp_offset = addr_byte_size * BitCount (registers); - addr_t addr = sp; - uint32_t i, data; - - EmulateInstruction::Context context = { EmulateInstruction::eContextPopRegisterOffStack, eRegisterKindDWARF, 0, 0 }; - for (i=0; i<15; ++i) - { - if (BitIsSet (registers, 1u << i)) - { - context.arg1 = dwarf_r0 + i; // arg1 in the context is the DWARF register number - context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); - if (!success) - return false; - if (!emulator->WriteRegisterUnsigned(context, eRegisterKindDWARF, context.arg1, data)) - return false; - addr += addr_byte_size; - } - } - - if (BitIsSet (registers, 1u << 15)) - { - context.arg1 = dwarf_pc; // arg1 in the context is the DWARF register number - context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); - if (!success) - return false; - if (!emulator->WriteRegisterUnsigned(context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, data)) - return false; - addr += addr_byte_size; - } - - context.type = EmulateInstruction::eContextAdjustStackPointer; - context.arg0 = eRegisterKindGeneric; - context.arg1 = LLDB_REGNUM_GENERIC_SP; - context.arg2 = sp_offset; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp + sp_offset)) - return false; - } - return true; -} - -// Set r7 or ip to point to saved value residing within the stack. -// ADD (SP plus immediate) -static bool -emulate_add_rd_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - (result, carry, overflow) = AddWithCarry(SP, imm32, ???0???); - if d == 15 then - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - APSR.C = carry; - APSR.V = overflow; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t Rd; // the destination register - uint32_t imm32; - switch (encoding) { - case eEncodingT1: - Rd = 7; - imm32 = Bits32(opcode, 7, 0) << 2; // imm32 = ZeroExtend(imm8:'00', 32) - break; - case eEncodingA1: - Rd = Bits32(opcode, 15, 12); - imm32 = ARMExpandImm(opcode); // imm32 = ARMExpandImm(imm12) - break; - default: - return false; - } - addr_t sp_offset = imm32; - addr_t addr = sp + sp_offset; // a pointer to the stack area - - EmulateInstruction::Context context = { EmulateInstruction::eContextRegisterPlusOffset, - eRegisterKindGeneric, - LLDB_REGNUM_GENERIC_SP, - sp_offset }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, addr)) - return false; - } - return true; -} - -// Set r7 or ip to the current stack pointer. -// MOV (register) -static bool -emulate_mov_rd_sp (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - result = R[m]; - if d == 15 then - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - // APSR.C unchanged - // APSR.V unchanged - } -#endif - - bool success = false; - //const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - //if (!success) - // return false; - - if (emulator->ConditionPassed()) - { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t Rd; // the destination register - switch (encoding) { - case eEncodingT1: - Rd = 7; - break; - case eEncodingA1: - Rd = 12; - break; - default: - return false; - } - EmulateInstruction::Context context = { EmulateInstruction::eContextRegisterPlusOffset, - eRegisterKindGeneric, - LLDB_REGNUM_GENERIC_SP, - 0 }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, sp)) - return false; - } - return true; -} - -// Move from high register (r8-r15) to low register (r0-r7). -// MOV (register) -static bool -emulate_mov_low_high (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - result = R[m]; - if d == 15 then - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - // APSR.C unchanged - // APSR.V unchanged - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - uint32_t Rm; // the source register - uint32_t Rd; // the destination register - switch (encoding) { - case eEncodingT1: - Rm = Bits32(opcode, 6, 3); - Rd = Bits32(opcode, 2, 1); // bits(7) == 0 - break; - default: - return false; - } - int32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success); - if (!success) - return false; - - // The context specifies that Rm is to be moved into Rd. - EmulateInstruction::Context context = { EmulateInstruction::eContextRegisterPlusOffset, - eRegisterKindDWARF, - dwarf_r0 + Rm, - 0 }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, reg_value)) - return false; - } - return true; -} - -// PC relative immediate load into register, possibly followed by ADD (SP plus register). -// LDR (literal) -static bool -emulate_ldr_rd_pc_rel (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); NullCheckIfThumbEE(15); - base = Align(PC,4); - address = if add then (base + imm32) else (base - imm32); - data = MemU[address,4]; - if t == 15 then - if address<1:0> == ???00??? then LoadWritePC(data); else UNPREDICTABLE; - elsif UnalignedSupport() || address<1:0> = ???00??? then - R[t] = data; - else // Can only apply before ARMv7 - if CurrentInstrSet() == InstrSet_ARM then - R[t] = ROR(data, 8*UInt(address<1:0>)); - else - R[t] = bits(32) UNKNOWN; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const uint32_t pc = emulator->ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); - if (!success) - return false; - - // PC relative immediate load context - EmulateInstruction::Context context = {EmulateInstruction::eContextRegisterPlusOffset, - eRegisterKindGeneric, - LLDB_REGNUM_GENERIC_PC, - 0}; - uint32_t Rd; // the destination register - uint32_t imm32; // immediate offset from the PC - addr_t addr; // the PC relative address - uint32_t data; // the literal data value from the PC relative load - switch (encoding) { - case eEncodingT1: - Rd = Bits32(opcode, 10, 8); - imm32 = Bits32(opcode, 7, 0) << 2; // imm32 = ZeroExtend(imm8:'00', 32); - addr = pc + 4 + imm32; - context.arg2 = 4 + imm32; - break; - default: - return false; - } - data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); - if (!success) - return false; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, data)) - return false; - } - return true; -} - -// An add operation to adjust the SP. -// ADD (SP plus immediate) -static bool -emulate_add_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - (result, carry, overflow) = AddWithCarry(SP, imm32, ???0???); - if d == 15 then // Can only occur for ARM encoding - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - APSR.C = carry; - APSR.V = overflow; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t imm32; // the immediate operand - switch (encoding) { - case eEncodingT2: - imm32 = ThumbImmScaled(opcode); // imm32 = ZeroExtend(imm7:'00', 32) - break; - default: - return false; - } - addr_t sp_offset = imm32; - addr_t addr = sp + sp_offset; // the adjusted stack pointer value - - EmulateInstruction::Context context = { EmulateInstruction::eContextAdjustStackPointer, - eRegisterKindGeneric, - LLDB_REGNUM_GENERIC_SP, - sp_offset }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) - return false; - } - return true; -} - -// An add operation to adjust the SP. -// ADD (SP plus register) -static bool -emulate_add_sp_rm (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - shifted = Shift(R[m], shift_t, shift_n, APSR.C); - (result, carry, overflow) = AddWithCarry(SP, shifted, ???0???); - if d == 15 then - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - APSR.C = carry; - APSR.V = overflow; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t Rm; // the second operand - switch (encoding) { - case eEncodingT2: - Rm = Bits32(opcode, 6, 3); - break; - default: - return false; - } - int32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success); - if (!success) - return false; - - addr_t addr = (int32_t)sp + reg_value; // the adjusted stack pointer value - - EmulateInstruction::Context context = { EmulateInstruction::eContextAdjustStackPointer, - eRegisterKindGeneric, - LLDB_REGNUM_GENERIC_SP, - reg_value }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) - return false; - } - return true; -} - -// Set r7 to point to some ip offset. -// SUB (immediate) -static bool -emulate_sub_r7_ip_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - (result, carry, overflow) = AddWithCarry(SP, NOT(imm32), ???1???); - if d == 15 then // Can only occur for ARM encoding - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - APSR.C = carry; - APSR.V = overflow; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const addr_t ip = emulator->ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_r12, 0, &success); - if (!success) - return false; - uint32_t imm32; - switch (encoding) { - case eEncodingA1: - imm32 = ARMExpandImm(opcode); // imm32 = ARMExpandImm(imm12) - break; - default: - return false; - } - addr_t ip_offset = imm32; - addr_t addr = ip - ip_offset; // the adjusted ip value - - EmulateInstruction::Context context = { EmulateInstruction::eContextRegisterPlusOffset, - eRegisterKindDWARF, - dwarf_r12, - -ip_offset }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r7, addr)) - return false; - } - return true; -} - -// Set ip to point to some stack offset. -// SUB (SP minus immediate) -static bool -emulate_sub_ip_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - (result, carry, overflow) = AddWithCarry(SP, NOT(imm32), ???1???); - if d == 15 then // Can only occur for ARM encoding - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - APSR.C = carry; - APSR.V = overflow; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t imm32; - switch (encoding) { - case eEncodingA1: - imm32 = ARMExpandImm(opcode); // imm32 = ARMExpandImm(imm12) - break; - default: - return false; - } - addr_t sp_offset = imm32; - addr_t addr = sp - sp_offset; // the adjusted stack pointer value - - EmulateInstruction::Context context = { EmulateInstruction::eContextRegisterPlusOffset, - eRegisterKindGeneric, - LLDB_REGNUM_GENERIC_SP, - -sp_offset }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r12, addr)) - return false; - } - return true; -} - -// A sub operation to adjust the SP -- allocate space for local storage. -static bool -emulate_sub_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - (result, carry, overflow) = AddWithCarry(SP, NOT(imm32), ???1???); - if d == 15 then // Can only occur for ARM encoding - ALUWritePC(result); // setflags is always FALSE here - else - R[d] = result; - if setflags then - APSR.N = result<31>; - APSR.Z = IsZeroBit(result); - APSR.C = carry; - APSR.V = overflow; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t imm32; - switch (encoding) { - case eEncodingT1: - imm32 = ThumbImmScaled(opcode); // imm32 = ZeroExtend(imm7:'00', 32) - case eEncodingT2: - imm32 = ThumbExpandImm(opcode); // imm32 = ThumbExpandImm(i:imm3:imm8) - break; - case eEncodingT3: - imm32 = ThumbImm12(opcode); // imm32 = ZeroExtend(i:imm3:imm8, 32) - break; - case eEncodingA1: - imm32 = ARMExpandImm(opcode); // imm32 = ARMExpandImm(imm12) - break; - default: - return false; - } - addr_t sp_offset = imm32; - addr_t addr = sp - sp_offset; // the adjusted stack pointer value - - EmulateInstruction::Context context = { EmulateInstruction::eContextAdjustStackPointer, - eRegisterKindGeneric, - LLDB_REGNUM_GENERIC_SP, - -sp_offset }; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) - return false; - } - return true; -} - -// A store operation to the stack that also updates the SP. -static bool -emulate_str_rt_sp (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - MemU[address,4] = if t == 15 then PCStoreValue() else R[t]; - if wback then R[n] = offset_addr; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - uint32_t Rt; // the source register - uint32_t imm12; - switch (encoding) { - case eEncodingA1: - Rt = Bits32(opcode, 15, 12); - imm12 = Bits32(opcode, 11, 0); - break; - default: - return false; - } - addr_t sp_offset = imm12; - addr_t addr = sp - sp_offset; - - EmulateInstruction::Context context = { EmulateInstruction::eContextPushRegisterOnStack, eRegisterKindDWARF, 0, 0 }; - if (Rt != 15) - { - context.arg1 = dwarf_r0 + Rt; // arg1 in the context is the DWARF register number - context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - uint32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); - if (!success) - return false; - if (!emulator->WriteMemoryUnsigned (context, addr, reg_value, addr_byte_size)) - return false; - } - else - { - context.arg1 = dwarf_pc; // arg1 in the context is the DWARF register number - context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - const uint32_t pc = emulator->ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); - if (!success) - return false; - if (!emulator->WriteMemoryUnsigned (context, addr, pc + 8, addr_byte_size)) - return false; - } - - context.type = EmulateInstruction::eContextAdjustStackPointer; - context.arg0 = eRegisterKindGeneric; - context.arg1 = LLDB_REGNUM_GENERIC_SP; - context.arg2 = -sp_offset; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) - return false; - } - return true; -} - -// Vector Push stores multiple extension registers to the stack. -// It also updates SP to point to the start of the stored data. -static bool -emulate_vpush (EmulateInstructionARM *emulator, ARMEncoding encoding) -{ -#if 0 - // ARM pseudo code... - if (ConditionPassed()) - { - EncodingSpecificOperations(); CheckVFPEnabled(TRUE); NullCheckIfThumbEE(13); - address = SP - imm32; - SP = SP - imm32; - if single_regs then - for r = 0 to regs-1 - MemA[address,4] = S[d+r]; address = address+4; - else - for r = 0 to regs-1 - // Store as two word-aligned words in the correct order for current endianness. - MemA[address,4] = if BigEndian() then D[d+r]<63:32> else D[d+r]<31:0>; - MemA[address+4,4] = if BigEndian() then D[d+r]<31:0> else D[d+r]<63:32>; - address = address+8; - } -#endif - - bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); - if (!success) - return false; - - if (emulator->ConditionPassed()) - { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); - if (!success) - return false; - bool single_regs; - uint32_t d; // UInt(Vd:D) starting register - uint32_t imm32; // stack offset - uint32_t regs; // number of registers - switch (encoding) { - case eEncodingT1: - case eEncodingA1: - single_regs = false; - d = Bits32(opcode, 15, 12) << 1 | Bits32(opcode, 22, 22); - imm32 = Bits32(opcode, 7, 0) * addr_byte_size; - // If UInt(imm8) is odd, see "FSTMX". - regs = Bits32(opcode, 7, 0) / 2; - // if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if (regs == 0 || regs > 16 || (d + regs) > 32) - return false; - break; - case eEncodingT2: - case eEncodingA2: - single_regs = true; - d = Bits32(opcode, 15, 12) << 1 | Bits32(opcode, 22, 22); - imm32 = Bits32(opcode, 7, 0) * addr_byte_size; - regs = Bits32(opcode, 7, 0); - // if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if (regs == 0 || regs > 16 || (d + regs) > 32) - return false; - break; - default: - return false; - } - uint32_t start_reg = single_regs ? dwarf_s0 : dwarf_d0; - uint32_t reg_byte_size = single_regs ? addr_byte_size : addr_byte_size * 2; - addr_t sp_offset = imm32; - addr_t addr = sp - sp_offset; - uint32_t i; - - EmulateInstruction::Context context = { EmulateInstruction::eContextPushRegisterOnStack, eRegisterKindDWARF, 0, 0 }; - for (i=d; iReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); - if (!success) - return false; - if (!emulator->WriteMemoryUnsigned (context, addr, reg_value, reg_byte_size)) - return false; - addr += reg_byte_size; - } - - context.type = EmulateInstruction::eContextAdjustStackPointer; - context.arg0 = eRegisterKindGeneric; - context.arg1 = LLDB_REGNUM_GENERIC_SP; - context.arg2 = -sp_offset; - - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) - return false; - } - return true; -} - -static ARMOpcode g_arm_opcodes[] = -{ - /////////////////////////// - // Prologue instructions // - /////////////////////////// - - // push register(s) - { 0x0fff0000, 0x092d0000, ARMvAll, eEncodingA1, eSize32, emulate_push, "push " }, - { 0x0fff0fff, 0x052d0004, ARMvAll, eEncodingA2, eSize32, emulate_push, "push " }, - - // set r7 to point to a stack offset - { 0x0ffff000, 0x028d7000, ARMvAll, eEncodingA1, eSize32, emulate_add_rd_sp_imm, "add r7, sp, #" }, - { 0x0ffff000, 0x024c7000, ARMvAll, eEncodingA1, eSize32, emulate_sub_r7_ip_imm, "sub r7, ip, #"}, - // set ip to point to a stack offset - { 0x0fffffff, 0x01a0c00d, ARMvAll, eEncodingA1, eSize32, emulate_mov_rd_sp, "mov ip, sp" }, - { 0x0ffff000, 0x028dc000, ARMvAll, eEncodingA1, eSize32, emulate_add_rd_sp_imm, "add ip, sp, #" }, - { 0x0ffff000, 0x024dc000, ARMvAll, eEncodingA1, eSize32, emulate_sub_ip_sp_imm, "sub ip, sp, #"}, - - // adjust the stack pointer - { 0x0ffff000, 0x024dd000, ARMvAll, eEncodingA1, eSize32, emulate_sub_sp_imm, "sub sp, sp, #"}, - - // push one register - // if Rn == '1101' && imm12 == '000000000100' then SEE PUSH; - { 0x0fff0000, 0x052d0000, ARMvAll, eEncodingA1, eSize32, emulate_str_rt_sp, "str Rt, [sp, #-imm12]!" }, - - // vector push consecutive extension register(s) - { 0x0fbf0f00, 0x0d2d0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, emulate_vpush, "vpush.64 "}, - { 0x0fbf0f00, 0x0d2d0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, emulate_vpush, "vpush.32 "}, - - /////////////////////////// - // Epilogue instructions // - /////////////////////////// - - { 0x0fff0000, 0x08bd0000, ARMvAll, eEncodingA1, eSize32, emulate_pop, "pop "}, - { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, emulate_pop, "pop "} -}; - -static ARMOpcode g_thumb_opcodes[] = -{ - /////////////////////////// - // Prologue instructions // - /////////////////////////// - - // push register(s) - { 0xfffffe00, 0x0000b400, ARMvAll, eEncodingT1, eSize16, emulate_push, "push " }, - { 0xffff0000, 0xe92d0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_push, "push.w " }, - { 0xffff0fff, 0xf84d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, emulate_push, "push.w " }, - // move from high register to low register - { 0xffffffc0, 0x00004640, ARMvAll, eEncodingT1, eSize16, emulate_mov_low_high, "mov r0-r7, r8-r15" }, - - // set r7 to point to a stack offset - { 0xffffff00, 0x0000af00, ARMvAll, eEncodingT1, eSize16, emulate_add_rd_sp_imm, "add r7, sp, #imm" }, - { 0xffffffff, 0x0000466f, ARMvAll, eEncodingT1, eSize16, emulate_mov_rd_sp, "mov r7, sp" }, - - // PC relative load into register (see also emulate_add_sp_rm) - { 0xfffff800, 0x00004800, ARMvAll, eEncodingT1, eSize16, emulate_ldr_rd_pc_rel, "ldr , [PC, #imm]"}, - - // adjust the stack pointer - { 0xffffff87, 0x00004485, ARMvAll, eEncodingT2, eSize16, emulate_add_sp_rm, "add sp, "}, - { 0xffffff80, 0x0000b080, ARMvAll, eEncodingT1, eSize16, emulate_sub_sp_imm, "add sp, sp, #imm"}, - { 0xfbef8f00, 0xf1ad0d00, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_sub_sp_imm, "sub.w sp, sp, #"}, - { 0xfbff8f00, 0xf2ad0d00, ARMv6T2|ARMv7, eEncodingT3, eSize32, emulate_sub_sp_imm, "subw sp, sp, #imm12"}, - - // vector push consecutive extension register(s) - { 0xffbf0f00, 0xed2d0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, emulate_vpush, "vpush.64 "}, - { 0xffbf0f00, 0xed2d0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_vpush, "vpush.32 "}, - - /////////////////////////// - // Epilogue instructions // - /////////////////////////// - - { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, emulate_add_sp_imm, "add sp, #imm"}, - { 0xfffffe00, 0x0000bc00, ARMvAll, eEncodingT1, eSize16, emulate_pop, "pop "}, - { 0xffff0000, 0xe8bd0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_pop, "pop.w " }, - { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, emulate_pop, "pop.w " } -}; - -static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); -static const size_t k_num_thumb_opcodes = sizeof(g_thumb_opcodes)/sizeof(ARMOpcode); - -bool -EmulateInstructionARM::SetTargetTriple (const ConstString &triple) -{ - m_arm_isa = 0; - const char *triple_cstr = triple.GetCString(); - if (triple_cstr) - { - const char *dash = ::strchr (triple_cstr, '-'); - if (dash) - { - std::string arch (triple_cstr, dash); - const char *arch_cstr = arch.c_str(); - if (strcasecmp(arch_cstr, "armv4t") == 0) - m_arm_isa = ARMv4T; - else if (strcasecmp(arch_cstr, "armv4") == 0) - m_arm_isa = ARMv4; - else if (strcasecmp(arch_cstr, "armv5tej") == 0) - m_arm_isa = ARMv5TEJ; - else if (strcasecmp(arch_cstr, "armv5te") == 0) - m_arm_isa = ARMv5TE; - else if (strcasecmp(arch_cstr, "armv5t") == 0) - m_arm_isa = ARMv5T; - else if (strcasecmp(arch_cstr, "armv6k") == 0) - m_arm_isa = ARMv6K; - else if (strcasecmp(arch_cstr, "armv6") == 0) - m_arm_isa = ARMv6; - else if (strcasecmp(arch_cstr, "armv6t2") == 0) - m_arm_isa = ARMv6T2; - else if (strcasecmp(arch_cstr, "armv7") == 0) - m_arm_isa = ARMv7; - else if (strcasecmp(arch_cstr, "armv8") == 0) - m_arm_isa = ARMv8; - } - } - return m_arm_isa != 0; -} - - -bool -EmulateInstructionARM::ReadInstruction () -{ - bool success = false; - m_inst_cpsr = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS, 0, &success); - if (success) - { - addr_t pc = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_ADDRESS, &success); - if (success) - { - Context read_inst_context = {eContextReadOpcode, 0, 0}; - if (m_inst_cpsr & MASK_CPSR_T) - { - m_inst_mode = eModeThumb; - uint32_t thumb_opcode = ReadMemoryUnsigned(read_inst_context, pc, 2, 0, &success); - - if (success) - { - if ((m_inst.opcode.inst16 & 0xe000) != 0xe000 || ((m_inst.opcode.inst16 & 0x1800u) == 0)) - { - m_inst.opcode_type = eOpcode16; - m_inst.opcode.inst16 = thumb_opcode; - } - else - { - m_inst.opcode_type = eOpcode32; - m_inst.opcode.inst32 = (thumb_opcode << 16) | ReadMemoryUnsigned(read_inst_context, pc + 2, 2, 0, &success); - } - } - } - else - { - m_inst_mode = eModeARM; - m_inst.opcode_type = eOpcode32; - m_inst.opcode.inst32 = ReadMemoryUnsigned(read_inst_context, pc, 4, 0, &success); - } - } - } - if (!success) - { - m_inst_mode = eModeInvalid; - m_inst_pc = LLDB_INVALID_ADDRESS; - } - return success; -} - -uint32_t -EmulateInstructionARM::CurrentCond () -{ - switch (m_inst_mode) - { - default: - case eModeInvalid: - break; - - case eModeARM: - return UnsignedBits(m_inst.opcode.inst32, 31, 28); - - case eModeThumb: - return 0x0000000Eu; // Return always for now, we need to handl IT instructions later - } - return UINT32_MAX; // Return invalid value -} -bool -EmulateInstructionARM::ConditionPassed () -{ - if (m_inst_cpsr == 0) - return false; - - const uint32_t cond = CurrentCond (); - - if (cond == UINT32_MAX) - return false; - - bool result = false; - switch (UnsignedBits(cond, 3, 1)) - { - case 0: result = (m_inst_cpsr & MASK_CPSR_Z) != 0; break; - case 1: result = (m_inst_cpsr & MASK_CPSR_C) != 0; break; - case 2: result = (m_inst_cpsr & MASK_CPSR_N) != 0; break; - case 3: result = (m_inst_cpsr & MASK_CPSR_V) != 0; break; - case 4: result = ((m_inst_cpsr & MASK_CPSR_C) != 0) && ((m_inst_cpsr & MASK_CPSR_Z) == 0); break; - case 5: - { - bool n = (m_inst_cpsr & MASK_CPSR_N); - bool v = (m_inst_cpsr & MASK_CPSR_V); - result = n == v; - } - break; - case 6: - { - bool n = (m_inst_cpsr & MASK_CPSR_N); - bool v = (m_inst_cpsr & MASK_CPSR_V); - result = n == v && ((m_inst_cpsr & MASK_CPSR_Z) == 0); - } - break; - case 7: - result = true; - break; - } - - if (cond & 1) - result = !result; - return result; -} - - -bool -EmulateInstructionARM::EvaluateInstruction () -{ - return false; -} Removed: lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h?rev=124630&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h (original) +++ lldb/trunk/source/Plugins/Process/Utility/EmulateInstructionARM.h (removed) @@ -1,111 +0,0 @@ -//===-- lldb_EmulateInstructionARM.h ------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef lldb_EmulateInstructionARM_h_ -#define lldb_EmulateInstructionARM_h_ - -#include "EmulateInstruction.h" -#include "ARM_DWARF_Registers.h" - -#include "lldb/Core/Error.h" - -namespace lldb_private { - -class EmulateInstructionARM : public EmulateInstruction -{ -public: - - virtual const char * - GetPluginName() - { - return "EmulateInstructionARM"; - } - - virtual const char * - GetShortPluginName() - { - return "lldb.emulate-instruction.arm"; - } - - virtual uint32_t - GetPluginVersion() - { - return 1; - } - - virtual void - GetPluginCommandHelp (const char *command, Stream *strm) - { - } - - virtual lldb_private::Error - ExecutePluginCommand (Args &command, Stream *strm) - { - Error error; - error.SetErrorString("no plug-in commands are supported"); - return error; - } - - virtual Log * - EnablePluginLogging (Stream *strm, Args &command) - { - return NULL; - } - - enum Mode - { - eModeInvalid, - eModeARM, - eModeThumb - }; - - EmulateInstructionARM (void *baton, - ReadMemory read_mem_callback, - WriteMemory write_mem_callback, - ReadRegister read_reg_callback, - WriteRegister write_reg_callback) : - EmulateInstruction (lldb::eByteOrderLittle, // Byte order for ARM - 4, // Address size in byte - baton, - read_mem_callback, - write_mem_callback, - read_reg_callback, - write_reg_callback), - m_arm_isa (0), - m_inst_mode (eModeInvalid), - m_inst_cpsr (0) - { - } - - - virtual bool - SetTargetTriple (const ConstString &triple); - - virtual bool - ReadInstruction (); - - virtual bool - EvaluateInstruction (); - - bool - ConditionPassed (); - - uint32_t - CurrentCond (); - -protected: - uint32_t m_arm_isa; - Mode m_inst_mode; - uint32_t m_inst_cpsr; - -}; - -} // namespace lldb_private - -#endif // lldb_EmulateInstructionARM_h_ From gclayton at apple.com Mon Jan 31 18:49:32 2011 From: gclayton at apple.com (Greg Clayton) Date: Tue, 01 Feb 2011 00:49:32 -0000 Subject: [Lldb-commits] [lldb] r124636 - in /lldb/trunk/source/Plugins/Instruction/ARM: EmulateInstructionARM.cpp EmulateInstructionARM.h Message-ID: <20110201004932.717A72A6C12C@llvm.org> Author: gclayton Date: Mon Jan 31 18:49:32 2011 New Revision: 124636 URL: http://llvm.org/viewvc/llvm-project?rev=124636&view=rev Log: Cleaned up the EmulateInstructionARM to have the evaluate instruction callbacks use member functions. Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp?rev=124636&r1=124635&r2=124636&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Mon Jan 31 18:49:32 2011 @@ -35,46 +35,23 @@ #define ARMv8 (1u << 9) #define ARMvAll (0xffffffffu) -typedef enum + +void +EmulateInstructionARM::Initialize () { - eEncodingA1, - eEncodingA2, - eEncodingA3, - eEncodingA4, - eEncodingA5, - eEncodingT1, - eEncodingT2, - eEncodingT3, - eEncodingT4, - eEncodingT5, -} ARMEncoding; - -typedef enum -{ - eSize16, - eSize32 -} ARMInstrSize; - -// Typedef for the callback function used during the emulation. -// Pass along (ARMEncoding)encoding as the callback data. -typedef bool (*EmulateCallback) (EmulateInstructionARM *emulator, ARMEncoding encoding); - -typedef struct +} + +void +EmulateInstructionARM::Terminate () { - uint32_t mask; - uint32_t value; - uint32_t variants; - ARMEncoding encoding; - ARMInstrSize size; - EmulateCallback callback; - const char *name; -} ARMOpcode; +} + // Push Multiple Registers stores multiple registers to the stack, storing to // consecutive memory locations ending just below the address in SP, and updates // SP to point to the start of the stored data. -static bool -emulate_push (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulatePush (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -104,14 +81,14 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const uint32_t addr_byte_size = GetAddressByteSize(); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t registers = 0; @@ -167,10 +144,10 @@ { context.arg1 = dwarf_r0 + i; // arg1 in the context is the DWARF register number context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - uint32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); + uint32_t reg_value = ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); if (!success) return false; - if (!emulator->WriteMemoryUnsigned (context, addr, reg_value, addr_byte_size)) + if (!WriteMemoryUnsigned (context, addr, reg_value, addr_byte_size)) return false; addr += addr_byte_size; } @@ -180,10 +157,10 @@ { context.arg1 = dwarf_pc; // arg1 in the context is the DWARF register number context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - const uint32_t pc = emulator->ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); + const uint32_t pc = ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); if (!success) return false; - if (!emulator->WriteMemoryUnsigned (context, addr, pc + 8, addr_byte_size)) + if (!WriteMemoryUnsigned (context, addr, pc + 8, addr_byte_size)) return false; } @@ -192,7 +169,7 @@ context.arg1 = LLDB_REGNUM_GENERIC_SP; context.arg2 = -sp_offset; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) + if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) return false; } return true; @@ -201,8 +178,8 @@ // Pop Multiple Registers loads multiple registers from the stack, loading from // consecutive memory locations staring at the address in SP, and updates // SP to point just above the loaded data. -static bool -emulate_pop (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulatePop (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -224,14 +201,14 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const uint32_t addr_byte_size = GetAddressByteSize(); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t registers = 0; @@ -291,10 +268,10 @@ { context.arg1 = dwarf_r0 + i; // arg1 in the context is the DWARF register number context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); + data = ReadMemoryUnsigned(context, addr, 4, 0, &success); if (!success) return false; - if (!emulator->WriteRegisterUnsigned(context, eRegisterKindDWARF, context.arg1, data)) + if (!WriteRegisterUnsigned(context, eRegisterKindDWARF, context.arg1, data)) return false; addr += addr_byte_size; } @@ -304,10 +281,10 @@ { context.arg1 = dwarf_pc; // arg1 in the context is the DWARF register number context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); + data = ReadMemoryUnsigned(context, addr, 4, 0, &success); if (!success) return false; - if (!emulator->WriteRegisterUnsigned(context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, data)) + if (!WriteRegisterUnsigned(context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, data)) return false; addr += addr_byte_size; } @@ -317,7 +294,7 @@ context.arg1 = LLDB_REGNUM_GENERIC_SP; context.arg2 = sp_offset; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp + sp_offset)) + if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp + sp_offset)) return false; } return true; @@ -325,8 +302,8 @@ // Set r7 or ip to point to saved value residing within the stack. // ADD (SP plus immediate) -static bool -emulate_add_rd_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateAddRdSPImmediate (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -347,13 +324,13 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t Rd; // the destination register @@ -378,7 +355,7 @@ LLDB_REGNUM_GENERIC_SP, sp_offset }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, addr)) + if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, addr)) return false; } return true; @@ -386,8 +363,8 @@ // Set r7 or ip to the current stack pointer. // MOV (register) -static bool -emulate_mov_rd_sp (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateMovRdSP (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -408,13 +385,13 @@ #endif bool success = false; - //const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + //const uint32_t opcode = OpcodeAsUnsigned (&success); //if (!success) // return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t Rd; // the destination register @@ -433,7 +410,7 @@ LLDB_REGNUM_GENERIC_SP, 0 }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, sp)) + if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, sp)) return false; } return true; @@ -441,8 +418,8 @@ // Move from high register (r8-r15) to low register (r0-r7). // MOV (register) -static bool -emulate_mov_low_high (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateMovLowHigh (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -463,11 +440,11 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { uint32_t Rm; // the source register uint32_t Rd; // the destination register @@ -479,7 +456,7 @@ default: return false; } - int32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success); + int32_t reg_value = ReadRegisterUnsigned(eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success); if (!success) return false; @@ -489,7 +466,7 @@ dwarf_r0 + Rm, 0 }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, reg_value)) + if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, reg_value)) return false; } return true; @@ -497,8 +474,8 @@ // PC relative immediate load into register, possibly followed by ADD (SP plus register). // LDR (literal) -static bool -emulate_ldr_rd_pc_rel (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateLDRRdPCRelative (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -521,13 +498,13 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const uint32_t pc = emulator->ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); + const uint32_t pc = ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); if (!success) return false; @@ -550,10 +527,10 @@ default: return false; } - data = emulator->ReadMemoryUnsigned(context, addr, 4, 0, &success); + data = ReadMemoryUnsigned(context, addr, 4, 0, &success); if (!success) return false; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, data)) + if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, data)) return false; } return true; @@ -561,8 +538,8 @@ // An add operation to adjust the SP. // ADD (SP plus immediate) -static bool -emulate_add_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateAddSPImmediate (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -583,13 +560,13 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t imm32; // the immediate operand @@ -608,7 +585,7 @@ LLDB_REGNUM_GENERIC_SP, sp_offset }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) + if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) return false; } return true; @@ -616,8 +593,8 @@ // An add operation to adjust the SP. // ADD (SP plus register) -static bool -emulate_add_sp_rm (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateAddSPRm (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -639,13 +616,13 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t Rm; // the second operand @@ -656,7 +633,7 @@ default: return false; } - int32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success); + int32_t reg_value = ReadRegisterUnsigned(eRegisterKindDWARF, dwarf_r0 + Rm, 0, &success); if (!success) return false; @@ -667,7 +644,7 @@ LLDB_REGNUM_GENERIC_SP, reg_value }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) + if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) return false; } return true; @@ -675,8 +652,8 @@ // Set r7 to point to some ip offset. // SUB (immediate) -static bool -emulate_sub_r7_ip_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateSubR7IPImmediate (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -697,13 +674,13 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const addr_t ip = emulator->ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_r12, 0, &success); + const addr_t ip = ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_r12, 0, &success); if (!success) return false; uint32_t imm32; @@ -722,7 +699,7 @@ dwarf_r12, -ip_offset }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r7, addr)) + if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r7, addr)) return false; } return true; @@ -730,8 +707,8 @@ // Set ip to point to some stack offset. // SUB (SP minus immediate) -static bool -emulate_sub_ip_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateSubIPSPImmediate (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -752,13 +729,13 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t imm32; @@ -777,15 +754,15 @@ LLDB_REGNUM_GENERIC_SP, -sp_offset }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r12, addr)) + if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r12, addr)) return false; } return true; } // A sub operation to adjust the SP -- allocate space for local storage. -static bool -emulate_sub_sp_imm (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateSubSPImmdiate (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -806,13 +783,13 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t imm32; @@ -839,15 +816,15 @@ LLDB_REGNUM_GENERIC_SP, -sp_offset }; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) + if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr)) return false; } return true; } // A store operation to the stack that also updates the SP. -static bool -emulate_str_rt_sp (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateSTRRtSP (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -862,14 +839,14 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const uint32_t addr_byte_size = GetAddressByteSize(); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; uint32_t Rt; // the source register @@ -890,20 +867,20 @@ { context.arg1 = dwarf_r0 + Rt; // arg1 in the context is the DWARF register number context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - uint32_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); + uint32_t reg_value = ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); if (!success) return false; - if (!emulator->WriteMemoryUnsigned (context, addr, reg_value, addr_byte_size)) + if (!WriteMemoryUnsigned (context, addr, reg_value, addr_byte_size)) return false; } else { context.arg1 = dwarf_pc; // arg1 in the context is the DWARF register number context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset - const uint32_t pc = emulator->ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); + const uint32_t pc = ReadRegisterUnsigned(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, 0, &success); if (!success) return false; - if (!emulator->WriteMemoryUnsigned (context, addr, pc + 8, addr_byte_size)) + if (!WriteMemoryUnsigned (context, addr, pc + 8, addr_byte_size)) return false; } @@ -912,7 +889,7 @@ context.arg1 = LLDB_REGNUM_GENERIC_SP; context.arg2 = -sp_offset; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) + if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) return false; } return true; @@ -920,8 +897,8 @@ // Vector Push stores multiple extension registers to the stack. // It also updates SP to point to the start of the stored data. -static bool -emulate_vpush (EmulateInstructionARM *emulator, ARMEncoding encoding) +bool +EmulateInstructionARM::EmulateVPUSH (ARMEncoding encoding) { #if 0 // ARM pseudo code... @@ -943,14 +920,14 @@ #endif bool success = false; - const uint32_t opcode = emulator->OpcodeAsUnsigned (&success); + const uint32_t opcode = OpcodeAsUnsigned (&success); if (!success) return false; - if (emulator->ConditionPassed()) + if (ConditionPassed()) { - const uint32_t addr_byte_size = emulator->GetAddressByteSize(); - const addr_t sp = emulator->ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + const uint32_t addr_byte_size = GetAddressByteSize(); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); if (!success) return false; bool single_regs; @@ -994,10 +971,10 @@ context.arg1 = start_reg + i; // arg1 in the context is the DWARF register number context.arg2 = addr - sp; // arg2 in the context is the stack pointer offset // uint64_t to accommodate 64-bit registers. - uint64_t reg_value = emulator->ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); + uint64_t reg_value = ReadRegisterUnsigned(eRegisterKindDWARF, context.arg1, 0, &success); if (!success) return false; - if (!emulator->WriteMemoryUnsigned (context, addr, reg_value, reg_byte_size)) + if (!WriteMemoryUnsigned (context, addr, reg_value, reg_byte_size)) return false; addr += reg_byte_size; } @@ -1007,91 +984,116 @@ context.arg1 = LLDB_REGNUM_GENERIC_SP; context.arg2 = -sp_offset; - if (!emulator->WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) + if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, sp - sp_offset)) return false; } return true; } -static ARMOpcode g_arm_opcodes[] = +EmulateInstructionARM::ARMOpcode* +EmulateInstructionARM::GetARMOpcodeForInstruction (const uint32_t opcode) +{ + static ARMOpcode + g_arm_opcodes[] = + { + //---------------------------------------------------------------------- + // Prologue instructions + //---------------------------------------------------------------------- + + // push register(s) + { 0x0fff0000, 0x092d0000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push " }, + { 0x0fff0fff, 0x052d0004, ARMvAll, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push " }, + + // set r7 to point to a stack offset + { 0x0ffff000, 0x028d7000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateAddRdSPImmediate, "add r7, sp, #" }, + { 0x0ffff000, 0x024c7000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubR7IPImmediate, "sub r7, ip, #"}, + // set ip to point to a stack offset + { 0x0fffffff, 0x01a0c00d, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateMovRdSP, "mov ip, sp" }, + { 0x0ffff000, 0x028dc000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateAddRdSPImmediate, "add ip, sp, #" }, + { 0x0ffff000, 0x024dc000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubIPSPImmediate, "sub ip, sp, #"}, + + // adjust the stack pointer + { 0x0ffff000, 0x024dd000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "sub sp, sp, #"}, + + // push one register + // if Rn == '1101' && imm12 == '000000000100' then SEE PUSH; + { 0x0fff0000, 0x052d0000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSTRRtSP, "str Rt, [sp, #-imm12]!" }, + + // vector push consecutive extension register(s) + { 0x0fbf0f00, 0x0d2d0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.64 "}, + { 0x0fbf0f00, 0x0d2d0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.32 "}, + + //---------------------------------------------------------------------- + // Epilogue instructions // + //---------------------------------------------------------------------- + + { 0x0fff0000, 0x08bd0000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, + { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "} + }; + static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); + + for (size_t i=0; i" }, - { 0x0fff0fff, 0x052d0004, ARMvAll, eEncodingA2, eSize32, emulate_push, "push " }, - - // set r7 to point to a stack offset - { 0x0ffff000, 0x028d7000, ARMvAll, eEncodingA1, eSize32, emulate_add_rd_sp_imm, "add r7, sp, #" }, - { 0x0ffff000, 0x024c7000, ARMvAll, eEncodingA1, eSize32, emulate_sub_r7_ip_imm, "sub r7, ip, #"}, - // set ip to point to a stack offset - { 0x0fffffff, 0x01a0c00d, ARMvAll, eEncodingA1, eSize32, emulate_mov_rd_sp, "mov ip, sp" }, - { 0x0ffff000, 0x028dc000, ARMvAll, eEncodingA1, eSize32, emulate_add_rd_sp_imm, "add ip, sp, #" }, - { 0x0ffff000, 0x024dc000, ARMvAll, eEncodingA1, eSize32, emulate_sub_ip_sp_imm, "sub ip, sp, #"}, - - // adjust the stack pointer - { 0x0ffff000, 0x024dd000, ARMvAll, eEncodingA1, eSize32, emulate_sub_sp_imm, "sub sp, sp, #"}, - - // push one register - // if Rn == '1101' && imm12 == '000000000100' then SEE PUSH; - { 0x0fff0000, 0x052d0000, ARMvAll, eEncodingA1, eSize32, emulate_str_rt_sp, "str Rt, [sp, #-imm12]!" }, - - // vector push consecutive extension register(s) - { 0x0fbf0f00, 0x0d2d0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, emulate_vpush, "vpush.64 "}, - { 0x0fbf0f00, 0x0d2d0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, emulate_vpush, "vpush.32 "}, - - /////////////////////////// - // Epilogue instructions // - /////////////////////////// - - { 0x0fff0000, 0x08bd0000, ARMvAll, eEncodingA1, eSize32, emulate_pop, "pop "}, - { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, emulate_pop, "pop "} -}; - -static ARMOpcode g_thumb_opcodes[] = -{ - /////////////////////////// - // Prologue instructions // - /////////////////////////// - - // push register(s) - { 0xfffffe00, 0x0000b400, ARMvAll, eEncodingT1, eSize16, emulate_push, "push " }, - { 0xffff0000, 0xe92d0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_push, "push.w " }, - { 0xffff0fff, 0xf84d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, emulate_push, "push.w " }, - // move from high register to low register - { 0xffffffc0, 0x00004640, ARMvAll, eEncodingT1, eSize16, emulate_mov_low_high, "mov r0-r7, r8-r15" }, - - // set r7 to point to a stack offset - { 0xffffff00, 0x0000af00, ARMvAll, eEncodingT1, eSize16, emulate_add_rd_sp_imm, "add r7, sp, #imm" }, - { 0xffffffff, 0x0000466f, ARMvAll, eEncodingT1, eSize16, emulate_mov_rd_sp, "mov r7, sp" }, - - // PC relative load into register (see also emulate_add_sp_rm) - { 0xfffff800, 0x00004800, ARMvAll, eEncodingT1, eSize16, emulate_ldr_rd_pc_rel, "ldr , [PC, #imm]"}, - - // adjust the stack pointer - { 0xffffff87, 0x00004485, ARMvAll, eEncodingT2, eSize16, emulate_add_sp_rm, "add sp, "}, - { 0xffffff80, 0x0000b080, ARMvAll, eEncodingT1, eSize16, emulate_sub_sp_imm, "add sp, sp, #imm"}, - { 0xfbef8f00, 0xf1ad0d00, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_sub_sp_imm, "sub.w sp, sp, #"}, - { 0xfbff8f00, 0xf2ad0d00, ARMv6T2|ARMv7, eEncodingT3, eSize32, emulate_sub_sp_imm, "subw sp, sp, #imm12"}, - - // vector push consecutive extension register(s) - { 0xffbf0f00, 0xed2d0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, emulate_vpush, "vpush.64 "}, - { 0xffbf0f00, 0xed2d0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_vpush, "vpush.32 "}, - - /////////////////////////// - // Epilogue instructions // - /////////////////////////// - - { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, emulate_add_sp_imm, "add sp, #imm"}, - { 0xfffffe00, 0x0000bc00, ARMvAll, eEncodingT1, eSize16, emulate_pop, "pop "}, - { 0xffff0000, 0xe8bd0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, emulate_pop, "pop.w " }, - { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, emulate_pop, "pop.w " } -}; -static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); -static const size_t k_num_thumb_opcodes = sizeof(g_thumb_opcodes)/sizeof(ARMOpcode); + static ARMOpcode + g_thumb_opcodes[] = + { + //---------------------------------------------------------------------- + // Prologue instructions + //---------------------------------------------------------------------- + + // push register(s) + { 0xfffffe00, 0x0000b400, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulatePush, "push " }, + { 0xffff0000, 0xe92d0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push.w " }, + { 0xffff0fff, 0xf84d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push.w " }, + // move from high register to low register + { 0xffffffc0, 0x00004640, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateMovLowHigh, "mov r0-r7, r8-r15" }, + + // set r7 to point to a stack offset + { 0xffffff00, 0x0000af00, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateAddRdSPImmediate, "add r7, sp, #imm" }, + { 0xffffffff, 0x0000466f, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateMovRdSP, "mov r7, sp" }, + + // PC relative load into register (see also EmulateAddSPRm) + { 0xfffff800, 0x00004800, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateLDRRdPCRelative, "ldr , [PC, #imm]"}, + + // adjust the stack pointer + { 0xffffff87, 0x00004485, ARMvAll, eEncodingT2, eSize16, &lldb_private::EmulateInstructionARM::EmulateAddSPRm, "add sp, "}, + { 0xffffff80, 0x0000b080, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "add sp, sp, #imm"}, + { 0xfbef8f00, 0xf1ad0d00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "sub.w sp, sp, #"}, + { 0xfbff8f00, 0xf2ad0d00, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "subw sp, sp, #imm12"}, + + // vector push consecutive extension register(s) + { 0xffbf0f00, 0xed2d0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.64 "}, + { 0xffbf0f00, 0xed2d0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.32 "}, + + //---------------------------------------------------------------------- + // Epilogue instructions + //---------------------------------------------------------------------- + + { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, &lldb_private::EmulateInstructionARM::EmulateAddSPImmediate, "add sp, #imm"}, + { 0xfffffe00, 0x0000bc00, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, + { 0xffff0000, 0xe8bd0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop.w " }, + { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop.w " } + }; + + const size_t k_num_thumb_opcodes = sizeof(g_thumb_opcodes)/sizeof(ARMOpcode); + for (size_t i=0; i Author: gclayton Date: Mon Jan 31 19:13:32 2011 New Revision: 124638 URL: http://llvm.org/viewvc/llvm-project?rev=124638&view=rev Log: Patch from Kirk Beitz that removes an unneeded include of "sys/errno.h". Modified: lldb/trunk/source/Commands/CommandObjectTarget.cpp Modified: lldb/trunk/source/Commands/CommandObjectTarget.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectTarget.cpp?rev=124638&r1=124637&r2=124638&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectTarget.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectTarget.cpp Mon Jan 31 19:13:32 2011 @@ -11,7 +11,7 @@ // C Includes #include -#include + // C++ Includes // Other libraries and framework includes // Project includes From johnny.chen at apple.com Mon Jan 31 19:23:35 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 01 Feb 2011 01:23:35 -0000 Subject: [Lldb-commits] [lldb] r124642 - in /lldb/trunk/test/cpp/virtual: Makefile TestVirtual.py main.cpp Message-ID: <20110201012335.2D74C2A6C12C@llvm.org> Author: johnny Date: Mon Jan 31 19:23:34 2011 New Revision: 124642 URL: http://llvm.org/viewvc/llvm-project?rev=124642&view=rev Log: Add TestVirtual.py to go with test/cpp/virtual/main.cpp file, which tests C++ virtual function and virtual inheritance. Added: lldb/trunk/test/cpp/virtual/Makefile lldb/trunk/test/cpp/virtual/TestVirtual.py Modified: lldb/trunk/test/cpp/virtual/main.cpp Added: lldb/trunk/test/cpp/virtual/Makefile URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/cpp/virtual/Makefile?rev=124642&view=auto ============================================================================== --- lldb/trunk/test/cpp/virtual/Makefile (added) +++ lldb/trunk/test/cpp/virtual/Makefile Mon Jan 31 19:23:34 2011 @@ -0,0 +1,5 @@ +LEVEL = ../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules Added: lldb/trunk/test/cpp/virtual/TestVirtual.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/cpp/virtual/TestVirtual.py?rev=124642&view=auto ============================================================================== --- lldb/trunk/test/cpp/virtual/TestVirtual.py (added) +++ lldb/trunk/test/cpp/virtual/TestVirtual.py Mon Jan 31 19:23:34 2011 @@ -0,0 +1,86 @@ +""" +Test C++ virtual function and virtual inheritance. +""" + +import os, time +import re +import lldb +from lldbtest import * + +def Msg(expr, val): + return "'expression %s' matches the output (from compiled code): %s" % (expr, val) + +class CppVirtualMadness(TestBase): + + mydir = os.path.join("cpp", "virtual") + + # This is the pattern by design to match the "my_expr = 'value'" output from + # printf() stmts (see main.cpp). + pattern = re.compile("^([^=]*) = '([^=]*)'$") + + # Assert message. + PRINTF_OUTPUT_GROKKED = "The printf output from compiled code is parsed correctly" + + @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") + def test_virtual_madness_dsym(self): + """Test that expression works correctly with virtual inheritance as well as virtual function.""" + self.buildDsym() + self.virtual_madness_test() + + def test_virtual_madness_dwarf(self): + """Test that expression works correctly with virtual inheritance as well as virtual function.""" + self.buildDwarf() + self.virtual_madness_test() + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + # Find the line number to break for main.cpp. + self.line = line_number('main.cpp', '// Set first breakpoint here.') + + def virtual_madness_test(self): + """Test that variable expressions with basic types are evaluated correctly.""" + + # First, capture the golden output emitted by the oracle, i.e., the + # series of printf statements. + go = system("./a.out", sender=self) + # This golden list contains a list of "my_expr = 'value' pairs extracted + # from the golden output. + gl = [] + + # Scan the golden output line by line, looking for the pattern: + # + # my_expr = 'value' + # + for line in go.split(os.linesep): + match = self.pattern.search(line) + if match: + my_expr, val = match.group(1), match.group(2) + gl.append((my_expr, val)) + #print "golden list:", gl + + # Bring the program to the point where we can issue a series of + # 'expression' command to compare against the golden output. + self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + self.runCmd("breakpoint set -f main.cpp -l %d" % self.line) + self.runCmd("run", RUN_SUCCEEDED) + + # Now iterate through the golden list, comparing against the output from + # 'expression var'. + for my_expr, val in gl: + # Don't overwhelm the expression mechanism. + # This slows down the test suite quite a bit, to enable it, define + # the environment variable LLDB_TYPES_EXPR_TIME_WAIT. For example: + # + # export LLDB_TYPES_EXPR_TIME_WAIT=0.5 + # + # causes a 0.5 second delay between 'expression' commands. + if "LLDB_TYPES_EXPR_TIME_WAIT" in os.environ: + time.sleep(float(os.environ["LLDB_TYPES_EXPR_TIME_WAIT"])) + + self.runCmd("expression %s" % my_expr) + output = self.res.GetOutput() + + # The expression output must match the oracle. + self.expect(output, Msg(my_expr, val), exe=False, + substrs = [val]) Modified: lldb/trunk/test/cpp/virtual/main.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/cpp/virtual/main.cpp?rev=124642&r1=124641&r2=124642&view=diff ============================================================================== --- lldb/trunk/test/cpp/virtual/main.cpp (original) +++ lldb/trunk/test/cpp/virtual/main.cpp Mon Jan 31 19:23:34 2011 @@ -84,18 +84,7 @@ C *c_as_C = new C(); A *c_as_A = c_as_C; - printf ("a_as_A->a() = '%s'\n", a_as_A->a()); - printf ("a_as_A->b() = '%s'\n", a_as_A->b()); - printf ("a_as_A->c() = '%s'\n", a_as_A->c()); - printf ("b_as_A->a() = '%s'\n", b_as_A->a()); - printf ("b_as_A->b() = '%s'\n", b_as_A->b()); - printf ("b_as_A->c() = '%s'\n", b_as_A->c()); - printf ("b_as_B->aa() = '%s'\n", b_as_B->aa()); - printf ("c_as_A->a() = '%s'\n", c_as_A->a()); - printf ("c_as_A->b() = '%s'\n", c_as_A->b()); - printf ("c_as_A->c() = '%s'\n", c_as_A->c()); - printf ("c_as_C->aa() = '%s'\n", c_as_C->aa()); - return 0; // Set first breakpoint here. + // Set first breakpoint here. // then evaluate: // expression a_as_A->a() // expression a_as_A->b() @@ -108,4 +97,16 @@ // expression c_as_A->b() // expression c_as_A->c() // expression c_as_C->aa() + printf ("a_as_A->a() = '%s'\n", a_as_A->a()); + printf ("a_as_A->b() = '%s'\n", a_as_A->b()); + printf ("a_as_A->c() = '%s'\n", a_as_A->c()); + printf ("b_as_A->a() = '%s'\n", b_as_A->a()); + printf ("b_as_A->b() = '%s'\n", b_as_A->b()); + printf ("b_as_A->c() = '%s'\n", b_as_A->c()); + printf ("b_as_B->aa() = '%s'\n", b_as_B->aa()); + printf ("c_as_A->a() = '%s'\n", c_as_A->a()); + printf ("c_as_A->b() = '%s'\n", c_as_A->b()); + printf ("c_as_A->c() = '%s'\n", c_as_A->c()); + printf ("c_as_C->aa() = '%s'\n", c_as_C->aa()); + return 0; } From gclayton at apple.com Mon Jan 31 19:31:41 2011 From: gclayton at apple.com (Greg Clayton) Date: Tue, 01 Feb 2011 01:31:41 -0000 Subject: [Lldb-commits] [lldb] r124643 - in /lldb/trunk: include/lldb/ include/lldb/Core/ include/lldb/Host/ include/lldb/Symbol/ source/API/ source/Commands/ source/Core/ source/Expression/ source/Host/common/ source/Host/macosx/ source/Interpreter/ source/Plugins/DynamicLoader/MacOSX-DYLD/ source/Plugins/ObjectContainer/BSD-Archive/ source/Plugins/ObjectContainer/Universal-Mach-O/ source/Plugins/ObjectFile/Mach-O/ source/Plugins/Process/MacOSX-User/source/ source/Plugins/Process/MacOSX-User/source/MacOSX/ source/Plugins/Proce... Message-ID: <20110201013141.DD3CF2A6C12C@llvm.org> Author: gclayton Date: Mon Jan 31 19:31:41 2011 New Revision: 124643 URL: http://llvm.org/viewvc/llvm-project?rev=124643&view=rev Log: Endian patch from Kirk Beitz that allows better cross platform building. Modified: lldb/trunk/include/lldb/Core/Communication.h lldb/trunk/include/lldb/Host/Endian.h lldb/trunk/include/lldb/Symbol/ObjectContainer.h lldb/trunk/include/lldb/Symbol/ObjectFile.h lldb/trunk/include/lldb/lldb-enumerations.h lldb/trunk/source/API/SBTarget.cpp lldb/trunk/source/Commands/CommandObjectFrame.cpp lldb/trunk/source/Commands/CommandObjectProcess.cpp lldb/trunk/source/Commands/CommandObjectThread.cpp lldb/trunk/source/Core/Address.cpp lldb/trunk/source/Core/Communication.cpp lldb/trunk/source/Core/DataExtractor.cpp lldb/trunk/source/Core/EmulateInstruction.cpp lldb/trunk/source/Core/Event.cpp lldb/trunk/source/Core/Scalar.cpp lldb/trunk/source/Core/Stream.cpp lldb/trunk/source/Core/Value.cpp lldb/trunk/source/Core/ValueObject.cpp lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp lldb/trunk/source/Expression/ClangUserExpression.cpp lldb/trunk/source/Expression/DWARFExpression.cpp lldb/trunk/source/Host/common/Host.cpp lldb/trunk/source/Host/macosx/Symbols.cpp lldb/trunk/source/Interpreter/CommandInterpreter.cpp lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h lldb/trunk/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp lldb/trunk/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp lldb/trunk/source/Plugins/Process/MacOSX-User/source/MacOSX/MachTask.cpp lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp lldb/trunk/source/Target/Process.cpp lldb/trunk/source/Target/RegisterContext.cpp lldb/trunk/source/Target/Thread.cpp Modified: lldb/trunk/include/lldb/Core/Communication.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Communication.h?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/Communication.h (original) +++ lldb/trunk/include/lldb/Core/Communication.h Mon Jan 31 19:31:41 2011 @@ -19,9 +19,7 @@ #include "lldb/lldb-private.h" #include "lldb/Core/Broadcaster.h" #include "lldb/Core/Error.h" -#include "lldb/Host/Host.h" #include "lldb/Host/Mutex.h" -#include "lldb/Host/Predicate.h" #include "lldb/lldb-private.h" namespace lldb_private { Modified: lldb/trunk/include/lldb/Host/Endian.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Endian.h?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/Endian.h (original) +++ lldb/trunk/include/lldb/Host/Endian.h Mon Jan 31 19:31:41 2011 @@ -10,10 +10,24 @@ #ifndef liblldb_host_endian_h_ #define liblldb_host_endian_h_ -// TODO: come up with a more lldb specific solution instead of relying on -// macosx .... +#include -#include +namespace lldb { + +namespace endian { + + static union EndianTest + { + uint32_t num; + uint8_t bytes[sizeof(uint32_t)]; + } const endianTest = { (uint16_t)0x01020304 }; + + inline ByteOrder InlHostByteOrder() { return (ByteOrder)endianTest.bytes[0]; } + +// ByteOrder const InlHostByteOrder = (ByteOrder)endianTest.bytes[0]; +} + +} #endif // liblldb_host_endian_h_ Modified: lldb/trunk/include/lldb/Symbol/ObjectContainer.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ObjectContainer.h?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ObjectContainer.h (original) +++ lldb/trunk/include/lldb/Symbol/ObjectContainer.h Mon Jan 31 19:31:41 2011 @@ -20,6 +20,7 @@ #include "lldb/Core/FileSpec.h" #include "lldb/Core/ModuleChild.h" #include "lldb/Core/PluginInterface.h" +#include "lldb/Host/Endian.h" namespace lldb_private { @@ -55,7 +56,7 @@ m_file (), // This file can be different than the module's file spec m_offset (offset), m_length (length), - m_data (headerDataSP, lldb::eByteOrderHost, 4) + m_data (headerDataSP, lldb::endian::InlHostByteOrder(), 4) { if (file) m_file = *file; Modified: lldb/trunk/include/lldb/Symbol/ObjectFile.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ObjectFile.h?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ObjectFile.h (original) +++ lldb/trunk/include/lldb/Symbol/ObjectFile.h Mon Jan 31 19:31:41 2011 @@ -15,6 +15,7 @@ #include "lldb/Core/FileSpec.h" #include "lldb/Core/ModuleChild.h" #include "lldb/Core/PluginInterface.h" +#include "lldb/Host/Endian.h" #include "lldb/Symbol/Symtab.h" #include "lldb/Symbol/UnwindTable.h" @@ -67,7 +68,7 @@ m_file (), // This file could be different from the original module's file m_offset (offset), m_length (length), - m_data (headerDataSP, lldb::eByteOrderHost, 4), + m_data (headerDataSP, lldb::endian::InlHostByteOrder(), 4), m_unwind_table (*this) { if (file_spec_ptr) Modified: lldb/trunk/include/lldb/lldb-enumerations.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-enumerations.h?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-enumerations.h (original) +++ lldb/trunk/include/lldb/lldb-enumerations.h Mon Jan 31 19:31:41 2011 @@ -10,12 +10,6 @@ #ifndef LLDB_enumerations_h_ #define LLDB_enumerations_h_ -#if !defined (__APPLE__) - -#include - -#endif - namespace lldb { //---------------------------------------------------------------------- @@ -86,41 +80,9 @@ typedef enum ByteOrder { eByteOrderInvalid = 0, - eByteOrderLittle = 1234, - eByteOrderBig = 4321, - eByteOrderPDP = 3412, - -#if defined (__APPLE__) - -// On Mac OS X there are preprocessor defines automatically defined -// for the byte order that we can rely on. - -#if defined (__LITTLE_ENDIAN__) - eByteOrderHost = eByteOrderLittle -#elif defined (__BIG_ENDIAN__) - eByteOrderHost = eByteOrderBig -#elif defined (__PDP_ENDIAN__) - eByteOrderHost = eByteOrderPDP -#else -#error unable to detect endianness -#endif - -#else - -// On linux we rely upon the defines in - -#if __BYTE_ORDER == __LITTLE_ENDIAN - eByteOrderHost = eByteOrderLittle -#elif __BYTE_ORDER == __BIG_ENDIAN - eByteOrderHost = eByteOrderBig -#elif __BYTE_ORDER == __PDP_ENDIAN - eByteOrderHost = eByteOrderPDP -#else -#error unable to detect endianness -#endif - -#endif - + eByteOrderBig = 1, + eByteOrderPDP = 2, + eByteOrderLittle = 4, } ByteOrder; //---------------------------------------------------------------------- Modified: lldb/trunk/source/API/SBTarget.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTarget.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/API/SBTarget.cpp (original) +++ lldb/trunk/source/API/SBTarget.cpp Mon Jan 31 19:31:41 2011 @@ -30,6 +30,7 @@ #include "lldb/Core/RegularExpression.h" #include "lldb/Core/SearchFilter.h" #include "lldb/Core/STLUtils.h" +#include "lldb/Host/Host.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Target/TargetList.h" Modified: lldb/trunk/source/Commands/CommandObjectFrame.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectFrame.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectFrame.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectFrame.cpp Mon Jan 31 19:31:41 2011 @@ -20,6 +20,7 @@ #include "lldb/Core/Value.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectVariable.h" +#include "lldb/Host/Host.h" #include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" Modified: lldb/trunk/source/Commands/CommandObjectProcess.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectProcess.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectProcess.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectProcess.cpp Mon Jan 31 19:31:41 2011 @@ -19,6 +19,7 @@ #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" #include "./CommandObjectThread.h" +#include "lldb/Host/Host.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" Modified: lldb/trunk/source/Commands/CommandObjectThread.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectThread.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectThread.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectThread.cpp Mon Jan 31 19:31:41 2011 @@ -17,6 +17,8 @@ #include "lldb/Core/State.h" #include "lldb/Core/SourceManager.h" +#include "lldb/Host/Host.h" + #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/CommandReturnObject.h" Modified: lldb/trunk/source/Core/Address.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Address.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Core/Address.cpp (original) +++ lldb/trunk/source/Core/Address.cpp Mon Jan 31 19:31:41 2011 @@ -171,7 +171,7 @@ buf[k_buf_len] = '\0'; // NULL terminate // Byte order and address size don't matter for C string dumping.. - DataExtractor data (buf, sizeof(buf), eByteOrderHost, 4); + DataExtractor data (buf, sizeof(buf), lldb::endian::InlHostByteOrder(), 4); size_t total_len = 0; size_t bytes_read; Address curr_address(address); Modified: lldb/trunk/source/Core/Communication.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Communication.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Core/Communication.cpp (original) +++ lldb/trunk/source/Core/Communication.cpp Mon Jan 31 19:31:41 2011 @@ -17,6 +17,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Timer.h" #include "lldb/Core/Event.h" +#include "lldb/Host/Host.h" #include using namespace lldb; Modified: lldb/trunk/source/Core/DataExtractor.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/DataExtractor.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Core/DataExtractor.cpp (original) +++ lldb/trunk/source/Core/DataExtractor.cpp Mon Jan 31 19:31:41 2011 @@ -22,6 +22,7 @@ #include "lldb/Core/StreamString.h" #include "lldb/Core/UUID.h" #include "lldb/Core/dwarf.h" +#include "lldb/Host/Endian.h" using namespace lldb; using namespace lldb_private; @@ -67,7 +68,7 @@ DataExtractor::DataExtractor () : m_start (NULL), m_end (NULL), - m_byte_order(eByteOrderHost), + m_byte_order(lldb::endian::InlHostByteOrder()), m_addr_size (4), m_data_sp () { @@ -160,7 +161,7 @@ { m_start = NULL; m_end = NULL; - m_byte_order = eByteOrderHost; + m_byte_order = lldb::endian::InlHostByteOrder(); m_addr_size = 4; m_data_sp.reset(); } @@ -460,7 +461,7 @@ register uint32_t offset = *offset_ptr; if ( ValidOffsetForDataOfSize(offset, sizeof(val)) ) { - if (m_byte_order != eByteOrderHost) + if (m_byte_order != lldb::endian::InlHostByteOrder()) val = ReadSwapInt16(m_start, offset); else val = ReadInt16 (m_start, offset); @@ -474,7 +475,7 @@ uint16_t DataExtractor::GetU16_unchecked (uint32_t *offset_ptr) const { - uint16_t val = (m_byte_order == eByteOrderHost) ? + uint16_t val = (m_byte_order == lldb::endian::InlHostByteOrder()) ? ReadInt16 (m_start, *offset_ptr) : ReadSwapInt16(m_start, *offset_ptr); *offset_ptr += sizeof(val); @@ -484,7 +485,7 @@ uint32_t DataExtractor::GetU32_unchecked (uint32_t *offset_ptr) const { - uint32_t val = (m_byte_order == eByteOrderHost) ? + uint32_t val = (m_byte_order == lldb::endian::InlHostByteOrder()) ? ReadInt32 (m_start, *offset_ptr) : ReadSwapInt32 (m_start, *offset_ptr); *offset_ptr += sizeof(val); @@ -494,7 +495,7 @@ uint64_t DataExtractor::GetU64_unchecked (uint32_t *offset_ptr) const { - uint64_t val = (m_byte_order == eByteOrderHost) ? + uint64_t val = (m_byte_order == lldb::endian::InlHostByteOrder()) ? ReadInt64 (m_start, *offset_ptr) : ReadSwapInt64 (m_start, *offset_ptr); *offset_ptr += sizeof(val); @@ -522,7 +523,7 @@ { uint16_t *value_ptr; uint16_t *end = dst + count; - if (m_byte_order != eByteOrderHost) + if (m_byte_order != lldb::endian::InlHostByteOrder()) { for (value_ptr = dst; value_ptr < end; ++value_ptr, offset += value_size) *value_ptr = ReadSwapInt16 (m_start, offset); @@ -555,7 +556,7 @@ if ( ValidOffsetForDataOfSize(offset, sizeof(val)) ) { - if (m_byte_order != eByteOrderHost) + if (m_byte_order != lldb::endian::InlHostByteOrder()) val = ReadSwapInt32 (m_start, offset); else val = ReadInt32 (m_start, offset); @@ -586,7 +587,7 @@ { uint32_t *value_ptr; uint32_t *end = dst + count; - if (m_byte_order != eByteOrderHost) + if (m_byte_order != lldb::endian::InlHostByteOrder()) { for (value_ptr = dst; value_ptr < end; ++value_ptr, offset += value_size) *value_ptr = ReadSwapInt32 (m_start, offset); @@ -619,7 +620,7 @@ register uint32_t offset = *offset_ptr; if ( ValidOffsetForDataOfSize(offset, sizeof(val)) ) { - if (m_byte_order != eByteOrderHost) + if (m_byte_order != lldb::endian::InlHostByteOrder()) val = ReadSwapInt64 (m_start, offset); else val = ReadInt64 (m_start, offset); @@ -648,7 +649,7 @@ { uint64_t *value_ptr; uint64_t *end = dst + count; - if (m_byte_order != eByteOrderHost) + if (m_byte_order != lldb::endian::InlHostByteOrder()) { for (value_ptr = dst; value_ptr < end; ++value_ptr, offset += value_size) *value_ptr = ReadSwapInt64 (m_start, offset); @@ -776,7 +777,7 @@ if (src_data) { - if (m_byte_order != eByteOrderHost) + if (m_byte_order != lldb::endian::InlHostByteOrder()) { uint8_t *dst_data = (uint8_t *)&val; for (int i=0; i @@ -129,7 +130,7 @@ else if (m_bytes.size() > 0) { DataExtractor data; - data.SetData(&m_bytes[0], m_bytes.size(), eByteOrderHost); + data.SetData(&m_bytes[0], m_bytes.size(), lldb::endian::InlHostByteOrder()); data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0); } } Modified: lldb/trunk/source/Core/Scalar.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Scalar.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Core/Scalar.cpp (original) +++ lldb/trunk/source/Core/Scalar.cpp Mon Jan 31 19:31:41 2011 @@ -15,6 +15,7 @@ #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/DataExtractor.h" +#include "lldb/Host/Endian.h" using namespace lldb; using namespace lldb_private; @@ -134,25 +135,25 @@ { if (limit_byte_size < byte_size) { - if (eByteOrderHost == eByteOrderLittle) + if (lldb::endian::InlHostByteOrder() == eByteOrderLittle) { // On little endian systems if we want fewer bytes from the // current type we just specify fewer bytes since the LSByte // is first... - data.SetData((uint8_t*)&m_data, limit_byte_size, eByteOrderHost); + data.SetData((uint8_t*)&m_data, limit_byte_size, lldb::endian::InlHostByteOrder()); } - else if (eByteOrderHost == eByteOrderBig) + else if (lldb::endian::InlHostByteOrder() == eByteOrderBig) { // On big endian systems if we want fewer bytes from the // current type have to advance our initial byte pointer and // trim down the number of bytes since the MSByte is first - data.SetData(((uint8_t*)&m_data) + byte_size - limit_byte_size, limit_byte_size, eByteOrderHost); + data.SetData(((uint8_t*)&m_data) + byte_size - limit_byte_size, limit_byte_size, lldb::endian::InlHostByteOrder()); } } else { // We want all of the data - data.SetData((uint8_t*)&m_data, byte_size, eByteOrderHost); + data.SetData((uint8_t*)&m_data, byte_size, lldb::endian::InlHostByteOrder()); } return true; } Modified: lldb/trunk/source/Core/Stream.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Stream.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Core/Stream.cpp (original) +++ lldb/trunk/source/Core/Stream.cpp Mon Jan 31 19:31:41 2011 @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "lldb/Core/Stream.h" +#include "lldb/Host/Endian.h" #include #include #include @@ -26,7 +27,7 @@ Stream::Stream () : m_flags (0), m_addr_size (4), - m_byte_order (eByteOrderHost), + m_byte_order (lldb::endian::InlHostByteOrder()), m_indent_level(0) { } @@ -628,7 +629,7 @@ int Stream::PutPointer (void *ptr) { - return PutRawBytes (&ptr, sizeof(ptr), eByteOrderHost, eByteOrderHost); + return PutRawBytes (&ptr, sizeof(ptr), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder()); } int @@ -637,7 +638,7 @@ if (byte_order == eByteOrderInvalid) byte_order = m_byte_order; - return PutRawBytes (&f, sizeof(f), eByteOrderHost, byte_order); + return PutRawBytes (&f, sizeof(f), lldb::endian::InlHostByteOrder(), byte_order); } int @@ -646,7 +647,7 @@ if (byte_order == eByteOrderInvalid) byte_order = m_byte_order; - return PutRawBytes (&d, sizeof(d), eByteOrderHost, byte_order); + return PutRawBytes (&d, sizeof(d), lldb::endian::InlHostByteOrder(), byte_order); } int @@ -655,7 +656,7 @@ if (byte_order == eByteOrderInvalid) byte_order = m_byte_order; - return PutRawBytes (&ld, sizeof(ld), eByteOrderHost, byte_order); + return PutRawBytes (&ld, sizeof(ld), lldb::endian::InlHostByteOrder(), byte_order); } int @@ -739,21 +740,21 @@ s->PutHex8(0x12); s->PutChar(' '); - s->PutHex16(0x3456, eByteOrderHost); + s->PutHex16(0x3456, lldb::endian::InlHostByteOrder()); s->PutChar(' '); s->PutHex16(0x3456, eByteOrderBig); s->PutChar(' '); s->PutHex16(0x3456, eByteOrderLittle); s->PutChar(' '); - s->PutHex32(0x789abcde, eByteOrderHost); + s->PutHex32(0x789abcde, lldb::endian::InlHostByteOrder()); s->PutChar(' '); s->PutHex32(0x789abcde, eByteOrderBig); s->PutChar(' '); s->PutHex32(0x789abcde, eByteOrderLittle); s->PutChar(' '); - s->PutHex64(0x1122334455667788ull, eByteOrderHost); + s->PutHex64(0x1122334455667788ull, lldb::endian::InlHostByteOrder()); s->PutChar(' '); s->PutHex64(0x1122334455667788ull, eByteOrderBig); s->PutChar(' '); Modified: lldb/trunk/source/Core/Value.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Value.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Core/Value.cpp (original) +++ lldb/trunk/source/Core/Value.cpp Mon Jan 31 19:31:41 2011 @@ -522,7 +522,7 @@ break; case eValueTypeScalar: - data.SetByteOrder (eByteOrderHost); + data.SetByteOrder (lldb::endian::InlHostByteOrder()); data.SetAddressByteSize(sizeof(void *)); if (m_value.GetData (data)) return error; // Success; @@ -603,7 +603,7 @@ case eValueTypeHostAddress: address = m_value.ULongLong(LLDB_INVALID_ADDRESS); - data.SetByteOrder(eByteOrderHost); + data.SetByteOrder(lldb::endian::InlHostByteOrder()); data.SetAddressByteSize(sizeof(void *)); address_type = eAddressTypeHost; break; Modified: lldb/trunk/source/Core/ValueObject.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObject.cpp (original) +++ lldb/trunk/source/Core/ValueObject.cpp Mon Jan 31 19:31:41 2011 @@ -24,6 +24,8 @@ #include "lldb/Core/ValueObjectConstResult.h" #include "lldb/Core/ValueObjectList.h" +#include "lldb/Host/Endian.h" + #include "lldb/Symbol/ClangASTType.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/Type.h" @@ -460,7 +462,7 @@ if (cstr_len > 0) { data_buffer.resize(cstr_len); - data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost); + data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder()); bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), cstr_len, error); if (bytes_read > 0) { @@ -486,7 +488,7 @@ sstr << '"'; - data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost); + data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder()); while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0) { size_t len = strlen(&data_buffer.front()); @@ -796,7 +798,7 @@ { // We are decoding a float into host byte order below, so make // sure m_data knows what it contains. - m_data.SetByteOrder(eByteOrderHost); + m_data.SetByteOrder(lldb::endian::InlHostByteOrder()); const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue ( GetClangAST(), GetClangType(), Modified: lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp (original) +++ lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Mon Jan 31 19:31:41 2011 @@ -23,6 +23,7 @@ #include "lldb/Core/ValueObjectConstResult.h" #include "lldb/Expression/ClangASTSource.h" #include "lldb/Expression/ClangPersistentVariables.h" +#include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/ClangNamespaceDecl.h" #include "lldb/Symbol/CompileUnit.h" @@ -861,13 +862,13 @@ case 4: { uint32_t address32 = address & 0xffffffffll; - str.PutRawBytes(&address32, sizeof(address32), eByteOrderHost, eByteOrderInvalid); + str.PutRawBytes(&address32, sizeof(address32), endian::InlHostByteOrder(), eByteOrderInvalid); } break; case 8: { uint64_t address64 = address; - str.PutRawBytes(&address64, sizeof(address64), eByteOrderHost, eByteOrderInvalid); + str.PutRawBytes(&address64, sizeof(address64), endian::InlHostByteOrder(), eByteOrderInvalid); } break; } Modified: lldb/trunk/source/Expression/ClangUserExpression.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangUserExpression.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Expression/ClangUserExpression.cpp (original) +++ lldb/trunk/source/Expression/ClangUserExpression.cpp Mon Jan 31 19:31:41 2011 @@ -275,7 +275,7 @@ // m_dwarf_opcodes.reset(new StreamString); - m_dwarf_opcodes->SetByteOrder (lldb::eByteOrderHost); + m_dwarf_opcodes->SetByteOrder (lldb::endian::InlHostByteOrder()); m_dwarf_opcodes->GetFlags ().Set (Stream::eBinary); m_local_variables.reset(new ClangExpressionVariableList()); Modified: lldb/trunk/source/Expression/DWARFExpression.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/DWARFExpression.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Expression/DWARFExpression.cpp (original) +++ lldb/trunk/source/Expression/DWARFExpression.cpp Mon Jan 31 19:31:41 2011 @@ -21,7 +21,7 @@ #include "lldb/Expression/ClangExpressionDeclMap.h" #include "lldb/Expression/ClangExpressionVariable.h" -#include "lldb/Host/Host.h" +#include "lldb/Host/Endian.h" #include "lldb/lldb-private-log.h" @@ -2272,7 +2272,7 @@ tmp = stack.back(); stack.pop_back(); Value::ContextType context_type = stack.back().GetContextType(); - StreamString new_value(Stream::eBinary, 4, eByteOrderHost); + StreamString new_value(Stream::eBinary, 4, lldb::endian::InlHostByteOrder()); switch (context_type) { case Value::eContextTypeClangType: @@ -2316,7 +2316,7 @@ } break; case Value::eValueTypeHostAddress: - if (exe_ctx->process->GetByteOrder() != Host::GetByteOrder()) + if (exe_ctx->process->GetByteOrder() != lldb::endian::InlHostByteOrder()) { if (error_ptr) error_ptr->SetErrorStringWithFormat ("Copy of composite types between incompatible byte orders is unimplemented"); @@ -2341,7 +2341,7 @@ switch (target_value_type) { case Value::eValueTypeLoadAddress: - if (exe_ctx->process->GetByteOrder() != Host::GetByteOrder()) + if (exe_ctx->process->GetByteOrder() != lldb::endian::InlHostByteOrder()) { if (error_ptr) error_ptr->SetErrorStringWithFormat ("Copy of composite types between incompatible byte orders is unimplemented"); Modified: lldb/trunk/source/Host/common/Host.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Host.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Host/common/Host.cpp (original) +++ lldb/trunk/source/Host/common/Host.cpp Mon Jan 31 19:31:41 2011 @@ -14,6 +14,7 @@ #include "lldb/Core/FileSpec.h" #include "lldb/Core/Log.h" #include "lldb/Core/StreamString.h" +#include "lldb/Host/Endian.h" #include "lldb/Host/Mutex.h" #include @@ -214,26 +215,6 @@ return ::getpagesize(); } -//------------------------------------------------------------------ -// Returns true if the host system is Big Endian. -//------------------------------------------------------------------ -ByteOrder -Host::GetByteOrder () -{ - union EndianTest - { - uint32_t num; - uint8_t bytes[sizeof(uint32_t)]; - } endian = { (uint16_t)0x11223344 }; - switch (endian.bytes[0]) - { - case 0x11: return eByteOrderLittle; - case 0x44: return eByteOrderBig; - case 0x33: return eByteOrderPDP; - } - return eByteOrderInvalid; -} - const ArchSpec & Host::GetArchitecture () { Modified: lldb/trunk/source/Host/macosx/Symbols.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Symbols.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Host/macosx/Symbols.cpp (original) +++ lldb/trunk/source/Host/macosx/Symbols.cpp Mon Jan 31 19:31:41 2011 @@ -24,6 +24,7 @@ #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Timer.h" #include "lldb/Core/UUID.h" +#include "lldb/Host/Endian.h" #include "Host/macosx/cfcpp/CFCReleaser.h" #include "mach/machine.h" @@ -53,8 +54,8 @@ { assert(magic == HeaderMagic32 || magic == HeaderMagic32Swapped || magic == HeaderMagic64 || magic == HeaderMagic64Swapped); if (magic == HeaderMagic32 || magic == HeaderMagic64) - data.SetByteOrder (eByteOrderHost); - else if (eByteOrderHost == eByteOrderBig) + data.SetByteOrder (lldb::endian::InlHostByteOrder()); + else if (lldb::endian::InlHostByteOrder() == eByteOrderBig) data.SetByteOrder (eByteOrderLittle); else data.SetByteOrder (eByteOrderBig); Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original) +++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Mon Jan 31 19:31:41 2011 @@ -43,6 +43,7 @@ #include "lldb/Core/InputReader.h" #include "lldb/Core/Stream.h" #include "lldb/Core/Timer.h" +#include "lldb/Host/Host.h" #include "lldb/Target/Process.h" #include "lldb/Target/Thread.h" #include "lldb/Target/TargetList.h" Modified: lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp (original) +++ lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp Mon Jan 31 19:31:41 2011 @@ -785,7 +785,7 @@ ::memset (header, 0, sizeof(header)); // Get the magic byte unswapped so we can figure out what we are dealing with - DataExtractor data(header_bytes.GetBytes(), header_bytes.GetByteSize(), eByteOrderHost, 4); + DataExtractor data(header_bytes.GetBytes(), header_bytes.GetByteSize(), lldb::endian::InlHostByteOrder(), 4); header->magic = data.GetU32(&offset); lldb::addr_t load_cmd_addr = addr; data.SetByteOrder(DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic(header->magic)); Modified: lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h (original) +++ lldb/trunk/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h Mon Jan 31 19:31:41 2011 @@ -154,11 +154,11 @@ { case llvm::MachO::HeaderMagic32: case llvm::MachO::HeaderMagic64: - return lldb::eByteOrderHost; + return lldb::endian::InlHostByteOrder(); case llvm::MachO::HeaderMagic32Swapped: case llvm::MachO::HeaderMagic64Swapped: - if (lldb::eByteOrderHost == lldb::eByteOrderBig) + if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig) return lldb::eByteOrderLittle; else return lldb::eByteOrderBig; @@ -274,11 +274,11 @@ { case llvm::MachO::HeaderMagic32: // MH_MAGIC case llvm::MachO::HeaderMagic64: // MH_MAGIC_64 - return lldb::eByteOrderHost; + return lldb::endian::InlHostByteOrder(); case llvm::MachO::HeaderMagic32Swapped: // MH_CIGAM case llvm::MachO::HeaderMagic64Swapped: // MH_CIGAM_64 - if (lldb::eByteOrderHost == lldb::eByteOrderLittle) + if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderLittle) return lldb::eByteOrderBig; else return lldb::eByteOrderLittle; @@ -286,7 +286,7 @@ assert (!"invalid header.magic value"); break; } - return lldb::eByteOrderHost; + return lldb::endian::InlHostByteOrder(); } const Segment * Modified: lldb/trunk/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp (original) +++ lldb/trunk/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.cpp Mon Jan 31 19:31:41 2011 @@ -288,7 +288,7 @@ bool ObjectContainerBSDArchive::MagicBytesMatch (DataBufferSP& dataSP) { - DataExtractor data(dataSP, eByteOrderHost, 4); + DataExtractor data(dataSP, lldb::endian::InlHostByteOrder(), 4); uint32_t offset = 0; const char* armag = (const char* )data.PeekData (offset, sizeof(ar_hdr)); if (armag && ::strncmp(armag, ARMAG, SARMAG) == 0) Modified: lldb/trunk/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp (original) +++ lldb/trunk/source/Plugins/ObjectContainer/Universal-Mach-O/ObjectContainerUniversalMachO.cpp Mon Jan 31 19:31:41 2011 @@ -73,7 +73,7 @@ bool ObjectContainerUniversalMachO::MagicBytesMatch (DataBufferSP& dataSP) { - DataExtractor data(dataSP, eByteOrderHost, 4); + DataExtractor data(dataSP, lldb::endian::InlHostByteOrder(), 4); uint32_t offset = 0; uint32_t magic = data.GetU32(&offset); return magic == UniversalMagic || magic == UniversalMagicSwapped; Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Mon Jan 31 19:31:41 2011 @@ -93,7 +93,7 @@ bool ObjectFileMachO::MagicBytesMatch (DataBufferSP& dataSP) { - DataExtractor data(dataSP, eByteOrderHost, 4); + DataExtractor data(dataSP, lldb::endian::InlHostByteOrder(), 4); uint32_t offset = 0; uint32_t magic = data.GetU32(&offset); return MachHeaderSizeFromMagic(magic) != 0; @@ -123,31 +123,31 @@ lldb_private::Mutex::Locker locker(m_mutex); bool can_parse = false; uint32_t offset = 0; - m_data.SetByteOrder (eByteOrderHost); + m_data.SetByteOrder (lldb::endian::InlHostByteOrder()); // Leave magic in the original byte order m_header.magic = m_data.GetU32(&offset); switch (m_header.magic) { case HeaderMagic32: - m_data.SetByteOrder (eByteOrderHost); + m_data.SetByteOrder (lldb::endian::InlHostByteOrder()); m_data.SetAddressByteSize(4); can_parse = true; break; case HeaderMagic64: - m_data.SetByteOrder (eByteOrderHost); + m_data.SetByteOrder (lldb::endian::InlHostByteOrder()); m_data.SetAddressByteSize(8); can_parse = true; break; case HeaderMagic32Swapped: - m_data.SetByteOrder(eByteOrderHost == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); + m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); m_data.SetAddressByteSize(4); can_parse = true; break; case HeaderMagic64Swapped: - m_data.SetByteOrder(eByteOrderHost == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); + m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); m_data.SetAddressByteSize(8); can_parse = true; break; @@ -652,7 +652,7 @@ assert (symtab_data_sp->GetByteSize()/nlist_size >= symtab_load_command.nsyms); - if (endian != eByteOrderHost) + if (endian != lldb::endian::InlHostByteOrder()) { // ... assert (!"UNIMPLEMENTED: Swap all nlist entries"); Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/MacOSX/MachTask.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/MacOSX/MachTask.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/MacOSX-User/source/MacOSX/MachTask.cpp (original) +++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/MacOSX/MachTask.cpp Mon Jan 31 19:31:41 2011 @@ -21,6 +21,7 @@ #endif +#include "lldb/Host/Endian.h" #include "lldb/Host/Host.h" #include "lldb/Core/DataExtractor.h" @@ -165,7 +166,7 @@ log->Printf ("MachTask::ReadMemory ( addr = 0x%16.16llx, size = %zu, buf = %8.8p) => %u bytes read", (uint64_t)addr, size, buf, n); if (log->GetMask().Test(PD_LOG_MEMORY_DATA_LONG) || (log->GetMask().Test(PD_LOG_MEMORY_DATA_SHORT) && size <= 8)) { - DataExtractor data((uint8_t*)buf, n, eByteOrderHost, 4); + DataExtractor data((uint8_t*)buf, n, lldb::endian::InlHostByteOrder(), 4); data.PutToLog(log.get(), 0, n, addr, 16, DataExtractor::TypeUInt8); } } @@ -191,7 +192,7 @@ log->Printf ("MachTask::WriteMemory ( addr = 0x%16.16llx, size = %zu, buf = %8.8p) => %u bytes written", (uint64_t)addr, size, buf, n); if (log->GetMask().Test(PD_LOG_MEMORY_DATA_LONG) || (log->GetMask().Test(PD_LOG_MEMORY_DATA_SHORT) && size <= 8)) { - DataExtractor data((uint8_t*)buf, n, eByteOrderHost, 4); + DataExtractor data((uint8_t*)buf, n, lldb::endian::InlHostByteOrder(), 4); data.PutToLog(log.get(), 0, n, addr, 16, DataExtractor::TypeUInt8); } } Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp (original) +++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp Mon Jan 31 19:31:41 2011 @@ -32,6 +32,7 @@ #include "lldb/Core/PluginManager.h" #include "lldb/Core/State.h" #include "lldb/Core/Timer.h" +#include "lldb/Host/Host.h" #include "lldb/Host/TimeValue.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/DynamicLoader.h" @@ -48,7 +49,6 @@ #endif // #if defined (__arm__) // Project includes -#include "lldb/Host/Host.h" #include "ProcessMacOSX.h" #include "ProcessMacOSXLog.h" #include "ThreadMacOSX.h" Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp (original) +++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp Mon Jan 31 19:31:41 2011 @@ -18,6 +18,7 @@ #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Scalar.h" +#include "lldb/Host/Endian.h" // Project includes #include "ARM_GCC_Registers.h" @@ -837,7 +838,7 @@ case gpr_lr: case gpr_pc: case gpr_cpsr: - data.SetData(&gpr.r[reg - gpr_r0], reg_info->byte_size, eByteOrderHost); + data.SetData(&gpr.r[reg - gpr_r0], reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_s0: @@ -872,23 +873,23 @@ case fpu_s29: case fpu_s30: case fpu_s31: - data.SetData(&fpu.floats.s[reg - fpu_s0], reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.floats.s[reg - fpu_s0], reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_fpscr: - data.SetData(&fpu.fpscr, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.fpscr, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_exception: - data.SetData(&exc.exception, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.exception, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_fsr: - data.SetData(&exc.fsr, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.fsr, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_far: - data.SetData(&exc.far, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.far, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; default: Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp (original) +++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp Mon Jan 31 19:31:41 2011 @@ -16,6 +16,7 @@ #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Scalar.h" +#include "lldb/Host/Endian.h" // Project includes #include "RegisterContextMach_i386.h" @@ -817,47 +818,47 @@ case gpr_es: case gpr_fs: case gpr_gs: - data.SetData(&gpr.eax + reg - gpr_eax, reg_info->byte_size, eByteOrderHost); + data.SetData(&gpr.eax + reg - gpr_eax, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_fcw: - data.SetData(&fpu.fcw, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.fcw, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_fsw: - data.SetData(&fpu.fsw, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.fsw, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_ftw: - data.SetData(&fpu.ftw, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.ftw, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_fop: - data.SetData(&fpu.fop, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.fop, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_ip: - data.SetData(&fpu.ip, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.ip, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_cs: - data.SetData(&fpu.cs, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.cs, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_dp: - data.SetData(&fpu.dp, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.dp, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_ds: - data.SetData(&fpu.ds, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.ds, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_mxcsr: - data.SetData(&fpu.mxcsr, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.mxcsr, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_mxcsrmask: - data.SetData(&fpu.mxcsrmask, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.mxcsrmask, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_stmm0: @@ -868,7 +869,7 @@ case fpu_stmm5: case fpu_stmm6: case fpu_stmm7: - data.SetData(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, eByteOrderHost); + data.SetData(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_xmm0: @@ -879,19 +880,19 @@ case fpu_xmm5: case fpu_xmm6: case fpu_xmm7: - data.SetData(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, eByteOrderHost); + data.SetData(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_trapno: - data.SetData(&exc.trapno, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.trapno, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_err: - data.SetData(&exc.err, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.err, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_faultvaddr: - data.SetData(&exc.faultvaddr, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.faultvaddr, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; default: Modified: lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp (original) +++ lldb/trunk/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp Mon Jan 31 19:31:41 2011 @@ -16,6 +16,7 @@ #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Scalar.h" +#include "lldb/Host/Endian.h" // Project includes #include "RegisterContextMach_x86_64.h" @@ -895,47 +896,47 @@ case gpr_cs: case gpr_fs: case gpr_gs: - data.SetData(&gpr.rax + reg - gpr_rax, reg_info->byte_size, eByteOrderHost); + data.SetData(&gpr.rax + reg - gpr_rax, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_fcw: - data.SetData(&fpu.fcw, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.fcw, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_fsw: - data.SetData(&fpu.fsw, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.fsw, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_ftw: - data.SetData(&fpu.ftw, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.ftw, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_fop: - data.SetData(&fpu.fop, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.fop, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_ip: - data.SetData(&fpu.ip, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.ip, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_cs: - data.SetData(&fpu.cs, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.cs, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_dp: - data.SetData(&fpu.dp, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.dp, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_ds: - data.SetData(&fpu.ds, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.ds, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_mxcsr: - data.SetData(&fpu.mxcsr, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.mxcsr, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_mxcsrmask: - data.SetData(&fpu.mxcsrmask, reg_info->byte_size, eByteOrderHost); + data.SetData(&fpu.mxcsrmask, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_stmm0: @@ -946,7 +947,7 @@ case fpu_stmm5: case fpu_stmm6: case fpu_stmm7: - data.SetData(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, eByteOrderHost); + data.SetData(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case fpu_xmm0: @@ -965,19 +966,19 @@ case fpu_xmm13: case fpu_xmm14: case fpu_xmm15: - data.SetData(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, eByteOrderHost); + data.SetData(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_trapno: - data.SetData(&exc.trapno, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.trapno, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_err: - data.SetData(&exc.err, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.err, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; case exc_faultvaddr: - data.SetData(&exc.faultvaddr, reg_info->byte_size, eByteOrderHost); + data.SetData(&exc.faultvaddr, reg_info->byte_size, lldb::endian::InlHostByteOrder()); break; default: Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp (original) +++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp Mon Jan 31 19:31:41 2011 @@ -707,35 +707,35 @@ if (regloc.type == eRegisterValueInferred) { - data.SetByteOrder (eByteOrderHost); + data.SetByteOrder (lldb::endian::InlHostByteOrder()); switch (reg_info->byte_size) { case 1: { uint8_t val = regloc.location.register_value; memcpy (data_sp->GetBytes(), &val, sizeof (val)); - data.SetByteOrder (eByteOrderHost); + data.SetByteOrder (lldb::endian::InlHostByteOrder()); return true; } case 2: { uint16_t val = regloc.location.register_value; memcpy (data_sp->GetBytes(), &val, sizeof (val)); - data.SetByteOrder (eByteOrderHost); + data.SetByteOrder (lldb::endian::InlHostByteOrder()); return true; } case 4: { uint32_t val = regloc.location.register_value; memcpy (data_sp->GetBytes(), &val, sizeof (val)); - data.SetByteOrder (eByteOrderHost); + data.SetByteOrder (lldb::endian::InlHostByteOrder()); return true; } case 8: { uint64_t val = regloc.location.register_value; memcpy (data_sp->GetBytes(), &val, sizeof (val)); - data.SetByteOrder (eByteOrderHost); + data.SetByteOrder (lldb::endian::InlHostByteOrder()); return true; } } Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp (original) +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp Mon Jan 31 19:31:41 2011 @@ -18,6 +18,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/State.h" #include "lldb/Core/StreamString.h" +#include "lldb/Host/Host.h" #include "lldb/Host/TimeValue.h" // Project includes @@ -48,7 +49,7 @@ m_arch(), m_os(), m_vendor(), - m_byte_order(eByteOrderHost), + m_byte_order(lldb::endian::InlHostByteOrder()), m_pointer_byte_size(0) { m_rx_packet_listener.StartListeningForEvents(this, @@ -773,7 +774,7 @@ if (i > 0) packet.PutChar(','); packet.Printf("%i,%i,", arg_len * 2, i); - packet.PutBytesAsRawHex8(arg, arg_len, eByteOrderHost, eByteOrderHost); + packet.PutBytesAsRawHex8(arg, arg_len, lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder()); } StringExtractorGDBRemote response; @@ -815,7 +816,7 @@ m_arch.Clear(); m_os.Clear(); m_vendor.Clear(); - m_byte_order = eByteOrderHost; + m_byte_order = lldb::endian::InlHostByteOrder(); m_pointer_byte_size = 0; StringExtractorGDBRemote response; Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp (original) +++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp Mon Jan 31 19:31:41 2011 @@ -341,8 +341,8 @@ packet.PutBytesAsRawHex8 (m_reg_data.GetDataStart(), m_reg_data.GetByteSize(), - eByteOrderHost, - eByteOrderHost); + lldb::endian::InlHostByteOrder(), + lldb::endian::InlHostByteOrder()); if (thread_suffix_supported) packet.Printf (";thread:%4.4x;", m_thread.GetID()); @@ -369,8 +369,8 @@ packet.Printf ("P%x=", reg); packet.PutBytesAsRawHex8 (m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size), reg_info->byte_size, - eByteOrderHost, - eByteOrderHost); + lldb::endian::InlHostByteOrder(), + lldb::endian::InlHostByteOrder()); if (thread_suffix_supported) packet.Printf (";thread:%4.4x;", m_thread.GetID()); Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original) +++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Mon Jan 31 19:31:41 2011 @@ -758,7 +758,7 @@ else packet.PutCString("vAttachName"); packet.PutChar(';'); - packet.PutBytesAsRawHex8(process_name, strlen(process_name), eByteOrderHost, eByteOrderHost); + packet.PutBytesAsRawHex8(process_name, strlen(process_name), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder()); m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet.GetData(), packet.GetSize())); @@ -1324,7 +1324,7 @@ { StreamString packet; packet.Printf("M%llx,%zx:", addr, size); - packet.PutBytesAsRawHex8(buf, size, eByteOrderHost, eByteOrderHost); + packet.PutBytesAsRawHex8(buf, size, lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder()); StringExtractorGDBRemote response; if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetData(), packet.GetSize(), response, 2, true)) { Modified: lldb/trunk/source/Target/Process.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Target/Process.cpp (original) +++ lldb/trunk/source/Target/Process.cpp Mon Jan 31 19:31:41 2011 @@ -230,7 +230,7 @@ m_dynamic_checkers_ap (), m_unix_signals (), m_target_triple (), - m_byte_order (eByteOrderHost), + m_byte_order (lldb::endian::InlHostByteOrder()), m_addr_byte_size (0), m_abi_sp (), m_process_input_reader (), Modified: lldb/trunk/source/Target/RegisterContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/RegisterContext.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Target/RegisterContext.cpp (original) +++ lldb/trunk/source/Target/RegisterContext.cpp Mon Jan 31 19:31:41 2011 @@ -14,6 +14,7 @@ #include "lldb/Target/RegisterContext.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Scalar.h" +#include "lldb/Host/Endian.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/StackFrame.h" #include "lldb/Target/Process.h" @@ -315,7 +316,7 @@ case 1: { int8_t v; - if (data.ExtractBytes (0, sizeof (int8_t), eByteOrderHost, &v) != sizeof (int8_t)) + if (data.ExtractBytes (0, sizeof (int8_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int8_t)) return false; value = v; return true; @@ -323,7 +324,7 @@ case 2: { int16_t v; - if (data.ExtractBytes (0, sizeof (int16_t), eByteOrderHost, &v) != sizeof (int16_t)) + if (data.ExtractBytes (0, sizeof (int16_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int16_t)) return false; value = v; return true; @@ -331,7 +332,7 @@ case 4: { int32_t v; - if (data.ExtractBytes (0, sizeof (int32_t), eByteOrderHost, &v) != sizeof (int32_t)) + if (data.ExtractBytes (0, sizeof (int32_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int32_t)) return false; value = v; return true; @@ -339,7 +340,7 @@ case 8: { int64_t v; - if (data.ExtractBytes (0, sizeof (int64_t), eByteOrderHost, &v) != sizeof (int64_t)) + if (data.ExtractBytes (0, sizeof (int64_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int64_t)) return false; value = v; return true; @@ -352,7 +353,7 @@ case sizeof (float): { float v; - if (data.ExtractBytes (0, sizeof (float), eByteOrderHost, &v) != sizeof (float)) + if (data.ExtractBytes (0, sizeof (float), lldb::endian::InlHostByteOrder(), &v) != sizeof (float)) return false; value = v; return true; @@ -360,7 +361,7 @@ case sizeof (double): { double v; - if (data.ExtractBytes (0, sizeof (double), eByteOrderHost, &v) != sizeof (double)) + if (data.ExtractBytes (0, sizeof (double), lldb::endian::InlHostByteOrder(), &v) != sizeof (double)) return false; value = v; return true; @@ -368,7 +369,7 @@ case sizeof (long double): { double v; - if (data.ExtractBytes (0, sizeof (long double), eByteOrderHost, &v) != sizeof (long double)) + if (data.ExtractBytes (0, sizeof (long double), lldb::endian::InlHostByteOrder(), &v) != sizeof (long double)) return false; value = v; return true; Modified: lldb/trunk/source/Target/Thread.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=124643&r1=124642&r2=124643&view=diff ============================================================================== --- lldb/trunk/source/Target/Thread.cpp (original) +++ lldb/trunk/source/Target/Thread.cpp Mon Jan 31 19:31:41 2011 @@ -14,7 +14,6 @@ #include "lldb/Core/Stream.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/RegularExpression.h" -#include "lldb/Host/Host.h" #include "lldb/Target/DynamicLoader.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" From gclayton at apple.com Mon Jan 31 19:37:45 2011 From: gclayton at apple.com (Greg Clayton) Date: Tue, 01 Feb 2011 01:37:45 -0000 Subject: [Lldb-commits] [lldb] r124644 - in /lldb/trunk: include/lldb/Core/PluginManager.h include/lldb/lldb-forward.h include/lldb/lldb-private-interfaces.h source/Core/PluginManager.cpp Message-ID: <20110201013745.5B8072A6C12C@llvm.org> Author: gclayton Date: Mon Jan 31 19:37:45 2011 New Revision: 124644 URL: http://llvm.org/viewvc/llvm-project?rev=124644&view=rev Log: Added EmulateIntruction plug-in manager support. Modified: lldb/trunk/include/lldb/Core/PluginManager.h lldb/trunk/include/lldb/lldb-forward.h lldb/trunk/include/lldb/lldb-private-interfaces.h lldb/trunk/source/Core/PluginManager.cpp Modified: lldb/trunk/include/lldb/Core/PluginManager.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=124644&r1=124643&r2=124644&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/PluginManager.h (original) +++ lldb/trunk/include/lldb/Core/PluginManager.h Mon Jan 31 19:37:45 2011 @@ -73,6 +73,23 @@ //------------------------------------------------------------------ + // EmulateInstruction + //------------------------------------------------------------------ + static bool + RegisterPlugin (const char *name, + const char *description, + EmulateInstructionCreateInstance create_callback); + + static bool + UnregisterPlugin (EmulateInstructionCreateInstance create_callback); + + static EmulateInstructionCreateInstance + GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx); + + static EmulateInstructionCreateInstance + GetEmulateInstructionCreateCallbackForPluginName (const char *name); + + //------------------------------------------------------------------ // LanguageRuntime //------------------------------------------------------------------ static bool Modified: lldb/trunk/include/lldb/lldb-forward.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=124644&r1=124643&r2=124644&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-forward.h (original) +++ lldb/trunk/include/lldb/lldb-forward.h Mon Jan 31 19:37:45 2011 @@ -69,6 +69,7 @@ class Declaration; class Disassembler; class DynamicLoader; +class EmulateInstruction; class Error; class Event; class EventData; Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=124644&r1=124643&r2=124644&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-private-interfaces.h (original) +++ lldb/trunk/include/lldb/lldb-private-interfaces.h Mon Jan 31 19:37:45 2011 @@ -22,6 +22,7 @@ typedef ObjectContainer* (*ObjectContainerCreateInstance) (Module* module, lldb::DataBufferSP& dataSP, const FileSpec *file, lldb::addr_t offset, lldb::addr_t length); typedef ObjectFile* (*ObjectFileCreateInstance) (Module* module, lldb::DataBufferSP& dataSP, const FileSpec* file, lldb::addr_t offset, lldb::addr_t length); typedef LogChannel* (*LogChannelCreateInstance) (); + typedef EmulateInstruction * (*EmulateInstructionCreateInstance) (const ConstString &triple); typedef LanguageRuntime *(*LanguageRuntimeCreateInstance) (Process *process, lldb::LanguageType language); typedef Process* (*ProcessCreateInstance) (Target &target, Listener &listener); typedef SymbolFile* (*SymbolFileCreateInstance) (ObjectFile* obj_file); Modified: lldb/trunk/source/Core/PluginManager.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=124644&r1=124643&r2=124644&view=diff ============================================================================== --- lldb/trunk/source/Core/PluginManager.cpp (original) +++ lldb/trunk/source/Core/PluginManager.cpp Mon Jan 31 19:37:45 2011 @@ -391,6 +391,128 @@ return NULL; } +#pragma mark EmulateInstruction + + +struct EmulateInstructionInstance +{ + EmulateInstructionInstance() : + name(), + description(), + create_callback(NULL) + { + } + + std::string name; + std::string description; + EmulateInstructionCreateInstance create_callback; +}; + +typedef std::vector EmulateInstructionInstances; + +static bool +AccessEmulateInstructionInstances (PluginAction action, EmulateInstructionInstance &instance, uint32_t index) +{ + static EmulateInstructionInstances g_plugin_instances; + + switch (action) + { + case ePluginRegisterInstance: + if (instance.create_callback) + { + g_plugin_instances.push_back (instance); + return true; + } + break; + + case ePluginUnregisterInstance: + if (instance.create_callback) + { + EmulateInstructionInstances::iterator pos, end = g_plugin_instances.end(); + for (pos = g_plugin_instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == instance.create_callback) + { + g_plugin_instances.erase(pos); + return true; + } + } + } + break; + + case ePluginGetInstanceAtIndex: + if (index < g_plugin_instances.size()) + { + instance = g_plugin_instances[index]; + return true; + } + break; + + default: + break; + } + return false; +} + + +bool +PluginManager::RegisterPlugin +( + const char *name, + const char *description, + EmulateInstructionCreateInstance create_callback + ) +{ + if (create_callback) + { + EmulateInstructionInstance instance; + assert (name && name[0]); + instance.name = name; + if (description && description[0]) + instance.description = description; + instance.create_callback = create_callback; + return AccessEmulateInstructionInstances (ePluginRegisterInstance, instance, 0); + } + return false; +} + +bool +PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback) +{ + if (create_callback) + { + EmulateInstructionInstance instance; + instance.create_callback = create_callback; + return AccessEmulateInstructionInstances (ePluginUnregisterInstance, instance, 0); + } + return false; +} + +EmulateInstructionCreateInstance +PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx) +{ + EmulateInstructionInstance instance; + if (AccessEmulateInstructionInstances (ePluginGetInstanceAtIndex, instance, idx)) + return instance.create_callback; + return NULL; +} + +EmulateInstructionCreateInstance +PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const char *name) +{ + if (name && name[0]) + { + EmulateInstructionInstance instance; + std::string ss_name(name); + for (uint32_t idx = 0; AccessEmulateInstructionInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + { + if (instance.name == ss_name) + return instance.create_callback; + } + } + return NULL; +} + #pragma mark LanguageRuntime From gclayton at apple.com Mon Jan 31 23:15:02 2011 From: gclayton at apple.com (Greg Clayton) Date: Tue, 01 Feb 2011 05:15:02 -0000 Subject: [Lldb-commits] [lldb] r124648 - /lldb/trunk/source/Host/macosx/Symbols.cpp Message-ID: <20110201051502.5CB7E2A6C12C@llvm.org> Author: gclayton Date: Mon Jan 31 23:15:02 2011 New Revision: 124648 URL: http://llvm.org/viewvc/llvm-project?rev=124648&view=rev Log: Added a cleanup helper object to make sure the directory that was opened with "DIR *opendir(const char *)" is closed if it is valid with a call to "int closedir (DIR *)". Modified: lldb/trunk/source/Host/macosx/Symbols.cpp Modified: lldb/trunk/source/Host/macosx/Symbols.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Symbols.cpp?rev=124648&r1=124647&r2=124648&view=diff ============================================================================== --- lldb/trunk/source/Host/macosx/Symbols.cpp (original) +++ lldb/trunk/source/Host/macosx/Symbols.cpp Mon Jan 31 23:15:02 2011 @@ -25,6 +25,7 @@ #include "lldb/Core/Timer.h" #include "lldb/Core/UUID.h" #include "lldb/Host/Endian.h" +#include "lldb/Utility/CleanUp.h" #include "Host/macosx/cfcpp/CFCReleaser.h" #include "mach/machine.h" @@ -237,12 +238,12 @@ { ::strncat (path, "/Contents/Resources/DWARF", sizeof(path) - strlen(path) - 1); - DIR* dirp = ::opendir(path); - if (dirp != NULL) + lldb_utility::CleanUp dirp (opendir("containing_part"), NULL, closedir); + if (dirp.is_valid()) { dsym_fspec.GetDirectory().SetCString(path); struct dirent* dp; - while ((dp = readdir(dirp)) != NULL) + while ((dp = readdir(dirp.get())) != NULL) { // Only search directories if (dp->d_type == DT_DIR || dp->d_type == DT_UNKNOWN) From gclayton at apple.com Mon Jan 31 23:15:22 2011 From: gclayton at apple.com (Greg Clayton) Date: Tue, 01 Feb 2011 05:15:22 -0000 Subject: [Lldb-commits] [lldb] r124649 - /lldb/trunk/source/Commands/CommandCompletions.cpp Message-ID: <20110201051522.397C32A6C12C@llvm.org> Author: gclayton Date: Mon Jan 31 23:15:22 2011 New Revision: 124649 URL: http://llvm.org/viewvc/llvm-project?rev=124649&view=rev Log: Added a cleanup helper object to make sure the directory that was opened with "DIR *opendir(const char *)" is closed if it is valid with a call to "int closedir (DIR *)". Modified: lldb/trunk/source/Commands/CommandCompletions.cpp Modified: lldb/trunk/source/Commands/CommandCompletions.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandCompletions.cpp?rev=124649&r1=124648&r2=124649&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandCompletions.cpp (original) +++ lldb/trunk/source/Commands/CommandCompletions.cpp Mon Jan 31 23:15:22 2011 @@ -19,13 +19,13 @@ // C++ Includes // Other libraries and framework includes // Project includes +#include "lldb/Core/FileSpec.h" +#include "lldb/Core/FileSpecList.h" #include "lldb/Interpreter/Args.h" +#include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Interpreter/CommandInterpreter.h" -#include "lldb/Core/FileSpecList.h" #include "lldb/Target/Target.h" -#include "lldb/Interpreter/CommandCompletions.h" -#include "lldb/Core/FileSpec.h" - +#include "lldb/Utility/CleanUp.h" using namespace lldb_private; @@ -246,18 +246,16 @@ } // Okay, containing_part is now the directory we want to open and look for files: - - DIR *dir_stream; - - dir_stream = opendir(containing_part); - if (dir_stream == NULL) + + lldb_utility::CleanUp dir_stream (opendir(containing_part), NULL, closedir); + if (!dir_stream.is_valid()) return matches.GetSize(); - + struct dirent *dirent_buf; size_t baselen = end_ptr - partial_name_copy; - while ((dirent_buf = readdir(dir_stream)) != NULL) + while ((dirent_buf = readdir(dir_stream.get())) != NULL) { char *name = dirent_buf->d_name; From gclayton at apple.com Tue Feb 1 03:20:26 2011 From: gclayton at apple.com (Greg Clayton) Date: Tue, 01 Feb 2011 09:20:26 -0000 Subject: [Lldb-commits] [lldb] r124658 - /lldb/trunk/source/Plugins/Process/Linux/RegisterContextLinux_x86_64.cpp Message-ID: <20110201092026.4F17F2A6C12D@llvm.org> Author: gclayton Date: Tue Feb 1 03:20:26 2011 New Revision: 124658 URL: http://llvm.org/viewvc/llvm-project?rev=124658&view=rev Log: A missed endian fix for the linux register context for x86_64. Modified: lldb/trunk/source/Plugins/Process/Linux/RegisterContextLinux_x86_64.cpp Modified: lldb/trunk/source/Plugins/Process/Linux/RegisterContextLinux_x86_64.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/RegisterContextLinux_x86_64.cpp?rev=124658&r1=124657&r2=124658&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/Linux/RegisterContextLinux_x86_64.cpp (original) +++ lldb/trunk/source/Plugins/Process/Linux/RegisterContextLinux_x86_64.cpp Tue Feb 1 03:20:26 2011 @@ -500,7 +500,7 @@ } if (status) - data.SetData(buf + GetRegOffset(reg), GetRegSize(reg), eByteOrderHost); + data.SetData(buf + GetRegOffset(reg), GetRegSize(reg), endian::InlHostByteOrder()); return status; } From johnny.chen at apple.com Tue Feb 1 12:35:28 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 01 Feb 2011 18:35:28 -0000 Subject: [Lldb-commits] [lldb] r124670 - in /lldb/trunk/source/Plugins/Instruction/ARM: EmulateInstructionARM.cpp EmulateInstructionARM.h Message-ID: <20110201183528.BC3892A6C12C@llvm.org> Author: johnny Date: Tue Feb 1 12:35:28 2011 New Revision: 124670 URL: http://llvm.org/viewvc/llvm-project?rev=124670&view=rev Log: Add EmulateVPOP() to the g_arm_opcodes and g_thumb_opcodes tables, which represents an operation to load multiple extension registers from the stack. Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp?rev=124670&r1=124669&r2=124670&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Tue Feb 1 12:35:28 2011 @@ -931,14 +931,14 @@ if (!success) return false; bool single_regs; - uint32_t d; // UInt(Vd:D) starting register + uint32_t d; // UInt(D:Vd) or UInt(Vd:D) starting register uint32_t imm32; // stack offset uint32_t regs; // number of registers switch (encoding) { case eEncodingT1: case eEncodingA1: single_regs = false; - d = Bits32(opcode, 15, 12) << 1 | Bits32(opcode, 22, 22); + d = Bits32(opcode, 22, 22) << 4 | Bits32(opcode, 15, 12); imm32 = Bits32(opcode, 7, 0) * addr_byte_size; // If UInt(imm8) is odd, see "FSTMX". regs = Bits32(opcode, 7, 0) / 2; @@ -990,6 +990,100 @@ return true; } +// Vector Pop loads multiple extension registers from the stack. +// It also updates SP to point just above the loaded data. +bool +EmulateInstructionARM::EmulateVPOP (ARMEncoding encoding) +{ +#if 0 + // ARM pseudo code... + if (ConditionPassed()) + { + EncodingSpecificOperations(); CheckVFPEnabled(TRUE); NullCheckIfThumbEE(13); + address = SP; + SP = SP + imm32; + if single_regs then + for r = 0 to regs-1 + S[d+r] = MemA[address,4]; address = address+4; + else + for r = 0 to regs-1 + word1 = MemA[address,4]; word2 = MemA[address+4,4]; address = address+8; + // Combine the word-aligned words in the correct order for current endianness. + D[d+r] = if BigEndian() then word1:word2 else word2:word1; + } +#endif + + bool success = false; + const uint32_t opcode = OpcodeAsUnsigned (&success); + if (!success) + return false; + + if (ConditionPassed()) + { + const uint32_t addr_byte_size = GetAddressByteSize(); + const addr_t sp = ReadRegisterUnsigned (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, 0, &success); + if (!success) + return false; + bool single_regs; + uint32_t d; // UInt(D:Vd) or UInt(Vd:D) starting register + uint32_t imm32; // stack offset + uint32_t regs; // number of registers + switch (encoding) { + case eEncodingT1: + case eEncodingA1: + single_regs = false; + d = Bits32(opcode, 22, 22) << 4 | Bits32(opcode, 15, 12); + imm32 = Bits32(opcode, 7, 0) * addr_byte_size; + // If UInt(imm8) is odd, see "FLDMX". + regs = Bits32(opcode, 7, 0) / 2; + // if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; + if (regs == 0 || regs > 16 || (d + regs) > 32) + return false; + break; + case eEncodingT2: + case eEncodingA2: + single_regs = true; + d = Bits32(opcode, 15, 12) << 1 | Bits32(opcode, 22, 22); + imm32 = Bits32(opcode, 7, 0) * addr_byte_size; + regs = Bits32(opcode, 7, 0); + // if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; + if (regs == 0 || regs > 16 || (d + regs) > 32) + return false; + break; + default: + return false; + } + uint32_t start_reg = single_regs ? dwarf_s0 : dwarf_d0; + uint32_t reg_byte_size = single_regs ? addr_byte_size : addr_byte_size * 2; + addr_t sp_offset = imm32; + addr_t addr = sp; + uint32_t i; + uint64_t data; // uint64_t to accomodate 64-bit registers. + + EmulateInstruction::Context context = { EmulateInstruction::eContextPopRegisterOffStack, eRegisterKindDWARF, 0, 0 }; + for (i=d; i"}, //---------------------------------------------------------------------- - // Epilogue instructions // + // Epilogue instructions //---------------------------------------------------------------------- { 0x0fff0000, 0x08bd0000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, - { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "} + { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, + { 0x0fbf0f00, 0x0cbd0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.64 "}, + { 0x0fbf0f00, 0x0cbd0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.32 "} }; static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); @@ -1083,7 +1179,9 @@ { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, &lldb_private::EmulateInstructionARM::EmulateAddSPImmediate, "add sp, #imm"}, { 0xfffffe00, 0x0000bc00, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, { 0xffff0000, 0xe8bd0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop.w " }, - { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop.w " } + { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop.w " }, + { 0xffbf0f00, 0xecbd0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.64 "}, + { 0xffbf0f00, 0xecbd0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.32 "} }; const size_t k_num_thumb_opcodes = sizeof(g_thumb_opcodes)/sizeof(ARMOpcode); Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h?rev=124670&r1=124669&r2=124670&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h (original) +++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.h Tue Feb 1 12:35:28 2011 @@ -184,6 +184,9 @@ bool EmulateVPUSH (ARMEncoding encoding); + bool + EmulateVPOP (ARMEncoding encoding); + uint32_t m_arm_isa; Mode m_inst_mode; uint32_t m_inst_cpsr; From johnny.chen at apple.com Tue Feb 1 12:51:48 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Tue, 01 Feb 2011 18:51:48 -0000 Subject: [Lldb-commits] [lldb] r124671 - /lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Message-ID: <20110201185148.30CA22A6C12C@llvm.org> Author: johnny Date: Tue Feb 1 12:51:48 2011 New Revision: 124671 URL: http://llvm.org/viewvc/llvm-project?rev=124671&view=rev Log: Remove the 'lldb_private::' namespace resolution operator. Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp?rev=124671&r1=124670&r2=124671&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp (original) +++ lldb/trunk/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp Tue Feb 1 12:51:48 2011 @@ -1095,36 +1095,36 @@ //---------------------------------------------------------------------- // push register(s) - { 0x0fff0000, 0x092d0000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push " }, - { 0x0fff0fff, 0x052d0004, ARMvAll, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push " }, + { 0x0fff0000, 0x092d0000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulatePush, "push " }, + { 0x0fff0fff, 0x052d0004, ARMvAll, eEncodingA2, eSize32, &EmulateInstructionARM::EmulatePush, "push " }, // set r7 to point to a stack offset - { 0x0ffff000, 0x028d7000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateAddRdSPImmediate, "add r7, sp, #" }, - { 0x0ffff000, 0x024c7000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubR7IPImmediate, "sub r7, ip, #"}, + { 0x0ffff000, 0x028d7000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateAddRdSPImmediate, "add r7, sp, #" }, + { 0x0ffff000, 0x024c7000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateSubR7IPImmediate, "sub r7, ip, #"}, // set ip to point to a stack offset - { 0x0fffffff, 0x01a0c00d, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateMovRdSP, "mov ip, sp" }, - { 0x0ffff000, 0x028dc000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateAddRdSPImmediate, "add ip, sp, #" }, - { 0x0ffff000, 0x024dc000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubIPSPImmediate, "sub ip, sp, #"}, + { 0x0fffffff, 0x01a0c00d, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateMovRdSP, "mov ip, sp" }, + { 0x0ffff000, 0x028dc000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateAddRdSPImmediate, "add ip, sp, #" }, + { 0x0ffff000, 0x024dc000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateSubIPSPImmediate, "sub ip, sp, #"}, // adjust the stack pointer - { 0x0ffff000, 0x024dd000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "sub sp, sp, #"}, + { 0x0ffff000, 0x024dd000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateSubSPImmdiate, "sub sp, sp, #"}, // push one register // if Rn == '1101' && imm12 == '000000000100' then SEE PUSH; - { 0x0fff0000, 0x052d0000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateSTRRtSP, "str Rt, [sp, #-imm12]!" }, + { 0x0fff0000, 0x052d0000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateSTRRtSP, "str Rt, [sp, #-imm12]!" }, // vector push consecutive extension register(s) - { 0x0fbf0f00, 0x0d2d0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.64 "}, - { 0x0fbf0f00, 0x0d2d0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.32 "}, + { 0x0fbf0f00, 0x0d2d0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateVPUSH, "vpush.64 "}, + { 0x0fbf0f00, 0x0d2d0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, &EmulateInstructionARM::EmulateVPUSH, "vpush.32 "}, //---------------------------------------------------------------------- // Epilogue instructions //---------------------------------------------------------------------- - { 0x0fff0000, 0x08bd0000, ARMvAll, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, - { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, - { 0x0fbf0f00, 0x0cbd0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.64 "}, - { 0x0fbf0f00, 0x0cbd0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.32 "} + { 0x0fff0000, 0x08bd0000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulatePop, "pop "}, + { 0x0fff0fff, 0x049d0004, ARMvAll, eEncodingA2, eSize32, &EmulateInstructionARM::EmulatePop, "pop "}, + { 0x0fbf0f00, 0x0cbd0b00, ARMv6T2|ARMv7, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateVPOP, "vpop.64 "}, + { 0x0fbf0f00, 0x0cbd0a00, ARMv6T2|ARMv7, eEncodingA2, eSize32, &EmulateInstructionARM::EmulateVPOP, "vpop.32 "} }; static const size_t k_num_arm_opcodes = sizeof(g_arm_opcodes)/sizeof(ARMOpcode); @@ -1149,39 +1149,39 @@ //---------------------------------------------------------------------- // push register(s) - { 0xfffffe00, 0x0000b400, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulatePush, "push " }, - { 0xffff0000, 0xe92d0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push.w " }, - { 0xffff0fff, 0xf84d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulatePush, "push.w " }, + { 0xfffffe00, 0x0000b400, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulatePush, "push " }, + { 0xffff0000, 0xe92d0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, &EmulateInstructionARM::EmulatePush, "push.w " }, + { 0xffff0fff, 0xf84d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &EmulateInstructionARM::EmulatePush, "push.w " }, // move from high register to low register - { 0xffffffc0, 0x00004640, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateMovLowHigh, "mov r0-r7, r8-r15" }, + { 0xffffffc0, 0x00004640, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulateMovLowHigh, "mov r0-r7, r8-r15" }, // set r7 to point to a stack offset - { 0xffffff00, 0x0000af00, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateAddRdSPImmediate, "add r7, sp, #imm" }, - { 0xffffffff, 0x0000466f, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateMovRdSP, "mov r7, sp" }, + { 0xffffff00, 0x0000af00, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulateAddRdSPImmediate, "add r7, sp, #imm" }, + { 0xffffffff, 0x0000466f, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulateMovRdSP, "mov r7, sp" }, // PC relative load into register (see also EmulateAddSPRm) - { 0xfffff800, 0x00004800, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateLDRRdPCRelative, "ldr , [PC, #imm]"}, + { 0xfffff800, 0x00004800, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulateLDRRdPCRelative, "ldr , [PC, #imm]"}, // adjust the stack pointer - { 0xffffff87, 0x00004485, ARMvAll, eEncodingT2, eSize16, &lldb_private::EmulateInstructionARM::EmulateAddSPRm, "add sp, "}, - { 0xffffff80, 0x0000b080, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "add sp, sp, #imm"}, - { 0xfbef8f00, 0xf1ad0d00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "sub.w sp, sp, #"}, - { 0xfbff8f00, 0xf2ad0d00, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulateSubSPImmdiate, "subw sp, sp, #imm12"}, + { 0xffffff87, 0x00004485, ARMvAll, eEncodingT2, eSize16, &EmulateInstructionARM::EmulateAddSPRm, "add sp, "}, + { 0xffffff80, 0x0000b080, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulateSubSPImmdiate, "add sp, sp, #imm"}, + { 0xfbef8f00, 0xf1ad0d00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &EmulateInstructionARM::EmulateSubSPImmdiate, "sub.w sp, sp, #"}, + { 0xfbff8f00, 0xf2ad0d00, ARMv6T2|ARMv7, eEncodingT3, eSize32, &EmulateInstructionARM::EmulateSubSPImmdiate, "subw sp, sp, #imm12"}, // vector push consecutive extension register(s) - { 0xffbf0f00, 0xed2d0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.64 "}, - { 0xffbf0f00, 0xed2d0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPUSH, "vpush.32 "}, + { 0xffbf0f00, 0xed2d0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, &EmulateInstructionARM::EmulateVPUSH, "vpush.64 "}, + { 0xffbf0f00, 0xed2d0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &EmulateInstructionARM::EmulateVPUSH, "vpush.32 "}, //---------------------------------------------------------------------- // Epilogue instructions //---------------------------------------------------------------------- - { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, &lldb_private::EmulateInstructionARM::EmulateAddSPImmediate, "add sp, #imm"}, - { 0xfffffe00, 0x0000bc00, ARMvAll, eEncodingT1, eSize16, &lldb_private::EmulateInstructionARM::EmulatePop, "pop "}, - { 0xffff0000, 0xe8bd0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop.w " }, - { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &lldb_private::EmulateInstructionARM::EmulatePop, "pop.w " }, - { 0xffbf0f00, 0xecbd0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.64 "}, - { 0xffbf0f00, 0xecbd0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &lldb_private::EmulateInstructionARM::EmulateVPOP, "vpop.32 "} + { 0xffffff80, 0x0000b000, ARMvAll, eEncodingT2, eSize16, &EmulateInstructionARM::EmulateAddSPImmediate, "add sp, #imm"}, + { 0xfffffe00, 0x0000bc00, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulatePop, "pop "}, + { 0xffff0000, 0xe8bd0000, ARMv6T2|ARMv7, eEncodingT2, eSize32, &EmulateInstructionARM::EmulatePop, "pop.w " }, + { 0xffff0fff, 0xf85d0d04, ARMv6T2|ARMv7, eEncodingT3, eSize32, &EmulateInstructionARM::EmulatePop, "pop.w " }, + { 0xffbf0f00, 0xecbd0b00, ARMv6T2|ARMv7, eEncodingT1, eSize32, &EmulateInstructionARM::EmulateVPOP, "vpop.64 "}, + { 0xffbf0f00, 0xecbd0a00, ARMv6T2|ARMv7, eEncodingT2, eSize32, &EmulateInstructionARM::EmulateVPOP, "vpop.32 "} }; const size_t k_num_thumb_opcodes = sizeof(g_thumb_opcodes)/sizeof(ARMOpcode); From scallanan at apple.com Tue Feb 1 17:43:26 2011 From: scallanan at apple.com (Sean Callanan) Date: Tue, 01 Feb 2011 23:43:26 -0000 Subject: [Lldb-commits] [lldb] r124703 - in /lldb/trunk: include/lldb/Expression/ASTDumper.h lldb.xcodeproj/project.pbxproj source/Expression/ASTDumper.cpp source/Expression/ClangExpressionDeclMap.cpp Message-ID: <20110201234326.70E1E2A6C12C@llvm.org> Author: spyffe Date: Tue Feb 1 17:43:26 2011 New Revision: 124703 URL: http://llvm.org/viewvc/llvm-project?rev=124703&view=rev Log: Added a new class, ASTDumper, that provides verbose diagnostics of Clang AST classes for the purpose of debugging the types LLDB produces for DWARF objects. The ASTDumper is currently only used in log output if you enable verbose mode in the expression log: log enable -v lldb expr Its output then appears in the log for external variables used by the expr command. Added: lldb/trunk/include/lldb/Expression/ASTDumper.h lldb/trunk/source/Expression/ASTDumper.cpp Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Added: lldb/trunk/include/lldb/Expression/ASTDumper.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/ASTDumper.h?rev=124703&view=auto ============================================================================== --- lldb/trunk/include/lldb/Expression/ASTDumper.h (added) +++ lldb/trunk/include/lldb/Expression/ASTDumper.h Tue Feb 1 17:43:26 2011 @@ -0,0 +1,171 @@ +//===-- ASTDumper.h ---------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "clang/AST/DeclVisitor.h" +#include "clang/AST/StmtVisitor.h" +#include "clang/AST/TypeVisitor.h" + +#include "lldb/Core/Stream.h" +#include "llvm/ADT/DenseSet.h" + +namespace lldb_private +{ + +//---------------------------------------------------------------------- +/// @class ASTDumper ASTDumper.h "lldb/Expression/ASTDumper.h" +/// @brief Encapsulates a recursive dumper for Clang AST nodes. +/// +/// ASTDumper contains a variety of methods for printing fields of Clang +/// AST structures, for debugging purposes. It prints the AST objects +/// hierarchically: +/// +/// --- +/// class : InheritedClass +/// someAccessor() : result +/// accessorReturningObject() : +/// class : ChildClass [object returned by accessorReturningObject] +/// ... +/// class : BaseClass [same object as InheritedClass] +/// baseAccessor() : result +/// +/// The output format is YAML. +//---------------------------------------------------------------------- +class ASTDumper : + public clang::DeclVisitor , + public clang::StmtVisitor , + public clang::TypeVisitor +{ +private: + ASTDumper (Stream &stream) : + m_stream(stream), + m_base_indentation(stream.GetIndentLevel()), + m_max_indentation(10) + { + } + + // MARK: Utility functions + + bool KeepDumping () + { + return (m_stream.GetIndentLevel() - m_base_indentation <= m_max_indentation); + } + + void PushIndent() + { + m_stream.IndentMore(1); + } + + void PopIndent() + { + m_stream.IndentLess(1); + } + + bool Visiting (const void *entity) + { + return m_visited_entities.count(entity); + } + + void WillVisit (const void *entity) + { + m_visited_entities.insert(entity); + } + + void DidVisit (const void *entity) + { + m_visited_entities.erase(entity); + } + +public: + // MARK: DeclVisitor + + void VisitDecl (clang::Decl *decl); + void VisitTranslationUnitDecl (clang::TranslationUnitDecl *translation_unit_decl); + void VisitNamedDecl (clang::NamedDecl *named_decl); + void VisitNamespaceDecl (clang::NamespaceDecl *namespace_decl); + void VisitValueDecl (clang::ValueDecl *value_decl); + void VisitDeclaratorDecl (clang::DeclaratorDecl *declarator_decl); + void VisitVarDecl (clang::VarDecl *var_decl); + void VisitTypeDecl (clang::TypeDecl *type_decl); + void VisitTagDecl (clang::TagDecl *tag_decl); + void VisitRecordDecl (clang::RecordDecl *record_decl); + void VisitCXXRecordDecl (clang::CXXRecordDecl *cxx_record_decl); + + // MARK: StmtVisitor + + // MARK: TypeVisitor + + void VisitType (const clang::Type *type); + void VisitReferenceType (const clang::ReferenceType *reference_type); + void VisitLValueReferenceType (const clang::LValueReferenceType *lvalue_reference_type); + void VisitPointerType (const clang::PointerType *pointer_type); + void VisitTagType (const clang::TagType *tag_type); + void VisitRecordType (const clang::RecordType *record_type); + +private: + llvm::DenseSet m_visited_entities; ///< A set of all entities that have already been printed, to prevent loops + Stream &m_stream; ///< A stream to print output to + unsigned m_base_indentation; ///< The indentation of m_stream when the ASTDumper was entered + unsigned m_max_indentation; ///< The maximum depth of indentation (added to m_base_indentation) +public: + //------------------------------------------------------------------ + /// DumpDecl - Create an ASTDumper and use it to dump a Decl. + /// + /// @param[in] stream + /// The stream to use when printing output. + /// + /// @param[in] decl + /// The AST Decl to print. + //------------------------------------------------------------------ + static void DumpDecl (Stream &stream, clang::Decl *decl) + { + ASTDumper dumper(stream); + + stream.Printf("---\n"); + + dumper.::clang::DeclVisitor::Visit(decl); + } + + //------------------------------------------------------------------ + /// DumpDecl - Create an ASTDumper and use it to dump a Stmt. + /// + /// @param[in] stream + /// The stream to use when printing output. + /// + /// @param[in] stmt + /// The AST Stmt to print. + //------------------------------------------------------------------ + static void DumpStmt (Stream &stream, clang::Stmt *stmt) + { + ASTDumper dumper(stream); + + stream.Printf("---\n"); + + dumper.::clang::StmtVisitor::Visit(stmt); + } + + //------------------------------------------------------------------ + /// DumpDecl - Create an ASTDumper and use it to dump a Type. + /// + /// @param[in] stream + /// The stream to use when printing output. + /// + /// @param[in] type + /// The AST Type to print. + //------------------------------------------------------------------ + static void DumpType (Stream &stream, clang::Type *type) + { + ASTDumper dumper(stream); + + stream.Printf("---\n"); + + dumper.::clang::TypeVisitor::Visit(type); + } +}; + +} // namespace lldb_private Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=124703&r1=124702&r2=124703&view=diff ============================================================================== --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original) +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Tue Feb 1 17:43:26 2011 @@ -318,6 +318,7 @@ 26F5C32D10F3DFDD009D5894 /* libtermcap.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 26F5C32B10F3DFDD009D5894 /* libtermcap.dylib */; }; 26F5C37510F3F61B009D5894 /* libobjc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 26F5C37410F3F61B009D5894 /* libobjc.dylib */; }; 26F5C39110F3FA26009D5894 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26F5C39010F3FA26009D5894 /* CoreFoundation.framework */; }; + 4906FD4212F2255300A2A77C /* ASTDumper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4906FD4012F2255300A2A77C /* ASTDumper.cpp */; }; 491193521226386000578B7F /* ASTStructExtractor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491193501226386000578B7F /* ASTStructExtractor.cpp */; }; 49307AAE11DEA4D90081F992 /* IRForTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49307AAD11DEA4D90081F992 /* IRForTarget.cpp */; }; 49445C2612245E3600C11A81 /* ClangExpressionParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49445C2512245E3600C11A81 /* ClangExpressionParser.cpp */; }; @@ -925,6 +926,8 @@ 26F996A8119B79C300412154 /* ARM_GCC_Registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ARM_GCC_Registers.h; path = source/Utility/ARM_GCC_Registers.h; sourceTree = ""; }; 26FE25221146CADE00F4085A /* GDBRemoteCommunication.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GDBRemoteCommunication.cpp; path = "source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp"; sourceTree = ""; }; 26FE25231146CADE00F4085A /* GDBRemoteCommunication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GDBRemoteCommunication.h; path = "source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h"; sourceTree = ""; }; + 4906FD4012F2255300A2A77C /* ASTDumper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ASTDumper.cpp; path = source/Expression/ASTDumper.cpp; sourceTree = ""; }; + 4906FD4412F2257600A2A77C /* ASTDumper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASTDumper.h; path = include/lldb/Expression/ASTDumper.h; sourceTree = ""; }; 4911934B1226383D00578B7F /* ASTStructExtractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASTStructExtractor.h; path = include/lldb/Expression/ASTStructExtractor.h; sourceTree = ""; }; 491193501226386000578B7F /* ASTStructExtractor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ASTStructExtractor.cpp; path = source/Expression/ASTStructExtractor.cpp; sourceTree = ""; }; 49307AAD11DEA4D90081F992 /* IRForTarget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = IRForTarget.cpp; path = source/Expression/IRForTarget.cpp; sourceTree = ""; }; @@ -1939,6 +1942,8 @@ 497C86BD122823D800B54702 /* ClangUtilityFunction.cpp */, 26BC7DC310F1B79500F91463 /* DWARFExpression.h */, 26BC7ED810F1B86700F91463 /* DWARFExpression.cpp */, + 4906FD4412F2257600A2A77C /* ASTDumper.h */, + 4906FD4012F2255300A2A77C /* ASTDumper.cpp */, 49A8A3A311D568BF00AD3B68 /* ASTResultSynthesizer.h */, 49A8A39F11D568A300AD3B68 /* ASTResultSynthesizer.cpp */, 4911934B1226383D00578B7F /* ASTStructExtractor.h */, @@ -2834,6 +2839,7 @@ B296983712C2FB98002D92C3 /* CommandObjectVersion.cpp in Sources */, 26D9FDC912F784FD0003F2EE /* EmulateInstruction.cpp in Sources */, 26D9FDCE12F7853F0003F2EE /* EmulateInstructionARM.cpp in Sources */, + 4906FD4212F2255300A2A77C /* ASTDumper.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; Added: lldb/trunk/source/Expression/ASTDumper.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ASTDumper.cpp?rev=124703&view=auto ============================================================================== --- lldb/trunk/source/Expression/ASTDumper.cpp (added) +++ lldb/trunk/source/Expression/ASTDumper.cpp Tue Feb 1 17:43:26 2011 @@ -0,0 +1,545 @@ +//===-- ASTDumper.cpp -------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Expression/ASTDumper.h" + +using namespace lldb_private; +using namespace clang; + +// MARK: Utility functions + +static const char* SfB (bool b) +{ + return b ? "True" : "False"; +} + +// MARK: DeclVisitor + +void ASTDumper::VisitDecl (clang::Decl *decl) +{ + m_stream.Indent(); m_stream.Printf("class : Decl\n"); + m_stream.Indent(); m_stream.Printf("getDeclKindName() : %s\n", decl->getDeclKindName()); + m_stream.Indent(); m_stream.Printf("getTranslationUnitDecl() : "); + + TranslationUnitDecl *translation_unit_decl = decl->getTranslationUnitDecl(); + + if (translation_unit_decl) + { + if (KeepDumping() && !Visiting(translation_unit_decl)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(translation_unit_decl); + VisitTranslationUnitDecl(translation_unit_decl); + DidVisit(translation_unit_decl); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + + m_stream.Indent(); m_stream.Printf("getAccess() : "); + switch (decl->getAccess()) + { + default: m_stream.Printf("~\n"); + case AS_public: m_stream.Printf("AS_public\n"); + case AS_protected: m_stream.Printf("AS_protected\n"); + case AS_private: m_stream.Printf("AS_private\n"); + case AS_none: m_stream.Printf("AS_none\n"); + } + m_stream.Indent(); m_stream.Printf("getMaxAlignment() : %d\n", decl->getMaxAlignment()); + m_stream.Indent(); m_stream.Printf("isInvalidDecl() : %s\n", SfB(decl->isInvalidDecl())); + m_stream.Indent(); m_stream.Printf("isImplicit() : %s\n", SfB(decl->isImplicit())); + m_stream.Indent(); m_stream.Printf("isUsed() : %s\n", SfB(decl->isUsed())); + m_stream.Indent(); m_stream.Printf("isOutOfLine() : %s\n", SfB(decl->isOutOfLine())); + m_stream.Indent(); m_stream.Printf("isCanonicalDecl() : %s\n", SfB(decl->isCanonicalDecl())); + m_stream.Indent(); m_stream.Printf("hasBody() : %s\n", SfB(decl->hasBody())); + m_stream.Indent(); m_stream.Printf("isTemplateParameter() : %s\n", SfB(decl->isTemplateParameter())); + m_stream.Indent(); m_stream.Printf("isTemplateParameterPack() : %s\n", SfB(decl->isTemplateParameterPack())); + m_stream.Indent(); m_stream.Printf("isParameterPack() : %s\n", SfB(decl->isParameterPack())); + m_stream.Indent(); m_stream.Printf("isFunctionOrFunctionTemplate() : %s\n", SfB(decl->isFunctionOrFunctionTemplate())); + m_stream.Indent(); m_stream.Printf("getFriendObjectKind() : "); + switch (decl->getFriendObjectKind()) + { + default: m_stream.Printf("~\n"); break; + case Decl::FOK_None: m_stream.Printf("FOK_None\n"); break; + case Decl::FOK_Declared: m_stream.Printf("FOK_Declared\n"); break; + case Decl::FOK_Undeclared: m_stream.Printf("FOK_Undeclared\n"); break; + } +} + +void ASTDumper::VisitTranslationUnitDecl (clang::TranslationUnitDecl *translation_unit_decl) +{ + m_stream.Indent(); m_stream.Printf("class : TranslationUnitDecl\n"); + m_stream.Indent(); m_stream.Printf("getAnonymousNamespace() : "); + + NamespaceDecl *anonymous_namespace = translation_unit_decl->getAnonymousNamespace(); + + if (anonymous_namespace) + { + if (KeepDumping() && !Visiting(anonymous_namespace)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(anonymous_namespace); + VisitNamespaceDecl(anonymous_namespace); + DidVisit(anonymous_namespace); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + + VisitDecl (translation_unit_decl); +} + +void ASTDumper::VisitNamedDecl (clang::NamedDecl *named_decl) +{ + m_stream.Indent(); m_stream.Printf("class : NamedDecl\n"); + m_stream.Indent(); m_stream.Printf("getNameAsString() : %s\n", named_decl->getNameAsString().c_str()); + m_stream.Indent(); m_stream.Printf("hasLinkage() : %s\n", SfB(named_decl->hasLinkage())); + m_stream.Indent(); m_stream.Printf("isCXXClassMember() : %s\n", SfB(named_decl->isCXXClassMember())); + m_stream.Indent(); m_stream.Printf("isCXXInstanceMember() : %s\n", SfB(named_decl->isCXXClassMember())); + m_stream.Indent(); m_stream.Printf("getVisibility() : "); + switch (named_decl->getVisibility()) + { + default: m_stream.Printf("~\n"); break; + case HiddenVisibility: m_stream.Printf("HiddenVisibility\n"); break; + case ProtectedVisibility: m_stream.Printf("ProtectedVisibility\n"); break; + case DefaultVisibility: m_stream.Printf("DefaultVisibility\n"); break; + } + m_stream.Indent(); m_stream.Printf("getUnderlyingDecl() : "); + + NamedDecl *underlying_decl = named_decl->getUnderlyingDecl(); + + if (underlying_decl) + { + if (KeepDumping() && !Visiting(underlying_decl)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(underlying_decl); + ::clang::DeclVisitor::Visit(underlying_decl); + DidVisit(underlying_decl); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + + VisitDecl (named_decl); +} + +void ASTDumper::VisitNamespaceDecl (clang::NamespaceDecl *namespace_decl) +{ + m_stream.Indent(); m_stream.Printf("class : NamespaceDecl\n"); + m_stream.Indent(); m_stream.Printf("isAnonymousNamespace() : %s\n", SfB(namespace_decl->isAnonymousNamespace())); + m_stream.Indent(); m_stream.Printf("isInline() : %s\n", SfB(namespace_decl->isInline())); + m_stream.Indent(); m_stream.Printf("isOriginalNamespace() : %s\n", SfB(namespace_decl->isOriginalNamespace())); + + VisitNamedDecl (namespace_decl); +} + +void ASTDumper::VisitValueDecl (clang::ValueDecl *value_decl) +{ + m_stream.Indent(); m_stream.Printf("class : ValueDecl\n"); + m_stream.Indent(); m_stream.Printf("getType() : "); + if (value_decl->getType().getTypePtrOrNull()) + { + const clang::Type *type_ptr = value_decl->getType().getTypePtr(); + + if (KeepDumping() && !Visiting(type_ptr)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(type_ptr); + ::clang::TypeVisitor::Visit(type_ptr); + DidVisit(type_ptr); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + + VisitNamedDecl (value_decl); +} + +void ASTDumper::VisitDeclaratorDecl (clang::DeclaratorDecl *declarator_decl) +{ + m_stream.Indent(); m_stream.Printf("class : DeclaratorDecl\n"); + VisitValueDecl (declarator_decl); +} + +void ASTDumper::VisitVarDecl (clang::VarDecl *var_decl) +{ + m_stream.Indent(); m_stream.Printf("class : VarDecl\n"); + VisitDeclaratorDecl (var_decl); +} + +void ASTDumper::VisitTypeDecl (clang::TypeDecl *type_decl) +{ + m_stream.Indent(); m_stream.Printf("class : TypeDecl\n"); + m_stream.Indent(); m_stream.Printf("getTypeForDecl() : "); + + const clang::Type *type_for_decl = type_decl->getTypeForDecl(); + + if (type_for_decl) + { + if (KeepDumping() && !Visiting(type_for_decl)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(type_for_decl); + ::clang::TypeVisitor::Visit(type_for_decl); + DidVisit(type_for_decl); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + + VisitNamedDecl (type_decl); +} + +void ASTDumper::VisitTagDecl (clang::TagDecl *tag_decl) +{ + m_stream.Indent(); m_stream.Printf("class : TagDecl\n"); + m_stream.Indent(); m_stream.Printf("isDefinition() : %s\n", SfB(tag_decl->isDefinition())); + m_stream.Indent(); m_stream.Printf("isBeingDefined() : %s\n", SfB(tag_decl->isBeingDefined())); + m_stream.Indent(); m_stream.Printf("isEmbeddedInDeclarator() : %s\n", SfB(tag_decl->isEmbeddedInDeclarator())); + m_stream.Indent(); m_stream.Printf("isDependentType() : %s\n", SfB(tag_decl->isDependentType())); + m_stream.Indent(); m_stream.Printf("getDefinition() : "); + + TagDecl *definition = tag_decl->getDefinition(); + + if (definition) + { + if (KeepDumping() && !Visiting(definition)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(definition); + ::clang::DeclVisitor::Visit(tag_decl->getDefinition()); + DidVisit(definition); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + m_stream.Indent(); m_stream.Printf("getKindName() : %s\n", tag_decl->getKindName()); + + VisitTypeDecl(tag_decl); +} + +void ASTDumper::VisitRecordDecl (clang::RecordDecl *record_decl) +{ + m_stream.Indent(); m_stream.Printf("class : RecordDecl\n"); + m_stream.Indent(); m_stream.Printf("hasFlexibleArrayMember() : %s\n", SfB(record_decl->hasFlexibleArrayMember())); + m_stream.Indent(); m_stream.Printf("isAnonymousStructOrUnion() : %s\n", SfB(record_decl->isAnonymousStructOrUnion())); + m_stream.Indent(); m_stream.Printf("hasObjectMember() : %s\n", SfB(record_decl->hasObjectMember())); + m_stream.Indent(); m_stream.Printf("isInjectedClassName() : %s\n", SfB(record_decl->isInjectedClassName())); + m_stream.Indent(); m_stream.Printf("field_begin() ... field_end() : "); + if (KeepDumping()) + { + if (record_decl->field_empty()) + { + m_stream.Printf("~\n"); + } + else + { + m_stream.Printf("\n"); + PushIndent(); + for (RecordDecl::field_iterator iter = record_decl->field_begin(), end_iter = record_decl->field_end(); + iter != end_iter; + ++iter) + { + m_stream.Indent(); m_stream.Printf("- field:\n"); + PushIndent(); + if (Visiting (*iter)) + { + m_stream.Indent(); m_stream.Printf("capped\n"); + } + else + { + WillVisit(*iter); + ::clang::DeclVisitor::Visit(*iter); + DidVisit(*iter); + } + PopIndent(); + } + PopIndent(); + } + } + else + { + m_stream.Printf("capped\n"); + } + + VisitTagDecl (record_decl); +} + +void ASTDumper::VisitCXXRecordDecl (clang::CXXRecordDecl *cxx_record_decl) +{ + m_stream.Indent(); m_stream.Printf("class : CXXRecordDecl\n"); + m_stream.Indent(); m_stream.Printf("isDynamicClass() : %s\n", SfB(cxx_record_decl->isDynamicClass())); + m_stream.Indent(); m_stream.Printf("bases_begin() ... bases_end() : "); + if (KeepDumping()) + { + if (cxx_record_decl->bases_begin() == cxx_record_decl->bases_end()) + { + m_stream.Printf("~\n"); + } + else + { + m_stream.Printf("\n"); + PushIndent(); + for (CXXRecordDecl::base_class_iterator iter = cxx_record_decl->bases_begin(), end_iter = cxx_record_decl->bases_end(); + iter != end_iter; + ++iter) + { + m_stream.Indent(); m_stream.Printf("- CXXBaseSpecifier:\n"); + PushIndent(); + m_stream.Indent(); m_stream.Printf("isVirtual() : %s\n", SfB(iter->isVirtual())); + m_stream.Indent(); m_stream.Printf("isBaseOfClass() : %s\n", SfB(iter->isBaseOfClass())); + m_stream.Indent(); m_stream.Printf("isPackExpansion() : %s\n", SfB(iter->isPackExpansion())); + m_stream.Indent(); m_stream.Printf("getAccessSpecifier() : "); + switch (iter->getAccessSpecifier()) + { + default: m_stream.Printf("~\n"); break; + case clang::AS_none: m_stream.Printf("AS_none\n"); break; + case clang::AS_private: m_stream.Printf("AS_private\n"); break; + case clang::AS_protected: m_stream.Printf("AS_protected\n"); break; + case clang::AS_public: m_stream.Printf("AS_public\n"); break; + } + m_stream.Indent(); m_stream.Printf("getType() : "); + const clang::Type *base_type = iter->getType().getTypePtr(); + + if (Visiting(base_type)) + { + m_stream.Printf("capped\n"); + } + else + { + m_stream.Printf("\n"); + PushIndent(); + WillVisit(base_type); + ::clang::TypeVisitor::Visit(base_type); + DidVisit(base_type); + PopIndent(); + } + PopIndent(); + } + PopIndent(); + } + } + else + { + m_stream.Printf("capped\n"); + } + + VisitRecordDecl(cxx_record_decl); +} + +// MARK: TypeVisitor + +void ASTDumper::VisitType (const clang::Type *type) +{ + m_stream.Indent(); m_stream.Printf("class : Type\n"); + m_stream.Indent(); m_stream.Printf("getTypeClass() : "); + switch (type->getTypeClass()) + { + default: m_stream.Printf("~\n"); break; +#define TYPE(Class, Base) case clang::Type::Class: m_stream.Printf("%s\n", #Class); break; +#define ABSTRACT_TYPE(Class, Base) +#include "clang/AST/TypeNodes.def" + } + m_stream.Indent(); m_stream.Printf("isFromAST() : %s\n", SfB(type->isFromAST())); + m_stream.Indent(); m_stream.Printf("containsUnexpandedParameterPack() : %s\n", SfB(type->containsUnexpandedParameterPack())); + m_stream.Indent(); m_stream.Printf("isCanonicalUnqualified() : %s\n", SfB(type->isCanonicalUnqualified())); + m_stream.Indent(); m_stream.Printf("isIncompleteType() : %s\n", SfB(type->isIncompleteType())); + m_stream.Indent(); m_stream.Printf("isObjectType() : %s\n", SfB(type->isObjectType())); + m_stream.Indent(); m_stream.Printf("isPODType() : %s\n", SfB(type->isPODType())); + m_stream.Indent(); m_stream.Printf("isLiteralType() : %s\n", SfB(type->isLiteralType())); + m_stream.Indent(); m_stream.Printf("isBuiltinType() : %s\n", SfB(type->isBuiltinType())); + m_stream.Indent(); m_stream.Printf("isPlaceholderType() : %s\n", SfB(type->isPlaceholderType())); + m_stream.Indent(); m_stream.Printf("isScalarType() : %s\n", SfB(type->isScalarType())); + m_stream.Indent(); m_stream.Printf("getScalarTypeKind() : "); + if (type->isScalarType()) + { + switch (type->getScalarTypeKind()) + { + default: m_stream.Printf("~\n"); break; + case clang::Type::STK_Pointer: m_stream.Printf("STK_Pointer\n"); break; + case clang::Type::STK_MemberPointer: m_stream.Printf("STK_MemberPointer\n"); break; + case clang::Type::STK_Bool: m_stream.Printf("STK_Bool\n"); break; + case clang::Type::STK_Integral: m_stream.Printf("STK_Integral\n"); break; + case clang::Type::STK_Floating: m_stream.Printf("STK_Floating\n"); break; + case clang::Type::STK_IntegralComplex: m_stream.Printf("STK_IntegralComplex\n"); break; + case clang::Type::STK_FloatingComplex: m_stream.Printf("STK_FloatingComplex\n"); break; + } + } + else + { + m_stream.Printf("~\n"); + } + // ... +} + +void ASTDumper::VisitReferenceType(const clang::ReferenceType *reference_type) +{ + m_stream.Indent(); m_stream.Printf("class : ReferenceType\n"); + m_stream.Indent(); m_stream.Printf("isSpelledAsLValue() : %s\n", SfB(reference_type->isSpelledAsLValue())); + m_stream.Indent(); m_stream.Printf("isInnerRef() : %s\n", SfB(reference_type->isInnerRef())); + m_stream.Indent(); m_stream.Printf("getPointeeType() : "); + + const clang::Type *pointee_type = reference_type->getPointeeType().getTypePtrOrNull(); + + if (pointee_type) + { + if (KeepDumping() && !Visiting(pointee_type)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(pointee_type); + ::clang::TypeVisitor::Visit(pointee_type); + DidVisit(pointee_type); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + VisitType(reference_type); +} + +void ASTDumper::VisitLValueReferenceType(const clang::LValueReferenceType *lvalue_reference_type) +{ + m_stream.Indent(); m_stream.Printf("class : LValueReferenceType\n"); + m_stream.Indent(); m_stream.Printf("isSugared() : %s\n", SfB(lvalue_reference_type->isSugared())); + VisitReferenceType(lvalue_reference_type); +} + +void ASTDumper::VisitPointerType(const clang::PointerType *pointer_type) +{ + m_stream.Indent(); m_stream.Printf("class : PointerType\n"); + m_stream.Indent(); m_stream.Printf("getPointeeType() : "); + + const clang::Type *pointee_type = pointer_type->getPointeeType().getTypePtrOrNull(); + + if (pointee_type) + { + if (KeepDumping() && !Visiting(pointee_type)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(pointee_type); + ::clang::TypeVisitor::Visit(pointee_type); + DidVisit(pointee_type); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + m_stream.Indent(); m_stream.Printf("isSugared() : %s\n", SfB (pointer_type->isSugared())); + VisitType(pointer_type); +} + +void ASTDumper::VisitTagType(const clang::TagType *tag_type) +{ + m_stream.Indent(); m_stream.Printf("class : TagType\n"); + m_stream.Indent(); m_stream.Printf("getDecl() : "); + + Decl *decl = tag_type->getDecl(); + + if (decl) + { + if (KeepDumping() && !Visiting(decl)) + { + m_stream.Printf("\n"); + + PushIndent(); + WillVisit(decl); + ::clang::DeclVisitor::Visit(decl); + DidVisit(decl); + PopIndent(); + } + else + { + m_stream.Printf("capped\n"); + } + } + else + { + m_stream.Printf("~\n"); + } + m_stream.Indent(); m_stream.Printf("isBeingDefined() : %s\n", SfB(tag_type->isBeingDefined())); + VisitType(tag_type); +} + +void ASTDumper::VisitRecordType(const clang::RecordType *record_type) +{ + m_stream.Indent(); m_stream.Printf("class : RecordType\n"); + m_stream.Indent(); m_stream.Printf("hasConstFields() : %s\n", SfB(record_type->hasConstFields())); + VisitTagType(record_type); +} Modified: lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp?rev=124703&r1=124702&r2=124703&view=diff ============================================================================== --- lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp (original) +++ lldb/trunk/source/Expression/ClangExpressionDeclMap.cpp Tue Feb 1 17:43:26 2011 @@ -21,6 +21,7 @@ #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Expression/ASTDumper.h" #include "lldb/Expression/ClangASTSource.h" #include "lldb/Expression/ClangPersistentVariables.h" #include "lldb/Host/Endian.h" @@ -1904,6 +1905,13 @@ var_decl_print_stream.flush(); log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); + + if (log->GetVerbose()) + { + StreamString var_decl_dump_string; + ASTDumper::DumpDecl(var_decl_dump_string, var_decl); + log->Printf("%s\n", var_decl_dump_string.GetData()); + } } } From gclayton at apple.com Tue Feb 1 18:52:14 2011 From: gclayton at apple.com (Greg Clayton) Date: Wed, 02 Feb 2011 00:52:14 -0000 Subject: [Lldb-commits] [lldb] r124706 - /lldb/trunk/source/Symbol/ClangASTContext.cpp Message-ID: <20110202005214.C05212A6C12C@llvm.org> Author: gclayton Date: Tue Feb 1 18:52:14 2011 New Revision: 124706 URL: http://llvm.org/viewvc/llvm-project?rev=124706&view=rev Log: Added missing return statement (patch from Kirk Beitz). Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=124706&r1=124705&r2=124706&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original) +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Tue Feb 1 18:52:14 2011 @@ -4227,6 +4227,7 @@ *member_type = cast(qual_type)->getElementType().getAsOpaquePtr(); if (size) *size = 0; + return true; case clang::Type::DependentSizedArray: if (member_type) *member_type = cast(qual_type)->getElementType().getAsOpaquePtr(); From johnny.chen at apple.com Tue Feb 1 18:56:40 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Wed, 02 Feb 2011 00:56:40 -0000 Subject: [Lldb-commits] [lldb] r124707 - /lldb/trunk/test/breakpoint_command/TestBreakpointCommand.py Message-ID: <20110202005640.2FFD72A6C12C@llvm.org> Author: johnny Date: Tue Feb 1 18:56:40 2011 New Revision: 124707 URL: http://llvm.org/viewvc/llvm-project?rev=124707&view=rev Log: Fix test function breakpoint_command_script_parameters()'s expect-pattern so that it passes when using clang as the compiler to build the inferior. Modified: lldb/trunk/test/breakpoint_command/TestBreakpointCommand.py Modified: lldb/trunk/test/breakpoint_command/TestBreakpointCommand.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/breakpoint_command/TestBreakpointCommand.py?rev=124707&r1=124706&r2=124707&view=diff ============================================================================== --- lldb/trunk/test/breakpoint_command/TestBreakpointCommand.py (original) +++ lldb/trunk/test/breakpoint_command/TestBreakpointCommand.py Tue Feb 1 18:56:40 2011 @@ -163,7 +163,7 @@ self.expect (output, "File 'output-2.txt' and the content matches", exe=False, startstr = "frame #0:", - patterns = ["1.* where = .*main .* 11.* resolved, hit count = 1" ]) + patterns = ["1.* where = .*main .* resolved, hit count = 1" ]) # Now remove 'output-2.txt' os.remove ('output-2.txt') From johnny.chen at apple.com Tue Feb 1 19:13:56 2011 From: johnny.chen at apple.com (Johnny Chen) Date: Wed, 02 Feb 2011 01:13:56 -0000 Subject: [Lldb-commits] [lldb] r124710 - in /lldb/trunk: include/lldb/Core/EmulateInstruction.h source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp source/Plugins/Instruction/ARM/EmulateInstructionARM.h Message-ID: <20110202011356.4A66A2A6C12C@llvm.org> Author: johnny Date: Tue Feb 1 19:13:56 2011 New Revision: 124710 URL: http://llvm.org/viewvc/llvm-project?rev=124710&view=rev Log: Add EmulateBLXImmediate() and EmulateBLXRm() to the g_arm_opcodes and g_thumb_opcodes tables, which represent "bl