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