[lldb][test] Remove symlink for API tests.
Summary: Moves lldbsuite tests to lldb/test/API.
This is a largely mechanical change, moved with the following steps:
```
rm lldb/test/API/testcases
mkdir -p lldb/test/API/{test_runner/test,tools/lldb-{server,vscode}}
mv lldb/packages/Python/lldbsuite/test/test_runner/test lldb/test/API/test_runner
for d in $(find lldb/packages/Python/lldbsuite/test/* -maxdepth 0 -type d | egrep -v "make|plugins|test_runner|tools"); do mv $d lldb/test/API; done
for d in $(find lldb/packages/Python/lldbsuite/test/tools/lldb-vscode -maxdepth 1 -mindepth 1 | grep -v ".py"); do mv $d lldb/test/API/tools/lldb-vscode; done
for d in $(find lldb/packages/Python/lldbsuite/test/tools/lldb-server -maxdepth 1 -mindepth 1 | egrep -v "gdbremote_testcase.py|lldbgdbserverutils.py|socket_packet_pump.py"); do mv $d lldb/test/API/tools/lldb-server; done
```
lldb/packages/Python/lldbsuite/__init__.py and lldb/test/API/lit.cfg.py were also updated with the new directory structure.
Reviewers: labath, JDevlieghere
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D71151
This commit is contained in:
3
lldb/test/API/python_api/function_symbol/Makefile
Normal file
3
lldb/test/API/python_api/function_symbol/Makefile
Normal file
@@ -0,0 +1,3 @@
|
||||
C_SOURCES := main.c
|
||||
|
||||
include Makefile.rules
|
||||
123
lldb/test/API/python_api/function_symbol/TestDisasmAPI.py
Normal file
123
lldb/test/API/python_api/function_symbol/TestDisasmAPI.py
Normal file
@@ -0,0 +1,123 @@
|
||||
"""
|
||||
Test retrieval of SBAddress from function/symbol, disassembly, and SBAddress APIs.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
|
||||
import lldb
|
||||
from lldbsuite.test.decorators import *
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
|
||||
class DisasmAPITestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
def setUp(self):
|
||||
# Call super's setUp().
|
||||
TestBase.setUp(self)
|
||||
# Find the line number to of function 'c'.
|
||||
self.line1 = line_number(
|
||||
'main.c', '// Find the line number for breakpoint 1 here.')
|
||||
self.line2 = line_number(
|
||||
'main.c', '// Find the line number for breakpoint 2 here.')
|
||||
|
||||
@add_test_categories(['pyapi'])
|
||||
@expectedFailureAll(oslist=["windows"], bugnumber='llvm.org/pr21765')
|
||||
def test(self):
|
||||
"""Exercise getting SBAddress objects, disassembly, and SBAddress APIs."""
|
||||
self.build()
|
||||
exe = self.getBuildArtifact("a.out")
|
||||
|
||||
# Create a target by the debugger.
|
||||
target = self.dbg.CreateTarget(exe)
|
||||
self.assertTrue(target, VALID_TARGET)
|
||||
|
||||
# Now create the two breakpoints inside function 'a'.
|
||||
breakpoint1 = target.BreakpointCreateByLocation('main.c', self.line1)
|
||||
breakpoint2 = target.BreakpointCreateByLocation('main.c', self.line2)
|
||||
#print("breakpoint1:", breakpoint1)
|
||||
#print("breakpoint2:", breakpoint2)
|
||||
self.assertTrue(breakpoint1 and
|
||||
breakpoint1.GetNumLocations() == 1,
|
||||
VALID_BREAKPOINT)
|
||||
self.assertTrue(breakpoint2 and
|
||||
breakpoint2.GetNumLocations() == 1,
|
||||
VALID_BREAKPOINT)
|
||||
|
||||
# Now launch the process, and do not stop at entry point.
|
||||
process = target.LaunchSimple(
|
||||
None, None, self.get_process_working_directory())
|
||||
self.assertTrue(process, PROCESS_IS_VALID)
|
||||
|
||||
# Frame #0 should be on self.line1.
|
||||
self.assertTrue(process.GetState() == lldb.eStateStopped)
|
||||
thread = lldbutil.get_stopped_thread(
|
||||
process, lldb.eStopReasonBreakpoint)
|
||||
self.assertTrue(
|
||||
thread.IsValid(),
|
||||
"There should be a thread stopped due to breakpoint condition")
|
||||
frame0 = thread.GetFrameAtIndex(0)
|
||||
lineEntry = frame0.GetLineEntry()
|
||||
self.assertTrue(lineEntry.GetLine() == self.line1)
|
||||
|
||||
address1 = lineEntry.GetStartAddress()
|
||||
#print("address1:", address1)
|
||||
|
||||
# Now call SBTarget.ResolveSymbolContextForAddress() with address1.
|
||||
context1 = target.ResolveSymbolContextForAddress(
|
||||
address1, lldb.eSymbolContextEverything)
|
||||
|
||||
self.assertTrue(context1)
|
||||
if self.TraceOn():
|
||||
print("context1:", context1)
|
||||
|
||||
# Continue the inferior, the breakpoint 2 should be hit.
|
||||
process.Continue()
|
||||
self.assertTrue(process.GetState() == lldb.eStateStopped)
|
||||
thread = lldbutil.get_stopped_thread(
|
||||
process, lldb.eStopReasonBreakpoint)
|
||||
self.assertTrue(
|
||||
thread.IsValid(),
|
||||
"There should be a thread stopped due to breakpoint condition")
|
||||
frame0 = thread.GetFrameAtIndex(0)
|
||||
lineEntry = frame0.GetLineEntry()
|
||||
self.assertTrue(lineEntry.GetLine() == self.line2)
|
||||
|
||||
# Verify that the symbol and the function has the same address range
|
||||
# per function 'a'.
|
||||
symbol = context1.GetSymbol()
|
||||
function = frame0.GetFunction()
|
||||
self.assertTrue(symbol and function)
|
||||
|
||||
disasm_output = lldbutil.disassemble(target, symbol)
|
||||
if self.TraceOn():
|
||||
print("symbol:", symbol)
|
||||
print("disassembly=>\n", disasm_output)
|
||||
|
||||
disasm_output = lldbutil.disassemble(target, function)
|
||||
if self.TraceOn():
|
||||
print("function:", function)
|
||||
print("disassembly=>\n", disasm_output)
|
||||
|
||||
sa1 = symbol.GetStartAddress()
|
||||
#print("sa1:", sa1)
|
||||
#print("sa1.GetFileAddress():", hex(sa1.GetFileAddress()))
|
||||
#ea1 = symbol.GetEndAddress()
|
||||
#print("ea1:", ea1)
|
||||
sa2 = function.GetStartAddress()
|
||||
#print("sa2:", sa2)
|
||||
#print("sa2.GetFileAddress():", hex(sa2.GetFileAddress()))
|
||||
#ea2 = function.GetEndAddress()
|
||||
#print("ea2:", ea2)
|
||||
self.assertTrue(sa1 and sa2 and sa1 == sa2,
|
||||
"The two starting addresses should be the same")
|
||||
|
||||
from lldbsuite.test.lldbutil import get_description
|
||||
desc1 = get_description(sa1)
|
||||
desc2 = get_description(sa2)
|
||||
self.assertTrue(
|
||||
desc1 and desc2 and desc1 == desc2,
|
||||
"SBAddress.GetDescription() API of sa1 and sa2 should return the same string")
|
||||
92
lldb/test/API/python_api/function_symbol/TestSymbolAPI.py
Normal file
92
lldb/test/API/python_api/function_symbol/TestSymbolAPI.py
Normal file
@@ -0,0 +1,92 @@
|
||||
"""
|
||||
Test newly added SBSymbol and SBAddress APIs.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
|
||||
import lldb
|
||||
from lldbsuite.test.decorators import *
|
||||
from lldbsuite.test.lldbtest import *
|
||||
from lldbsuite.test import lldbutil
|
||||
|
||||
|
||||
class SymbolAPITestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
def setUp(self):
|
||||
# Call super's setUp().
|
||||
TestBase.setUp(self)
|
||||
# Find the line number to of function 'c'.
|
||||
self.line1 = line_number(
|
||||
'main.c', '// Find the line number for breakpoint 1 here.')
|
||||
self.line2 = line_number(
|
||||
'main.c', '// Find the line number for breakpoint 2 here.')
|
||||
|
||||
@add_test_categories(['pyapi'])
|
||||
@expectedFailureAll(oslist=["windows"], bugnumber='llvm.org/pr21765')
|
||||
def test(self):
|
||||
"""Exercise some SBSymbol and SBAddress APIs."""
|
||||
self.build()
|
||||
exe = self.getBuildArtifact("a.out")
|
||||
|
||||
# Create a target by the debugger.
|
||||
target = self.dbg.CreateTarget(exe)
|
||||
self.assertTrue(target, VALID_TARGET)
|
||||
|
||||
# Now create the two breakpoints inside function 'a'.
|
||||
breakpoint1 = target.BreakpointCreateByLocation('main.c', self.line1)
|
||||
breakpoint2 = target.BreakpointCreateByLocation('main.c', self.line2)
|
||||
#print("breakpoint1:", breakpoint1)
|
||||
#print("breakpoint2:", breakpoint2)
|
||||
self.assertTrue(breakpoint1 and
|
||||
breakpoint1.GetNumLocations() == 1,
|
||||
VALID_BREAKPOINT)
|
||||
self.assertTrue(breakpoint2 and
|
||||
breakpoint2.GetNumLocations() == 1,
|
||||
VALID_BREAKPOINT)
|
||||
|
||||
# Now launch the process, and do not stop at entry point.
|
||||
process = target.LaunchSimple(
|
||||
None, None, self.get_process_working_directory())
|
||||
self.assertTrue(process, PROCESS_IS_VALID)
|
||||
|
||||
# Frame #0 should be on self.line1.
|
||||
self.assertTrue(process.GetState() == lldb.eStateStopped)
|
||||
thread = lldbutil.get_stopped_thread(
|
||||
process, lldb.eStopReasonBreakpoint)
|
||||
self.assertTrue(
|
||||
thread.IsValid(),
|
||||
"There should be a thread stopped due to breakpoint condition")
|
||||
frame0 = thread.GetFrameAtIndex(0)
|
||||
symbol_line1 = frame0.GetSymbol()
|
||||
# We should have a symbol type of code.
|
||||
self.assertTrue(symbol_line1.GetType() == lldb.eSymbolTypeCode)
|
||||
addr_line1 = symbol_line1.GetStartAddress()
|
||||
# And a section type of code, too.
|
||||
self.assertTrue(addr_line1.GetSection().GetSectionType()
|
||||
== lldb.eSectionTypeCode)
|
||||
|
||||
# Continue the inferior, the breakpoint 2 should be hit.
|
||||
process.Continue()
|
||||
self.assertTrue(process.GetState() == lldb.eStateStopped)
|
||||
thread = lldbutil.get_stopped_thread(
|
||||
process, lldb.eStopReasonBreakpoint)
|
||||
self.assertTrue(
|
||||
thread.IsValid(),
|
||||
"There should be a thread stopped due to breakpoint condition")
|
||||
frame0 = thread.GetFrameAtIndex(0)
|
||||
symbol_line2 = frame0.GetSymbol()
|
||||
# We should have a symbol type of code.
|
||||
self.assertTrue(symbol_line2.GetType() == lldb.eSymbolTypeCode)
|
||||
addr_line2 = symbol_line2.GetStartAddress()
|
||||
# And a section type of code, too.
|
||||
self.assertTrue(addr_line2.GetSection().GetSectionType()
|
||||
== lldb.eSectionTypeCode)
|
||||
|
||||
# Now verify that both addresses point to the same module.
|
||||
if self.TraceOn():
|
||||
print("UUID:", addr_line1.GetModule().GetUUIDString())
|
||||
self.assertTrue(addr_line1.GetModule().GetUUIDString()
|
||||
== addr_line2.GetModule().GetUUIDString())
|
||||
59
lldb/test/API/python_api/function_symbol/main.c
Normal file
59
lldb/test/API/python_api/function_symbol/main.c
Normal file
@@ -0,0 +1,59 @@
|
||||
//===-- main.c --------------------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#include <stdio.h>
|
||||
|
||||
// This simple program is to test the lldb Python APIs SBTarget, SBFrame,
|
||||
// SBFunction, SBSymbol, and SBAddress.
|
||||
//
|
||||
// When stopped on breakppint 1, we can get the line entry using SBFrame API
|
||||
// SBFrame.GetLineEntry(). We'll get the start address for the line entry
|
||||
// with the SBAddress type, resolve the symbol context using the SBTarget API
|
||||
// SBTarget.ResolveSymbolContextForAddress() in order to get the SBSymbol.
|
||||
//
|
||||
// We then stop at breakpoint 2, get the SBFrame, and the SBFunction object.
|
||||
//
|
||||
// The address from calling GetStartAddress() on the symbol and the function
|
||||
// should point to the same address, and we also verify that.
|
||||
|
||||
int a(int);
|
||||
int b(int);
|
||||
int c(int);
|
||||
|
||||
int a(int val)
|
||||
{
|
||||
if (val <= 1) // Find the line number for breakpoint 1 here.
|
||||
val = b(val);
|
||||
else if (val >= 3)
|
||||
val = c(val);
|
||||
|
||||
return val; // Find the line number for breakpoint 2 here.
|
||||
}
|
||||
|
||||
int b(int val)
|
||||
{
|
||||
return c(val);
|
||||
}
|
||||
|
||||
int c(int val)
|
||||
{
|
||||
return val + 3;
|
||||
}
|
||||
|
||||
int main (int argc, char const *argv[])
|
||||
{
|
||||
int A1 = a(1); // a(1) -> b(1) -> c(1)
|
||||
printf("a(1) returns %d\n", A1);
|
||||
|
||||
int B2 = b(2); // b(2) -> c(2)
|
||||
printf("b(2) returns %d\n", B2);
|
||||
|
||||
int A3 = a(3); // a(3) -> c(3)
|
||||
printf("a(3) returns %d\n", A3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user