<div dir="ltr">Of course I know it's not your fault, but I have to say that the MIPS ABI seems really odd.<div><br></div><div>I did a quick grep on gold source code but couldn't find code to do the same thing. It makes me wonder if other linkers do this.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 10, 2016 at 8:06 AM, Simon Atanasyan via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: atanasyan<br>
Date: Wed Aug 10 10:06:45 2016<br>
New Revision: 278230<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=278230&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=278230&view=rev</a><br>
Log:<br>
[ELF][MIPS] Take into account combination of EF_MIPS_ARCH and EF_MIPS_MACH flags while checking ISA compatibility<br>
<br>
MIPS ISA encoded using two ELF flags: general architecture flag like<br>
EF_MIPS_ARCH_32, EF_MIPS_ARCH_64R6 etc and optional machine variant flag<br>
like EF_MIPS_MACH_4111, EF_MIPS_MACH_OCTEON3 etc. When we check<br>
compatibility between two input files and deduce ELF flags for generated<br>
output we need to take into account both of these flags.<br>
<br>
Modified:<br>
    lld/trunk/ELF/Mips.cpp<br>
    lld/trunk/test/ELF/mips-elf-<wbr>flags-err.s<br>
<br>
Modified: lld/trunk/ELF/Mips.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Mips.cpp?rev=278230&r1=278229&r2=278230&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/Mips.<wbr>cpp?rev=278230&r1=278229&r2=<wbr>278230&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/Mips.cpp (original)<br>
+++ lld/trunk/ELF/Mips.cpp Wed Aug 10 10:06:45 2016<br>
@@ -119,13 +119,33 @@ static uint32_t getPicFlags(ArrayRef<Fil<br>
<br>
 static ArchTreeEdge ArchTree[] = {<br>
     // MIPS32R6 and MIPS64R6 are not compatible with other extensions<br>
+    // MIPS64R2 extensions.<br>
+    {EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON3, EF_MIPS_ARCH_64R2},<br>
+    {EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON2, EF_MIPS_ARCH_64R2},<br>
+    {EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON, EF_MIPS_ARCH_64R2},<br>
+    {EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_LS3A, EF_MIPS_ARCH_64R2},<br>
     // MIPS64 extensions.<br>
+    {EF_MIPS_ARCH_64 | EF_MIPS_MACH_SB1, EF_MIPS_ARCH_64},<br>
+    {EF_MIPS_ARCH_64 | EF_MIPS_MACH_XLR, EF_MIPS_ARCH_64},<br>
     {EF_MIPS_ARCH_64R2, EF_MIPS_ARCH_64},<br>
     // MIPS V extensions.<br>
     {EF_MIPS_ARCH_64, EF_MIPS_ARCH_5},<br>
+    // R5000 extensions.<br>
+    {EF_MIPS_ARCH_4 | EF_MIPS_MACH_5500, EF_MIPS_ARCH_4 | EF_MIPS_MACH_5400},<br>
     // MIPS IV extensions.<br>
+    {EF_MIPS_ARCH_4 | EF_MIPS_MACH_5400, EF_MIPS_ARCH_4},<br>
+    {EF_MIPS_ARCH_4 | EF_MIPS_MACH_9000, EF_MIPS_ARCH_4},<br>
     {EF_MIPS_ARCH_5, EF_MIPS_ARCH_4},<br>
+    // VR4100 extensions.<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_4111, EF_MIPS_ARCH_3 | EF_MIPS_MACH_4100},<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_4120, EF_MIPS_ARCH_3 | EF_MIPS_MACH_4100},<br>
     // MIPS III extensions.<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_4010, EF_MIPS_ARCH_3},<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_4100, EF_MIPS_ARCH_3},<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_4650, EF_MIPS_ARCH_3},<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_5900, EF_MIPS_ARCH_3},<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2E, EF_MIPS_ARCH_3},<br>
+    {EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2F, EF_MIPS_ARCH_3},<br>
     {EF_MIPS_ARCH_4, EF_MIPS_ARCH_3},<br>
     // MIPS32 extensions.<br>
     {EF_MIPS_ARCH_32R2, EF_MIPS_ARCH_32},<br>
@@ -133,6 +153,7 @@ static ArchTreeEdge ArchTree[] = {<br>
     {EF_MIPS_ARCH_3, EF_MIPS_ARCH_2},<br>
     {EF_MIPS_ARCH_32, EF_MIPS_ARCH_2},<br>
     // MIPS I extensions.<br>
+    {EF_MIPS_ARCH_1 | EF_MIPS_MACH_3900, EF_MIPS_ARCH_1},<br>
     {EF_MIPS_ARCH_2, EF_MIPS_ARCH_1},<br>
 };<br>
<br>
@@ -183,10 +204,10 @@ static StringRef getArchName(uint32_t Fl<br>
 }<br>
<br>
 static uint32_t getArchFlags(ArrayRef<<wbr>FileFlags> Files) {<br>
-  uint32_t Ret = Files[0].Flags & EF_MIPS_ARCH;<br>
+  uint32_t Ret = Files[0].Flags & (EF_MIPS_ARCH | EF_MIPS_MACH);<br>
<br>
   for (const FileFlags &F : Files.slice(1)) {<br>
-    uint32_t New = F.Flags & EF_MIPS_ARCH;<br>
+    uint32_t New = F.Flags & (EF_MIPS_ARCH | EF_MIPS_MACH);<br>
<br>
     // Check ISA compatibility.<br>
     if (isArchMatched(New, Ret))<br>
<br>
Modified: lld/trunk/test/ELF/mips-elf-<wbr>flags-err.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/mips-elf-flags-err.s?rev=278230&r1=278229&r2=278230&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/ELF/<wbr>mips-elf-flags-err.s?rev=<wbr>278230&r1=278229&r2=278230&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/ELF/mips-elf-<wbr>flags-err.s (original)<br>
+++ lld/trunk/test/ELF/mips-elf-<wbr>flags-err.s Wed Aug 10 10:06:45 2016<br>
@@ -15,6 +15,15 @@<br>
 # RUN:         -mcpu=mips32r6 %s -o %t2.o<br>
 # RUN: not ld.lld %t1.o %t2.o -o %t.exe 2>&1 | FileCheck -check-prefix=R1R6 %s<br>
<br>
+# Check that lld take in account EF_MIPS_MACH_XXX ISA flags<br>
+<br>
+# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux \<br>
+# RUN:         -mcpu=mips64 %S/Inputs/mips-dynamic.s -o %t1.o<br>
+# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux \<br>
+# RUN:         -mcpu=octeon %s -o %t2.o<br>
+# RUN: ld.lld %t1.o %t2.o -o %t.exe<br>
+# RUN: llvm-readobj -h %t.exe | FileCheck -check-prefix=OCTEON %s<br>
+<br>
 # Check that lld does not allow to link incompatible ABIs.<br>
<br>
 # RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \<br>
@@ -47,6 +56,13 @@ __start:<br>
<br>
 # R1R6: target ISA 'mips32' is incompatible with 'mips32r6': {{.*}}mips-elf-flags-err.s.<wbr>tmp2.o<br>
<br>
+# OCTEON:      Flags [<br>
+# OCTEON-NEXT:   EF_MIPS_ARCH_64R2<br>
+# OCTEON-NEXT:   EF_MIPS_CPIC<br>
+# OCTEON-NEXT:   EF_MIPS_MACH_OCTEON<br>
+# OCTEON-NEXT:   EF_MIPS_PIC<br>
+# OCTEON-NEXT: ]<br>
+<br>
 # N32O32: target ABI 'n32' is incompatible with 'o32': {{.*}}mips-elf-flags-err.s.<wbr>tmp2.o<br>
<br>
 # NAN: target -mnan=2008 is incompatible with -mnan=legacy: {{.*}}mips-elf-flags-err.s.<wbr>tmp2.o<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>