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; }