blob: bd3083ce4ba5f8fa98de4779a8d02fd15eadddd5 [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 Ferrise69f4702017-10-19 16:08:58 -070069 bool Init(uint64_t*) override { return false; }
Christopher Ferris4cc36d22018-06-06 14:47:31 -070070 void InitHeaders(uint64_t) 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 Ferrisf6f691b2017-09-25 19:23:07 -0700100 private:
Christopher Ferris150db122017-12-20 18:49:01 -0800101 std::unordered_map<std::string, uint64_t> globals_;
Christopher Ferrisbf373ed2019-01-16 17:23:39 -0800102 std::string fake_build_id_;
Christopher Ferris02a6c442019-03-11 14:43:33 -0700103 std::string fake_soname_;
Christopher Ferris150db122017-12-20 18:49:01 -0800104
Christopher Ferrisf6f691b2017-09-25 19:23:07 -0700105 static std::deque<FunctionData> functions_;
106 static std::deque<StepData> steps_;
107};
108
Christopher Ferrise69f4702017-10-19 16:08:58 -0700109class ElfInterface32Fake : public ElfInterface32 {
110 public:
111 ElfInterface32Fake(Memory* memory) : ElfInterface32(memory) {}
112 virtual ~ElfInterface32Fake() = default;
113
114 void FakeSetEhFrameOffset(uint64_t offset) { eh_frame_offset_ = offset; }
115 void FakeSetEhFrameSize(uint64_t size) { eh_frame_size_ = size; }
116 void FakeSetDebugFrameOffset(uint64_t offset) { debug_frame_offset_ = offset; }
117 void FakeSetDebugFrameSize(uint64_t size) { debug_frame_size_ = size; }
118};
119
120class ElfInterface64Fake : public ElfInterface64 {
121 public:
122 ElfInterface64Fake(Memory* memory) : ElfInterface64(memory) {}
123 virtual ~ElfInterface64Fake() = default;
124
125 void FakeSetEhFrameOffset(uint64_t offset) { eh_frame_offset_ = offset; }
126 void FakeSetEhFrameSize(uint64_t size) { eh_frame_size_ = size; }
127 void FakeSetDebugFrameOffset(uint64_t offset) { debug_frame_offset_ = offset; }
128 void FakeSetDebugFrameSize(uint64_t size) { debug_frame_size_ = size; }
129};
130
131class ElfInterfaceArmFake : public ElfInterfaceArm {
132 public:
133 ElfInterfaceArmFake(Memory* memory) : ElfInterfaceArm(memory) {}
134 virtual ~ElfInterfaceArmFake() = default;
135
136 void FakeSetStartOffset(uint64_t offset) { start_offset_ = offset; }
137 void FakeSetTotalEntries(size_t entries) { total_entries_ = entries; }
138};
139
Christopher Ferrisf6f691b2017-09-25 19:23:07 -0700140} // namespace unwindstack
141
142#endif // _LIBUNWINDSTACK_TESTS_ELF_FAKE_H