[mips] Fix ELF header flags.
authorMatheus Almeida <matheus.almeida@imgtec.com>
Tue, 28 Jan 2014 19:24:11 +0000 (19:24 +0000)
committerMatheus Almeida <matheus.almeida@imgtec.com>
Tue, 28 Jan 2014 19:24:11 +0000 (19:24 +0000)
As opposed to GCC/GAS the default ABI for Mips64 is n64.
Compatibility bit should be set if o32 ABI is used when targeting Mips64.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200332 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
test/MC/Mips/elf_eflags.s

index 0dec292908ef7c46648a37f0135c22baad569e4d..41b8ad6b96b8db1f353013de5e0c6b3a7572744c 100644 (file)
@@ -137,7 +137,14 @@ MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
     EFlags |= ELF::EF_MIPS_ARCH_32;
 
   if (T.isArch64Bit()) {
-    EFlags |= ELF::EF_MIPS_ABI2;
+    if (Features & Mips::FeatureN32)
+      EFlags |= ELF::EF_MIPS_ABI2;
+    else if (Features & Mips::FeatureO32) {
+      EFlags |= ELF::EF_MIPS_ABI_O32;
+      EFlags |= ELF::EF_MIPS_32BITMODE; /* Compatibility Mode */
+    }
+    // No need to set any bit for N64 which is the default ABI at the moment
+    // for 64-bit Mips architectures.
   } else {
     if (Features & Mips::FeatureMips64r2 || Features & Mips::FeatureMips64)
       EFlags |= ELF::EF_MIPS_32BITMODE;
index c8fb20330d7eb556fe6c4cd33df5f94b5d0b0511..7a497785d2d04bdac6e49d7a4608cbe612f1ef7f 100644 (file)
 # RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux -mcpu=mips32 %s -o -| llvm-readobj -h | FileCheck --check-prefix=MIPSEL-MIPS32 %s
 # MIPSEL-MIPS32: Flags [ (0x50001000)
 
+# RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64r2 -mattr=n32 %s -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64R2-N32 %s
+# MIPS64EL-MIPS64R2-N32: Flags [ (0x80000020)
+
+# RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64 -mattr=n32 %s -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64-N32 %s
+# MIPS64EL-MIPS64-N32: Flags [ (0x60000020)
+
+# RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64r2 -mattr=n64 %s -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64R2-N64 %s
+# MIPS64EL-MIPS64R2-N64: Flags [ (0x80000000)
+
+# RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64 %s -mattr=n64 -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64-N64 %s
+# MIPS64EL-MIPS64-N64: Flags [ (0x60000000)
+
+# RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64r2 -mattr=o32 %s -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64R2-O32 %s
+# MIPS64EL-MIPS64R2-O32: Flags [ (0x80001100)
+
+# RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64 %s -mattr=o32 -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64-O32 %s
+# MIPS64EL-MIPS64-O32: Flags [ (0x60001100)
+       
+# Default ABI for MIPS64 is N64 as opposed to GCC/GAS (N32)
 # RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64r2 %s -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64R2 %s
-# MIPS64EL-MIPS64R2: Flags [ (0x80000020)
+# MIPS64EL-MIPS64R2: Flags [ (0x80000000)
 
+# Default ABI for MIPS64 is N64 as opposed to GCC/GAS (N32)
 # RUN: llvm-mc -filetype=obj -triple mips64el-unknown-linux -mcpu=mips64 %s -o -| llvm-readobj -h | FileCheck --check-prefix=MIPS64EL-MIPS64 %s
-# MIPS64EL-MIPS64: Flags [ (0x60000020)
+# MIPS64EL-MIPS64: Flags [ (0x60000000)