# RUN: llvm-mc -filetype=obj -arch mipsel %s | llvm-readobj -r | FileCheck %s # Test the order of records in the relocation table. # # MIPS has a few relocations that have an AHL component in the expression used # to evaluate them. This AHL component is an addend with the same number of # bits as a symbol value but not all of our ABI's are able to supply a # sufficiently sized addend in a single relocation. # # The O32 ABI for example, uses REL relocations which store the addend in the # section data. All the relocations with AHL components affect 16-bit fields # so the addend is limited to 16-bit. This ABI resolves the limitation by # linking relocations (e.g. R_MIPS_HI16 and R_MIPS_LO16) and distributing the # addend between the linked relocations. The ABI mandates that such relocations # must be next to each other in a particular order (e.g. R_MIPS_HI16 must be # followed by a matching R_MIPS_LO16) but the rule is less strict in practice. # # See MipsELFObjectWriter.cpp for a full description of the rules. # # TODO: Add mips16 and micromips tests. # HILO 1: HI/LO already match .section .mips_hilo_1, "ax", @progbits lui $2, %hi(sym1) addiu $2, $2, %lo(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_1 { # CHECK-NEXT: 0x0 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x4 R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 2: R_MIPS_HI16 must be followed by a matching R_MIPS_LO16. .section .mips_hilo_2, "ax", @progbits addiu $2, $2, %lo(sym1) lui $2, %hi(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_2 { # CHECK-NEXT: 0x4 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 3: R_MIPS_HI16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same. .section .mips_hilo_3, "ax", @progbits addiu $2, $2, %lo(sym1) lui $2, %hi(sym2) addiu $2, $2, %lo(sym2) lui $2, %hi(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_3 { # CHECK-NEXT: 0xC R_MIPS_HI16 sym1 # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: 0x4 R_MIPS_HI16 sym2 # CHECK-NEXT: 0x8 R_MIPS_LO16 sym2 # CHECK-NEXT: } # HILO 3b: Same as 3 but a different starting order. .section .mips_hilo_3b, "ax", @progbits addiu $2, $2, %lo(sym1) lui $2, %hi(sym1) addiu $2, $2, %lo(sym2) lui $2, %hi(sym2) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_3b { # CHECK-NEXT: 0x4 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: 0xC R_MIPS_HI16 sym2 # CHECK-NEXT: 0x8 R_MIPS_LO16 sym2 # CHECK-NEXT: } # HILO 4: R_MIPS_HI16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is the same. .section .mips_hilo_4, "ax", @progbits addiu $2, $2, %lo(sym1) addiu $2, $2, %lo(sym1+4) lui $2, %hi(sym1+4) lui $2, %hi(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_4 { # CHECK-NEXT: 0xC R_MIPS_HI16 sym1 # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: 0x8 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x4 R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 5: R_MIPS_HI16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is greater or equal. Exact matches are preferred so both # R_MIPS_HI16's match the same R_MIPS_LO16. .section .mips_hilo_5, "ax", @progbits lui $2, %hi(sym1) lui $2, %hi(sym1) addiu $2, $2, %lo(sym1+1) addiu $2, $2, %lo(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_5 { # CHECK-NEXT: 0x8 R_MIPS_LO16 sym1 # CHECK-NEXT: 0x0 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x4 R_MIPS_HI16 sym1 # CHECK-NEXT: 0xC R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 6: R_MIPS_HI16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is greater or equal. Smaller offsets are preferred so both # R_MIPS_HI16's still match the same R_MIPS_LO16. .section .mips_hilo_6, "ax", @progbits lui $2, %hi(sym1) lui $2, %hi(sym1) addiu $2, $2, %lo(sym1+2) addiu $2, $2, %lo(sym1+1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_6 { # CHECK-NEXT: 0x8 R_MIPS_LO16 sym1 # CHECK-NEXT: 0x0 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x4 R_MIPS_HI16 sym1 # CHECK-NEXT: 0xC R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 7: R_MIPS_HI16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is greater or equal so that the carry bit is correct. The two # R_MIPS_HI16's therefore match different R_MIPS_LO16's. .section .mips_hilo_7, "ax", @progbits addiu $2, $2, %lo(sym1+1) addiu $2, $2, %lo(sym1+6) lui $2, %hi(sym1+4) lui $2, %hi(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_7 { # CHECK-NEXT: 0xC R_MIPS_HI16 sym1 # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: 0x8 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x4 R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 8: R_MIPS_LO16's may be orphaned. .section .mips_hilo_8, "ax", @progbits lw $2, %lo(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_8 { # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 8b: Another example of 8. The R_MIPS_LO16 at 0x4 is orphaned. .section .mips_hilo_8b, "ax", @progbits lw $2, %lo(sym1) lw $2, %lo(sym1) lui $2, %hi(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_8b { # CHECK-NEXT: 0x8 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: 0x4 R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 9: R_MIPS_HI16's don't need a matching R_MIPS_LO16 to immediately follow # so long as there is one after the R_MIPS_HI16 somewhere. This isn't # permitted by the ABI specification but has been allowed in practice # for a very long time. The R_MIPS_HI16's should be ordered by the # address they affect for purely cosmetic reasons. .section .mips_hilo_9, "ax", @progbits lw $2, %lo(sym1) lui $2, %hi(sym1) lui $2, %hi(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_9 { # CHECK-NEXT: 0x4 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x8 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: } # HILO 10: R_MIPS_HI16's must have a matching R_MIPS_LO16 somewhere though. # When this is impossible we have two possible bad behaviours # depending on the linker implementation: # * The linker silently computes the wrong value using a partially # matching R_MIPS_LO16. # * The linker rejects the relocation table as invalid. # The latter is preferable since it's far easier to detect and debug so # check that we encourage this behaviour by putting invalid # R_MIPS_HI16's at the end of the relocation table where the risk of a # partial match is very low. .section .mips_hilo_10, "ax", @progbits lui $2, %hi(sym1) lw $2, %lo(sym1) lui $2, %hi(sym2) lui $2, %hi(sym3) lw $2, %lo(sym3) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_hilo_10 { # CHECK-NEXT: 0x0 R_MIPS_HI16 sym1 # CHECK-NEXT: 0x4 R_MIPS_LO16 sym1 # CHECK-NEXT: 0xC R_MIPS_HI16 sym3 # CHECK-NEXT: 0x10 R_MIPS_LO16 sym3 # CHECK-NEXT: 0x8 R_MIPS_HI16 sym2 # CHECK-NEXT: } # Now do the same tests for GOT/LO. # The rules only apply to R_MIPS_GOT16 on local symbols which are also # rewritten into section relative relocations. # GOTLO 1: GOT/LO already match .section .mips_gotlo_1, "ax", @progbits lui $2, %got(local1) addiu $2, $2, %lo(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_1 { # CHECK-NEXT: 0x0 R_MIPS_GOT16 .text # CHECK-NEXT: 0x4 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 2: R_MIPS_GOT16 must be followed by a matching R_MIPS_LO16. .section .mips_gotlo_2, "ax", @progbits addiu $2, $2, %lo(local1) lui $2, %got(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_2 { # CHECK-NEXT: 0x4 R_MIPS_GOT16 .text # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 3: R_MIPS_GOT16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same. .section .mips_gotlo_3, "ax", @progbits addiu $2, $2, %lo(local1) lui $2, %got(local2) addiu $2, $2, %lo(local2) lui $2, %got(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_3 { # CHECK-NEXT: 0xC R_MIPS_GOT16 .text # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: 0x4 R_MIPS_GOT16 .text # CHECK-NEXT: 0x8 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 3b: Same as 3 but a different starting order. .section .mips_gotlo_3b, "ax", @progbits addiu $2, $2, %lo(local1) lui $2, %got(local1) addiu $2, $2, %lo(local2) lui $2, %got(local2) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_3b { # CHECK-NEXT: 0x4 R_MIPS_GOT16 .text # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: 0xC R_MIPS_GOT16 .text # CHECK-NEXT: 0x8 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 4: R_MIPS_GOT16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is the same. .section .mips_gotlo_4, "ax", @progbits addiu $2, $2, %lo(local1) addiu $2, $2, %lo(local1+4) lui $2, %got(local1+4) lui $2, %got(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_4 { # CHECK-NEXT: 0xC R_MIPS_GOT16 .text # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: 0x8 R_MIPS_GOT16 .text # CHECK-NEXT: 0x4 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 5: R_MIPS_GOT16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is greater or equal. Exact matches are preferred so both # R_MIPS_GOT16's match the same R_MIPS_LO16. .section .mips_gotlo_5, "ax", @progbits lui $2, %got(local1) lui $2, %got(local1) addiu $2, $2, %lo(local1+1) addiu $2, $2, %lo(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_5 { # CHECK-NEXT: 0x8 R_MIPS_LO16 .text # CHECK-NEXT: 0x0 R_MIPS_GOT16 .text # CHECK-NEXT: 0x4 R_MIPS_GOT16 .text # CHECK-NEXT: 0xC R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 6: R_MIPS_GOT16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is greater or equal. Smaller offsets are preferred so both # R_MIPS_GOT16's still match the same R_MIPS_LO16. .section .mips_gotlo_6, "ax", @progbits lui $2, %got(local1) lui $2, %got(local1) addiu $2, $2, %lo(local1+2) addiu $2, $2, %lo(local1+1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_6 { # CHECK-NEXT: 0x8 R_MIPS_LO16 .text # CHECK-NEXT: 0x0 R_MIPS_GOT16 .text # CHECK-NEXT: 0x4 R_MIPS_GOT16 .text # CHECK-NEXT: 0xC R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 7: R_MIPS_GOT16 must be followed by a matching R_MIPS_LO16. # The second relocation matches if the symbol is the same and the # offset is greater or equal so that the carry bit is correct. The two # R_MIPS_GOT16's therefore match different R_MIPS_LO16's. .section .mips_gotlo_7, "ax", @progbits addiu $2, $2, %lo(local1+1) addiu $2, $2, %lo(local1+6) lui $2, %got(local1+4) lui $2, %got(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_7 { # CHECK-NEXT: 0xC R_MIPS_GOT16 .text # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: 0x8 R_MIPS_GOT16 .text # CHECK-NEXT: 0x4 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 8: R_MIPS_LO16's may be orphaned. .section .mips_gotlo_8, "ax", @progbits lw $2, %lo(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_8 { # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 8b: Another example of 8. The R_MIPS_LO16 at 0x4 is orphaned. .section .mips_gotlo_8b, "ax", @progbits lw $2, %lo(local1) lw $2, %lo(local1) lui $2, %got(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_8b { # CHECK-NEXT: 0x8 R_MIPS_GOT16 .text # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: 0x4 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 9: R_MIPS_GOT16's don't need a matching R_MIPS_LO16 to immediately # follow so long as there is one after the R_MIPS_GOT16 somewhere. # This isn't permitted by the ABI specification but has been allowed # in practice for a very long time. The R_MIPS_GOT16's should be # ordered by the address they affect for purely cosmetic reasons. .section .mips_gotlo_9, "ax", @progbits lw $2, %lo(local1) lui $2, %got(local1) lui $2, %got(local1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_9 { # CHECK-NEXT: 0x4 R_MIPS_GOT16 .text # CHECK-NEXT: 0x8 R_MIPS_GOT16 .text # CHECK-NEXT: 0x0 R_MIPS_LO16 .text # CHECK-NEXT: } # GOTLO 10: R_MIPS_GOT16's must have a matching R_MIPS_LO16 somewhere though. # When this is impossible we have two possible bad behaviours # depending on the linker implementation: # * The linker silently computes the wrong value using a partially # matching R_MIPS_LO16. # * The linker rejects the relocation table as invalid. # The latter is preferable since it's far easier to detect and debug # so check that we encourage this behaviour by putting invalid # R_MIPS_GOT16's at the end of the relocation table where the risk of # a partial match is very low. .section .mips_gotlo_10, "ax", @progbits lui $2, %got(local1) lw $2, %lo(local1) lui $2, %got(local2) lui $2, %got(local3) lw $2, %lo(local3) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_gotlo_10 { # CHECK-NEXT: 0x0 R_MIPS_GOT16 .text # CHECK-NEXT: 0x4 R_MIPS_LO16 .text # CHECK-NEXT: 0xC R_MIPS_GOT16 .text # CHECK-NEXT: 0x10 R_MIPS_LO16 .text # CHECK-NEXT: 0x8 R_MIPS_GOT16 .text # CHECK-NEXT: } # Finally, do test 2 for R_MIPS_GOT16 on external symbols to prove they are # exempt from the rules for local symbols. # External GOTLO 2: R_MIPS_GOT16 must be followed by a matching R_MIPS_LO16. .section .mips_ext_gotlo_2, "ax", @progbits addiu $2, $2, %lo(sym1) lui $2, %got(sym1) # CHECK-LABEL: Section ({{[0-9]+}}) .rel.mips_ext_gotlo_2 { # CHECK-NEXT: 0x0 R_MIPS_LO16 sym1 # CHECK-NEXT: 0x4 R_MIPS_GOT16 sym1 # CHECK-NEXT: } # Define some local symbols. .text nop local1: nop local2: nop local3: nop