1 | //===-- ExecutionContextTest.cpp ------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "lldb/Target/ExecutionContext.h" |
10 | #include "Plugins/Platform/Linux/PlatformLinux.h" |
11 | #include "lldb/Core/Debugger.h" |
12 | #include "lldb/Host/FileSystem.h" |
13 | #include "lldb/Host/HostInfo.h" |
14 | #include "lldb/Target/Platform.h" |
15 | #include "lldb/Target/Process.h" |
16 | #include "lldb/Target/Target.h" |
17 | #include "lldb/Utility/ArchSpec.h" |
18 | #include "lldb/Utility/Endian.h" |
19 | #include "lldb/lldb-enumerations.h" |
20 | #include "lldb/lldb-forward.h" |
21 | #include "lldb/lldb-private-enumerations.h" |
22 | #include "lldb/lldb-private.h" |
23 | #include "llvm/Support/FormatVariadic.h" |
24 | #include "gtest/gtest.h" |
25 | |
26 | using namespace lldb_private; |
27 | using namespace lldb; |
28 | |
29 | namespace { |
30 | class ExecutionContextTest : public ::testing::Test { |
31 | public: |
32 | void SetUp() override { |
33 | FileSystem::Initialize(); |
34 | HostInfo::Initialize(); |
35 | platform_linux::PlatformLinux::Initialize(); |
36 | } |
37 | void TearDown() override { |
38 | platform_linux::PlatformLinux::Terminate(); |
39 | HostInfo::Terminate(); |
40 | FileSystem::Terminate(); |
41 | } |
42 | }; |
43 | |
44 | class DummyProcess : public Process { |
45 | public: |
46 | DummyProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp) |
47 | : Process(target_sp, listener_sp) {} |
48 | |
49 | bool CanDebug(lldb::TargetSP target, bool plugin_specified_by_name) override { |
50 | return true; |
51 | } |
52 | Status DoDestroy() override { return {}; } |
53 | void RefreshStateAfterStop() override {} |
54 | size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, |
55 | Status &error) override { |
56 | return 0; |
57 | } |
58 | bool DoUpdateThreadList(ThreadList &old_thread_list, |
59 | ThreadList &new_thread_list) override { |
60 | return false; |
61 | } |
62 | llvm::StringRef GetPluginName() override { return "Dummy" ; } |
63 | }; |
64 | } // namespace |
65 | |
66 | TEST_F(ExecutionContextTest, GetByteOrder) { |
67 | ExecutionContext exe_ctx(nullptr, nullptr, nullptr); |
68 | EXPECT_EQ(endian::InlHostByteOrder(), exe_ctx.GetByteOrder()); |
69 | } |
70 | |
71 | TEST_F(ExecutionContextTest, GetByteOrderTarget) { |
72 | ArchSpec arch("powerpc64-pc-linux" ); |
73 | |
74 | Platform::SetHostPlatform( |
75 | platform_linux::PlatformLinux::CreateInstance(force: true, arch: &arch)); |
76 | |
77 | DebuggerSP debugger_sp = Debugger::CreateInstance(); |
78 | ASSERT_TRUE(debugger_sp); |
79 | |
80 | TargetSP target_sp; |
81 | PlatformSP platform_sp; |
82 | Status error = debugger_sp->GetTargetList().CreateTarget( |
83 | debugger&: *debugger_sp, user_exe_path: "" , arch, get_dependent_modules: eLoadDependentsNo, platform_sp, target_sp); |
84 | ASSERT_TRUE(target_sp); |
85 | ASSERT_TRUE(target_sp->GetArchitecture().IsValid()); |
86 | ASSERT_TRUE(platform_sp); |
87 | |
88 | ExecutionContext target_ctx(target_sp, false); |
89 | EXPECT_EQ(target_sp->GetArchitecture().GetByteOrder(), |
90 | target_ctx.GetByteOrder()); |
91 | } |
92 | |
93 | TEST_F(ExecutionContextTest, GetByteOrderProcess) { |
94 | ArchSpec arch("powerpc64-pc-linux" ); |
95 | |
96 | Platform::SetHostPlatform( |
97 | platform_linux::PlatformLinux::CreateInstance(force: true, arch: &arch)); |
98 | |
99 | DebuggerSP debugger_sp = Debugger::CreateInstance(); |
100 | ASSERT_TRUE(debugger_sp); |
101 | |
102 | TargetSP target_sp; |
103 | PlatformSP platform_sp; |
104 | Status error = debugger_sp->GetTargetList().CreateTarget( |
105 | debugger&: *debugger_sp, user_exe_path: "" , arch, get_dependent_modules: eLoadDependentsNo, platform_sp, target_sp); |
106 | ASSERT_TRUE(target_sp); |
107 | ASSERT_TRUE(target_sp->GetArchitecture().IsValid()); |
108 | ASSERT_TRUE(platform_sp); |
109 | |
110 | ListenerSP listener_sp(Listener::MakeListener(name: "dummy" )); |
111 | ProcessSP process_sp = std::make_shared<DummyProcess>(args&: target_sp, args&: listener_sp); |
112 | ASSERT_TRUE(process_sp); |
113 | |
114 | ExecutionContext process_ctx(process_sp); |
115 | EXPECT_EQ(process_sp->GetByteOrder(), process_ctx.GetByteOrder()); |
116 | } |
117 | |