Imported Upstream version 6.10.0.49

Former-commit-id: 1d6753294b2993e1fbf92de9366bb9544db4189b
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2020-01-16 16:38:04 +00:00
parent d94e79959b
commit 468663ddbb
48518 changed files with 2789335 additions and 61176 deletions

View File

@ -0,0 +1,12 @@
LEVEL = ../../make
CXX_SOURCES := main.cpp
LD_EXTRAS += -Wl,--build-id=none
localall : stripped.out all
stripped.out : a.out
$(OBJCOPY) --remove-section=.note.gnu.build-id --remove-section=.gnu_debuglink --strip-debug a.out stripped.out
clean::
$(RM) stripped.out
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,52 @@
""" Testing explicit symbol loading via target symbols add. """
import os
import time
import lldb
import sys
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class TargetSymbolsAddCommand(TestBase):
mydir = TestBase.compute_mydir(__file__)
def setUp(self):
TestBase.setUp(self)
self.source = 'main.c'
@no_debug_info_test # Prevent the genaration of the dwarf version of this test
@skipUnlessPlatform(['linux'])
def test_target_symbols_add(self):
"""Test that 'target symbols add' can load the symbols
even if gnu.build-id and gnu_debuglink are not present in the module.
Similar to test_add_dsym_mid_execution test for macos."""
self.build(clean=True)
exe = os.path.join(os.getcwd(), "stripped.out")
self.target = self.dbg.CreateTarget(exe)
self.assertTrue(self.target, VALID_TARGET)
main_bp = self.target.BreakpointCreateByName("main", "stripped.out")
self.assertTrue(main_bp, VALID_BREAKPOINT)
self.process = self.target.LaunchSimple(
None, None, self.get_process_working_directory())
self.assertTrue(self.process, PROCESS_IS_VALID)
# The stop reason of the thread should be breakpoint.
self.assertTrue(self.process.GetState() == lldb.eStateStopped,
STOPPED_DUE_TO_BREAKPOINT)
exe_module = self.target.GetModuleAtIndex(0)
# Check that symbols are not loaded and main.c is not know to be
# the source file.
self.expect("frame select", substrs=['main.c'], matching=False)
# Tell LLDB that a.out has symbols for stripped.out
self.runCmd("target symbols add -s stripped.out a.out")
# Check that symbols are now loaded and main.c is in the output.
self.expect("frame select", substrs=['main.c'])

View File

@ -0,0 +1,6 @@
#include <stdio.h>
static int var = 5;
int main() {
printf("%p is %d\n", &var, var);
return ++var;
}

View File

@ -0,0 +1,5 @@
LEVEL = ../../make
CXX_SOURCES := main.cpp
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,53 @@
"""
Test lldb ability to unwind a stack with a function containing a call to the
'__builtin_trap' intrinsic, which GCC (4.6) encodes to an illegal opcode.
"""
from __future__ import print_function
import os
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class BuiltinTrapTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Find the line number to break at.
self.line = line_number('main.cpp', '// Set break point at this line.')
# gcc generates incorrect linetable
@expectedFailureAll(archs="arm", compiler="gcc", triple=".*-android")
@expectedFailureAll(oslist=['linux'], archs=['arm'])
@skipIfWindows
def test_with_run_command(self):
"""Test that LLDB handles a function with __builtin_trap correctly."""
self.build()
self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
lldbutil.run_break_set_by_file_and_line(self, "main.cpp", self.line,
num_expected_locations=1,
loc_exact=True)
self.runCmd("run", RUN_SUCCEEDED)
# The stop reason of the thread should be breakpoint.
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
substrs=['stopped',
'stop reason = breakpoint'])
# print backtrace, expect both 'bar' and 'main' functions to be listed
self.expect('bt', substrs=['bar', 'main'])
# go up one frame
self.runCmd("up", RUN_SUCCEEDED)
# evaluate a local
self.expect('p foo', substrs=['= 5'])

