Skip to content

Commit be68f35

Browse files
authored
[MC][CodeGen][Mips] Add CodeView mapping (#120877)
Also add support for new relocation types required by debug information. Constants have been taken from CodeView Symbolic Debug Information Specification.
1 parent 3b67383 commit be68f35

File tree

7 files changed

+215
-2
lines changed

7 files changed

+215
-2
lines changed

llvm/include/llvm/DebugInfo/CodeView/CodeViewRegisters.def

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616

1717
#if !defined(CV_REGISTERS_ALL) && !defined(CV_REGISTERS_X86) && \
1818
!defined(CV_REGISTERS_ARM) && \
19-
!defined(CV_REGISTERS_ARM64)
19+
!defined(CV_REGISTERS_ARM64) && \
20+
!defined(CV_REGISTERS_MIPS)
2021
#error Need include at least one register set.
2122
#endif
2223

@@ -793,3 +794,88 @@ CV_REGISTER(ARM64_H31, 301)
793794
#pragma pop_macro("ARM64_FPCR")
794795

795796
#endif // defined(CV_REGISTERS_ALL) || defined(CV_REGISTERS_ARM64)
797+
798+
#if defined(CV_REGISTERS_ALL) || defined(CV_REGISTERS_MIPS)
799+
800+
// MIPS registers
801+
CV_REGISTER(MIPS_NOREG, 0)
802+
803+
// General purpose integer registers
804+
805+
CV_REGISTER(MIPS_ZERO, 10)
806+
CV_REGISTER(MIPS_AT, 11)
807+
CV_REGISTER(MIPS_V0, 12)
808+
CV_REGISTER(MIPS_V1, 13)
809+
CV_REGISTER(MIPS_A0, 14)
810+
CV_REGISTER(MIPS_A1, 15)
811+
CV_REGISTER(MIPS_A2, 16)
812+
CV_REGISTER(MIPS_A3, 17)
813+
CV_REGISTER(MIPS_T0, 18)
814+
CV_REGISTER(MIPS_T1, 19)
815+
CV_REGISTER(MIPS_T2, 20)
816+
CV_REGISTER(MIPS_T3, 21)
817+
CV_REGISTER(MIPS_T4, 22)
818+
CV_REGISTER(MIPS_T5, 23)
819+
CV_REGISTER(MIPS_T6, 24)
820+
CV_REGISTER(MIPS_T7, 25)
821+
CV_REGISTER(MIPS_S0, 26)
822+
CV_REGISTER(MIPS_S1, 27)
823+
CV_REGISTER(MIPS_S2, 28)
824+
CV_REGISTER(MIPS_S3, 29)
825+
CV_REGISTER(MIPS_S4, 30)
826+
CV_REGISTER(MIPS_S5, 31)
827+
CV_REGISTER(MIPS_S6, 32)
828+
CV_REGISTER(MIPS_S7, 33)
829+
CV_REGISTER(MIPS_T8, 34)
830+
CV_REGISTER(MIPS_T9, 35)
831+
CV_REGISTER(MIPS_K0, 36)
832+
CV_REGISTER(MIPS_K1, 37)
833+
CV_REGISTER(MIPS_GP, 38)
834+
CV_REGISTER(MIPS_SP, 39)
835+
CV_REGISTER(MIPS_S8, 40)
836+
CV_REGISTER(MIPS_RA, 41)
837+
CV_REGISTER(MIPS_LO, 42)
838+
CV_REGISTER(MIPS_HI, 43)
839+
840+
// Status registers
841+
842+
CV_REGISTER(MIPS_Fir, 50)
843+
CV_REGISTER(MIPS_Psr, 51)
844+
845+
// Floating-point registers
846+
847+
CV_REGISTER(MIPS_F0, 60)
848+
CV_REGISTER(MIPS_F1, 61)
849+
CV_REGISTER(MIPS_F2, 62)
850+
CV_REGISTER(MIPS_F3, 63)
851+
CV_REGISTER(MIPS_F4, 64)
852+
CV_REGISTER(MIPS_F5, 65)
853+
CV_REGISTER(MIPS_F6, 66)
854+
CV_REGISTER(MIPS_F7, 67)
855+
CV_REGISTER(MIPS_F8, 68)
856+
CV_REGISTER(MIPS_F9, 69)
857+
CV_REGISTER(MIPS_F10, 70)
858+
CV_REGISTER(MIPS_F11, 71)
859+
CV_REGISTER(MIPS_F12, 72)
860+
CV_REGISTER(MIPS_F13, 73)
861+
CV_REGISTER(MIPS_F14, 74)
862+
CV_REGISTER(MIPS_F15, 75)
863+
CV_REGISTER(MIPS_F16, 76)
864+
CV_REGISTER(MIPS_F17, 77)
865+
CV_REGISTER(MIPS_F18, 78)
866+
CV_REGISTER(MIPS_F19, 79)
867+
CV_REGISTER(MIPS_F20, 80)
868+
CV_REGISTER(MIPS_F21, 81)
869+
CV_REGISTER(MIPS_F22, 82)
870+
CV_REGISTER(MIPS_F23, 83)
871+
CV_REGISTER(MIPS_F24, 84)
872+
CV_REGISTER(MIPS_F25, 85)
873+
CV_REGISTER(MIPS_F26, 86)
874+
CV_REGISTER(MIPS_F27, 87)
875+
CV_REGISTER(MIPS_F28, 88)
876+
CV_REGISTER(MIPS_F29, 89)
877+
CV_REGISTER(MIPS_F30, 90)
878+
CV_REGISTER(MIPS_F31, 91)
879+
CV_REGISTER(MIPS_Fsr, 92)
880+
881+
#endif // defined(CV_REGISTERS_ALL) || defined(CV_REGISTERS_MIPS)

llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ static CPUType mapArchToCVCPUType(Triple::ArchType Type) {
123123
return CPUType::ARMNT;
124124
case Triple::ArchType::aarch64:
125125
return CPUType::ARM64;
126+
case Triple::ArchType::mipsel:
127+
return CPUType::MIPS;
126128
default:
127129
report_fatal_error("target architecture doesn't map to a CodeView CPUType");
128130
}

llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "MipsMCNaCl.h"
2020
#include "MipsTargetStreamer.h"
2121
#include "TargetInfo/MipsTargetInfo.h"
22+
#include "llvm/DebugInfo/CodeView/CodeView.h"
2223
#include "llvm/MC/MCCodeEmitter.h"
2324
#include "llvm/MC/MCELFStreamer.h"
2425
#include "llvm/MC/MCInstrAnalysis.h"
@@ -44,6 +45,86 @@ using namespace llvm;
4445
#define GET_REGINFO_MC_DESC
4546
#include "MipsGenRegisterInfo.inc"
4647

48+
void MIPS_MC::initLLVMToCVRegMapping(MCRegisterInfo *MRI) {
49+
// Mapping from CodeView to MC register id.
50+
static const struct {
51+
codeview::RegisterId CVReg;
52+
MCPhysReg Reg;
53+
} RegMap[] = {
54+
{codeview::RegisterId::MIPS_ZERO, Mips::ZERO},
55+
{codeview::RegisterId::MIPS_AT, Mips::AT},
56+
{codeview::RegisterId::MIPS_V0, Mips::V0},
57+
{codeview::RegisterId::MIPS_V1, Mips::V1},
58+
{codeview::RegisterId::MIPS_A0, Mips::A0},
59+
{codeview::RegisterId::MIPS_A1, Mips::A1},
60+
{codeview::RegisterId::MIPS_A2, Mips::A2},
61+
{codeview::RegisterId::MIPS_A3, Mips::A3},
62+
{codeview::RegisterId::MIPS_T0, Mips::T0},
63+
{codeview::RegisterId::MIPS_T1, Mips::T1},
64+
{codeview::RegisterId::MIPS_T2, Mips::T2},
65+
{codeview::RegisterId::MIPS_T3, Mips::T3},
66+
{codeview::RegisterId::MIPS_T4, Mips::T4},
67+
{codeview::RegisterId::MIPS_T5, Mips::T5},
68+
{codeview::RegisterId::MIPS_T6, Mips::T6},
69+
{codeview::RegisterId::MIPS_T7, Mips::T7},
70+
{codeview::RegisterId::MIPS_S0, Mips::S0},
71+
{codeview::RegisterId::MIPS_S1, Mips::S1},
72+
{codeview::RegisterId::MIPS_S2, Mips::S2},
73+
{codeview::RegisterId::MIPS_S3, Mips::S3},
74+
{codeview::RegisterId::MIPS_S4, Mips::S4},
75+
{codeview::RegisterId::MIPS_S5, Mips::S5},
76+
{codeview::RegisterId::MIPS_S6, Mips::S6},
77+
{codeview::RegisterId::MIPS_S7, Mips::S7},
78+
{codeview::RegisterId::MIPS_T8, Mips::T8},
79+
{codeview::RegisterId::MIPS_T9, Mips::T9},
80+
{codeview::RegisterId::MIPS_K0, Mips::K0},
81+
{codeview::RegisterId::MIPS_K1, Mips::K1},
82+
{codeview::RegisterId::MIPS_GP, Mips::GP},
83+
{codeview::RegisterId::MIPS_SP, Mips::SP},
84+
{codeview::RegisterId::MIPS_S8, Mips::FP},
85+
{codeview::RegisterId::MIPS_RA, Mips::RA},
86+
{codeview::RegisterId::MIPS_LO, Mips::HI0},
87+
{codeview::RegisterId::MIPS_HI, Mips::LO0},
88+
{codeview::RegisterId::MIPS_Fir, Mips::FCR0},
89+
{codeview::RegisterId::MIPS_Psr, Mips::COP012}, // CP0.Status
90+
{codeview::RegisterId::MIPS_F0, Mips::F0},
91+
{codeview::RegisterId::MIPS_F1, Mips::F1},
92+
{codeview::RegisterId::MIPS_F2, Mips::F2},
93+
{codeview::RegisterId::MIPS_F3, Mips::F3},
94+
{codeview::RegisterId::MIPS_F4, Mips::F4},
95+
{codeview::RegisterId::MIPS_F5, Mips::F5},
96+
{codeview::RegisterId::MIPS_F6, Mips::F6},
97+
{codeview::RegisterId::MIPS_F7, Mips::F7},
98+
{codeview::RegisterId::MIPS_F8, Mips::F8},
99+
{codeview::RegisterId::MIPS_F9, Mips::F9},
100+
{codeview::RegisterId::MIPS_F10, Mips::F10},
101+
{codeview::RegisterId::MIPS_F11, Mips::F11},
102+
{codeview::RegisterId::MIPS_F12, Mips::F12},
103+
{codeview::RegisterId::MIPS_F13, Mips::F13},
104+
{codeview::RegisterId::MIPS_F14, Mips::F14},
105+
{codeview::RegisterId::MIPS_F15, Mips::F15},
106+
{codeview::RegisterId::MIPS_F16, Mips::F16},
107+
{codeview::RegisterId::MIPS_F17, Mips::F17},
108+
{codeview::RegisterId::MIPS_F18, Mips::F18},
109+
{codeview::RegisterId::MIPS_F19, Mips::F19},
110+
{codeview::RegisterId::MIPS_F20, Mips::F20},
111+
{codeview::RegisterId::MIPS_F21, Mips::F21},
112+
{codeview::RegisterId::MIPS_F22, Mips::F22},
113+
{codeview::RegisterId::MIPS_F23, Mips::F23},
114+
{codeview::RegisterId::MIPS_F24, Mips::F24},
115+
{codeview::RegisterId::MIPS_F25, Mips::F25},
116+
{codeview::RegisterId::MIPS_F26, Mips::F26},
117+
{codeview::RegisterId::MIPS_F27, Mips::F27},
118+
{codeview::RegisterId::MIPS_F28, Mips::F28},
119+
{codeview::RegisterId::MIPS_F29, Mips::F29},
120+
{codeview::RegisterId::MIPS_F30, Mips::F30},
121+
{codeview::RegisterId::MIPS_F31, Mips::F31},
122+
{codeview::RegisterId::MIPS_Fsr, Mips::FCR31},
123+
};
124+
for (const auto &I : RegMap)
125+
MRI->mapLLVMRegToCVReg(I.Reg, static_cast<int>(I.CVReg));
126+
}
127+
47128
namespace {
48129
class MipsWinCOFFTargetStreamer : public MipsTargetStreamer {
49130
public:

llvm/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ createMipsELFObjectWriter(const Triple &TT, bool IsN32);
5757
std::unique_ptr<MCObjectTargetWriter> createMipsWinCOFFObjectWriter();
5858

5959
namespace MIPS_MC {
60+
void initLLVMToCVRegMapping(MCRegisterInfo *MRI);
61+
6062
StringRef selectMipsCPU(const Triple &TT, StringRef CPU);
6163
}
6264

llvm/lib/Target/Mips/MCTargetDesc/MipsWinCOFFObjectWriter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ unsigned MipsWinCOFFObjectWriter::getRelocType(MCContext &Ctx,
4040
switch (FixupKind) {
4141
case FK_Data_4:
4242
return COFF::IMAGE_REL_MIPS_REFWORD;
43+
case FK_SecRel_2:
44+
return COFF::IMAGE_REL_MIPS_SECTION;
45+
case FK_SecRel_4:
46+
return COFF::IMAGE_REL_MIPS_SECREL;
4347
case Mips::fixup_Mips_26:
4448
return COFF::IMAGE_REL_MIPS_JMPADDR;
4549
case Mips::fixup_Mips_HI16:

llvm/lib/Target/Mips/MipsRegisterInfo.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ using namespace llvm;
3737
#define GET_REGINFO_TARGET_DESC
3838
#include "MipsGenRegisterInfo.inc"
3939

40-
MipsRegisterInfo::MipsRegisterInfo() : MipsGenRegisterInfo(Mips::RA) {}
40+
MipsRegisterInfo::MipsRegisterInfo() : MipsGenRegisterInfo(Mips::RA) {
41+
MIPS_MC::initLLVMToCVRegMapping(this);
42+
}
4143

4244
unsigned MipsRegisterInfo::getPICCallReg() { return Mips::T9; }
4345

llvm/test/MC/Mips/coff-relocs.ll

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,39 @@ define i32 @foo_var() {
4343
; CHECK: - VirtualAddress: 0
4444
; CHECK: SymbolName: var2
4545
; CHECK: Type: IMAGE_REL_MIPS_REFWORD
46+
47+
48+
49+
50+
; CHECK: - Name: '.debug$S'
51+
; CHECK: Relocations:
52+
53+
!llvm.dbg.cu = !{!0}
54+
!llvm.module.flags = !{!2, !3, !4}
55+
56+
!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, emissionKind: FullDebug)
57+
!1 = !DIFile(filename: "dummy.c", directory: "/tmp/private")
58+
!2 = !{i32 2, !"CodeView", i32 1}
59+
!3 = !{i32 2, !"Debug Info Version", i32 3}
60+
!4 = !{i32 1, !"wchar_size", i32 2}
61+
!5 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !6, scopeLine: 2, spFlags: DISPFlagDefinition, unit: !0)
62+
!6 = !DISubroutineType(types: !7)
63+
!7 = !{null}
64+
!8 = !DILocation(line: 3, scope: !5)
65+
66+
define dso_local void @foo_dbg() #0 !dbg !5 {
67+
ret void, !dbg !8
68+
; CHECK: - VirtualAddress: 92
69+
; CHECK: SymbolName: foo_dbg
70+
; CHECK: Type: IMAGE_REL_MIPS_SECREL
71+
; CHECK: - VirtualAddress: 96
72+
; CHECK: SymbolName: foo_dbg
73+
; CHECK: Type: IMAGE_REL_MIPS_SECTION
74+
; CHECK: - VirtualAddress: 148
75+
; CHECK: SymbolName: foo_dbg
76+
; CHECK: Type: IMAGE_REL_MIPS_SECREL
77+
; CHECK: - VirtualAddress: 152
78+
; CHECK: SymbolName: foo_dbg
79+
; CHECK: Type: IMAGE_REL_MIPS_SECTION
80+
}
81+

0 commit comments

Comments
 (0)