static std::string computeDataLayout(const MipsSubtarget &ST) { std::string Ret = ""; // There are both little and big endian mips. if (ST.isLittle()) Ret += "e"; else Ret += "E"; Ret += "-m:m"; // Pointers are 32 bit on some ABIs. if (!ST.isABI_N64()) Ret += "-p:32:32"; // 8 and 16 bit integers only need no have natural alignment, but try to // align them to 32 bits. 64 bit integers have natural alignment. Ret += "-i8:8:32-i16:16:32-i64:64"; // 32 bit registers are always available and the stack is at least 64 bit // aligned. On N64 64 bit registers are also available and the stack is // 128 bit aligned. if (ST.isABI_N64() || ST.isABI_N32()) Ret += "-n32:64-S128"; else Ret += "-n32-S64"; return Ret; }
// Integrated assembler version void MipsReginfo::emitMipsReginfoSectionCG(MCStreamer &OS, const TargetLoweringObjectFile &TLOF, const MipsSubtarget &MST) const { if (OS.hasRawTextSupport()) return; const MipsTargetObjectFile &TLOFELF = static_cast<const MipsTargetObjectFile &>(TLOF); OS.SwitchSection(TLOFELF.getReginfoSection()); // .reginfo if (MST.isABI_O32()) { OS.EmitIntValue(0, 4); // ri_gprmask OS.EmitIntValue(0, 4); // ri_cpr[0]mask OS.EmitIntValue(0, 4); // ri_cpr[1]mask OS.EmitIntValue(0, 4); // ri_cpr[2]mask OS.EmitIntValue(0, 4); // ri_cpr[3]mask OS.EmitIntValue(0, 4); // ri_gp_value } // .MIPS.options else if (MST.isABI_N64()) { OS.EmitIntValue(1, 1); // kind OS.EmitIntValue(40, 1); // size OS.EmitIntValue(0, 2); // section OS.EmitIntValue(0, 4); // info OS.EmitIntValue(0, 4); // ri_gprmask OS.EmitIntValue(0, 4); // pad OS.EmitIntValue(0, 4); // ri_cpr[0]mask OS.EmitIntValue(0, 4); // ri_cpr[1]mask OS.EmitIntValue(0, 4); // ri_cpr[2]mask OS.EmitIntValue(0, 4); // ri_cpr[3]mask OS.EmitIntValue(0, 8); // ri_gp_value } else llvm_unreachable("Unsupported abi for reginfo"); }