View File

@ -0,0 +1,17 @@
//===-- main.cpp ------------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
void bar(int const *foo) {
__builtin_trap(); // Set break point at this line.
}
int main() {
int foo = 5;
bar(&foo);
}

View File

@ -0,0 +1,5 @@
LEVEL = ../../../make
CXX_SOURCES := main.cpp
ENABLE_THREADS := YES
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,85 @@
"""
This tests that we do not lose control of the inferior, while doing an instruction-level step
over a thread creation instruction.
"""
from __future__ import print_function
import os
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class CreateDuringInstructionStepTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
NO_DEBUG_INFO_TESTCASE = True
@skipUnlessPlatform(['linux'])
@expectedFailureAndroid('llvm.org/pr24737', archs=['arm'])
@expectedFailureAll(
oslist=["linux"],
archs=["arm"],
bugnumber="llvm.org/pr24737")
def test_step_inst(self):
self.build(dictionary=self.getBuildFlags())
exe = os.path.join(os.getcwd(), "a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target and target.IsValid(), "Target is valid")
# This should create a breakpoint in the stepping thread.
breakpoint = target.BreakpointCreateByName("main")
self.assertTrue(
breakpoint and breakpoint.IsValid(),
"Breakpoint is valid")
# Run the program.
process = target.LaunchSimple(
None, None, self.get_process_working_directory())
self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID)
# The stop reason of the thread should be breakpoint.
self.assertEqual(
process.GetState(),
lldb.eStateStopped,
PROCESS_STOPPED)
threads = lldbutil.get_threads_stopped_at_breakpoint(
process, breakpoint)
self.assertEqual(len(threads), 1, STOPPED_DUE_TO_BREAKPOINT)
thread = threads[0]
self.assertTrue(thread and thread.IsValid(), "Thread is valid")
# Make sure we see only one threads
self.assertEqual(
process.GetNumThreads(),
1,
'Number of expected threads and actual threads do not match.')
# Keep stepping until we see the thread creation
while process.GetNumThreads() < 2:
thread.StepInstruction(False)
self.assertEqual(
process.GetState(),
lldb.eStateStopped,
PROCESS_STOPPED)
self.assertEqual(
thread.GetStopReason(),
lldb.eStopReasonPlanComplete,
"Step operation succeeded")
if self.TraceOn():
self.runCmd("disassemble --pc")
if self.TraceOn():
self.runCmd("thread list")
# We have successfully caught thread creation. Now just run to
# completion
process.Continue()
# At this point, the inferior process should have exited.
self.assertEqual(process.GetState(), lldb.eStateExited, PROCESS_EXITED)

View File

@ -0,0 +1,55 @@
//===-- main.cpp ------------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// This file deliberately uses low level linux-specific API for thread creation because:
// - instruction-stepping over thread creation using higher-level functions was very slow
// - it was also unreliable due to single-stepping bugs unrelated to this test
// - some threading libraries do not create or destroy threads when we would expect them to
#include <sched.h>
#include <atomic>
#include <cstdio>
enum { STACK_SIZE = 0x2000 };
static uint8_t child_stack[STACK_SIZE];
pid_t child_tid;
std::atomic<bool> flag(false);
int thread_main(void *)
{
while (! flag) // Make sure the thread does not exit prematurely
;
return 0;
}
int main ()
{
int ret = clone(thread_main,
child_stack + STACK_SIZE/2, // Don't care whether the stack grows up or down,
// just point to the middle
CLONE_CHILD_CLEARTID | CLONE_FILES | CLONE_FS | CLONE_PARENT_SETTID |
CLONE_SIGHAND | CLONE_SYSVSEM | CLONE_THREAD | CLONE_VM,
nullptr, // thread_main argument
&child_tid);
if (ret == -1)
{
perror("clone");
return 1;
}
flag = true;
return 0;
}