X86RegisterInfo::X86RegisterInfo(const X86Subtarget &STI) : X86GenRegisterInfo( (STI.is64Bit() ? X86::RIP : X86::EIP), X86_MC::getDwarfRegFlavour(STI.getTargetTriple(), false), X86_MC::getDwarfRegFlavour(STI.getTargetTriple(), true), (STI.is64Bit() ? X86::RIP : X86::EIP)), Subtarget(STI) { X86_MC::InitLLVM2SEHRegisterMapping(this); // Cache some information. Is64Bit = Subtarget.is64Bit(); IsWin64 = Subtarget.isTargetWin64(); if (Is64Bit) { SlotSize = 8; StackPtr = (Subtarget.isTarget64BitLP64() || Subtarget.isTargetNaCl64()) ? X86::RSP : X86::ESP; FramePtr = (Subtarget.isTarget64BitLP64() || Subtarget.isTargetNaCl64()) ? X86::RBP : X86::EBP; } else { SlotSize = 4; StackPtr = X86::ESP; FramePtr = X86::EBP; } // Use a callee-saved register as the base pointer. These registers must // not conflict with any ABI requirements. For example, in 32-bit mode PIC // requires GOT in the EBX register before function calls via PLT GOT pointer. BasePtr = Is64Bit ? X86::RBX : X86::ESI; }
static std::string computeDataLayout(const X86Subtarget &ST) { // X86 is little endian std::string Ret = "e"; Ret += DataLayout::getManglingComponent(ST.getTargetTriple()); // X86 and x32 have 32 bit pointers. if (ST.isTarget64BitILP32() || !ST.is64Bit()) Ret += "-p:32:32"; // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32. if (ST.is64Bit() || ST.isTargetCygMing() || ST.isTargetWindows() || ST.isTargetNaCl()) Ret += "-i64:64"; else Ret += "-f64:32:64"; // Some ABIs align long double to 128 bits, others to 32. if (ST.isTargetNaCl()) ; // No f80 else if (ST.is64Bit() || ST.isTargetDarwin()) Ret += "-f80:128"; else Ret += "-f80:32"; // The registers can hold 8, 16, 32 or, in x86-64, 64 bits. if (ST.is64Bit()) Ret += "-n8:16:32:64"; else Ret += "-n8:16:32"; // The stack is aligned to 32 bits on some ABIs and 128 bits on others. if (!ST.is64Bit() && (ST.isTargetCygMing() || ST.isTargetWindows())) Ret += "-S32"; else Ret += "-S128"; return Ret; }
static unsigned getRetOpcode(const X86Subtarget &Subtarget) { return Subtarget.is64Bit() ? X86::RETQ : X86::RETL; }