Skip to content

Commit

Permalink
Initial patch for x32 ABI support.
Browse files Browse the repository at this point in the history
Add the x32 environment kind to the triple, and separate the concept of
pointer size and callee save stack slot size, since they're not equal
on x32.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173175 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
eliben committed Jan 22, 2013
1 parent 91df03b commit 9dd2a3b
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 5 deletions.
1 change: 1 addition & 0 deletions include/llvm/ADT/Triple.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ class Triple {
GNU,
GNUEABI,
GNUEABIHF,
GNUX32,
EABI,
MachO,
Android,
Expand Down
18 changes: 17 additions & 1 deletion include/llvm/MC/MCAsmInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ namespace llvm {
/// Default is 4.
unsigned PointerSize;

/// CalleeSaveStackSlotSize - Size of the stack slot reserved for
/// callee-saved registers, in bytes.
/// Default is same as pointer size.
unsigned CalleeSaveStackSlotSize;

/// IsLittleEndian - True if target is little endian.
/// Default is true.
bool IsLittleEndian;
Expand Down Expand Up @@ -343,7 +348,18 @@ namespace llvm {
return PointerSize;
}

/// islittleendian - True if the target is little endian.
/// getCalleeSaveStackSlotSize - Get the callee-saved register stack slot
/// size in bytes.
unsigned getCalleeSaveStackSlotSize() const {
// If a target doesn't explicitly initialize this member, PointerSize is
// used by default.
if (CalleeSaveStackSlotSize == 0)
return PointerSize;
else
return CalleeSaveStackSlotSize;
}

/// isLittleEndian - True if the target is little endian.
bool isLittleEndian() const {
return IsLittleEndian;
}
Expand Down
2 changes: 2 additions & 0 deletions lib/MC/MCAsmInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ using namespace llvm;

MCAsmInfo::MCAsmInfo() {
PointerSize = 4;
CalleeSaveStackSlotSize = 0; // 0 means PointerSize is used in getter.

IsLittleEndian = true;
StackGrowsUp = false;
HasSubsectionsViaSymbols = false;
Expand Down
2 changes: 1 addition & 1 deletion lib/MC/MCDwarf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,7 @@ void MCGenDwarfLabelEntry::Make(MCSymbol *Symbol, MCStreamer *MCOS,
static int getDataAlignmentFactor(MCStreamer &streamer) {
MCContext &context = streamer.getContext();
const MCAsmInfo &asmInfo = context.getAsmInfo();
int size = asmInfo.getPointerSize();
int size = asmInfo.getCalleeSaveStackSlotSize();
if (asmInfo.isStackGrowthDirectionUp())
return size;
else
Expand Down
2 changes: 2 additions & 0 deletions lib/Support/Triple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
case GNU: return "gnu";
case GNUEABIHF: return "gnueabihf";
case GNUEABI: return "gnueabi";
case GNUX32: return "gnux32";
case EABI: return "eabi";
case MachO: return "macho";
case Android: return "android";
Expand Down Expand Up @@ -284,6 +285,7 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
.StartsWith("eabi", Triple::EABI)
.StartsWith("gnueabihf", Triple::GNUEABIHF)
.StartsWith("gnueabi", Triple::GNUEABI)
.StartsWith("gnux32", Triple::GNUX32)
.StartsWith("gnu", Triple::GNU)
.StartsWith("macho", Triple::MachO)
.StartsWith("android", Triple::Android)
Expand Down
14 changes: 11 additions & 3 deletions lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void X86MCAsmInfoDarwin::anchor() { }
X86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &T) {
bool is64Bit = T.getArch() == Triple::x86_64;
if (is64Bit)
PointerSize = 8;
PointerSize = CalleeSaveStackSlotSize = 8;

AssemblerDialect = AsmWriterFlavor;

Expand Down Expand Up @@ -76,8 +76,16 @@ X86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple)
void X86ELFMCAsmInfo::anchor() { }

X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) {
if (T.getArch() == Triple::x86_64)
PointerSize = 8;
bool is64Bit = T.getArch() == Triple::x86_64;
bool isX32 = T.getEnvironment() == Triple::GNUX32;

// For ELF, x86-64 pointer size depends on the ABI.
// For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64
// with the x32 ABI, pointer size remains the default 4.
PointerSize = (is64Bit && !isX32) ? 8 : 4;

// OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI.
CalleeSaveStackSlotSize = is64Bit ? 8 : 4;

AssemblerDialect = AsmWriterFlavor;

Expand Down

0 comments on commit 9dd2a3b

Please sign in to comment.