blob: c33908d23f6b8a2ba6e8be9bdcb89fe26969244c [file] [log] [blame]
Christopher Ferrisf6f691b2017-09-25 19:23:07 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _LIBUNWINDSTACK_TESTS_ELF_FAKE_H
18#define _LIBUNWINDSTACK_TESTS_ELF_FAKE_H
19
20#include <stdint.h>
21
22#include <deque>
23#include <string>
Christopher Ferris150db122017-12-20 18:49:01 -080024#include <unordered_map>
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070025
26#include <unwindstack/Elf.h>
27#include <unwindstack/ElfInterface.h>
28#include <unwindstack/Memory.h>
29#include <unwindstack/Regs.h>
30
Christopher Ferrise69f4702017-10-19 16:08:58 -070031#include "ElfInterfaceArm.h"
32
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070033namespace unwindstack {
34
35struct StepData {
36 StepData(uint64_t pc, uint64_t sp, bool finished) : pc(pc), sp(sp), finished(finished) {}
37 uint64_t pc;
38 uint64_t sp;
39 bool finished;
40};
41
42struct FunctionData {
43 FunctionData(std::string name, uint64_t offset) : name(name), offset(offset) {}
44
45 std::string name;
46 uint64_t offset;
47};
48
49class ElfFake : public Elf {
50 public:
51 ElfFake(Memory* memory) : Elf(memory) { valid_ = true; }
52 virtual ~ElfFake() = default;
53
Christopher Ferrise69f4702017-10-19 16:08:58 -070054 void FakeSetValid(bool valid) { valid_ = valid; }
55
56 void FakeSetLoadBias(uint64_t load_bias) { load_bias_ = load_bias; }
57
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070058 void FakeSetInterface(ElfInterface* interface) { interface_.reset(interface); }
Christopher Ferris150db122017-12-20 18:49:01 -080059 void FakeSetGnuDebugdataInterface(ElfInterface* interface) {
60 gnu_debugdata_interface_.reset(interface);
61 }
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070062};
63
64class ElfInterfaceFake : public ElfInterface {
65 public:
66 ElfInterfaceFake(Memory* memory) : ElfInterface(memory) {}
67 virtual ~ElfInterfaceFake() = default;
68
Christopher Ferris819f1312019-10-03 13:35:48 -070069 bool Init(int64_t*) override { return false; }
70 void InitHeaders() override {}
Christopher Ferris02a6c442019-03-11 14:43:33 -070071 std::string GetSoname() override { return fake_soname_; }
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070072
Christopher Ferris4cc36d22018-06-06 14:47:31 -070073 bool GetFunctionName(uint64_t, std::string*, uint64_t*) override;
Christopher Ferris150db122017-12-20 18:49:01 -080074 bool GetGlobalVariable(const std::string&, uint64_t*) override;
Christopher Ferrisbf373ed2019-01-16 17:23:39 -080075 std::string GetBuildID() override { return fake_build_id_; }
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070076
Christopher Ferris4cc36d22018-06-06 14:47:31 -070077 bool Step(uint64_t, Regs*, Memory*, bool*) override;
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070078
Christopher Ferris150db122017-12-20 18:49:01 -080079 void FakeSetGlobalVariable(const std::string& global, uint64_t offset) {
80 globals_[global] = offset;
81 }
82
Christopher Ferrisbf373ed2019-01-16 17:23:39 -080083 void FakeSetBuildID(std::string& build_id) { fake_build_id_ = build_id; }
84 void FakeSetBuildID(const char* build_id) { fake_build_id_ = build_id; }
85
Christopher Ferris02a6c442019-03-11 14:43:33 -070086 void FakeSetSoname(const char* soname) { fake_soname_ = soname; }
87
Christopher Ferrisf6f691b2017-09-25 19:23:07 -070088 static void FakePushFunctionData(const FunctionData data) { functions_.push_back(data); }
89 static void FakePushStepData(const StepData data) { steps_.push_back(data); }
90
91 static void FakeClear() {
92 functions_.clear();
93 steps_.clear();
94 }
95
Christopher Ferris2fcf4cf2018-01-23 17:52:23 -080096 void FakeSetErrorCode(ErrorCode code) { last_error_.code = code; }
97
98 void FakeSetErrorAddress(uint64_t address) { last_error_.address = address; }
99
Christopher Ferrisdf683b72019-12-03 17:13:49 -0800100 void FakeSetDataOffset(uint64_t offset) { data_offset_ = offset; }
101 void FakeSetDataVaddrStart(uint64_t vaddr) { data_vaddr_start_ = vaddr; }
102 void FakeSetDataVaddrEnd(uint64_t vaddr) { data_vaddr_end_ = vaddr; }
103
104 void FakeSetDynamicOffset(uint64_t offset) { dynamic_offset_ = offset; }
105 void FakeSetDynamicVaddrStart(uint64_t vaddr) { dynamic_vaddr_start_ = vaddr; }
106 void FakeSetDynamicVaddrEnd(uint64_t vaddr) { dynamic_vaddr_end_ = vaddr; }
107
Christopher Ferrisf6f691b2017-09-25 19:23:07 -0700108 private:
Christopher Ferris150db122017-12-20 18:49:01 -0800109 std::unordered_map<std::string, uint64_t> globals_;
Christopher Ferrisbf373ed2019-01-16 17:23:39 -0800110 std::string fake_build_id_;
Christopher Ferris02a6c442019-03-11 14:43:33 -0700111 std::string fake_soname_;
Christopher Ferris150db122017-12-20 18:49:01 -0800112
Christopher Ferrisf6f691b2017-09-25 19:23:07 -0700113 static std::deque<FunctionData> functions_;
114 static std::deque<StepData> steps_;
115};
116
Christopher Ferrise69f4702017-10-19 16:08:58 -0700117class ElfInterface32Fake : public ElfInterface32 {
118 public:
119 ElfInterface32Fake(Memory* memory) : ElfInterface32(memory) {}
120 virtual ~ElfInterface32Fake() = default;
121
122 void FakeSetEhFrameOffset(uint64_t offset) { eh_frame_offset_ = offset; }
123 void FakeSetEhFrameSize(uint64_t size) { eh_frame_size_ = size; }
124 void FakeSetDebugFrameOffset(uint64_t offset) { debug_frame_offset_ = offset; }
125 void FakeSetDebugFrameSize(uint64_t size) { debug_frame_size_ = size; }
126};
127
128class ElfInterface64Fake : public ElfInterface64 {
129 public:
130 ElfInterface64Fake(Memory* memory) : ElfInterface64(memory) {}
131 virtual ~ElfInterface64Fake() = default;
132
133 void FakeSetEhFrameOffset(uint64_t offset) { eh_frame_offset_ = offset; }
134 void FakeSetEhFrameSize(uint64_t size) { eh_frame_size_ = size; }
135 void FakeSetDebugFrameOffset(uint64_t offset) { debug_frame_offset_ = offset; }
136 void FakeSetDebugFrameSize(uint64_t size) { debug_frame_size_ = size; }
137};
138
139class ElfInterfaceArmFake : public ElfInterfaceArm {
140 public:
141 ElfInterfaceArmFake(Memory* memory) : ElfInterfaceArm(memory) {}
142 virtual ~ElfInterfaceArmFake() = default;
143
144 void FakeSetStartOffset(uint64_t offset) { start_offset_ = offset; }
145 void FakeSetTotalEntries(size_t entries) { total_entries_ = entries; }
146};
147
Christopher Ferrisf6f691b2017-09-25 19:23:07 -0700148} // namespace unwindstack
149
150#endif // _LIBUNWINDSTACK_TESTS_ELF_FAKE_H