blob: 1dc9bcb36a5f539e8969f2f2483dde68f08c96a8 [file] [log] [blame]
Jack Carterc1b17ed2013-01-18 21:20:38 +00001//===-- MipsReginfo.cpp - Registerinfo handling --------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8// .reginfo
9// Elf32_Word ri_gprmask
10// Elf32_Word ri_cprmask[4]
11// Elf32_Word ri_gp_value
12//
13// .MIPS.options - N64
14// Elf64_Byte kind (ODK_REGINFO)
15// Elf64_Byte size (40 bytes)
16// Elf64_Section section (0)
17// Elf64_Word info (unused)
18// Elf64_Word ri_gprmask ()
19// Elf64_Word ri_pad ()
20// Elf64_Word[4] ri_cprmask ()
21// Elf64_Addr ri_gp_value ()
22//
23// .MIPS.options - N32
24// Elf32_Byte kind (ODK_REGINFO)
25// Elf32_Byte size (36 bytes)
26// Elf32_Section section (0)
27// Elf32_Word info (unused)
28// Elf32_Word ri_gprmask ()
29// Elf32_Word ri_pad ()
30// Elf32_Word[4] ri_cprmask ()
31// Elf32_Addr ri_gp_value ()
32//
33//===----------------------------------------------------------------------===//
34#include "MCTargetDesc/MipsReginfo.h"
35#include "MipsSubtarget.h"
36#include "MipsTargetObjectFile.h"
37#include "llvm/MC/MCStreamer.h"
38
39using namespace llvm;
40
41// Integrated assembler version
42void
43MipsReginfo::emitMipsReginfoSectionCG(MCStreamer &OS,
44 const TargetLoweringObjectFile &TLOF,
45 const MipsSubtarget &MST) const
46{
47
48 if (OS.hasRawTextSupport())
49 return;
50
51 const MipsTargetObjectFile &TLOFELF =
52 static_cast<const MipsTargetObjectFile &>(TLOF);
53 OS.SwitchSection(TLOFELF.getReginfoSection());
54
55 // .reginfo
56 if (MST.isABI_O32()) {
57 OS.EmitIntValue(0, 4); // ri_gprmask
58 OS.EmitIntValue(0, 4); // ri_cpr[0]mask
59 OS.EmitIntValue(0, 4); // ri_cpr[1]mask
60 OS.EmitIntValue(0, 4); // ri_cpr[2]mask
61 OS.EmitIntValue(0, 4); // ri_cpr[3]mask
62 OS.EmitIntValue(0, 4); // ri_gp_value
63 }
64 // .MIPS.options
65 else if (MST.isABI_N64()) {
66 OS.EmitIntValue(1, 1); // kind
67 OS.EmitIntValue(40, 1); // size
68 OS.EmitIntValue(0, 2); // section
69 OS.EmitIntValue(0, 4); // info
70 OS.EmitIntValue(0, 4); // ri_gprmask
71 OS.EmitIntValue(0, 4); // pad
72 OS.EmitIntValue(0, 4); // ri_cpr[0]mask
73 OS.EmitIntValue(0, 4); // ri_cpr[1]mask
74 OS.EmitIntValue(0, 4); // ri_cpr[2]mask
75 OS.EmitIntValue(0, 4); // ri_cpr[3]mask
76 OS.EmitIntValue(0, 8); // ri_gp_value
77 }
78 else llvm_unreachable("Unsupported abi for reginfo");
79}
80