xref: /aosp_15_r20/system/unwinding/libunwindstack/benchmarks/EvalBenchmark.cpp (revision eb293b8f56ee8303637c5595cfcdeef8039e85c6)
1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker  *
4*eb293b8fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker  *
8*eb293b8fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker  *
10*eb293b8fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker  * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker  */
16*eb293b8fSAndroid Build Coastguard Worker 
17*eb293b8fSAndroid Build Coastguard Worker #include <cstdint>
18*eb293b8fSAndroid Build Coastguard Worker #include <ios>
19*eb293b8fSAndroid Build Coastguard Worker #include <memory>
20*eb293b8fSAndroid Build Coastguard Worker #include <sstream>
21*eb293b8fSAndroid Build Coastguard Worker 
22*eb293b8fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
23*eb293b8fSAndroid Build Coastguard Worker 
24*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/DwarfLocation.h>
25*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/DwarfSection.h>
26*eb293b8fSAndroid Build Coastguard Worker 
27*eb293b8fSAndroid Build Coastguard Worker #include "Utils.h"
28*eb293b8fSAndroid Build Coastguard Worker #include "utils/DwarfSectionImplFake.h"
29*eb293b8fSAndroid Build Coastguard Worker #include "utils/MemoryFake.h"
30*eb293b8fSAndroid Build Coastguard Worker #include "utils/RegsFake.h"
31*eb293b8fSAndroid Build Coastguard Worker 
32*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack {
33*eb293b8fSAndroid Build Coastguard Worker namespace {
34*eb293b8fSAndroid Build Coastguard Worker 
35*eb293b8fSAndroid Build Coastguard Worker // This collection of benchmarks exercises the DwarfSectionImpl::Eval function with a set of
36*eb293b8fSAndroid Build Coastguard Worker // artificial unwind data. The number of registers and register evaluation method are varied
37*eb293b8fSAndroid Build Coastguard Worker // for each individual benchmark.
38*eb293b8fSAndroid Build Coastguard Worker 
39*eb293b8fSAndroid Build Coastguard Worker constexpr int kReturnAddressReg = 5;
40*eb293b8fSAndroid Build Coastguard Worker 
41*eb293b8fSAndroid Build Coastguard Worker template <typename AddresssType>
42*eb293b8fSAndroid Build Coastguard Worker class EvalBenchmark : public benchmark::Fixture {
43*eb293b8fSAndroid Build Coastguard Worker  public:
EvalBenchmark()44*eb293b8fSAndroid Build Coastguard Worker   EvalBenchmark() {
45*eb293b8fSAndroid Build Coastguard Worker     fake_memory_ = new MemoryFake;
46*eb293b8fSAndroid Build Coastguard Worker     std::shared_ptr<Memory> memory(fake_memory_);
47*eb293b8fSAndroid Build Coastguard Worker     section_ = std::make_unique<DwarfSectionImplFake<AddresssType>>(memory);
48*eb293b8fSAndroid Build Coastguard Worker   }
49*eb293b8fSAndroid Build Coastguard Worker 
50*eb293b8fSAndroid Build Coastguard Worker   // Benchmarks DwarfSectionImpl::Eval given the DwarfLocation object, loc_regs, initialized in each
51*eb293b8fSAndroid Build Coastguard Worker   // individual benchmark macro/function.
52*eb293b8fSAndroid Build Coastguard Worker   //
53*eb293b8fSAndroid Build Coastguard Worker   // This method initializes the fake register object and the DwarfCie object the same regardless
54*eb293b8fSAndroid Build Coastguard Worker   // of the benchmark. So the initialization of loc_regs is carefully crafted in each benchmark
55*eb293b8fSAndroid Build Coastguard Worker   // macro so that the evaluated PC and SP match the expected values after each call to Eval in the
56*eb293b8fSAndroid Build Coastguard Worker   // benchmarking loop.
57*eb293b8fSAndroid Build Coastguard Worker   //
58*eb293b8fSAndroid Build Coastguard Worker   // In addition to the Eval call, register value assertion is included in the benchmarking loop
59*eb293b8fSAndroid Build Coastguard Worker   // to ensure that we always capture the actual register evaluation
60*eb293b8fSAndroid Build Coastguard Worker   // (DwarfSectionImpl::EvalRegister). For example, if Eval is modified to lazily evaluate register
61*eb293b8fSAndroid Build Coastguard Worker   // values, we will still capture the register evaluation for the PC and SP (common case) in the
62*eb293b8fSAndroid Build Coastguard Worker   // register value assertion.
RunBenchmark(benchmark::State & state,DwarfLocations & loc_regs)63*eb293b8fSAndroid Build Coastguard Worker   void RunBenchmark(benchmark::State& state, DwarfLocations& loc_regs) {
64*eb293b8fSAndroid Build Coastguard Worker     DwarfCie cie{.return_address_register = kReturnAddressReg};
65*eb293b8fSAndroid Build Coastguard Worker     bool finished;
66*eb293b8fSAndroid Build Coastguard Worker     RegsImplFake<AddresssType> regs(64);
67*eb293b8fSAndroid Build Coastguard Worker     regs.set_pc(0x1000);
68*eb293b8fSAndroid Build Coastguard Worker     regs.set_sp(0x3500);
69*eb293b8fSAndroid Build Coastguard Worker     regs[0] = 0x10000000;
70*eb293b8fSAndroid Build Coastguard Worker     MemoryTracker mem_tracker;
71*eb293b8fSAndroid Build Coastguard Worker     for (const auto& _ : state) {
72*eb293b8fSAndroid Build Coastguard Worker       state.PauseTiming();
73*eb293b8fSAndroid Build Coastguard Worker       mem_tracker.StartTrackingAllocations();
74*eb293b8fSAndroid Build Coastguard Worker       state.ResumeTiming();
75*eb293b8fSAndroid Build Coastguard Worker 
76*eb293b8fSAndroid Build Coastguard Worker       std::stringstream err_stream;
77*eb293b8fSAndroid Build Coastguard Worker       if (!section_->Eval(&cie, fake_memory_, loc_regs, &regs, &finished)) {
78*eb293b8fSAndroid Build Coastguard Worker         err_stream << "Eval() failed at address " << section_->LastErrorAddress();
79*eb293b8fSAndroid Build Coastguard Worker         state.SkipWithError(err_stream.str().c_str());
80*eb293b8fSAndroid Build Coastguard Worker         return;
81*eb293b8fSAndroid Build Coastguard Worker       }
82*eb293b8fSAndroid Build Coastguard Worker       if (finished || regs.pc() != 0x60000000U || regs.sp() != 0x10000000U) {
83*eb293b8fSAndroid Build Coastguard Worker         err_stream
84*eb293b8fSAndroid Build Coastguard Worker             << "Eval() finished successfully but registers were not evaluated correctly."
85*eb293b8fSAndroid Build Coastguard Worker             << "\nExpected: finished == false, regs.pc() == 0x60000000, regs.sp() == 0x10000000."
86*eb293b8fSAndroid Build Coastguard Worker             << "\nActual: finished == " << std::boolalpha << finished << std::hex
87*eb293b8fSAndroid Build Coastguard Worker             << ", regs.pc() == 0x" << regs.pc() << ", regs.sp() == 0x" << regs.sp();
88*eb293b8fSAndroid Build Coastguard Worker         state.SkipWithError(err_stream.str().c_str());
89*eb293b8fSAndroid Build Coastguard Worker         return;
90*eb293b8fSAndroid Build Coastguard Worker       }
91*eb293b8fSAndroid Build Coastguard Worker       state.PauseTiming();
92*eb293b8fSAndroid Build Coastguard Worker       mem_tracker.StopTrackingAllocations();
93*eb293b8fSAndroid Build Coastguard Worker       state.ResumeTiming();
94*eb293b8fSAndroid Build Coastguard Worker     }
95*eb293b8fSAndroid Build Coastguard Worker     mem_tracker.SetBenchmarkCounters(state);
96*eb293b8fSAndroid Build Coastguard Worker   }
97*eb293b8fSAndroid Build Coastguard Worker 
98*eb293b8fSAndroid Build Coastguard Worker  protected:
99*eb293b8fSAndroid Build Coastguard Worker   MemoryFake* fake_memory_;
100*eb293b8fSAndroid Build Coastguard Worker   std::unique_ptr<DwarfSectionImplFake<AddresssType>> section_;
101*eb293b8fSAndroid Build Coastguard Worker };
102*eb293b8fSAndroid Build Coastguard Worker 
103*eb293b8fSAndroid Build Coastguard Worker // Benchmarks exercising Eval with the DWARF_LOCATION_REGISTER evaluation method.
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_register_few_regs,uint64_t)104*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_register_few_regs, uint64_t)(benchmark::State& state) {
105*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
106*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
107*eb293b8fSAndroid Build Coastguard Worker   loc_regs[kReturnAddressReg] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0x50000000}};
108*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
109*eb293b8fSAndroid Build Coastguard Worker }
110*eb293b8fSAndroid Build Coastguard Worker 
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_register_many_regs,uint64_t)111*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_register_many_regs, uint64_t)(benchmark::State& state) {
112*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
113*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
114*eb293b8fSAndroid Build Coastguard Worker   for (uint64_t i = 0; i < 64; i++) {
115*eb293b8fSAndroid Build Coastguard Worker     loc_regs[i] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, i * 0x10000000}};
116*eb293b8fSAndroid Build Coastguard Worker   }
117*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
118*eb293b8fSAndroid Build Coastguard Worker }
119*eb293b8fSAndroid Build Coastguard Worker 
120*eb293b8fSAndroid Build Coastguard Worker // Benchmarks exercising Eval with the DWARF_LOCATION_VAL_OFFSET evaluation method.
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_val_offset_few_regs,uint64_t)121*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_val_offset_few_regs, uint64_t)
122*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
123*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
124*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
125*eb293b8fSAndroid Build Coastguard Worker   loc_regs[kReturnAddressReg] = DwarfLocation{DWARF_LOCATION_VAL_OFFSET, {0x50000000, 0}};
126*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
127*eb293b8fSAndroid Build Coastguard Worker }
128*eb293b8fSAndroid Build Coastguard Worker 
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_val_offset_many_regs,uint64_t)129*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_val_offset_many_regs, uint64_t)
130*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
131*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
132*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
133*eb293b8fSAndroid Build Coastguard Worker   for (uint64_t i = 0; i < 64; i++) {
134*eb293b8fSAndroid Build Coastguard Worker     loc_regs[i] = DwarfLocation{DWARF_LOCATION_VAL_OFFSET, {i * 0x10000000, 0}};
135*eb293b8fSAndroid Build Coastguard Worker   }
136*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
137*eb293b8fSAndroid Build Coastguard Worker }
138*eb293b8fSAndroid Build Coastguard Worker 
139*eb293b8fSAndroid Build Coastguard Worker // Benchmarks exercising Eval with the DWARF_LOCATION_OFFSET evaluation method.
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_offset_few_regs,uint64_t)140*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_offset_few_regs, uint64_t)
141*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
142*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetData64(0x20000000, 0x60000000);
143*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
144*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
145*eb293b8fSAndroid Build Coastguard Worker   loc_regs[kReturnAddressReg] = DwarfLocation{DWARF_LOCATION_OFFSET, {0x10000000, 0}};
146*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
147*eb293b8fSAndroid Build Coastguard Worker }
148*eb293b8fSAndroid Build Coastguard Worker 
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_offset_many_regs,uint64_t)149*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_offset_many_regs, uint64_t)
150*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
151*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetData64(0x20000000, 0x60000000);
152*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetData64(0x30000000, 0x10000000);
153*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
154*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
155*eb293b8fSAndroid Build Coastguard Worker   for (uint64_t i = 1; i < 64; i++) {
156*eb293b8fSAndroid Build Coastguard Worker     loc_regs[i] = DwarfLocation{DWARF_LOCATION_OFFSET, {0x10000000, 0}};
157*eb293b8fSAndroid Build Coastguard Worker   }
158*eb293b8fSAndroid Build Coastguard Worker   // Read from different place in memory for reg 0 so reg 0 maintains value of 0x10000000
159*eb293b8fSAndroid Build Coastguard Worker   // across multiple calls to Eval.
160*eb293b8fSAndroid Build Coastguard Worker   loc_regs[0] = DwarfLocation{DWARF_LOCATION_OFFSET, {0x20000000, 0}};
161*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
162*eb293b8fSAndroid Build Coastguard Worker }
163*eb293b8fSAndroid Build Coastguard Worker 
164*eb293b8fSAndroid Build Coastguard Worker // Benchmarks exercising Eval with the DWARF_LOCATION_EXPRESSION evaluation method.
165*eb293b8fSAndroid Build Coastguard Worker // The dwarf op-code used for the expression benchmarks are OP_const4u (see DwarfOp::Eval).
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_expression_few_regs,uint64_t)166*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_expression_few_regs, uint64_t)
167*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
168*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x5000, std::vector<uint8_t>{0x0c, 0x00, 0x00, 0x00, 0x80});
169*eb293b8fSAndroid Build Coastguard Worker   uint64_t pc_value = 0x60000000;
170*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x80000000, &pc_value, sizeof(pc_value));
171*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
172*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
173*eb293b8fSAndroid Build Coastguard Worker   loc_regs[kReturnAddressReg] = DwarfLocation{DWARF_LOCATION_EXPRESSION, {0x4, 0x5004}};
174*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
175*eb293b8fSAndroid Build Coastguard Worker }
176*eb293b8fSAndroid Build Coastguard Worker 
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_expression_many_regs,uint64_t)177*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_expression_many_regs, uint64_t)
178*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
179*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x5000, std::vector<uint8_t>{0x0c, 0x00, 0x00, 0x00, 0x80});
180*eb293b8fSAndroid Build Coastguard Worker   uint64_t pc_value = 0x60000000;
181*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x80000000, &pc_value, sizeof(pc_value));
182*eb293b8fSAndroid Build Coastguard Worker 
183*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x6000, std::vector<uint8_t>{0x0c, 0x00, 0x00, 0x00, 0x90});
184*eb293b8fSAndroid Build Coastguard Worker   uint64_t sp_value = 0x10000000;
185*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x90000000, &sp_value, sizeof(sp_value));
186*eb293b8fSAndroid Build Coastguard Worker 
187*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
188*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
189*eb293b8fSAndroid Build Coastguard Worker   for (uint64_t i = 1; i < 64; i++) {
190*eb293b8fSAndroid Build Coastguard Worker     loc_regs[i] = DwarfLocation{DWARF_LOCATION_EXPRESSION, {0x4, 0x5004}};
191*eb293b8fSAndroid Build Coastguard Worker   }
192*eb293b8fSAndroid Build Coastguard Worker   // Read from different place in memory for reg 0 so reg 0 maintains value of 0x10000000
193*eb293b8fSAndroid Build Coastguard Worker   // across multiple calls to Eval.
194*eb293b8fSAndroid Build Coastguard Worker   loc_regs[0] = DwarfLocation{DWARF_LOCATION_EXPRESSION, {0x4, 0x6004}};
195*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
196*eb293b8fSAndroid Build Coastguard Worker }
197*eb293b8fSAndroid Build Coastguard Worker 
198*eb293b8fSAndroid Build Coastguard Worker // Benchmarks exercising Eval with the DWARF_LOCATION_VAL_EXPRESSION evaluation method.
199*eb293b8fSAndroid Build Coastguard Worker // The dwarf op-code used for the value expression benchmarks are OP_const4u (see DwarfOp::Eval).
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_val_expression_few_regs,uint64_t)200*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_val_expression_few_regs, uint64_t)
201*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
202*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x5000, std::vector<uint8_t>{0x0c, 0x00, 0x00, 0x00, 0x60});
203*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
204*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
205*eb293b8fSAndroid Build Coastguard Worker   loc_regs[kReturnAddressReg] = DwarfLocation{DWARF_LOCATION_VAL_EXPRESSION, {0x4, 0x5004}};
206*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
207*eb293b8fSAndroid Build Coastguard Worker }
208*eb293b8fSAndroid Build Coastguard Worker 
BENCHMARK_TEMPLATE_F(EvalBenchmark,BM_eval_val_expression_many_regs,uint64_t)209*eb293b8fSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE_F(EvalBenchmark, BM_eval_val_expression_many_regs, uint64_t)
210*eb293b8fSAndroid Build Coastguard Worker (benchmark::State& state) {
211*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x5000, std::vector<uint8_t>{0x0c, 0x00, 0x00, 0x00, 0x60});
212*eb293b8fSAndroid Build Coastguard Worker   fake_memory_->SetMemory(0x6000, std::vector<uint8_t>{0x0c, 0x00, 0x00, 0x00, 0x10});
213*eb293b8fSAndroid Build Coastguard Worker   DwarfLocations loc_regs;
214*eb293b8fSAndroid Build Coastguard Worker   loc_regs[CFA_REG] = DwarfLocation{DWARF_LOCATION_REGISTER, {0, 0}};
215*eb293b8fSAndroid Build Coastguard Worker   for (uint64_t i = 1; i < 64; i++) {
216*eb293b8fSAndroid Build Coastguard Worker     loc_regs[i] = DwarfLocation{DWARF_LOCATION_VAL_EXPRESSION, {0x4, 0x5004}};
217*eb293b8fSAndroid Build Coastguard Worker   }
218*eb293b8fSAndroid Build Coastguard Worker   // Read from different place in memory for reg 0 so reg 0 maintains value of 0x10000000
219*eb293b8fSAndroid Build Coastguard Worker   // across multiple calls to Eval.
220*eb293b8fSAndroid Build Coastguard Worker   loc_regs[0] = DwarfLocation{DWARF_LOCATION_VAL_EXPRESSION, {0x4, 0x6004}};
221*eb293b8fSAndroid Build Coastguard Worker   RunBenchmark(state, loc_regs);
222*eb293b8fSAndroid Build Coastguard Worker }
223*eb293b8fSAndroid Build Coastguard Worker 
224*eb293b8fSAndroid Build Coastguard Worker }  // namespace
225*eb293b8fSAndroid Build Coastguard Worker }  // namespace unwindstack
226