115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky/* 215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * Copyright (C) 2015 The Android Open Source Project 315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * 415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * Licensed under the Apache License, Version 2.0 (the "License"); 515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * you may not use this file except in compliance with the License. 615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * You may obtain a copy of the License at 715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * 815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * http://www.apache.org/licenses/LICENSE-2.0 915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * 1015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * Unless required by applicable law or agreed to in writing, software 1115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * distributed under the License is distributed on an "AS IS" BASIS, 1215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * See the License for the specific language governing permissions and 1415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky * limitations under the License. 1515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky */ 1615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 174fda4eb799c95be266f52aaf3461a440ea86b841David Srbecky#ifndef ART_COMPILER_DEBUG_DWARF_REGISTER_H_ 184fda4eb799c95be266f52aaf3461a440ea86b841David Srbecky#define ART_COMPILER_DEBUG_DWARF_REGISTER_H_ 1915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 2015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckynamespace art { 2115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckynamespace dwarf { 2215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 2315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky// Represents DWARF register. 2415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbeckyclass Reg { 2515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky public: 2615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky explicit Reg(int reg_num) : num_(reg_num) { } 2715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky int num() const { return num_; } 2815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 2915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky // TODO: Arm S0–S31 register mapping is obsolescent. 3015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky // We should use VFP-v3/Neon D0-D31 mapping instead. 3115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky // However, D0 is aliased to pair of S0 and S1, so using that 3291d65e024846717fce3572106cffe9b957b8902cRoland Levillain // mapping we cannot easily say S0 is spilled and S1 is not. 3315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky // There are ways around this in DWARF but they are complex. 3415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky // It would be much simpler to always spill whole D registers. 3515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky // Arm64 mapping is correct since we already do this there. 368a813f72d21dea87b9e94b686fb35868ad4a88c4David Srbecky // libunwind might struggle with the new mapping as well. 3715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 380fd295f8663e658de429f85f241a142169477335David Srbecky static Reg ArmCore(int num) { return Reg(num); } // R0-R15. 3915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg ArmFp(int num) { return Reg(64 + num); } // S0–S31. 400fd295f8663e658de429f85f241a142169477335David Srbecky static Reg ArmDp(int num) { return Reg(256 + num); } // D0–D31. 410fd295f8663e658de429f85f241a142169477335David Srbecky static Reg Arm64Core(int num) { return Reg(num); } // X0-X31. 4215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg Arm64Fp(int num) { return Reg(64 + num); } // V0-V31. 4315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg MipsCore(int num) { return Reg(num); } 4415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg Mips64Core(int num) { return Reg(num); } 45ba70200c03f0481543877b218a8626c107edfbf6David Srbecky static Reg MipsFp(int num) { return Reg(32 + num); } 46ba70200c03f0481543877b218a8626c107edfbf6David Srbecky static Reg Mips64Fp(int num) { return Reg(32 + num); } 4715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg X86Core(int num) { return Reg(num); } 4815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg X86Fp(int num) { return Reg(21 + num); } 4915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg X86_64Core(int num) { 5015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static const int map[8] = {0, 2, 1, 3, 7, 6, 4, 5}; 5115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky return Reg(num < 8 ? map[num] : num); 5215c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky } 5315c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky static Reg X86_64Fp(int num) { return Reg(17 + num); } 5415c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 5515c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky private: 5615c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky int num_; 5715c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky}; 5815c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 5915c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky} // namespace dwarf 6015c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky} // namespace art 6115c1975f5fa5ae646ae87b57394bfdae1090a236David Srbecky 624fda4eb799c95be266f52aaf3461a440ea86b841David Srbecky#endif // ART_COMPILER_DEBUG_DWARF_REGISTER_H_ 63