1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_LIBELFFILE_DWARF_REGISTER_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_LIBELFFILE_DWARF_REGISTER_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker namespace art { 21*795d594fSAndroid Build Coastguard Worker namespace dwarf { 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker // Represents DWARF register. 24*795d594fSAndroid Build Coastguard Worker class Reg { 25*795d594fSAndroid Build Coastguard Worker public: Reg(int reg_num)26*795d594fSAndroid Build Coastguard Worker explicit Reg(int reg_num) : num_(reg_num) { } num()27*795d594fSAndroid Build Coastguard Worker int num() const { return num_; } 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker // TODO: Arm S0–S31 register mapping is obsolescent. 30*795d594fSAndroid Build Coastguard Worker // We should use VFP-v3/Neon D0-D31 mapping instead. 31*795d594fSAndroid Build Coastguard Worker // However, D0 is aliased to pair of S0 and S1, so using that 32*795d594fSAndroid Build Coastguard Worker // mapping we cannot easily say S0 is spilled and S1 is not. 33*795d594fSAndroid Build Coastguard Worker // There are ways around this in DWARF but they are complex. 34*795d594fSAndroid Build Coastguard Worker // It would be much simpler to always spill whole D registers. 35*795d594fSAndroid Build Coastguard Worker // Arm64 mapping is correct since we already do this there. 36*795d594fSAndroid Build Coastguard Worker // libunwind might struggle with the new mapping as well. 37*795d594fSAndroid Build Coastguard Worker ArmCore(int num)38*795d594fSAndroid Build Coastguard Worker static Reg ArmCore(int num) { return Reg(num); } // R0-R15. ArmFp(int num)39*795d594fSAndroid Build Coastguard Worker static Reg ArmFp(int num) { return Reg(64 + num); } // S0–S31. ArmDp(int num)40*795d594fSAndroid Build Coastguard Worker static Reg ArmDp(int num) { return Reg(256 + num); } // D0–D31. Arm64Core(int num)41*795d594fSAndroid Build Coastguard Worker static Reg Arm64Core(int num) { return Reg(num); } // X0-X31. Arm64Fp(int num)42*795d594fSAndroid Build Coastguard Worker static Reg Arm64Fp(int num) { return Reg(64 + num); } // V0-V31. Riscv64Core(int num)43*795d594fSAndroid Build Coastguard Worker static Reg Riscv64Core(int num) { return Reg(num); } // X0-X31 Riscv64Fp(int num)44*795d594fSAndroid Build Coastguard Worker static Reg Riscv64Fp(int num) { return Reg(32 + num); } // F0-F31 X86Core(int num)45*795d594fSAndroid Build Coastguard Worker static Reg X86Core(int num) { return Reg(num); } X86Fp(int num)46*795d594fSAndroid Build Coastguard Worker static Reg X86Fp(int num) { return Reg(21 + num); } X86_64Core(int num)47*795d594fSAndroid Build Coastguard Worker static Reg X86_64Core(int num) { 48*795d594fSAndroid Build Coastguard Worker static const int map[8] = {0, 2, 1, 3, 7, 6, 4, 5}; 49*795d594fSAndroid Build Coastguard Worker return Reg(num < 8 ? map[num] : num); 50*795d594fSAndroid Build Coastguard Worker } X86_64Fp(int num)51*795d594fSAndroid Build Coastguard Worker static Reg X86_64Fp(int num) { return Reg(17 + num); } 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker private: 54*795d594fSAndroid Build Coastguard Worker int num_; 55*795d594fSAndroid Build Coastguard Worker }; 56*795d594fSAndroid Build Coastguard Worker 57*795d594fSAndroid Build Coastguard Worker } // namespace dwarf 58*795d594fSAndroid Build Coastguard Worker } // namespace art 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker #endif // ART_LIBELFFILE_DWARF_REGISTER_H_ 61