126 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| # RUN: llvm-mc -filetype=obj -arch mipsel %s | llvm-readobj -r | FileCheck %s
 | |
| 
 | |
| # Test the order of records in the relocation table.
 | |
| # *HI16 and local *GOT16 relocations should be immediately followed by the
 | |
| # corresponding *LO16 relocation against the same symbol.
 | |
| #
 | |
| # We try to implement the same semantics as gas, ie. to order the relocation
 | |
| # table the same way as gas.
 | |
| #
 | |
| # gnu as command line:
 | |
| # mips-linux-gnu-as -EL sort-relocation-table.s -o sort-relocation-table.o
 | |
| #
 | |
| # TODO: Add mips16 and micromips tests.
 | |
| # Note: offsets are part of expected output, so it's simpler to add new test
 | |
| #       cases at the bottom of the file.
 | |
| 
 | |
| # CHECK:       Relocations [
 | |
| # CHECK-NEXT:  {
 | |
| 
 | |
| # Put HI before LO.
 | |
| addiu $2,$2,%lo(sym1)
 | |
| lui $2,%hi(sym1)
 | |
| 
 | |
| # CHECK-NEXT:    0x4 R_MIPS_HI16 sym1
 | |
| # CHECK-NEXT:    0x0 R_MIPS_LO16 sym1
 | |
| 
 | |
| # When searching for a matching LO, ignore LOs against a different symbol.
 | |
| addiu $2,$2,%lo(sym2)
 | |
| lui $2,%hi(sym2)
 | |
| addiu $2,$2,%lo(sym2_d)
 | |
| 
 | |
| # CHECK-NEXT:    0xC R_MIPS_HI16 sym2
 | |
| # CHECK-NEXT:    0x8 R_MIPS_LO16 sym2
 | |
| # CHECK-NEXT:    0x10 R_MIPS_LO16 sym2_d
 | |
| 
 | |
| # Match HI with 2nd LO because it has higher offset (than the 1st LO).
 | |
| addiu $2,$2,%lo(sym3)
 | |
| addiu $2,$2,%lo(sym3)
 | |
| lui $2,%hi(sym3)
 | |
| 
 | |
| # CHECK-NEXT:    0x14 R_MIPS_LO16 sym3
 | |
| # CHECK-NEXT:    0x1C R_MIPS_HI16 sym3
 | |
| # CHECK-NEXT:    0x18 R_MIPS_LO16 sym3
 | |
| 
 | |
| # HI is already followed by a matching LO, so don't look further, ie. ignore the
 | |
| # "free" LO with higher offset.
 | |
| lui $2,%hi(sym4)
 | |
| addiu $2,$2,%lo(sym4)
 | |
| addiu $2,$2,%lo(sym4)
 | |
| 
 | |
| # CHECK-NEXT:    0x20 R_MIPS_HI16 sym4
 | |
| # CHECK-NEXT:    0x24 R_MIPS_LO16 sym4
 | |
| # CHECK-NEXT:    0x28 R_MIPS_LO16 sym4
 | |
| 
 | |
| # Match 2nd HI with 2nd LO, since it's the one with highest offset among the
 | |
| # "free" ones.
 | |
| addiu $2,$2,%lo(sym5)
 | |
| addiu $2,$2,%lo(sym5)
 | |
| lui $2,%hi(sym5)
 | |
| addiu $2,$2,%lo(sym5)
 | |
| lui $2,%hi(sym5)
 | |
| 
 | |
| # CHECK-NEXT:    0x2C R_MIPS_LO16 sym5
 | |
| # CHECK-NEXT:    0x3C R_MIPS_HI16 sym5
 | |
| # CHECK-NEXT:    0x30 R_MIPS_LO16 sym5
 | |
| # CHECK-NEXT:    0x34 R_MIPS_HI16 sym5
 | |
| # CHECK-NEXT:    0x38 R_MIPS_LO16 sym5
 | |
| 
 | |
| # When more HIs are matched with one LO, sort them in descending order of
 | |
| # offset.
 | |
| addiu $2,$2,%lo(sym6)
 | |
| lui $2,%hi(sym6)
 | |
| lui $2,%hi(sym6)
 | |
| 
 | |
| # CHECK-NEXT:    0x48 R_MIPS_HI16 sym6
 | |
| # CHECK-NEXT:    0x44 R_MIPS_HI16 sym6
 | |
| # CHECK-NEXT:    0x40 R_MIPS_LO16 sym6
 | |
| 
 | |
| #  sym7 is a local symbol, so GOT relocation against it needs a matching LO.
 | |
| sym7:
 | |
| addiu $2,$2,%lo(sym7)
 | |
| lui $2,%got(sym7)
 | |
| 
 | |
| # CHECK-NEXT:    0x50 R_MIPS_GOT16 sym7
 | |
| # CHECK-NEXT:    0x4C R_MIPS_LO16 sym7
 | |
| 
 | |
| # sym8 is not a local symbol, don't look for a matching LO for GOT.
 | |
| .global sym8
 | |
| addiu $2,$2,%lo(sym8)
 | |
| lui $2,%got(sym8)
 | |
| 
 | |
| # CHECK-NEXT:    0x54 R_MIPS_LO16 sym8
 | |
| # CHECK-NEXT:    0x58 R_MIPS_GOT16 sym8
 | |
| 
 | |
| # A small combination of previous checks.
 | |
| symc1:
 | |
| addiu $2,$2,%lo(symc1)
 | |
| addiu $2,$2,%lo(symc1)
 | |
| addiu $2,$2,%lo(symc1)
 | |
| lui $2,%hi(symc1)
 | |
| lui $2,%got(symc1)
 | |
| addiu $2,$2,%lo(symc2)
 | |
| lui $2,%hi(symc1)
 | |
| lui $2,%hi(symc1)
 | |
| lui $2,%got(symc2)
 | |
| lui $2,%hi(symc1)
 | |
| addiu $2,$2,%lo(symc1)
 | |
| addiu $2,$2,%lo(symc2)
 | |
| lui $2,%hi(symc1)
 | |
| lui $2,%hi(symc1)
 | |
| 
 | |
| # CHECK-NEXT:    0x78 R_MIPS_HI16 symc1
 | |
| # CHECK-NEXT:    0x74 R_MIPS_HI16 symc1
 | |
| # CHECK-NEXT:    0x6C R_MIPS_GOT16 symc1
 | |
| # CHECK-NEXT:    0x68 R_MIPS_HI16 symc1
 | |
| # CHECK-NEXT:    0x5C R_MIPS_LO16 symc1
 | |
| # CHECK-NEXT:    0x8C R_MIPS_HI16 symc1
 | |
| # CHECK-NEXT:    0x60 R_MIPS_LO16 symc1
 | |
| # CHECK-NEXT:    0x90 R_MIPS_HI16 symc1
 | |
| # CHECK-NEXT:    0x64 R_MIPS_LO16 symc1
 | |
| # CHECK-NEXT:    0x70 R_MIPS_LO16 symc2
 | |
| # CHECK-NEXT:    0x7C R_MIPS_GOT16 symc2
 | |
| # CHECK-NEXT:    0x80 R_MIPS_HI16 symc1
 | |
| # CHECK-NEXT:    0x84 R_MIPS_LO16 symc1
 | |
| # CHECK-NEXT:    0x88 R_MIPS_LO16 symc2
 |