summaryrefslogtreecommitdiff
path: root/test/old-elf
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-12-30 11:57:38 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-12-30 11:57:38 +0000
commit5a5c549fe9a3fef595297bd21d36bed8409dc37d (patch)
treea964c8f5ac85b7b641cac022c5f9bf4eed3d2b9b /test/old-elf
parentfb911942f1434f3d1750f83f25f5e42c80e60638 (diff)
Notes
Diffstat (limited to 'test/old-elf')
-rw-r--r--test/old-elf/AArch64/Inputs/fn.c4
-rw-r--r--test/old-elf/AArch64/Inputs/fn.obin0 -> 899 bytes
-rw-r--r--test/old-elf/AArch64/Inputs/general-dyn-tls-0.yaml64
-rw-r--r--test/old-elf/AArch64/Inputs/initfini-option.c12
-rw-r--r--test/old-elf/AArch64/Inputs/initfini-option.obin0 -> 1552 bytes
-rw-r--r--test/old-elf/AArch64/Inputs/initfini.c13
-rw-r--r--test/old-elf/AArch64/Inputs/initfini.obin0 -> 2056 bytes
-rw-r--r--test/old-elf/AArch64/Inputs/initial-exec-tls-1.yaml77
-rw-r--r--test/old-elf/AArch64/Inputs/main.c4
-rw-r--r--test/old-elf/AArch64/Inputs/main.obin0 -> 1064 bytes
-rw-r--r--test/old-elf/AArch64/Inputs/no-interp-section.c1
-rw-r--r--test/old-elf/AArch64/Inputs/no-interp-section.obin0 -> 903 bytes
-rw-r--r--test/old-elf/AArch64/Inputs/zerosizedsection.obin0 -> 816 bytes
-rw-r--r--test/old-elf/AArch64/Inputs/zerosizedsection.s3
-rw-r--r--test/old-elf/AArch64/defsym.test22
-rw-r--r--test/old-elf/AArch64/dontignorezerosize-sections.test9
-rw-r--r--test/old-elf/AArch64/dynamicvars.test113
-rw-r--r--test/old-elf/AArch64/dynlib-nointerp-section.test5
-rw-r--r--test/old-elf/AArch64/general-dyn-tls-0.test103
-rw-r--r--test/old-elf/AArch64/initfini.test23
-rw-r--r--test/old-elf/AArch64/initial-exec-tls-0.test146
-rw-r--r--test/old-elf/AArch64/local-tls.test184
-rw-r--r--test/old-elf/AArch64/rel-abs16-overflow.test44
-rw-r--r--test/old-elf/AArch64/rel-abs16.test53
-rw-r--r--test/old-elf/AArch64/rel-abs32-overflow.test53
-rw-r--r--test/old-elf/AArch64/rel-abs32.test59
-rw-r--r--test/old-elf/AArch64/rel-abs64.test59
-rw-r--r--test/old-elf/AArch64/rel-adr_prel_lo21-overflow.test45
-rw-r--r--test/old-elf/AArch64/rel-adr_prel_lo21.test51
-rw-r--r--test/old-elf/AArch64/rel-adr_prel_pg_hi21-overflow.test45
-rw-r--r--test/old-elf/AArch64/rel-adr_prel_pg_hi21.test52
-rw-r--r--test/old-elf/AArch64/rel-bad.test44
-rw-r--r--test/old-elf/AArch64/rel-prel16-overflow.test53
-rw-r--r--test/old-elf/AArch64/rel-prel16.test59
-rw-r--r--test/old-elf/AArch64/rel-prel32-overflow.test53
-rw-r--r--test/old-elf/AArch64/rel-prel32.test59
-rw-r--r--test/old-elf/AArch64/rel-prel64.test59
-rw-r--r--test/old-elf/AMDGPU/hsa.test53
-rw-r--r--test/old-elf/ARM/Inputs/fn.c1
-rwxr-xr-xtest/old-elf/ARM/Inputs/libfn.sobin0 -> 4972 bytes
-rwxr-xr-xtest/old-elf/ARM/Inputs/libobj.sobin0 -> 5067 bytes
-rw-r--r--test/old-elf/ARM/Inputs/obj.c4
-rw-r--r--test/old-elf/ARM/arm-symbols.test51
-rw-r--r--test/old-elf/ARM/defsym.test50
-rw-r--r--test/old-elf/ARM/dynamic-symbols.test83
-rw-r--r--test/old-elf/ARM/entry-point.test113
-rw-r--r--test/old-elf/ARM/exidx.test254
-rw-r--r--test/old-elf/ARM/header-flags.test57
-rw-r--r--test/old-elf/ARM/mapping-code-model.test160
-rw-r--r--test/old-elf/ARM/mapping-symbols.test122
-rw-r--r--test/old-elf/ARM/missing-symbol.test38
-rw-r--r--test/old-elf/ARM/plt-dynamic.test200
-rw-r--r--test/old-elf/ARM/plt-ifunc-interwork.test396
-rw-r--r--test/old-elf/ARM/plt-ifunc-mapping.test109
-rw-r--r--test/old-elf/ARM/rel-abs32.test58
-rw-r--r--test/old-elf/ARM/rel-arm-call.test112
-rw-r--r--test/old-elf/ARM/rel-arm-jump24-veneer-b.test122
-rw-r--r--test/old-elf/ARM/rel-arm-jump24-veneer-bl.test120
-rw-r--r--test/old-elf/ARM/rel-arm-jump24.test108
-rw-r--r--test/old-elf/ARM/rel-arm-mov.test64
-rw-r--r--test/old-elf/ARM/rel-arm-prel31.test90
-rw-r--r--test/old-elf/ARM/rel-arm-target1.test114
-rw-r--r--test/old-elf/ARM/rel-arm-thm-interwork.test121
-rw-r--r--test/old-elf/ARM/rel-base-prel.test61
-rw-r--r--test/old-elf/ARM/rel-copy.test60
-rw-r--r--test/old-elf/ARM/rel-glob-dat.test57
-rw-r--r--test/old-elf/ARM/rel-got-brel.test63
-rw-r--r--test/old-elf/ARM/rel-group-relocs.test71
-rw-r--r--test/old-elf/ARM/rel-ifunc.test101
-rw-r--r--test/old-elf/ARM/rel-jump-slot.test50
-rw-r--r--test/old-elf/ARM/rel-rel32.test56
-rw-r--r--test/old-elf/ARM/rel-thm-call.test114
-rw-r--r--test/old-elf/ARM/rel-thm-jump11.test209
-rw-r--r--test/old-elf/ARM/rel-thm-jump24-veneer.test120
-rw-r--r--test/old-elf/ARM/rel-thm-jump24.test110
-rw-r--r--test/old-elf/ARM/rel-thm-mov.test70
-rw-r--r--test/old-elf/ARM/rel-tls-ie32.test125
-rw-r--r--test/old-elf/ARM/rel-tls-le32.test73
-rw-r--r--test/old-elf/ARM/rel-v4bx.test72
-rw-r--r--test/old-elf/ARM/thm-symbols.test51
-rw-r--r--test/old-elf/ARM/two-got-for-symbol.test62
-rw-r--r--test/old-elf/ARM/undef-lazy-symbol.test133
-rw-r--r--test/old-elf/ARM/veneer-mapping.test92
-rw-r--r--test/old-elf/ARM/weak-branch.test221
-rw-r--r--test/old-elf/Hexagon/Inputs/dynobj-data.c3
-rw-r--r--test/old-elf/Hexagon/Inputs/dynobj-data.obin0 -> 916 bytes
-rw-r--r--test/old-elf/Hexagon/Inputs/dynobj.c26
-rw-r--r--test/old-elf/Hexagon/Inputs/dynobj.obin0 -> 1288 bytes
-rw-r--r--test/old-elf/Hexagon/Inputs/got-plt-order.c6
-rw-r--r--test/old-elf/Hexagon/Inputs/got-plt-order.obin0 -> 964 bytes
-rw-r--r--test/old-elf/Hexagon/Inputs/libMaxAlignment.abin0 -> 1010 bytes
-rw-r--r--test/old-elf/Hexagon/Inputs/sda-base.obin0 -> 1469 bytes
-rw-r--r--test/old-elf/Hexagon/Inputs/sdata1.c3
-rw-r--r--test/old-elf/Hexagon/Inputs/sdata1.obin0 -> 684 bytes
-rw-r--r--test/old-elf/Hexagon/Inputs/sdata2.c6
-rw-r--r--test/old-elf/Hexagon/Inputs/sdata2.obin0 -> 829 bytes
-rw-r--r--test/old-elf/Hexagon/Inputs/use-shared.hexagonbin0 -> 872 bytes
-rw-r--r--test/old-elf/Hexagon/dynlib-data.test9
-rw-r--r--test/old-elf/Hexagon/dynlib-gotoff.test128
-rw-r--r--test/old-elf/Hexagon/dynlib-hash.test9
-rw-r--r--test/old-elf/Hexagon/dynlib-rela.test9
-rw-r--r--test/old-elf/Hexagon/dynlib-syms.test7
-rw-r--r--test/old-elf/Hexagon/dynlib.test36
-rw-r--r--test/old-elf/Hexagon/hexagon-got-plt-order.test5
-rw-r--r--test/old-elf/Hexagon/hexagon-plt-setup.test12
-rw-r--r--test/old-elf/Hexagon/maxalignment.test8
-rw-r--r--test/old-elf/Hexagon/rela-order.test9
-rw-r--r--test/old-elf/Hexagon/sda-base.test4
-rw-r--r--test/old-elf/Hexagon/zerofillquick-sdata.test18
-rw-r--r--test/old-elf/Inputs/abs-test.i386bin0 -> 504 bytes
-rw-r--r--test/old-elf/Inputs/allowduplicates.objtxt12
-rw-r--r--test/old-elf/Inputs/bar.o.x86-64bin0 -> 1240 bytes
-rw-r--r--test/old-elf/Inputs/branch-test.hexagonbin0 -> 700 bytes
-rw-r--r--test/old-elf/Inputs/branch-test.ppcbin0 -> 852 bytes
-rw-r--r--test/old-elf/Inputs/consecutive-weak-defs.o.yaml65
-rw-r--r--test/old-elf/Inputs/constants-merge.x86-64bin0 -> 1232 bytes
-rw-r--r--test/old-elf/Inputs/constdata.x86-64bin0 -> 1688 bytes
-rw-r--r--test/old-elf/Inputs/foo.o.x86-64bin0 -> 1240 bytes
-rw-r--r--test/old-elf/Inputs/globalconst.c2
-rw-r--r--test/old-elf/Inputs/globalconst.o.x86-64bin0 -> 1072 bytes
-rw-r--r--test/old-elf/Inputs/gotpcrel.S11
-rw-r--r--test/old-elf/Inputs/gotpcrel.x86-64bin0 -> 904 bytes
-rw-r--r--test/old-elf/Inputs/group-cmd-search-1.ls1
-rw-r--r--test/old-elf/Inputs/group-cmd-search-2.ls1
-rw-r--r--test/old-elf/Inputs/group-cmd-search-3.ls1
-rw-r--r--test/old-elf/Inputs/ifunc.S21
-rw-r--r--test/old-elf/Inputs/ifunc.cpp3
-rw-r--r--test/old-elf/Inputs/ifunc.cpp.x86-64bin0 -> 1224 bytes
-rw-r--r--test/old-elf/Inputs/ifunc.x86-64bin0 -> 912 bytes
-rw-r--r--test/old-elf/Inputs/libfnarchive.abin0 -> 2656 bytes
-rw-r--r--test/old-elf/Inputs/libifunc.x86-64.sobin0 -> 2512 bytes
-rw-r--r--test/old-elf/Inputs/libundef.sobin0 -> 11128 bytes
-rwxr-xr-xtest/old-elf/Inputs/libweaksym.sobin0 -> 2160 bytes
-rw-r--r--test/old-elf/Inputs/main-with-global-def.o.yaml55
-rw-r--r--test/old-elf/Inputs/mainobj.x86_64bin0 -> 1360 bytes
-rw-r--r--test/old-elf/Inputs/no-unique-section-names.x86-64bin0 -> 2128 bytes
-rw-r--r--test/old-elf/Inputs/object-test.elf-hexagonbin0 -> 1532 bytes
-rw-r--r--test/old-elf/Inputs/object-test.elf-i386bin0 -> 1784 bytes
-rw-r--r--test/old-elf/Inputs/phdr.i386bin0 -> 17536 bytes
-rw-r--r--test/old-elf/Inputs/quickdata-sort-test.o.elf-hexagonbin0 -> 1385 bytes
-rw-r--r--test/old-elf/Inputs/quickdata-sortcommon-test.o.elf-hexagonbin0 -> 1469 bytes
-rw-r--r--test/old-elf/Inputs/quickdata-test.elf-hexagonbin0 -> 891 bytes
-rw-r--r--test/old-elf/Inputs/reloc-test.elf-i386bin0 -> 1076 bytes
-rw-r--r--test/old-elf/Inputs/reloc-xb.x86bin0 -> 568 bytes
-rw-r--r--test/old-elf/Inputs/reloc-xt.x86bin0 -> 548 bytes
-rw-r--r--test/old-elf/Inputs/relocs-dynamic.x86-64bin0 -> 864 bytes
-rw-r--r--test/old-elf/Inputs/relocs.x86-64bin0 -> 1536 bytes
-rw-r--r--test/old-elf/Inputs/responsefile1
-rw-r--r--test/old-elf/Inputs/rodata-test.hexagonbin0 -> 669 bytes
-rw-r--r--test/old-elf/Inputs/rodata-test.i386bin0 -> 537 bytes
-rw-r--r--test/old-elf/Inputs/rodata.c4
-rw-r--r--test/old-elf/Inputs/rodata.obin0 -> 1568 bytes
-rw-r--r--test/old-elf/Inputs/section-test.i386bin0 -> 717 bytes
-rw-r--r--test/old-elf/Inputs/shared.c16
-rw-r--r--test/old-elf/Inputs/shared.so-x86-64bin0 -> 7536 bytes
-rw-r--r--test/old-elf/Inputs/shndx.o-x86_64bin0 -> 624 bytes
-rw-r--r--test/old-elf/Inputs/stripped-empty.x86_64bin0 -> 416 bytes
-rw-r--r--test/old-elf/Inputs/target-test.hexagonbin0 -> 676 bytes
-rw-r--r--test/old-elf/Inputs/target-test.ppcbin0 -> 552 bytes
-rw-r--r--test/old-elf/Inputs/tls-tbss-size.yaml59
-rw-r--r--test/old-elf/Inputs/tls.S50
-rw-r--r--test/old-elf/Inputs/tls.c11
-rw-r--r--test/old-elf/Inputs/tls.x86-64bin0 -> 1424 bytes
-rw-r--r--test/old-elf/Inputs/tlsAddr.x86-64bin0 -> 1752 bytes
-rw-r--r--test/old-elf/Inputs/tlsaddr.c8
-rw-r--r--test/old-elf/Inputs/undef-from-main-so.c1
-rw-r--r--test/old-elf/Inputs/undef-from-main.c5
-rw-r--r--test/old-elf/Inputs/undef-pc32.obin0 -> 1248 bytes
-rw-r--r--test/old-elf/Inputs/undef.obin0 -> 1264 bytes
-rw-r--r--test/old-elf/Inputs/undef2-so.o.yaml49
-rw-r--r--test/old-elf/Inputs/use-shared-32s.c8
-rw-r--r--test/old-elf/Inputs/use-shared-32s.x86-64bin0 -> 1336 bytes
-rw-r--r--test/old-elf/Inputs/use-shared.c7
-rw-r--r--test/old-elf/Inputs/use-shared.x86-64bin0 -> 1376 bytes
-rw-r--r--test/old-elf/Inputs/weaksym.obin0 -> 840 bytes
-rw-r--r--test/old-elf/Inputs/writersyms.obin0 -> 868 bytes
-rw-r--r--test/old-elf/Inputs/x86-64-relocs.S12
-rw-r--r--test/old-elf/Mips/abi-flags-01.test35
-rw-r--r--test/old-elf/Mips/abi-flags-02.test92
-rw-r--r--test/old-elf/Mips/abi-flags-03.test149
-rw-r--r--test/old-elf/Mips/abi-flags-04.test125
-rw-r--r--test/old-elf/Mips/abi-flags-05.test186
-rw-r--r--test/old-elf/Mips/abi-flags-06.test79
-rw-r--r--test/old-elf/Mips/abi-flags-07.test60
-rw-r--r--test/old-elf/Mips/abi-flags-08.test71
-rw-r--r--test/old-elf/Mips/abi-flags-09.test67
-rw-r--r--test/old-elf/Mips/abi-flags-10.test60
-rw-r--r--test/old-elf/Mips/abi-flags-11.test59
-rw-r--r--test/old-elf/Mips/base-address-64.test80
-rw-r--r--test/old-elf/Mips/base-address.test95
-rw-r--r--test/old-elf/Mips/ctors-order.test164
-rw-r--r--test/old-elf/Mips/driver-hash-style.test15
-rw-r--r--test/old-elf/Mips/dt-textrel-64.test74
-rw-r--r--test/old-elf/Mips/dt-textrel.test74
-rw-r--r--test/old-elf/Mips/dynamic-linking.test22
-rw-r--r--test/old-elf/Mips/dynamic-sym.test41
-rw-r--r--test/old-elf/Mips/dynlib-dynamic.test110
-rw-r--r--test/old-elf/Mips/dynlib-dynsym-micro.test208
-rw-r--r--test/old-elf/Mips/dynlib-dynsym.test202
-rw-r--r--test/old-elf/Mips/dynlib-fileheader-64.test72
-rw-r--r--test/old-elf/Mips/dynlib-fileheader-micro-64.test75
-rw-r--r--test/old-elf/Mips/dynlib-fileheader-micro.test79
-rw-r--r--test/old-elf/Mips/dynlib-fileheader.test76
-rw-r--r--test/old-elf/Mips/dynsym-table-1.test127
-rw-r--r--test/old-elf/Mips/dynsym-table-2.test105
-rw-r--r--test/old-elf/Mips/e-flags-merge-1-64.test30
-rw-r--r--test/old-elf/Mips/e-flags-merge-1.test56
-rw-r--r--test/old-elf/Mips/e-flags-merge-10.test43
-rw-r--r--test/old-elf/Mips/e-flags-merge-11.test43
-rw-r--r--test/old-elf/Mips/e-flags-merge-12.test44
-rw-r--r--test/old-elf/Mips/e-flags-merge-2-64.test33
-rw-r--r--test/old-elf/Mips/e-flags-merge-2.test35
-rw-r--r--test/old-elf/Mips/e-flags-merge-3-64.test130
-rw-r--r--test/old-elf/Mips/e-flags-merge-3.test134
-rw-r--r--test/old-elf/Mips/e-flags-merge-4-64.test64
-rw-r--r--test/old-elf/Mips/e-flags-merge-4.test65
-rw-r--r--test/old-elf/Mips/e-flags-merge-5-64.test42
-rw-r--r--test/old-elf/Mips/e-flags-merge-5.test42
-rw-r--r--test/old-elf/Mips/e-flags-merge-6-64.test79
-rw-r--r--test/old-elf/Mips/e-flags-merge-6.test80
-rw-r--r--test/old-elf/Mips/e-flags-merge-7-64.test42
-rw-r--r--test/old-elf/Mips/e-flags-merge-7.test42
-rw-r--r--test/old-elf/Mips/e-flags-merge-8.test65
-rw-r--r--test/old-elf/Mips/e-flags-merge-9.test43
-rw-r--r--test/old-elf/Mips/entry-name.test26
-rw-r--r--test/old-elf/Mips/exe-dynamic.test110
-rw-r--r--test/old-elf/Mips/exe-dynsym-micro.test94
-rw-r--r--test/old-elf/Mips/exe-dynsym.test91
-rw-r--r--test/old-elf/Mips/exe-fileheader-02.test62
-rw-r--r--test/old-elf/Mips/exe-fileheader-03.test72
-rw-r--r--test/old-elf/Mips/exe-fileheader-64.test66
-rw-r--r--test/old-elf/Mips/exe-fileheader-be-64.test60
-rw-r--r--test/old-elf/Mips/exe-fileheader-be.test60
-rw-r--r--test/old-elf/Mips/exe-fileheader-micro-64.test68
-rw-r--r--test/old-elf/Mips/exe-fileheader-micro.test69
-rw-r--r--test/old-elf/Mips/exe-fileheader-n32.test65
-rw-r--r--test/old-elf/Mips/exe-fileheader.test105
-rw-r--r--test/old-elf/Mips/exe-got-micro.test115
-rw-r--r--test/old-elf/Mips/exe-got.test116
-rw-r--r--test/old-elf/Mips/got-page-32-micro.test251
-rw-r--r--test/old-elf/Mips/got-page-32.test244
-rw-r--r--test/old-elf/Mips/got-page-64-micro.test210
-rw-r--r--test/old-elf/Mips/got-page-64.test203
-rw-r--r--test/old-elf/Mips/got16-2.test73
-rw-r--r--test/old-elf/Mips/got16-micro.test165
-rw-r--r--test/old-elf/Mips/got16.test196
-rw-r--r--test/old-elf/Mips/gotsym.test43
-rw-r--r--test/old-elf/Mips/gp-sym-1-micro.test88
-rw-r--r--test/old-elf/Mips/gp-sym-1.test86
-rw-r--r--test/old-elf/Mips/gp-sym-2.test103
-rw-r--r--test/old-elf/Mips/hilo16-1.test40
-rw-r--r--test/old-elf/Mips/hilo16-2.test70
-rw-r--r--test/old-elf/Mips/hilo16-3-overflow.test44
-rw-r--r--test/old-elf/Mips/hilo16-3.test74
-rw-r--r--test/old-elf/Mips/hilo16-4.test93
-rw-r--r--test/old-elf/Mips/hilo16-5.test103
-rw-r--r--test/old-elf/Mips/hilo16-8-micro.test81
-rw-r--r--test/old-elf/Mips/hilo16-9-micro.test142
-rw-r--r--test/old-elf/Mips/initfini-micro.test45
-rw-r--r--test/old-elf/Mips/interpreter-64.test26
-rw-r--r--test/old-elf/Mips/interpreter-n32.test27
-rw-r--r--test/old-elf/Mips/interpreter.test26
-rw-r--r--test/old-elf/Mips/invalid-reginfo.test28
-rw-r--r--test/old-elf/Mips/jalx-align-err.test46
-rw-r--r--test/old-elf/Mips/jalx-jalr.test47
-rw-r--r--test/old-elf/Mips/jalx.test71
-rw-r--r--test/old-elf/Mips/jump-fix-err.test45
-rw-r--r--test/old-elf/Mips/la25-stub-be.test113
-rw-r--r--test/old-elf/Mips/la25-stub-micro-be.test121
-rw-r--r--test/old-elf/Mips/la25-stub-micro.test136
-rw-r--r--test/old-elf/Mips/la25-stub-npic-01.test153
-rw-r--r--test/old-elf/Mips/la25-stub-npic-02.test123
-rw-r--r--test/old-elf/Mips/la25-stub-npic-shared.test152
-rw-r--r--test/old-elf/Mips/la25-stub-pic.test144
-rw-r--r--test/old-elf/Mips/la25-stub.test133
-rw-r--r--test/old-elf/Mips/mips-options-01.test34
-rw-r--r--test/old-elf/Mips/mips-options-02.test104
-rw-r--r--test/old-elf/Mips/mips-options-03.test41
-rw-r--r--test/old-elf/Mips/mips-options-04.test77
-rw-r--r--test/old-elf/Mips/mips-options-05.test119
-rw-r--r--test/old-elf/Mips/mips-options-gp0.test77
-rw-r--r--test/old-elf/Mips/n32-rela-chain.test68
-rw-r--r--test/old-elf/Mips/n64-rel-chain.test204
-rw-r--r--test/old-elf/Mips/n64-rel-shift.test48
-rw-r--r--test/old-elf/Mips/opt-emulation.test43
-rw-r--r--test/old-elf/Mips/pc23-range.test54
-rw-r--r--test/old-elf/Mips/plt-entry-mixed-1.test114
-rw-r--r--test/old-elf/Mips/plt-entry-mixed-2.test93
-rw-r--r--test/old-elf/Mips/plt-entry-mixed-3.test98
-rw-r--r--test/old-elf/Mips/plt-entry-mixed-4.test85
-rw-r--r--test/old-elf/Mips/plt-entry-r6-be.test109
-rw-r--r--test/old-elf/Mips/plt-entry-r6.test109
-rw-r--r--test/old-elf/Mips/plt-header-be.test104
-rw-r--r--test/old-elf/Mips/plt-header-micro-be.test105
-rw-r--r--test/old-elf/Mips/plt-header-micro.test108
-rw-r--r--test/old-elf/Mips/plt-header-mixed.test105
-rw-r--r--test/old-elf/Mips/plt-header.test99
-rw-r--r--test/old-elf/Mips/r26-1-micro.test131
-rw-r--r--test/old-elf/Mips/r26-1.test132
-rw-r--r--test/old-elf/Mips/r26-2-micro.test31
-rw-r--r--test/old-elf/Mips/r26-2.test31
-rw-r--r--test/old-elf/Mips/reginfo-01.test30
-rw-r--r--test/old-elf/Mips/reginfo-02.test107
-rw-r--r--test/old-elf/Mips/reginfo-03.test45
-rw-r--r--test/old-elf/Mips/reginfo-04.test81
-rw-r--r--test/old-elf/Mips/reginfo-05.test123
-rw-r--r--test/old-elf/Mips/rel-16-overflow.test45
-rw-r--r--test/old-elf/Mips/rel-16.test51
-rw-r--r--test/old-elf/Mips/rel-32-be.test60
-rw-r--r--test/old-elf/Mips/rel-32.test59
-rw-r--r--test/old-elf/Mips/rel-64.test61
-rw-r--r--test/old-elf/Mips/rel-call-hilo-01.test109
-rw-r--r--test/old-elf/Mips/rel-call-hilo-micro.test154
-rw-r--r--test/old-elf/Mips/rel-copy-micro.test159
-rw-r--r--test/old-elf/Mips/rel-copy-pc.test113
-rw-r--r--test/old-elf/Mips/rel-copy.test177
-rw-r--r--test/old-elf/Mips/rel-dynamic-01-micro.test201
-rw-r--r--test/old-elf/Mips/rel-dynamic-01.test261
-rw-r--r--test/old-elf/Mips/rel-dynamic-02.test101
-rw-r--r--test/old-elf/Mips/rel-dynamic-03-micro.test133
-rw-r--r--test/old-elf/Mips/rel-dynamic-03.test129
-rw-r--r--test/old-elf/Mips/rel-dynamic-04-micro.test226
-rw-r--r--test/old-elf/Mips/rel-dynamic-04.test221
-rw-r--r--test/old-elf/Mips/rel-dynamic-05-micro.test192
-rw-r--r--test/old-elf/Mips/rel-dynamic-05.test188
-rw-r--r--test/old-elf/Mips/rel-dynamic-06-64.test114
-rw-r--r--test/old-elf/Mips/rel-dynamic-06.test115
-rw-r--r--test/old-elf/Mips/rel-dynamic-07-64.test348
-rw-r--r--test/old-elf/Mips/rel-dynamic-07.test363
-rw-r--r--test/old-elf/Mips/rel-dynamic-08-64.test275
-rw-r--r--test/old-elf/Mips/rel-dynamic-08-micro.test278
-rw-r--r--test/old-elf/Mips/rel-dynamic-08.test275
-rw-r--r--test/old-elf/Mips/rel-dynamic-09-micro.test109
-rw-r--r--test/old-elf/Mips/rel-dynamic-09.test107
-rw-r--r--test/old-elf/Mips/rel-dynamic-10-micro.test166
-rw-r--r--test/old-elf/Mips/rel-dynamic-10.test160
-rw-r--r--test/old-elf/Mips/rel-dynamic-11.test110
-rw-r--r--test/old-elf/Mips/rel-dynamic-12.test237
-rw-r--r--test/old-elf/Mips/rel-dynamic-13.test94
-rw-r--r--test/old-elf/Mips/rel-dynamic-14.test94
-rw-r--r--test/old-elf/Mips/rel-dynamic-15.test81
-rw-r--r--test/old-elf/Mips/rel-eh-01.test186
-rw-r--r--test/old-elf/Mips/rel-eh-02.test130
-rw-r--r--test/old-elf/Mips/rel-eh-03.test128
-rw-r--r--test/old-elf/Mips/rel-got-hilo-01.test109
-rw-r--r--test/old-elf/Mips/rel-got-hilo-micro.test154
-rw-r--r--test/old-elf/Mips/rel-gprel16-micro-overflow.test57
-rw-r--r--test/old-elf/Mips/rel-gprel16-micro.test78
-rw-r--r--test/old-elf/Mips/rel-gprel16-overflow.test48
-rw-r--r--test/old-elf/Mips/rel-gprel16.test104
-rw-r--r--test/old-elf/Mips/rel-gprel32-64.test84
-rw-r--r--test/old-elf/Mips/rel-gprel32.test84
-rw-r--r--test/old-elf/Mips/rel-gprel7-micro-overflow.test48
-rw-r--r--test/old-elf/Mips/rel-gprel7-micro.test65
-rw-r--r--test/old-elf/Mips/rel-hi0-lo16-micro.test58
-rw-r--r--test/old-elf/Mips/rel-high-01.test25
-rw-r--r--test/old-elf/Mips/rel-high-02.test25
-rw-r--r--test/old-elf/Mips/rel-jalr-01.test101
-rw-r--r--test/old-elf/Mips/rel-jalr-02.test68
-rw-r--r--test/old-elf/Mips/rel-lit-micro.test59
-rw-r--r--test/old-elf/Mips/rel-lit.test57
-rw-r--r--test/old-elf/Mips/rel-pc-hilo.test70
-rw-r--r--test/old-elf/Mips/rel-pc16-align.test43
-rw-r--r--test/old-elf/Mips/rel-pc16-overflow.test45
-rw-r--r--test/old-elf/Mips/rel-pc16.test53
-rw-r--r--test/old-elf/Mips/rel-pc18-s3-align.test44
-rw-r--r--test/old-elf/Mips/rel-pc18-s3-micro.test56
-rw-r--r--test/old-elf/Mips/rel-pc18-s3.test54
-rw-r--r--test/old-elf/Mips/rel-pc19-s2-align.test44
-rw-r--r--test/old-elf/Mips/rel-pc19-s2-micro.test56
-rw-r--r--test/old-elf/Mips/rel-pc19-s2.test54
-rw-r--r--test/old-elf/Mips/rel-pc21-s2-align.test44
-rw-r--r--test/old-elf/Mips/rel-pc21-s2-micro.test56
-rw-r--r--test/old-elf/Mips/rel-pc21-s2-overflow.test45
-rw-r--r--test/old-elf/Mips/rel-pc21-s2.test54
-rw-r--r--test/old-elf/Mips/rel-pc26-s2-align.test44
-rw-r--r--test/old-elf/Mips/rel-pc26-s2-micro.test56
-rw-r--r--test/old-elf/Mips/rel-pc26-s2.test54
-rw-r--r--test/old-elf/Mips/rel-pc32.test59
-rw-r--r--test/old-elf/Mips/rel-pc7-10-16-23.test86
-rw-r--r--test/old-elf/Mips/rel-sub-micro.test62
-rw-r--r--test/old-elf/Mips/rel-sub.test61
-rw-r--r--test/old-elf/Mips/rld_map.test42
-rw-r--r--test/old-elf/Mips/sign-rela.test54
-rw-r--r--test/old-elf/Mips/st-other.test90
-rw-r--r--test/old-elf/Mips/static-01.test119
-rw-r--r--test/old-elf/Mips/tls-1-micro.test65
-rw-r--r--test/old-elf/Mips/tls-1.test63
-rw-r--r--test/old-elf/Mips/tls-2-64-static.test71
-rw-r--r--test/old-elf/Mips/tls-2-64.test69
-rw-r--r--test/old-elf/Mips/tls-2-micro.test70
-rw-r--r--test/old-elf/Mips/tls-2-static.test125
-rw-r--r--test/old-elf/Mips/tls-2.test69
-rw-r--r--test/old-elf/Mips/tls-3-64-static.test70
-rw-r--r--test/old-elf/Mips/tls-3-micro.test183
-rw-r--r--test/old-elf/Mips/tls-3-static.test67
-rw-r--r--test/old-elf/Mips/tls-3.test180
-rw-r--r--test/old-elf/Mips/tls-4-64-static.test71
-rw-r--r--test/old-elf/Mips/tls-4-micro.test126
-rw-r--r--test/old-elf/Mips/tls-4-static.test68
-rw-r--r--test/old-elf/Mips/tls-4.test123
-rw-r--r--test/old-elf/Mips/tls-5-64.test71
-rw-r--r--test/old-elf/Mips/tls-5-micro.test70
-rw-r--r--test/old-elf/Mips/tls-5.test69
-rw-r--r--test/old-elf/Mips/validate-rel-01.test82
-rw-r--r--test/old-elf/Mips/validate-rel-03.test56
-rw-r--r--test/old-elf/X86_64/ExampleTarget/triple.test32
-rw-r--r--test/old-elf/X86_64/Inputs/constint.c1
-rw-r--r--test/old-elf/X86_64/Inputs/constint.obin0 -> 1062 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/debug0.c5
-rw-r--r--test/old-elf/X86_64/Inputs/debug0.x86-64bin0 -> 2704 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/debug1.c3
-rw-r--r--test/old-elf/X86_64/Inputs/debug1.x86-64bin0 -> 2584 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/externtls.c6
-rw-r--r--test/old-elf/X86_64/Inputs/externtls.x86-64bin0 -> 1424 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/fn.c4
-rw-r--r--test/old-elf/X86_64/Inputs/fn.obin0 -> 1072 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/generaltls-so.o.yaml67
-rw-r--r--test/old-elf/X86_64/Inputs/group/1.c8
-rw-r--r--test/old-elf/X86_64/Inputs/group/1.obin0 -> 1456 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/group/fn.c4
-rw-r--r--test/old-elf/X86_64/Inputs/group/fn.obin0 -> 1360 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/group/fn1.c3
-rw-r--r--test/old-elf/X86_64/Inputs/group/fn1.obin0 -> 1352 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/group/fn2.c3
-rw-r--r--test/old-elf/X86_64/Inputs/group/fn2.obin0 -> 1224 bytes
-rwxr-xr-xtest/old-elf/X86_64/Inputs/group/group.sh38
-rw-r--r--test/old-elf/X86_64/Inputs/group/libfn.abin0 -> 2792 bytes
-rwxr-xr-xtest/old-elf/X86_64/Inputs/group/libfn.sobin0 -> 2516 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/group/libfn1.abin0 -> 1492 bytes
-rwxr-xr-xtest/old-elf/X86_64/Inputs/group/libfn2.sobin0 -> 9624 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/initfini-option.c13
-rw-r--r--test/old-elf/X86_64/Inputs/initfini-option.obin0 -> 1824 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/initfini.c14
-rw-r--r--test/old-elf/X86_64/Inputs/initfini.obin0 -> 2256 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/largebss.c3
-rw-r--r--test/old-elf/X86_64/Inputs/largebss.obin0 -> 1131 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/layoutpass/1.c8
-rw-r--r--test/old-elf/X86_64/Inputs/layoutpass/1.obin0 -> 1448 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/layoutpass/2.c7
-rw-r--r--test/old-elf/X86_64/Inputs/layoutpass/2.obin0 -> 1320 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/layoutpass/3.c3
-rw-r--r--test/old-elf/X86_64/Inputs/layoutpass/3.obin0 -> 1216 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/layoutpass/lib2.abin0 -> 1464 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/libfn.abin0 -> 1364 bytes
-rwxr-xr-xtest/old-elf/X86_64/Inputs/libfn.sobin0 -> 2008 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/main.c4
-rw-r--r--test/old-elf/X86_64/Inputs/main.obin0 -> 1360 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/multi-ovrd.c10
-rw-r--r--test/old-elf/X86_64/Inputs/multi-ovrd.obin0 -> 1648 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/multi-weak.c20
-rw-r--r--test/old-elf/X86_64/Inputs/multi-weak.obin0 -> 1856 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/multiweaksyms.obin0 -> 928 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/nmagic.c8
-rw-r--r--test/old-elf/X86_64/Inputs/nmagic.obin0 -> 1528 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/no-interp-section.c1
-rw-r--r--test/old-elf/X86_64/Inputs/no-interp-section.obin0 -> 975 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/note.obin0 -> 785 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/note.s11
-rw-r--r--test/old-elf/X86_64/Inputs/note_ro_rw.obin0 -> 905 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/note_ro_rw.s21
-rw-r--r--test/old-elf/X86_64/Inputs/ovrd.c6
-rw-r--r--test/old-elf/X86_64/Inputs/ovrd.obin0 -> 1488 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/rodata.c3
-rw-r--r--test/old-elf/X86_64/Inputs/rodata.obin0 -> 1584 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/rodata.s24
-rw-r--r--test/old-elf/X86_64/Inputs/rwint.c1
-rw-r--r--test/old-elf/X86_64/Inputs/rwint.obin0 -> 963 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/sectionmap.c4
-rw-r--r--test/old-elf/X86_64/Inputs/sectionmap.obin0 -> 1478 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/undefcpp.c1
-rw-r--r--test/old-elf/X86_64/Inputs/undefcpp.obin0 -> 1344 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/weak-zero-sized.obin0 -> 688 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/weak.c14
-rw-r--r--test/old-elf/X86_64/Inputs/weak.obin0 -> 1712 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/weak.s21
-rw-r--r--test/old-elf/X86_64/Inputs/zerosizedsection.obin0 -> 760 bytes
-rw-r--r--test/old-elf/X86_64/Inputs/zerosizedsection.s3
-rw-r--r--test/old-elf/X86_64/alignoffset.test118
-rw-r--r--test/old-elf/X86_64/debug.test57
-rw-r--r--test/old-elf/X86_64/defsym.test22
-rw-r--r--test/old-elf/X86_64/demangle.test12
-rw-r--r--test/old-elf/X86_64/dontignorezerosize-sections.test9
-rw-r--r--test/old-elf/X86_64/dynamicvars.test123
-rw-r--r--test/old-elf/X86_64/dynlib-nointerp-section.test4
-rw-r--r--test/old-elf/X86_64/dynlib-search.test6
-rw-r--r--test/old-elf/X86_64/dynsym-weak.test118
-rw-r--r--test/old-elf/X86_64/extern-tls.test16
-rw-r--r--test/old-elf/X86_64/general-dynamic-tls.test128
-rw-r--r--test/old-elf/X86_64/imagebase.test94
-rw-r--r--test/old-elf/X86_64/initfini-order.test10
-rw-r--r--test/old-elf/X86_64/initfini.test23
-rw-r--r--test/old-elf/X86_64/largebss.test20
-rw-r--r--test/old-elf/X86_64/layoutpass-order.test14
-rw-r--r--test/old-elf/X86_64/maxpagesize.test113
-rw-r--r--test/old-elf/X86_64/mergesimilarstrings.test47
-rw-r--r--test/old-elf/X86_64/multi-weak-layout.test52
-rw-r--r--test/old-elf/X86_64/multi-weak-override.test16
-rw-r--r--test/old-elf/X86_64/multi-weak-syms-order.test13
-rw-r--r--test/old-elf/X86_64/nmagic.test91
-rw-r--r--test/old-elf/X86_64/noalignsegments.test95
-rw-r--r--test/old-elf/X86_64/note-sections-ro_plus_rw.test42
-rw-r--r--test/old-elf/X86_64/note-sections.test23
-rw-r--r--test/old-elf/X86_64/omagic.test237
-rw-r--r--test/old-elf/X86_64/outputsegments.test188
-rw-r--r--test/old-elf/X86_64/reloc_r_x86_64_16.test59
-rw-r--r--test/old-elf/X86_64/reloc_r_x86_64_pc16.test60
-rw-r--r--test/old-elf/X86_64/reloc_r_x86_64_pc64.test60
-rw-r--r--test/old-elf/X86_64/rodata.test9
-rw-r--r--test/old-elf/X86_64/sectionchoice.test7
-rw-r--r--test/old-elf/X86_64/sectionmap.test22
-rw-r--r--test/old-elf/X86_64/startGroupEndGroup.test48
-rw-r--r--test/old-elf/X86_64/startGroupEndGroupWithDynlib.test10
-rw-r--r--test/old-elf/X86_64/staticlib-search.test6
-rw-r--r--test/old-elf/X86_64/undef.test18
-rw-r--r--test/old-elf/X86_64/underscore-end.test81
-rw-r--r--test/old-elf/X86_64/weak-override.test45
-rw-r--r--test/old-elf/X86_64/weak-zero-sized.test26
-rw-r--r--test/old-elf/X86_64/weaksym.test77
-rw-r--r--test/old-elf/X86_64/yamlinput.test166
-rw-r--r--test/old-elf/abs-dup.objtxt19
-rw-r--r--test/old-elf/abs.test19
-rw-r--r--test/old-elf/allowduplicates.objtxt41
-rw-r--r--test/old-elf/archive-elf-forceload.test43
-rw-r--r--test/old-elf/archive-elf.test38
-rw-r--r--test/old-elf/as-needed.test15
-rw-r--r--test/old-elf/branch.test34
-rw-r--r--test/old-elf/check.test39
-rw-r--r--test/old-elf/checkrodata.test9
-rw-r--r--test/old-elf/common.test10
-rw-r--r--test/old-elf/consecutive-weak-sym-defs.test81
-rw-r--r--test/old-elf/defsym.objtxt31
-rw-r--r--test/old-elf/discard-all.test88
-rw-r--r--test/old-elf/discard-locals.test65
-rw-r--r--test/old-elf/dynamic-segorder.test17
-rw-r--r--test/old-elf/dynamic-undef.test38
-rw-r--r--test/old-elf/dynamic.test80
-rw-r--r--test/old-elf/eh_frame_hdr.test30
-rw-r--r--test/old-elf/entry.objtxt58
-rw-r--r--test/old-elf/export-dynamic.test98
-rw-r--r--test/old-elf/filenotfound.test3
-rw-r--r--test/old-elf/gnulinkonce/gnulinkonce-report-discarded-reference.test145
-rw-r--r--test/old-elf/gnulinkonce/gnulinkonce-report-undef.test127
-rw-r--r--test/old-elf/gnulinkonce/gnulinkonce.test149
-rw-r--r--test/old-elf/gotpcrel.test21
-rw-r--r--test/old-elf/gottpoff.test119
-rw-r--r--test/old-elf/group-cmd-search.test134
-rw-r--r--test/old-elf/hexagon-quickdata-sort.test12
-rw-r--r--test/old-elf/hexagon-quickdata-sortcommon.test16
-rw-r--r--test/old-elf/ifunc.test69
-rw-r--r--test/old-elf/ignore-unknownoption.test5
-rw-r--r--test/old-elf/init_array-order.test67
-rw-r--r--test/old-elf/init_array.test127
-rw-r--r--test/old-elf/initfini-options.test-1.test33
-rw-r--r--test/old-elf/initfini-options.test-2.test47
-rw-r--r--test/old-elf/initfini-options.test-3.test53
-rw-r--r--test/old-elf/librarynotfound.test5
-rw-r--r--test/old-elf/linker-as-ld.test16
-rw-r--r--test/old-elf/linkerscript/Inputs/externs.ls3
-rw-r--r--test/old-elf/linkerscript/Inputs/invalid.ls1
-rw-r--r--test/old-elf/linkerscript/Inputs/prog1.o.yaml87
-rw-r--r--test/old-elf/linkerscript/Inputs/prog2.o.yaml88
-rw-r--r--test/old-elf/linkerscript/Inputs/prog3.o.yaml51
-rw-r--r--test/old-elf/linkerscript/Inputs/simple-pic.o.yaml32
-rw-r--r--test/old-elf/linkerscript/Inputs/simple.o.yaml51
-rw-r--r--test/old-elf/linkerscript/Inputs/valid.ls6
-rw-r--r--test/old-elf/linkerscript/externs.objtxt21
-rw-r--r--test/old-elf/linkerscript/filename-with-wildcards.test49
-rw-r--r--test/old-elf/linkerscript/invalid-script-cli-1.test10
-rw-r--r--test/old-elf/linkerscript/invalid-script-cli-2.test6
-rw-r--r--test/old-elf/linkerscript/invalid.test5
-rw-r--r--test/old-elf/linkerscript/phdrs-all-none.test26
-rw-r--r--test/old-elf/linkerscript/phdrs-custom-none.test36
-rw-r--r--test/old-elf/linkerscript/phdrs-default.test82
-rw-r--r--test/old-elf/linkerscript/phdrs-different.test45
-rw-r--r--test/old-elf/linkerscript/phdrs-extra-program.test27
-rw-r--r--test/old-elf/linkerscript/phdrs-flags.test46
-rw-r--r--test/old-elf/linkerscript/phdrs-has-program.test33
-rw-r--r--test/old-elf/linkerscript/phdrs-invalid.test63
-rw-r--r--test/old-elf/linkerscript/phdrs-misplaced-program.test26
-rw-r--r--test/old-elf/linkerscript/phdrs-no-program.test25
-rw-r--r--test/old-elf/linkerscript/phdrs-one-none.test36
-rw-r--r--test/old-elf/linkerscript/phdrs-program-flags.test33
-rw-r--r--test/old-elf/linkerscript/phdrs-program-good-phdrs.test34
-rw-r--r--test/old-elf/linkerscript/phdrs-program-no-phdrs.test26
-rw-r--r--test/old-elf/linkerscript/phdrs-program-wrong-phdrs.test26
-rw-r--r--test/old-elf/linkerscript/phdrs-same-flags.test35
-rw-r--r--test/old-elf/linkerscript/phdrs-same.test36
-rw-r--r--test/old-elf/linkerscript/phdrs/sections-empty-phdrs.script11
-rw-r--r--test/old-elf/linkerscript/phdrs/sections-no-phdrs.script7
-rw-r--r--test/old-elf/linkerscript/phdrs/sections-none-phdrs.script11
-rw-r--r--test/old-elf/linkerscript/phdrs/undef-empty-phdrs.script11
-rw-r--r--test/old-elf/linkerscript/phdrs/undef-id-phdrs.script12
-rw-r--r--test/old-elf/linkerscript/phdrs/undef-no-phdrs.script7
-rw-r--r--test/old-elf/linkerscript/sections-order.test113
-rw-r--r--test/old-elf/linkerscript/sections-with-wildcards.test88
-rw-r--r--test/old-elf/linkerscript/symbol-definition-so.test32
-rw-r--r--test/old-elf/linkerscript/symbol-definition.test54
-rw-r--r--test/old-elf/linkerscript/valid-script-cli.objtxt23
-rw-r--r--test/old-elf/loginputfiles.test28
-rw-r--r--test/old-elf/mergeatoms.test6
-rw-r--r--test/old-elf/mergeconstants.test20
-rw-r--r--test/old-elf/mergeglobalatoms.test11
-rw-r--r--test/old-elf/no-unique-section-names.test19
-rw-r--r--test/old-elf/note.test50
-rw-r--r--test/old-elf/options/dynamic-linker.test17
-rw-r--r--test/old-elf/options/target-specific-args.test5
-rw-r--r--test/old-elf/phdr.test99
-rw-r--r--test/old-elf/quickdata.test15
-rw-r--r--test/old-elf/reloc.test38
-rw-r--r--test/old-elf/responsefile.test6
-rw-r--r--test/old-elf/rodata.test5
-rw-r--r--test/old-elf/rosegment.test26
-rw-r--r--test/old-elf/sectionGroups/sectiongroup-new-members.test151
-rw-r--r--test/old-elf/sectionGroups/sectiongroup-simple.test144
-rw-r--r--test/old-elf/sectionGroups/sectiongroup-undef-member-other.test156
-rw-r--r--test/old-elf/sectionGroups/sectiongroup-undef-member.test142
-rw-r--r--test/old-elf/sectionGroups/sectiongroup-with-globalsymbols.test250
-rw-r--r--test/old-elf/sectionGroups/sectiongroup-with-undef-external-reference.test236
-rw-r--r--test/old-elf/sectionGroups/sectiongroup-with-undef-signature.test219
-rw-r--r--test/old-elf/sections.test142
-rw-r--r--test/old-elf/sh_addralign.test37
-rw-r--r--test/old-elf/shndx.test18
-rw-r--r--test/old-elf/soname.test6
-rw-r--r--test/old-elf/start-stop-sym.test108
-rw-r--r--test/old-elf/strip-all.test108
-rw-r--r--test/old-elf/stripped-empty.test4
-rw-r--r--test/old-elf/symbols.test33
-rw-r--r--test/old-elf/tls-tbss-size.test176
-rw-r--r--test/old-elf/tls.test43
-rw-r--r--test/old-elf/tlsAddr.test7
-rw-r--r--test/old-elf/undef-from-dso-to-main.test52
-rw-r--r--test/old-elf/undef-from-main-dso.test43
-rw-r--r--test/old-elf/weaksym.test7
-rw-r--r--test/old-elf/wrap.test276
-rw-r--r--test/old-elf/x86-64-dynamic-relocs.test26
-rw-r--r--test/old-elf/x86-64-dynamic.test79
-rw-r--r--test/old-elf/x86.test38
-rw-r--r--test/old-elf/x86_64-kinds.test23
-rw-r--r--test/old-elf/zoption_dtflags.test89
640 files changed, 37769 insertions, 0 deletions
diff --git a/test/old-elf/AArch64/Inputs/fn.c b/test/old-elf/AArch64/Inputs/fn.c
new file mode 100644
index 000000000000..54939a2426b2
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/fn.c
@@ -0,0 +1,4 @@
+int fn()
+{
+ return 0;
+}
diff --git a/test/old-elf/AArch64/Inputs/fn.o b/test/old-elf/AArch64/Inputs/fn.o
new file mode 100644
index 000000000000..53e47ad37742
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/fn.o
Binary files differ
diff --git a/test/old-elf/AArch64/Inputs/general-dyn-tls-0.yaml b/test/old-elf/AArch64/Inputs/general-dyn-tls-0.yaml
new file mode 100644
index 000000000000..e355a3d85cdf
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/general-dyn-tls-0.yaml
@@ -0,0 +1,64 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_AARCH64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: FF4300D1E00F00B900040011E103002A48D03BD50801009108010091000100B9E10B00B9FF430091C0035FD6
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000014
+ Symbol: var
+ Type: R_AARCH64_TLSLE_ADD_TPREL_HI12
+ - Offset: 0x0000000000000018
+ Symbol: var
+ Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .tbss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+# - Name: test_tls.c
+# Type: STT_FILE
+ - Name: '$d.1'
+ Section: .tbss
+ - Name: '$x.0'
+ Section: .text
+ - Name: .tbss
+ Type: STT_TLS
+ Section: .tbss
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000002C
+ - Name: var
+ Type: STT_TLS
+ Section: .tbss
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/AArch64/Inputs/initfini-option.c b/test/old-elf/AArch64/Inputs/initfini-option.c
new file mode 100644
index 000000000000..6021fb57ffa9
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/initfini-option.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+void init() {
+ printf("%s\n", __FUNCTION__);
+}
+
+void fini() {
+ printf("%s\n", __FUNCTION__);
+}
+
+int main() {
+}
diff --git a/test/old-elf/AArch64/Inputs/initfini-option.o b/test/old-elf/AArch64/Inputs/initfini-option.o
new file mode 100644
index 000000000000..c75079b013fa
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/initfini-option.o
Binary files differ
diff --git a/test/old-elf/AArch64/Inputs/initfini.c b/test/old-elf/AArch64/Inputs/initfini.c
new file mode 100644
index 000000000000..8369d68a8dab
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/initfini.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+void __attribute__ ((constructor)) constructor() {
+ printf("%s\n", __FUNCTION__);
+}
+
+void __attribute__ ((destructor)) destructor() {
+ printf("%s\n", __FUNCTION__);
+}
+
+int main() {
+ return 0;
+}
diff --git a/test/old-elf/AArch64/Inputs/initfini.o b/test/old-elf/AArch64/Inputs/initfini.o
new file mode 100644
index 000000000000..030fe59878be
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/initfini.o
Binary files differ
diff --git a/test/old-elf/AArch64/Inputs/initial-exec-tls-1.yaml b/test/old-elf/AArch64/Inputs/initial-exec-tls-1.yaml
new file mode 100644
index 000000000000..2a6104a150ea
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/initial-exec-tls-1.yaml
@@ -0,0 +1,77 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_AARCH64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .tbss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Size: 16
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742065653461393664373236383264353237636635353336313135366235656531383662303964363138292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623065376165623639343236646331346637376466626535343533333536366664363866396466632900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: '$d.0'
+ Type: STT_TLS
+ Section: .tbss
+ - Name: '$d.1'
+ Section: .comment
+ - Name: .tbss
+ Type: STT_TLS
+ Section: .tbss
+ - Type: STT_SECTION
+ Section: .text
+ - Type: STT_SECTION
+ Section: .data
+ - Type: STT_SECTION
+ Section: .bss
+ - Type: STT_SECTION
+ Section: .comment
+ - Type: STT_SECTION
+ Section: .note.GNU-stack
+ Global:
+ - Name: e0
+ Type: STT_TLS
+ Section: .tbss
+ Size: 0x0000000000000004
+ - Name: e1
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: e2
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000008
+ Size: 0x0000000000000004
+ - Name: e3
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x000000000000000C
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/AArch64/Inputs/main.c b/test/old-elf/AArch64/Inputs/main.c
new file mode 100644
index 000000000000..0280c9127076
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/main.c
@@ -0,0 +1,4 @@
+int main() {
+ fn();
+ return 0;
+}
diff --git a/test/old-elf/AArch64/Inputs/main.o b/test/old-elf/AArch64/Inputs/main.o
new file mode 100644
index 000000000000..8c0f049da6a8
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/main.o
Binary files differ
diff --git a/test/old-elf/AArch64/Inputs/no-interp-section.c b/test/old-elf/AArch64/Inputs/no-interp-section.c
new file mode 100644
index 000000000000..3981c038ed33
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/no-interp-section.c
@@ -0,0 +1 @@
+int c = 10;
diff --git a/test/old-elf/AArch64/Inputs/no-interp-section.o b/test/old-elf/AArch64/Inputs/no-interp-section.o
new file mode 100644
index 000000000000..36b41fdbf782
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/no-interp-section.o
Binary files differ
diff --git a/test/old-elf/AArch64/Inputs/zerosizedsection.o b/test/old-elf/AArch64/Inputs/zerosizedsection.o
new file mode 100644
index 000000000000..10123fcef90d
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/zerosizedsection.o
Binary files differ
diff --git a/test/old-elf/AArch64/Inputs/zerosizedsection.s b/test/old-elf/AArch64/Inputs/zerosizedsection.s
new file mode 100644
index 000000000000..651ee3aab503
--- /dev/null
+++ b/test/old-elf/AArch64/Inputs/zerosizedsection.s
@@ -0,0 +1,3 @@
+.text
+.data
+.word .text
diff --git a/test/old-elf/AArch64/defsym.test b/test/old-elf/AArch64/defsym.test
new file mode 100644
index 000000000000..f9864092ddc3
--- /dev/null
+++ b/test/old-elf/AArch64/defsym.test
@@ -0,0 +1,22 @@
+RUN: lld -flavor old-gnu -target aarch64--linux-gnu --defsym=main=fn \
+RUN: --noinhibit-exec %p/Inputs/fn.o -o %t
+RUN: llvm-readobj -symbols %t | FileCheck %s
+
+CHECK: Symbol {
+CHECK: Name: main (1)
+CHECK: Value: 0x4001A4
+CHECK: Size: 0
+CHECK: Binding: Global (0x1)
+CHECK: Type: Function (0x2)
+CHECK: Other: 0
+CHECK: Section: .text (0x5)
+CHECK: }
+CHECK: Symbol {
+CHECK: Name: fn (11)
+CHECK: Value: 0x4001A4
+CHECK: Size: 8
+CHECK: Binding: Global (0x1)
+CHECK: Type: Function (0x2)
+CHECK: Other: 0
+CHECK: Section: .text (0x5)
+CHECK: }
diff --git a/test/old-elf/AArch64/dontignorezerosize-sections.test b/test/old-elf/AArch64/dontignorezerosize-sections.test
new file mode 100644
index 000000000000..8f3b27702208
--- /dev/null
+++ b/test/old-elf/AArch64/dontignorezerosize-sections.test
@@ -0,0 +1,9 @@
+# This tests that lld is not ignoring zero sized sections
+RUN: lld -flavor old-gnu -target aarch64--linux-gnu %p/Inputs/zerosizedsection.o \
+RUN: --noinhibit-exec --output-filetype=yaml -o %t
+RUN: FileCheck %s < %t
+
+CHECK: references:
+CHECK: - kind: layout-after
+CHECK: offset: 0
+CHECK: target: L000
diff --git a/test/old-elf/AArch64/dynamicvars.test b/test/old-elf/AArch64/dynamicvars.test
new file mode 100644
index 000000000000..80228f0cd4b2
--- /dev/null
+++ b/test/old-elf/AArch64/dynamicvars.test
@@ -0,0 +1,113 @@
+# Tests that the dynamic variables created by the linker are set to the right
+# values.
+
+# RUN: yaml2obj --format elf -docnum 1 %s -o %t.o
+# RUN: lld -flavor old-gnu -target aarch64 -e main %t.o -o %t1 --noinhibit-exec
+# RUN: llvm-readobj -sections -symbols %t1 | FileCheck %s
+
+
+# CHECK: Name: .dynamic
+# CHECK: Type: SHT_DYNAMIC
+# CHECK: Address: [[TARGETA:[0xa-fA-f0-9]+]]
+# CHECK: Name: .got.plt
+# CHECK: Type: SHT_PROGBITS
+# CHECK: Address: [[TARGETB:[0xa-fA-f0-9]+]]
+# CHECK: Name: _DYNAMIC
+# CHECK: Value: [[TARGETA]]
+# CHECK: Section: .dynamic
+# CHECK: Name: _GLOBAL_OFFSET_TABLE_
+# CHECK: Value: [[TARGETB]]
+# CHECK: Section: .got.plt
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ - Name: .text.startup
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: FD7BBFA900000090FD030091000000910000009400008052FD7BC1A8C0035FD6
+ - Name: .rela.text.startup
+ Type: SHT_RELA
+ Flags: [ SHF_INFO_LINK ]
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text.startup
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: .rodata.str1.8
+ Type: R_AARCH64_ADR_PREL_PG_HI21
+ - Offset: 0x000000000000000C
+ Symbol: .rodata.str1.8
+ Type: R_AARCH64_ADD_ABS_LO12_NC
+ - Offset: 0x0000000000000010
+ Symbol: puts
+ Type: R_AARCH64_CALL26
+ - Name: .rodata.str1.8
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000008
+ Content: '7465737400000000'
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 004743433A2028474E552920342E392E33203230313530333234202870726572656C656173652900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: test.c
+ Type: STT_FILE
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .text.startup
+ Type: STT_SECTION
+ Section: .text.startup
+ - Name: '$x'
+ Section: .text.startup
+ - Name: .rodata.str1.8
+ Type: STT_SECTION
+ Section: .rodata.str1.8
+ - Name: '$d'
+ Section: .rodata.str1.8
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text.startup
+ Size: 0x0000000000000020
+ - Name: puts
+...
diff --git a/test/old-elf/AArch64/dynlib-nointerp-section.test b/test/old-elf/AArch64/dynlib-nointerp-section.test
new file mode 100644
index 000000000000..c4f4edab61b1
--- /dev/null
+++ b/test/old-elf/AArch64/dynlib-nointerp-section.test
@@ -0,0 +1,5 @@
+RUN: lld -flavor old-gnu -target aarch64--linux-gnu %p/Inputs/no-interp-section.o \
+RUN: -o %t -shared
+RUN: llvm-objdump -section-headers %t | FileCheck %s
+
+CHECK-NOT: .interp
diff --git a/test/old-elf/AArch64/general-dyn-tls-0.test b/test/old-elf/AArch64/general-dyn-tls-0.test
new file mode 100644
index 000000000000..ae2af94d057d
--- /dev/null
+++ b/test/old-elf/AArch64/general-dyn-tls-0.test
@@ -0,0 +1,103 @@
+# Check for correct offsets when handling relocations for general dynamic TLS
+# access in executable binaries.
+#
+# The test case was generated from following code snippet:
+#
+# == test_tls.c ==
+#
+# __thread int var;
+# void foo (int x) {
+# var = x + 1;
+# }
+#
+# == test_main.c ==
+# #include <stdio.h>
+#
+# extern __thread int var;
+# extern void foo (int);
+#
+# int main () {
+# foo (10);
+# return var;
+# }
+#
+# The objects are compiled with -fpic.
+
+#RUN: yaml2obj -format=elf %p/Inputs/general-dyn-tls-0.yaml -o=%t-t1.o
+#RUN: yaml2obj -format=elf %s -o %t-t0.o
+#RUN: lld -flavor old-gnu -target arm64 --noinhibit-exec -o %t.exe %t-t0.o %t-t1.o
+#RUN: llvm-readobj -relocations %t.exe | FileCheck %s -check-prefix=CHECKRELOCATION
+#RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+#CHECKRELOCATION: Relocations [
+#CHECKRELOCATION: .rela.dyn {
+#CHECKRELOCATION: 0x401090 R_AARCH64_TLSDESC var 0x0
+#CHECKRELOCATION: }
+
+#CHECK: Contents of section .text:
+#CHECK: 400250 a8c31fb8 40018052 0b000094 000000b0 ....@..R........
+# \_ adrp x0, 401000 <_DYNAMIC> (R_AARCH64_TLSDESC_ADR_PAGE21)
+#CHECK-NEXT: 400260 014840f9 00400291 20003fd6 49d03bd5 .H@..@.. .?.I.;.
+# \_ | | ldr x1, [x0,#144] (R_AARCH64_TLSDESC_LD64_LO12_NC)
+# \_ | add x0, x0, #0x90 (R_AARCH64_TLSDESC_ADD_LO12_NC)
+# \_ blr x1 (R_AARCH64_TLSDESC_CALL)
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_AARCH64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: FD7BBFA9FD030091FF4300D1E8031F2AA8C31FB8400180520000009400000090010040F90000009120003FD649D03BD5286960B8E003082ABF030091FD7BC1A8C0035FD6
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000018
+ Symbol: foo
+ Type: R_AARCH64_CALL26
+ - Offset: 0x000000000000001C
+ Symbol: var
+ Type: R_AARCH64_TLSDESC_ADR_PAGE21
+ - Offset: 0x0000000000000020
+ Symbol: var
+ Type: R_AARCH64_TLSDESC_LD64_LO12_NC
+ - Offset: 0x0000000000000024
+ Symbol: var
+ Type: R_AARCH64_TLSDESC_ADD_LO12_NC
+ - Offset: 0x0000000000000028
+ Symbol: var
+ Type: R_AARCH64_TLSDESC_CALL
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: '$x.0'
+ Section: .text
+ Global:
+ - Name: foo
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000044
+ - Name: var
+ Type: STT_TLS
diff --git a/test/old-elf/AArch64/initfini.test b/test/old-elf/AArch64/initfini.test
new file mode 100644
index 000000000000..c5f385082edc
--- /dev/null
+++ b/test/old-elf/AArch64/initfini.test
@@ -0,0 +1,23 @@
+# This tests the functionality that lld is able to read
+# init_array/fini_array sections in the input ELF. This
+# corresponds to the the .init_array/.fini_array sections
+# in the output ELF.
+
+RUN: lld -flavor old-gnu -target aarch64--linux-gnu %p/Inputs/initfini.o \
+RUN: --noinhibit-exec --output-filetype=yaml -o %t
+RUN: FileCheck %s < %t
+
+CHECK: type: data
+CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECK: section-name: .init_array
+CHECK: references:
+CHECK: - kind: R_AARCH64_ABS64
+CHECK: offset: 0
+CHECK: target: constructor
+CHECK: type: data
+CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECK: section-name: .fini_array
+CHECK: references:
+CHECK: - kind: R_AARCH64_ABS64
+CHECK: offset: 0
+CHECK: target: destructor
diff --git a/test/old-elf/AArch64/initial-exec-tls-0.test b/test/old-elf/AArch64/initial-exec-tls-0.test
new file mode 100644
index 000000000000..4cb5f9c7052a
--- /dev/null
+++ b/test/old-elf/AArch64/initial-exec-tls-0.test
@@ -0,0 +1,146 @@
+# Check for initial executable TLS access across different modules. For
+# this case compiler will emit R_AARCH64_TLSLD_ADR_PAGE21 and
+# R_AARCH64_TLSLD_ADD_LO12_NC static relocations and linker should create
+# a R_AARCH64_TLS_TPREL64 dynamic relocation for variable access.
+
+# The test case was generated from following code snippet:
+#
+# t1.c (initial-exec-tls-1.yaml)
+#
+# __thread int e0;
+# __thread int e1;
+# __thread int e2;
+# __thread int e3;
+#
+# t0.c (initial-exec-tls-0.test)
+#
+# extern __thread int e0;
+# extern __thread int e1;
+# extern __thread int e2;
+# extern __thread int e3;
+#
+# int main ()
+# {
+# e0 = 1;
+# e1 = 2;
+# e1 = 3;
+# e1 = 4;
+# }
+
+#RUN: yaml2obj -format=elf %p/Inputs/initial-exec-tls-1.yaml -o=%t-t1.o
+#RUN: yaml2obj -format=elf %s -o %t-t0.o
+#RUN: lld -flavor old-gnu -target arm64 --noinhibit-exec -o %t.exe %t-t0.o %t-t1.o
+#RUN: llvm-readobj -relocations %t.exe | FileCheck %s -check-prefix=CHECKRELOCATION
+#RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e0 0x0
+#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e1 0x0
+#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e2 0x0
+#CHECKRELOCATION: R_AARCH64_TLS_TPREL64 e3 0x0
+
+#CHECK: Contents of section .text:
+#CHECK-NEXT: 4002c0 ff4300d1 e8031f2a e9031e32 0a0000b0 .C.....*...2....
+# \_ adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21)
+#CHECK-NEXT: 4002d0 4a4940f9 4bd03bd5 ec030032 6c692ab8 JI@.K.;....2li*.
+# \_ ldr x10, [x10,#144] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC)
+#CHECK-NEXT: 4002e0 0a0000b0 4a4d40f9 ec031f32 6c692ab8 ....JM@....2li*.
+# \_ | adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21)
+# \_ ldr x10, [x10,#152] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC)
+#CHECK-NEXT: 4002f0 0a0000b0 4a5140f9 ec070032 6c692ab8 ....JQ@....2li*.
+# \_ | adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21)
+# \_ ldr x10, [x10,#160] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC)
+#CHECK-NEXT: 400300 0a0000b0 4a5540f9 ec031e32 6c692ab8 ....JU@....2li*.
+# \_ | adrp x10, 401000 (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21)
+# \_ ldr x10, [x10,#168] (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC)
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_AARCH64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: FF4300D1E8031F2AE9031E320A0000904A0140F94BD03BD5EC0300326C692AB80A0000904A0140F9EC031F326C692AB80A0000904A0140F9EC0700326C692AB80A0000904A0140F9EC031E326C692AB8E003082AE90F00B9FF430091C0035FD6
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000000C
+ Symbol: e0
+ Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
+ - Offset: 0x0000000000000010
+ Symbol: e0
+ Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
+ - Offset: 0x0000000000000020
+ Symbol: e1
+ Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
+ - Offset: 0x0000000000000024
+ Symbol: e1
+ Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
+ - Offset: 0x0000000000000030
+ Symbol: e2
+ Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
+ - Offset: 0x0000000000000034
+ Symbol: e2
+ Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
+ - Offset: 0x0000000000000040
+ Symbol: e3
+ Type: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21
+ - Offset: 0x0000000000000044
+ Symbol: e3
+ Type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742065653461393664373236383264353237636635353336313135366235656531383662303964363138292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623065376165623639343236646331346637376466626535343533333536366664363866396466632900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: '$d.1'
+ Section: .comment
+ - Name: '$x.0'
+ Section: .text
+ - Type: STT_SECTION
+ Section: .text
+ - Type: STT_SECTION
+ Section: .data
+ - Type: STT_SECTION
+ Section: .bss
+ - Type: STT_SECTION
+ Section: .comment
+ - Type: STT_SECTION
+ Section: .note.GNU-stack
+ Global:
+ - Name: e0
+ Type: STT_TLS
+ - Name: e1
+ Type: STT_TLS
+ - Name: e2
+ Type: STT_TLS
+ - Name: e3
+ Type: STT_TLS
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000060
+...
diff --git a/test/old-elf/AArch64/local-tls.test b/test/old-elf/AArch64/local-tls.test
new file mode 100644
index 000000000000..f339ae20e154
--- /dev/null
+++ b/test/old-elf/AArch64/local-tls.test
@@ -0,0 +1,184 @@
+# Check for correct offsets when handling relocations for local TLS
+# access (R_AARCH64_TLSLE_ADD_TPREL_HI12, R_AARCH64_TLSLE_ADD_TPREL_LO12_NC)
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 --noinhibit-exec -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 4001dc 48d03bd5 08010091 08610091 090140b9 H.;......a....@.
+# \_ | | <foo1>:
+# \_ | add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12)
+# \_ add x8, x8, #0x18 (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC)
+# CHECK-NEXT: 4001ec e003092a c0035fd6 48d03bd5 08010091 ...*.._.H.;.....
+# \_ | <foo2>:
+# \_ add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12)
+# CHECK-NEXT: 4001fc 08710091 090140b9 e003092a c0035fd6 .q....@....*.._.
+# \_ add x8, x8, #0x1c (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC)
+# CHECK-NEXT: 40020c 48d03bd5 08010091 08410091 090140b9 H.;......A....@.
+# \_ | | <foo3>:
+# \_ | add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12)
+# \_ add x8, x8, #0x10 (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC)
+# CHECK-NEXT: 40021c e003092a c0035fd6 48d03bd5 08010091 ...*.._.H.;.....
+# \_ | <foo3>:
+# \_ add x8, x8, #0x0 (R_AARCH64_TLSLE_ADD_TPREL_HI12)
+# CHECK-NEXT: 40022c 08510091 090140b9 e003092a c0035fd6 .Q....@....*.._.
+# \_ add x8, x8, #0x14 (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC)
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_AARCH64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 48D03BD50801009108010091090140B9E003092AC0035FD648D03BD50801009108010091090140B9E003092AC0035FD648D03BD50801009108010091090140B9E003092AC0035FD648D03BD50801009108010091090140B9E003092AC0035FD6FD7BBFA9FD030091FF8300D1BFC31FB8E4FFFF97A0831FB8E8FFFF97A0431FB8ECFFFF97E01300B9F0FFFF970800009008010091E00F00B9E00308AAA1835FB8A2435FB8E31340B9E40F40B900000094E1031F2AE00B00B9E003012ABF030091FD7BC1A8C0035FD6
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: v1
+ Type: R_AARCH64_TLSLE_ADD_TPREL_HI12
+ - Offset: 0x0000000000000008
+ Symbol: v1
+ Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
+ - Offset: 0x000000000000001C
+ Symbol: v2
+ Type: R_AARCH64_TLSLE_ADD_TPREL_HI12
+ - Offset: 0x0000000000000020
+ Symbol: v2
+ Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
+ - Offset: 0x0000000000000034
+ Symbol: v3
+ Type: R_AARCH64_TLSLE_ADD_TPREL_HI12
+ - Offset: 0x0000000000000038
+ Symbol: v3
+ Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
+ - Offset: 0x000000000000004C
+ Symbol: v4
+ Type: R_AARCH64_TLSLE_ADD_TPREL_HI12
+ - Offset: 0x0000000000000050
+ Symbol: v4
+ Type: R_AARCH64_TLSLE_ADD_TPREL_LO12_NC
+ - Offset: 0x000000000000008C
+ Symbol: .rodata.str1.1
+ Type: R_AARCH64_ADR_PREL_PG_HI21
+ - Offset: 0x0000000000000090
+ Symbol: .rodata.str1.1
+ Type: R_AARCH64_ADD_ABS_LO12_NC
+ - Offset: 0x00000000000000AC
+ Symbol: printf
+ Type: R_AARCH64_CALL26
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Content: '0300000004000000'
+ - Name: .tbss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Size: 8
+ - Name: .rodata.str1.1
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 25692025692025692025690A00
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: '$d.1'
+ Type: STT_TLS
+ Section: .tdata
+ - Name: '$d.2'
+ Type: STT_TLS
+ Section: .tbss
+ - Name: '$d.3'
+ Section: .rodata.str1.1
+ - Name: '$x.0'
+ Section: .text
+ - Name: v2
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: v4
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .tdata
+ Type: STT_SECTION
+ Section: .tdata
+ - Name: .tbss
+ Type: STT_SECTION
+ Section: .tbss
+ - Name: .rodata.str1.1
+ Type: STT_SECTION
+ Section: .rodata.str1.1
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ Global:
+ - Name: foo1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000018
+ - Name: foo2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000018
+ Size: 0x0000000000000018
+ - Name: foo3
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000030
+ Size: 0x0000000000000018
+ - Name: foo4
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000048
+ Size: 0x0000000000000018
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000060
+ Size: 0x0000000000000068
+ - Name: v1
+ Type: STT_TLS
+ Section: .tbss
+ Size: 0x0000000000000004
+ - Name: v3
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x0000000000000004
+ - Name: printf
+...
diff --git a/test/old-elf/AArch64/rel-abs16-overflow.test b/test/old-elf/AArch64/rel-abs16-overflow.test
new file mode 100644
index 000000000000..06221c902bd7
--- /dev/null
+++ b/test/old-elf/AArch64/rel-abs16-overflow.test
@@ -0,0 +1,44 @@
+# Check handling of R_AARCH64_ABS16 relocation overflow.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}}: reference from data1+0 to data1+0 of type 259 (R_AARCH64_ABS16)
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0
+ Symbol: data1
+ Type: R_AARCH64_ABS16
+ Addend: 0
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 4
diff --git a/test/old-elf/AArch64/rel-abs16.test b/test/old-elf/AArch64/rel-abs16.test
new file mode 100644
index 000000000000..e6b817570eb4
--- /dev/null
+++ b/test/old-elf/AArch64/rel-abs16.test
@@ -0,0 +1,53 @@
+# Check handling of R_AARCH64_ABS16 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401060 60100000 00000000 `.......
+# ^^ data1 - 0x400000 = 0x1060
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401060 g .data 00000004 data1
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data1
+ Type: R_AARCH64_ABS16
+ Addend: -4194304
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 4
+ - Name: data2
+ Section: .data
+ Value: 0x4
+ Size: 4
diff --git a/test/old-elf/AArch64/rel-abs32-overflow.test b/test/old-elf/AArch64/rel-abs32-overflow.test
new file mode 100644
index 000000000000..17154c6ddc82
--- /dev/null
+++ b/test/old-elf/AArch64/rel-abs32-overflow.test
@@ -0,0 +1,53 @@
+# Check handling of R_AARCH64_ABS32 relocation overflow.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s
+
+# CHECK-DAG: Relocation out of range in file {{.*}}: reference from data1+0 to data2+34359738369 of type 258 (R_AARCH64_ABS32)
+# CHECK-DAG: Relocation out of range in file {{.*}}: reference from data2+0 to data1+34359738369 of type 258 (R_AARCH64_ABS32)
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_ABS32
+ Addend: 0x800000001
+ - Offset: 0x4
+ Symbol: data1
+ Type: R_AARCH64_ABS32
+ Addend: 0x800000001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 4
+ - Name: data2
+ Section: .data
+ Value: 0x4
+ Size: 4
diff --git a/test/old-elf/AArch64/rel-abs32.test b/test/old-elf/AArch64/rel-abs32.test
new file mode 100644
index 000000000000..7faa662d3462
--- /dev/null
+++ b/test/old-elf/AArch64/rel-abs32.test
@@ -0,0 +1,59 @@
+# Check handling of R_AARCH64_ABS32 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401060 65104080 61104080 e.@.a.@.
+# ^^ data2 + 0x80000001 = 0x80401069
+# ^^ data1 + 0x80000001 = 0x80401061
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401060 g .data 00000004 data1
+# CHECK: 00401064 g .data 00000004 data2
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_ABS32
+ Addend: 0x80000001
+ - Offset: 0x4
+ Symbol: data1
+ Type: R_AARCH64_ABS32
+ Addend: 0x80000001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 4
+ - Name: data2
+ Section: .data
+ Value: 0x4
+ Size: 4
diff --git a/test/old-elf/AArch64/rel-abs64.test b/test/old-elf/AArch64/rel-abs64.test
new file mode 100644
index 000000000000..0304584d121d
--- /dev/null
+++ b/test/old-elf/AArch64/rel-abs64.test
@@ -0,0 +1,59 @@
+# Check handling of R_AARCH64_ABS64 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401060 69104000 00000080 61104000 00000080 i.@.....a.@.....
+# ^^ data2 + 0x8000000000000001 = 0x8000000000401069
+# ^^ data1 + 0x8000000000000001 = 0x8000000000401061
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401060 g .data 00000008 data1
+# CHECK: 00401068 g .data 00000008 data2
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "00000000000000000000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_ABS64
+ Addend: -9223372036854775807
+ - Offset: 0x8
+ Symbol: data1
+ Type: R_AARCH64_ABS64
+ Addend: -9223372036854775807
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 8
+ - Name: data2
+ Section: .data
+ Value: 0x8
+ Size: 8
diff --git a/test/old-elf/AArch64/rel-adr_prel_lo21-overflow.test b/test/old-elf/AArch64/rel-adr_prel_lo21-overflow.test
new file mode 100644
index 000000000000..4f8e6b607bc7
--- /dev/null
+++ b/test/old-elf/AArch64/rel-adr_prel_lo21-overflow.test
@@ -0,0 +1,45 @@
+# Check handling of R_AARCH64_ADR_PREL_PG_HI21 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+
+# CHECK: Relocation out of range in file {{.*}}: reference from _start+0 to data1+1048577 of type 274 (R_AARCH64_ADR_PREL_LO21)
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000090"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data1
+ Type: R_AARCH64_ADR_PREL_LO21
+ Addend: 0x100001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 8
diff --git a/test/old-elf/AArch64/rel-adr_prel_lo21.test b/test/old-elf/AArch64/rel-adr_prel_lo21.test
new file mode 100644
index 000000000000..36a9489c1aa4
--- /dev/null
+++ b/test/old-elf/AArch64/rel-adr_prel_lo21.test
@@ -0,0 +1,51 @@
+# REQUIRES: arm64
+
+# Check handling of R_AARCH64_ADR_PREL_LO21 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -d -t %t-exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: _start:
+# CHECK-NEXT: 4001b0: 80 75 00 90 adrp x0, #15400960
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401060 g .data 00000004 data1
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000090"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data1
+ Type: R_AARCH64_ADR_PREL_LO21
+ Addend: 0
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 8
diff --git a/test/old-elf/AArch64/rel-adr_prel_pg_hi21-overflow.test b/test/old-elf/AArch64/rel-adr_prel_pg_hi21-overflow.test
new file mode 100644
index 000000000000..f095f60e82a6
--- /dev/null
+++ b/test/old-elf/AArch64/rel-adr_prel_pg_hi21-overflow.test
@@ -0,0 +1,45 @@
+# Check handling of R_AARCH64_ADR_PREL_PG_HI21 relocation overflow.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+
+# CHECK-DAG: Relocation out of range in file {{.*}}: reference from _start+0 to data1+2147483649 of type 275 (R_AARCH64_ADR_PREL_PG_HI21)
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000090"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 4096
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data1
+ Type: R_AARCH64_ADR_PREL_PG_HI21
+ Addend: 0x80000001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 8
diff --git a/test/old-elf/AArch64/rel-adr_prel_pg_hi21.test b/test/old-elf/AArch64/rel-adr_prel_pg_hi21.test
new file mode 100644
index 000000000000..36a20c2f6473
--- /dev/null
+++ b/test/old-elf/AArch64/rel-adr_prel_pg_hi21.test
@@ -0,0 +1,52 @@
+# REQUIRES: arm64
+
+# Check handling of R_AARCH64_ADR_PREL_PG_HI21 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -d -t %t-exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: _start:
+# CHECK-NEXT: 4001b0: 00 00 00 d0 adrp x0, #8192
+# CHECK: SYMBOL TABLE:
+# CHECK: 00402000 g .data 00000004 data1
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000090"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 4096
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data1
+ Type: R_AARCH64_ADR_PREL_PG_HI21
+ Addend: 0
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 8
diff --git a/test/old-elf/AArch64/rel-bad.test b/test/old-elf/AArch64/rel-bad.test
new file mode 100644
index 000000000000..7d2ed192de56
--- /dev/null
+++ b/test/old-elf/AArch64/rel-bad.test
@@ -0,0 +1,44 @@
+# Check handling of a bad relocation (in this case dynamic in a static object).
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s
+
+# CHECK: Unhandled reference type in file {{.*}}: reference from data1+4 to data1+0 of type 1024 (R_AARCH64_COPY)
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x4
+ Symbol: data1
+ Type: R_AARCH64_COPY
+ Addend: 0
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 8
diff --git a/test/old-elf/AArch64/rel-prel16-overflow.test b/test/old-elf/AArch64/rel-prel16-overflow.test
new file mode 100644
index 000000000000..ea08f9700ee4
--- /dev/null
+++ b/test/old-elf/AArch64/rel-prel16-overflow.test
@@ -0,0 +1,53 @@
+# Check handling of R_AARCH64_PREL16 relocation overflow.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}}: reference from data1+0 to data2+524289 of type 262 (R_AARCH64_PREL16)
+# CHECK: Relocation out of range in file {{.*}}: reference from data2+0 to data1+524289 of type 262 (R_AARCH64_PREL16)
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_PREL16
+ Addend: 0x80001
+ - Offset: 0x2
+ Symbol: data1
+ Type: R_AARCH64_PREL16
+ Addend: 0x80001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 2
+ - Name: data2
+ Section: .data
+ Value: 0x2
+ Size: 2
diff --git a/test/old-elf/AArch64/rel-prel16.test b/test/old-elf/AArch64/rel-prel16.test
new file mode 100644
index 000000000000..11e6028e253b
--- /dev/null
+++ b/test/old-elf/AArch64/rel-prel16.test
@@ -0,0 +1,59 @@
+# Check handling of R_AARCH64_PREL16 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401060 0380ff7f 00000000 ........
+# ^^ data2 - data1 + 0x8001 = 0x8003
+# ^^ data1 - data2 + 0x8001 = 0x7fff
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401060 g .data 00000002 data1
+# CHECK: 00401062 g .data 00000006 data2
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_PREL16
+ Addend: 0x8001
+ - Offset: 0x2
+ Symbol: data1
+ Type: R_AARCH64_PREL16
+ Addend: 0x8001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 2
+ - Name: data2
+ Section: .data
+ Value: 0x2
+ Size: 2
diff --git a/test/old-elf/AArch64/rel-prel32-overflow.test b/test/old-elf/AArch64/rel-prel32-overflow.test
new file mode 100644
index 000000000000..513adad08efe
--- /dev/null
+++ b/test/old-elf/AArch64/rel-prel32-overflow.test
@@ -0,0 +1,53 @@
+# Check handling of R_AARCH64_PREL32 relocation overflow.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target arm64 -o %t-exe %t-obj 2>&1 | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}}: reference from data1+0 to data2+34359738369 of type 261 (R_AARCH64_PREL32)
+# CHECK: Relocation out of range in file {{.*}}: reference from data2+0 to data1+34359738369 of type 261 (R_AARCH64_PREL32)
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_PREL32
+ Addend: 0x800000001
+ - Offset: 0x4
+ Symbol: data1
+ Type: R_AARCH64_PREL32
+ Addend: 0x800000001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 4
+ - Name: data2
+ Section: .data
+ Value: 0x4
+ Size: 4
diff --git a/test/old-elf/AArch64/rel-prel32.test b/test/old-elf/AArch64/rel-prel32.test
new file mode 100644
index 000000000000..0e178ba97f41
--- /dev/null
+++ b/test/old-elf/AArch64/rel-prel32.test
@@ -0,0 +1,59 @@
+# Check handling of R_AARCH64_PREL32 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401060 05000080 fdffff7f ........
+# ^^ data2 - data1 + 0x80000001 = 0x80000005
+# ^^ data1 - data2 + 0x80000001 = 0x7ffffffd
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401060 g .data 00000004 data1
+# CHECK: 00401064 g .data 00000004 data2
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_PREL32
+ Addend: 0x80000001
+ - Offset: 0x4
+ Symbol: data1
+ Type: R_AARCH64_PREL32
+ Addend: 0x80000001
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 4
+ - Name: data2
+ Section: .data
+ Value: 0x4
+ Size: 4
diff --git a/test/old-elf/AArch64/rel-prel64.test b/test/old-elf/AArch64/rel-prel64.test
new file mode 100644
index 000000000000..3a3eb8b90fc3
--- /dev/null
+++ b/test/old-elf/AArch64/rel-prel64.test
@@ -0,0 +1,59 @@
+# Check handling of R_AARCH64_PREL64 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401060 09000000 00000080 f9ffffff ffffff7f ................
+# ^^ data2 - data1 + 0x8000000000000001 = 0x8000000000000009
+# ^^ data1 - data2 + 0x8000000000000001 = 0x7ffffffffffffff9
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401060 g .data 00000008 data1
+# CHECK: 00401068 g .data 00000008 data2
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "00000000000000000000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 8
+ Relocations:
+ - Offset: 0x0
+ Symbol: data2
+ Type: R_AARCH64_PREL64
+ Addend: -9223372036854775807
+ - Offset: 0x8
+ Symbol: data1
+ Type: R_AARCH64_PREL64
+ Addend: -9223372036854775807
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Size: 8
+ - Name: data2
+ Section: .data
+ Value: 0x8
+ Size: 8
diff --git a/test/old-elf/AMDGPU/hsa.test b/test/old-elf/AMDGPU/hsa.test
new file mode 100644
index 000000000000..4a17ae2223e0
--- /dev/null
+++ b/test/old-elf/AMDGPU/hsa.test
@@ -0,0 +1,53 @@
+# RUN: yaml2obj -format=elf %s > %t.obj
+# RUN: lld -flavor old-gnu -target amdgcn--hsa %t.obj -o %t.exe --noinhibit-exec
+# RUN: llvm-readobj -h -program-headers -s -symbols %t.exe | FileCheck %s
+
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Class: 64-bit (0x2)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: Machine: EM_AMDGPU (0xE0)
+
+
+# CHECK: Section {
+# CHECK: Name: .hsatext
+# CHECK: Type: SHT_PROGBITS (0x1)
+# CHECK: Flags [ (0xC00007
+# CHECK: SHF_ALLOC (0x2)
+# CHECK: SHF_AMDGPU_HSA_AGENT (0x800000)
+# CHECK: SHF_AMDGPU_HSA_CODE (0x400000)
+# CHECK: SHF_EXECINSTR (0x4)
+# CHECK: SHF_WRITE (0x1)
+#
+# CHECK: Symbol {
+# CHECK: Name: kernel
+# CHECK: Value: 0x0
+# CHECK: Binding: Local (0x0)
+# CHECK: Type: AMDGPU_HSA_KERNEL (0xA)
+
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_AMDGPU_HSA_LOAD_CODE_AGENT (0x60000003)
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_AMDGPU
+Sections:
+ - Name: .hsatext
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .note
+ Type: SHT_NOTE
+ AddressAlign: 0x0000000000000001
+ Content: '00'
+Symbols:
+ Local:
+ - Name: kernel
+ Type: STT_GNU_IFUNC
+ Section: .hsatext
+...
diff --git a/test/old-elf/ARM/Inputs/fn.c b/test/old-elf/ARM/Inputs/fn.c
new file mode 100644
index 000000000000..37c897ebb7f2
--- /dev/null
+++ b/test/old-elf/ARM/Inputs/fn.c
@@ -0,0 +1 @@
+int fn() { return 1; }
diff --git a/test/old-elf/ARM/Inputs/libfn.so b/test/old-elf/ARM/Inputs/libfn.so
new file mode 100755
index 000000000000..51934714841b
--- /dev/null
+++ b/test/old-elf/ARM/Inputs/libfn.so
Binary files differ
diff --git a/test/old-elf/ARM/Inputs/libobj.so b/test/old-elf/ARM/Inputs/libobj.so
new file mode 100755
index 000000000000..85b3ae4ca3d1
--- /dev/null
+++ b/test/old-elf/ARM/Inputs/libobj.so
Binary files differ
diff --git a/test/old-elf/ARM/Inputs/obj.c b/test/old-elf/ARM/Inputs/obj.c
new file mode 100644
index 000000000000..fb6a9f13f698
--- /dev/null
+++ b/test/old-elf/ARM/Inputs/obj.c
@@ -0,0 +1,4 @@
+static struct S {
+} s;
+
+struct S *const object = &s;
diff --git a/test/old-elf/ARM/arm-symbols.test b/test/old-elf/ARM/arm-symbols.test
new file mode 100644
index 000000000000..ddf3c80862a5
--- /dev/null
+++ b/test/old-elf/ARM/arm-symbols.test
@@ -0,0 +1,51 @@
+# Check that symbols formed from ARM instructions are valid:
+# 1. Symbol address.
+# 2. Symbol content size.
+# 3. Symbol content.
+
+# RUN: yaml2obj -format=elf %s > %t-a.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-a.o -o %t-a
+# RUN: llvm-readobj -symbols %t-a | FileCheck -check-prefix=SYM-ADDR %s
+# RUN: llvm-readobj -symbols %t-a | FileCheck -check-prefix=SYM-SIZE %s
+# RUN: llvm-objdump -s -t %t-a | FileCheck -check-prefix=SYM-CONTENT %s
+
+# SYM-ADDR: Name: main (1)
+# SYM-ADDR-NEXT: Value: 0x400074
+
+# SYM-SIZE: Name: main (1)
+# SYM-SIZE-NEXT: Value: 0x{{[0-9a-f]+}}
+# SYM-SIZE-NEXT: Size: 28
+
+# SYM-CONTENT: Contents of section .text:
+# SYM-CONTENT-NEXT: 400074 04b02de5 00b08de2 0030a0e3 0300a0e1 ..-......0......
+# SYM-CONTENT-NEXT: 400084 00d04be2 04b09de4 1eff2fe1 ..K......./.
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+...
diff --git a/test/old-elf/ARM/defsym.test b/test/old-elf/ARM/defsym.test
new file mode 100644
index 000000000000..7d4fa7fcd4dc
--- /dev/null
+++ b/test/old-elf/ARM/defsym.test
@@ -0,0 +1,50 @@
+# Check that defined symbols are present in the generated executable
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=fn \
+# RUN: -Bstatic --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck %s
+
+# CHECK: Name: main (1)
+# CHECK-NEXT: Value: 0x400074
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text (0x1)
+# CHECK: Name: fn (6)
+# CHECK-NEXT: Value: 0x400074
+# CHECK-NEXT: Size: {{[0-9]+}}
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text (0x1)
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: fn
+ Type: STT_FUNC
+ Section: .text
+...
diff --git a/test/old-elf/ARM/dynamic-symbols.test b/test/old-elf/ARM/dynamic-symbols.test
new file mode 100644
index 000000000000..13963be8e701
--- /dev/null
+++ b/test/old-elf/ARM/dynamic-symbols.test
@@ -0,0 +1,83 @@
+# Check that proper dynamic symbols are present in the generated executable
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=STATIC %s
+
+# STATIC-NOT: Name: _GLOBAL_OFFSET_TABLE_
+# STATIC-NOT: Name: _DYNAMIC
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=EXEC-DYN %s
+
+# EXEC-DYN: Name: _GLOBAL_OFFSET_TABLE_
+# EXEC-DYN-NEXT: Value: 0x401000
+# EXEC-DYN-NEXT: Size: 0
+# EXEC-DYN-NEXT: Binding: Global (0x1)
+# EXEC-DYN-NEXT: Type: Object (0x1)
+# EXEC-DYN-NEXT: Other: 0
+# EXEC-DYN-NEXT: Section: Absolute (0xFFF1)
+# EXEC-DYN: Name: _DYNAMIC
+# EXEC-DYN-NEXT: Value: 0x400130
+# EXEC-DYN-NEXT: Size: 0
+# EXEC-DYN-NEXT: Binding: Global (0x1)
+# EXEC-DYN-NEXT: Type: Object (0x1)
+# EXEC-DYN-NEXT: Other: 0
+# EXEC-DYN-NEXT: Section: Absolute (0xFFF1)
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -shared --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=SHARED %s
+
+# SHARED: Name: _GLOBAL_OFFSET_TABLE_
+# SHARED-NEXT: Value: 0x401000
+# SHARED-NEXT: Size: 0
+# SHARED-NEXT: Binding: Global (0x1)
+# SHARED-NEXT: Type: Object (0x1)
+# SHARED-NEXT: Other: 0
+# SHARED-NEXT: Section: Absolute (0xFFF1)
+# SHARED: Name: _DYNAMIC
+# SHARED-NEXT: Value: 0x4000EC
+# SHARED-NEXT: Size: 0
+# SHARED-NEXT: Binding: Global (0x1)
+# SHARED-NEXT: Type: Object (0x1)
+# SHARED-NEXT: Other: 0
+# SHARED-NEXT: Section: Absolute (0xFFF1)
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ - Name: .got
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: 0000
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+...
diff --git a/test/old-elf/ARM/entry-point.test b/test/old-elf/ARM/entry-point.test
new file mode 100644
index 000000000000..4cfee4aa6c7b
--- /dev/null
+++ b/test/old-elf/ARM/entry-point.test
@@ -0,0 +1,113 @@
+# 1. Check entry point address for ARM code - should be even.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-arm.o -o %t-arm
+# RUN: llvm-readobj -file-headers %t-arm | FileCheck -check-prefix=ARM-ENTRY %s
+#
+# ARM-ENTRY: Entry: 0x400074
+
+# 2. Check entry point address for Thumb code - should be odd.
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-thm.o -o %t-thm
+# RUN: llvm-readobj -file-headers %t-thm | FileCheck -check-prefix=THM-ENTRY %s
+#
+# THM-ENTRY: Entry: 0x400075
+
+# 3. Check wrong entry point address align for ARM code.
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-arm-wrong.o
+# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-arm-wrong.o -o %t-arm-wrong 2> %t-error
+# FileCheck -check-prefix=ARM-WRONG %s < %t-error
+#
+# ARM-WRONG: Two least bits must be zero for ARM entry point
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF00231846BD465DF8047B7047
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+
+# arm-wrong.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000006
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000002
+...
diff --git a/test/old-elf/ARM/exidx.test b/test/old-elf/ARM/exidx.test
new file mode 100644
index 000000000000..a277cfcd09ae
--- /dev/null
+++ b/test/old-elf/ARM/exidx.test
@@ -0,0 +1,254 @@
+# .ARM.exidx contents checking
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target arm-none-linux-eabi -static -o %t %t.o
+# RUN: llvm-objdump -s -t -section-headers %t | FileCheck %s
+#
+# CHECK: Sections:
+# CHECK: Idx Name Size Address Type
+# CHECK: 2 .ARM.extab 0000000c 00000000004000b4 DATA
+# CHECK: 3 .ARM.exidx 00000018 00000000004000c0
+# CHECK: Contents of section .text:
+# CHECK: 4000a4 1846aff3 00801846 0837bd46 80bd00bf
+# ^
+# 4000b0: bd80 pop {r7, pc}
+# CHECK: Contents of section .ARM.extab:
+# CHECK: 4000b4 01970181 b0b00884 00000000
+# CHECK: Contents of section .ARM.exidx:
+# CHECK: 4000c0 b4ffff7f 08809780 bcffff7f 08809780
+# ^ offset to 400074 (__aeabi_unwind_cpp_pr0)
+# CHECK: 4000d0 c4ffff7f e0ffff7f
+# ^ ^
+# offset to 400094 (_start) handler at 4000B0
+#
+# CHECK: SYMBOL TABLE:
+# CHECK: 004000b4 .ARM.extab 00000000 $d.2
+# CHECK: 004000c0 .ARM.exidx 00000000 $d.1
+# CHECK: 00400074 g F .text 00000010 __aeabi_unwind_cpp_pr0
+# CHECK: 00400094 g F .text 00000020 _start
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF00231846BD465DF8047B704780B400AF00231846BD465DF8047B704780B582B000AF3B1D1846FFF7FEFF3B1D1846FFF7FEFF18460837BD4680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000002A
+ Symbol: _ZN1AILi1EEC1Ev
+ Type: R_ARM_THM_CALL
+ - Offset: 0x0000000000000032
+ Symbol: _ZN1AILi1EED1Ev
+ Type: R_ARM_THM_CALL
+ - Name: .ARM.extab
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: 01970181B0B0088400000000
+ - Name: .ARM.exidx
+ Type: SHT_ARM_EXIDX
+ Flags: [ SHF_ALLOC, SHF_LINK_ORDER ]
+ Link: .text
+ AddressAlign: 0x0000000000000004
+ Content: '000000000880978010000000088097802000000000000000'
+ - Name: .rel.ARM.exidx
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .ARM.exidx
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: .text
+ Type: R_ARM_PREL31
+ - Offset: 0x0000000000000000
+ Symbol: __aeabi_unwind_cpp_pr0
+ Type: R_ARM_NONE
+ - Offset: 0x0000000000000008
+ Symbol: .text
+ Type: R_ARM_PREL31
+ - Offset: 0x0000000000000010
+ Symbol: .text
+ Type: R_ARM_PREL31
+ - Offset: 0x0000000000000010
+ Symbol: __aeabi_unwind_cpp_pr1
+ Type: R_ARM_NONE
+ - Offset: 0x0000000000000014
+ Symbol: .ARM.extab
+ Type: R_ARM_PREL31
+ - Name: .text._ZN1AILi1EEC2Ev
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B582B000AF78600120FFF7FEFF7B6818460837BD4680BD
+ - Name: .rel.text._ZN1AILi1EEC2Ev
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text._ZN1AILi1EEC2Ev
+ Relocations:
+ - Offset: 0x000000000000000A
+ Symbol: f
+ Type: R_ARM_THM_CALL
+ - Name: .ARM.extab.text._ZN1AILi1EEC2Ev
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_GROUP ]
+ AddressAlign: 0x0000000000000004
+ Content: 01970181B0B0088400000000
+ - Name: .ARM.exidx.text._ZN1AILi1EEC2Ev
+ Type: SHT_ARM_EXIDX
+ Flags: [ SHF_ALLOC, SHF_LINK_ORDER, SHF_GROUP ]
+ Link: .text._ZN1AILi1EEC2Ev
+ AddressAlign: 0x0000000000000004
+ Content: '0000000000000000'
+ - Name: .rel.ARM.exidx.text._ZN1AILi1EEC2Ev
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .ARM.exidx.text._ZN1AILi1EEC2Ev
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: .text._ZN1AILi1EEC2Ev
+ Type: R_ARM_PREL31
+ - Offset: 0x0000000000000000
+ Symbol: __aeabi_unwind_cpp_pr1
+ Type: R_ARM_NONE
+ - Offset: 0x0000000000000004
+ Symbol: .ARM.extab.text._ZN1AILi1EEC2Ev
+ Type: R_ARM_PREL31
+ - Name: .text._ZN1AILi1EED2Ev
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B582B000AF78604FF0FF30FFF7FEFF7B6818460837BD4680BD00BF
+ - Name: .rel.text._ZN1AILi1EED2Ev
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text._ZN1AILi1EED2Ev
+ Relocations:
+ - Offset: 0x000000000000000C
+ Symbol: f
+ Type: R_ARM_THM_CALL
+ - Name: .ARM.extab.text._ZN1AILi1EED2Ev
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_GROUP ]
+ AddressAlign: 0x0000000000000004
+ Content: 01970181B0B0088400000000
+ - Name: .ARM.exidx.text._ZN1AILi1EED2Ev
+ Type: SHT_ARM_EXIDX
+ Flags: [ SHF_ALLOC, SHF_LINK_ORDER, SHF_GROUP ]
+ Link: .text._ZN1AILi1EED2Ev
+ AddressAlign: 0x0000000000000004
+ Content: '0000000000000000'
+ - Name: .rel.ARM.exidx.text._ZN1AILi1EED2Ev
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .ARM.exidx.text._ZN1AILi1EED2Ev
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: .text._ZN1AILi1EED2Ev
+ Type: R_ARM_PREL31
+ - Offset: 0x0000000000000000
+ Symbol: __aeabi_unwind_cpp_pr1
+ Type: R_ARM_NONE
+ - Offset: 0x0000000000000004
+ Symbol: .ARM.extab.text._ZN1AILi1EED2Ev
+ Type: R_ARM_PREL31
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: '$t.1'
+ Section: .text
+ - Name: .ARM.extab
+ Type: STT_SECTION
+ Section: .ARM.extab
+ - Name: .ARM.exidx
+ Type: STT_SECTION
+ Section: .ARM.exidx
+ - Name: '$d.1'
+ Section: .ARM.exidx
+ - Name: '$d.2'
+ Section: .ARM.extab
+ - Name: .text._ZN1AILi1EEC2Ev
+ Type: STT_SECTION
+ Section: .text._ZN1AILi1EEC2Ev
+ - Name: '$t.2'
+ Section: .text._ZN1AILi1EEC2Ev
+ - Name: .ARM.extab.text._ZN1AILi1EEC2Ev
+ Type: STT_SECTION
+ Section: .ARM.extab.text._ZN1AILi1EEC2Ev
+ - Name: '$d.3'
+ Section: .ARM.extab.text._ZN1AILi1EEC2Ev
+ - Name: .ARM.exidx.text._ZN1AILi1EEC2Ev
+ Type: STT_SECTION
+ Section: .ARM.exidx.text._ZN1AILi1EEC2Ev
+ - Name: '$d.4'
+ Section: .ARM.exidx.text._ZN1AILi1EEC2Ev
+ - Name: .text._ZN1AILi1EED2Ev
+ Type: STT_SECTION
+ Section: .text._ZN1AILi1EED2Ev
+ - Name: '$t.3'
+ Section: .text._ZN1AILi1EED2Ev
+ - Name: .ARM.extab.text._ZN1AILi1EED2Ev
+ Type: STT_SECTION
+ Section: .ARM.extab.text._ZN1AILi1EED2Ev
+ - Name: '$d.5'
+ Section: .ARM.extab.text._ZN1AILi1EED2Ev
+ - Name: .ARM.exidx.text._ZN1AILi1EED2Ev
+ Type: STT_SECTION
+ Section: .ARM.exidx.text._ZN1AILi1EED2Ev
+ - Name: '$d.6'
+ Section: .ARM.exidx.text._ZN1AILi1EED2Ev
+ Global:
+ - Name: __aeabi_unwind_cpp_pr0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x0000000000000010
+ - Name: __aeabi_unwind_cpp_pr1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000011
+ Size: 0x0000000000000010
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000021
+ Size: 0x000000000000001E
+ Weak:
+ - Name: _ZN1AILi1EEC1Ev
+ Type: STT_FUNC
+ Section: .text._ZN1AILi1EEC2Ev
+ Value: 0x0000000000000001
+ Size: 0x0000000000000018
+ - Name: _ZN1AILi1EED1Ev
+ Type: STT_FUNC
+ Section: .text._ZN1AILi1EED2Ev
+ Value: 0x0000000000000001
+ Size: 0x000000000000001A
+ - Name: _ZN1AILi1EEC2Ev
+ Type: STT_FUNC
+ Section: .text._ZN1AILi1EEC2Ev
+ Value: 0x0000000000000001
+ Size: 0x0000000000000018
+ - Name: f
+ - Name: _ZN1AILi1EED2Ev
+ Type: STT_FUNC
+ Section: .text._ZN1AILi1EED2Ev
+ Value: 0x0000000000000001
+ Size: 0x000000000000001A
+...
diff --git a/test/old-elf/ARM/header-flags.test b/test/old-elf/ARM/header-flags.test
new file mode 100644
index 000000000000..735d65225216
--- /dev/null
+++ b/test/old-elf/ARM/header-flags.test
@@ -0,0 +1,57 @@
+# Various checks for header flags.
+
+# 1. Check header flags for statically linked executable with default options.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t.o -o %t
+# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=STATIC-DEF %s
+#
+# STATIC-DEF: Flags {{.}} (0x5000400)
+# ABI version 5 + hard float ^^
+
+# 2. Check header flags for dynamically linked executable with default options.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t.o -o %t
+# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=EXEC-DYN-DEF %s
+#
+# EXEC-DYN-DEF: Flags {{.}} (0x5000400)
+# ABI version 5 + hard float ^^
+
+# 3. Check header flags for shared object with default options.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \
+# RUN: --noinhibit-exec %t.o -o %t
+# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=SHARED-DEF %s
+#
+# SHARED-DEF: Flags {{.}} (0x5000400)
+# ABI version 5 + hard float ^^
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+...
diff --git a/test/old-elf/ARM/mapping-code-model.test b/test/old-elf/ARM/mapping-code-model.test
new file mode 100644
index 000000000000..affa10b464f8
--- /dev/null
+++ b/test/old-elf/ARM/mapping-code-model.test
@@ -0,0 +1,160 @@
+# Check that mapping symbols are treated as ARM or Thumb code properly.
+#
+# 1. ARM <=> Thumb generates both veneers.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-a-arm.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-t-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=f_a \
+# RUN: -Bstatic --noinhibit-exec %t-a-arm.o %t-t-thm.o -o %t
+# RUN: llvm-objdump -t %t | FileCheck -check-prefix=INTER %s
+
+# INTER: SYMBOL TABLE:
+# INTER: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_t_from_arm
+# INTER: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_a_from_thumb
+
+# 2. Thumb <=> Thumb doesn't generate veneers.
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-a-thm.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-t-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=f_t \
+# RUN: -Bstatic --noinhibit-exec %t-t-thm.o %t-a-thm.o -o %t
+# RUN: llvm-objdump -t %t | FileCheck -check-prefix=THUMB %s
+
+# THUMB: SYMBOL TABLE:
+# THUMB-NOT: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_t_from_thumb
+# THUMB-NOT: {{[0-9a-f]+}} l F .text {{[0-9a-f]+}} __f_a_from_thumb
+
+# f-a-arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE2FEFFFFEBFEFFFFEA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: f_t
+ Type: R_ARM_CALL
+ - Offset: 0x000000000000000C
+ Symbol: f_t
+ Type: R_ARM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$a'
+ Section: .text
+ Size: 0x0000000000000002
+ - Name: '$a.f_a'
+ Section: .text
+ Value: 0x0000000000000002
+ Global:
+ - Name: f_a
+ Type: STT_FUNC
+ Section: .text
+ - Name: f_t
+
+# f-a-thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF00231846BD465DF8047B7047
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$t'
+ Section: .text
+ Size: 0x0000000000000002
+ - Name: '$t.f_a'
+ Section: .text
+ Value: 0x0000000000000002
+ Global:
+ - Name: f_a
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+
+# f-t-thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B500AFFFF7FEFFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: f_a
+ Type: R_ARM_THM_CALL
+ - Offset: 0x0000000000000008
+ Symbol: f_a
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$t'
+ Section: .text
+ Size: 0x0000000000000002
+ - Name: '$t.f_t'
+ Section: .text
+ Value: 0x0000000000000002
+ Global:
+ - Name: f_t
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: f_a
+...
diff --git a/test/old-elf/ARM/mapping-symbols.test b/test/old-elf/ARM/mapping-symbols.test
new file mode 100644
index 000000000000..c6a4b7afc50b
--- /dev/null
+++ b/test/old-elf/ARM/mapping-symbols.test
@@ -0,0 +1,122 @@
+# Check that mapping symbols have zero size, local binding and none type.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-a.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-t.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-a.o %t-t.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck %s
+
+# CHECK: Name: $a (1)
+# CHECK-NEXT: Value: 0x{{[0-9a-f]+}}
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+#
+# CHECK: Name: $t (9)
+# CHECK-NEXT: Value: 0x{{[0-9a-f]+}}
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+#
+# CHECK: Name: $d (24)
+# CHECK-NEXT: Value: 0x{{[0-9a-f]+}}
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE2FEFFFFEB0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: _Z1fv
+ Type: R_ARM_CALL
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$a'
+ Section: .text
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ - Name: _Z1fv
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF40F20003C0F200031B681846BD465DF8047B7047
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: _ZL1i
+ Type: R_ARM_THM_MOVW_ABS_NC
+ - Offset: 0x0000000000000008
+ Symbol: _ZL1i
+ Type: R_ARM_THM_MOVT_ABS
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+Symbols:
+ Local:
+ - Name: _ZL1i
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ - Name: '$d'
+ Section: .bss
+ - Name: '$t'
+ Section: .text
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+...
diff --git a/test/old-elf/ARM/missing-symbol.test b/test/old-elf/ARM/missing-symbol.test
new file mode 100644
index 000000000000..a0d3dd51e57b
--- /dev/null
+++ b/test/old-elf/ARM/missing-symbol.test
@@ -0,0 +1,38 @@
+# Check that _MISSING_SYMBOL_ symbol is not resolved
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t 2>&1 | FileCheck %s
+
+# CHECK: Undefined symbol: {{.*}}: _MISSING_SYMBOL_
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B483B000AF40F20003C0F200037B60002318460C37BD465DF8047B704700BF
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: _MISSING_SYMBOL_
+...
diff --git a/test/old-elf/ARM/plt-dynamic.test b/test/old-elf/ARM/plt-dynamic.test
new file mode 100644
index 000000000000..905f628edb49
--- /dev/null
+++ b/test/old-elf/ARM/plt-dynamic.test
@@ -0,0 +1,200 @@
+# Check that PLT entries are properly generated when link dynamically.
+#
+# 1. ARM code generates PLT entries.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: --noinhibit-exec %t-arm.o -lfn -L%p/Inputs -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM %s
+
+# ARM: Contents of section .rel.plt:
+# ARM-NEXT: 400134 0c104000 16010000
+# GOT addr = 0x40100c ^^
+# ARM-NEXT: Contents of section .plt:
+# ARM-NEXT: 40013c 04e02de5 04e09fe5 0ee08fe0 00f0bee5
+# ^ -- PLT0 --
+# ARM-NEXT: 40014c bc0e0000 00c68fe2 00ca8ce2 b4febce5
+# -- ^ ^ -- PLT_fn -- ^
+# ARM-NEXT: Contents of section .text:
+# ARM-NEXT: 40015c {{[0-9a-f]+}} {{[0-9a-f]+}} f9ffffea
+# b PLT_fn ^^
+# ARM: Contents of section .got.plt:
+# ARM-NEXT: 401000 00000000 00000000 00000000 3c014000
+# PLT0 addr = 0x40013c ^^
+
+# 2. Thumb code generates PLT entries with veneers.
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: --noinhibit-exec %t-thm.o -lfn -L%p/Inputs -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM %s
+
+# THM: Contents of section .rel.plt:
+# THM-NEXT: 400134 0c104000 16010000
+# GOT addr = 0x40100c ^^
+# THM-NEXT: Contents of section .plt:
+# THM-NEXT: 40013c 04e02de5 04e09fe5 0ee08fe0 00f0bee5
+# ^ -- PLT0 --
+# THM-NEXT: 40014c bc0e0000 78470000 00c68fe2 00ca8ce2
+# -- ^ veneer ^ ^ -- PLT_fn --
+# THM-NEXT: 40015c b0febce5
+# -- ^
+# THM: Contents of section .text:
+# THM-NEXT: 400160 {{[0-9a-f]+}} fff7f4bf
+# b PLT_fn ^^
+
+# 3. Thumb code generates PLT entries without veneers when bl->blx is done.
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: --noinhibit-exec %t-thm.o -lfn -L%p/Inputs -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-BLX %s
+
+# THM-BLX: Contents of section .rel.plt:
+# THM-BLX-NEXT: 400134 0c104000 16010000
+# GOT addr = 0x40100c ^^
+# THM-BLX-NEXT: Contents of section .plt:
+# THM-BLX-NEXT: 40013c 04e02de5 04e09fe5 0ee08fe0 00f0bee5
+# ^ -- PLT0 --
+# THM-BLX-NEXT: 40014c bc0e0000 00c68fe2 00ca8ce2 b4febce5
+# -- ^ ^ -- PLT_fn -- ^
+# THM-BLX: Contents of section .text:
+# THM-BLX-NEXT: 40015c {{[0-9a-f]+}} fff7f6ef
+# blx PLT_fn ^^
+
+# Generation of mapping symbols.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: --noinhibit-exec %t-arm.o -lfn -L%p/Inputs -o %t-arm
+# RUN: llvm-readobj -symbols %t-arm | FileCheck -check-prefix=ARM-MAPPING %s
+
+# ARM-MAPPING: Name: {{[$]?[a]?[.]?}}__PLT0
+# ARM-MAPPING: Name: {{[$]?[d]?[.]?}}__PLT0_d
+# ARM-MAPPING: Name: {{[$]?[a]?[.]?}}__plt_fn
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: --noinhibit-exec %t-thm.o -lfn -L%p/Inputs -o %t-thm
+# RUN: llvm-readobj -symbols %t-thm | FileCheck -check-prefix=THM-MAPPING %s
+
+# THM-MAPPING: Name: {{[$]?[a]?[.]?}}__PLT0
+# THM-MAPPING: Name: {{[$]?[d]?[.]?}}__PLT0_d
+# THM-MAPPING: Name: {{[$]?[t]?[.]?}}__plt_from_thumb_fn
+# THM-MAPPING: Name: {{[$]?[a]?[.]?}}__plt_fn
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: fn
+ Type: R_ARM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ - Name: fn
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B500AFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: fn
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: fn
+
+# thm-c.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B500AFFFF7FEFF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: fn
+ Type: R_ARM_THM_CALL
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: fn
+...
diff --git a/test/old-elf/ARM/plt-ifunc-interwork.test b/test/old-elf/ARM/plt-ifunc-interwork.test
new file mode 100644
index 000000000000..29d8282edf26
--- /dev/null
+++ b/test/old-elf/ARM/plt-ifunc-interwork.test
@@ -0,0 +1,396 @@
+# Check that PLT entries are properly generated for cases when
+# referenced from both ARM and Thumb code.
+#
+# 1. ARM code generates PLT without transition veneer.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM-ONE %s
+
+# ARM-ONE: Contents of section .plt:
+# ARM-ONE-NEXT: 40007c 00c68fe2 00ca8ce2 7cffbce5
+# ^ regular veneer ^
+# Next line shows that .plt section ends.
+# ARM-ONE-NEXT: Contents of section .text:
+
+# 2. Thumb code generates PLT with transition veneer.
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-f1-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-thm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ONE %s
+
+# THM-ONE: Contents of section .plt:
+# THM-ONE-NEXT: 40007c 78470000 00c68fe2 00ca8ce2 78ffbce5
+# bx pc ^^ ^ regular veneer ^
+# Next line shows that .plt section ends.
+# THM-ONE-NEXT: Contents of section .text:
+
+# 3. ARM + Thumb code generate same single PLT with transition veneer.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-f1-thm-for-arm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o %t-f1-thm-for-arm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ONE %s
+
+# 4. Thumb + ARM code generate same single PLT with transition veneer.
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-f1-thm-for-arm.o
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-thm-for-arm.o %t-f1-arm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ONE %s
+
+# 5. ARM + ARM code generate two PLTs without transition veneers.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-f2-arm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o %t-f2-arm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM-TWO %s
+
+# ARM-TWO: Contents of section .plt:
+# ARM-TWO-NEXT: 400084 00c68fe2 00ca8ce2 74ffbce5 00c68fe2
+# ^ regular veneer 1 ^ ^ --
+# ARM-TWO-NEXT: 400094 00ca8ce2 6cffbce5
+# --- regular veneer 2 ^
+# Next line shows that .plt section ends.
+# ARM-TWO-NEXT: Contents of section .text:
+
+# 6. ARM + Thumb code generate two PLTs without and with transition veneer.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-f1-arm.o
+# RUN: yaml2obj -format=elf -docnum 5 %s > %t-f2-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-arm.o %t-f2-thm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=ARM-THM-TWO %s
+
+# ARM-THM-TWO: Contents of section .plt:
+# ARM-THM-TWO-NEXT: 400084 00c68fe2 00ca8ce2 74ffbce5 78470000
+# ^ regular veneer 1 ^ ^^ bx pc 2
+# ARM-THM-TWO-NEXT: 400094 00c68fe2 00ca8ce2 68ffbce5
+# ^ regular veneer 2 ^
+# Next line shows that .plt section ends.
+# ARM-THM-TWO-NEXT: Contents of section .text:
+
+# 7. Thumb + ARM code generate two PLTs with and without transition veneer.
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-f1-thm.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-f2-arm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-thm.o %t-f2-arm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-ARM-TWO %s
+
+# THM-ARM-TWO: Contents of section .plt:
+# THM-ARM-TWO-NEXT: 400084 78470000 00c68fe2 00ca8ce2 70ffbce
+# bx pc 1 ^^ ^ regular veneer 1 ^
+# THM-ARM-TWO-NEXT: 400094 00c68fe2 00ca8ce2 68ffbce5
+# ^ regular veneer 2 ^
+# Next line shows that .plt section ends.
+# THM-ARM-TWO-NEXT: Contents of section .text:
+
+# 8. Thumb + Thumb code generate two PLTs with transition veneers.
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-f1-thm.o
+# RUN: yaml2obj -format=elf -docnum 5 %s > %t-f2-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-thm.o %t-f2-thm.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-TWO %s
+
+# THM-TWO: Contents of section .plt:
+# THM-TWO-NEXT: 400084 78470000 00c68fe2 00ca8ce2 70ffbce5
+# bx pc 1 ^^ ^ regular veneer 1 ^
+# THM-TWO-NEXT: 400094 78470000 00c68fe2 00ca8ce2 64ffbce5
+# bx pc 2 ^^ ^ regular veneer 2 ^
+# Next line shows that .plt section ends.
+# THM-TWO-NEXT: Contents of section .text:
+
+# 9. Thumb code generates PLT without transition veneer when bl->blx is done.
+# RUN: yaml2obj -format=elf -docnum 6 %s > %t-f1-thm-c.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-f1-thm-c.o -o %t
+# RUN: llvm-objdump -s %t | FileCheck -check-prefix=THM-BL %s
+
+# THM-BL: Contents of section .plt:
+# THM-BL-NEXT: 40007c 00c68fe2 00ca8ce2 7cffbce5
+# ^ regular veneer ^
+# Next line shows that .plt section ends.
+# THM-BL-NEXT: Contents of section .text:
+
+# f1-arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: main
+ Type: R_ARM_MOVW_ABS_NC
+ - Offset: 0x000000000000000C
+ Symbol: main
+ Type: R_ARM_MOVT_ABS
+ - Offset: 0x0000000000000028
+ Symbol: f1
+ Type: R_ARM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f1
+ Type: STT_GNU_IFUNC
+ Section: .text
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+
+# f1-thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: main
+ Type: R_ARM_THM_MOVW_ABS_NC
+ - Offset: 0x0000000000000008
+ Symbol: main
+ Type: R_ARM_THM_MOVT_ABS
+ - Offset: 0x000000000000001C
+ Symbol: f1
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f1
+ Type: STT_GNU_IFUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000019
+
+# f1-thm-for-arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B500AFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: f1
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: f1
+
+# f2-arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: f
+ Type: R_ARM_MOVW_ABS_NC
+ - Offset: 0x000000000000000C
+ Symbol: f
+ Type: R_ARM_MOVT_ABS
+ - Offset: 0x0000000000000028
+ Symbol: f2
+ Type: R_ARM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f2
+ Type: STT_GNU_IFUNC
+ Section: .text
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+
+# f2-thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: f
+ Type: R_ARM_THM_MOVW_ABS_NC
+ - Offset: 0x0000000000000008
+ Symbol: f
+ Type: R_ARM_THM_MOVT_ABS
+ - Offset: 0x000000000000001C
+ Symbol: f2
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f2
+ Type: STT_GNU_IFUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000019
+
+# f1-thm-c.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEFF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: main
+ Type: R_ARM_THM_MOVW_ABS_NC
+ - Offset: 0x0000000000000008
+ Symbol: main
+ Type: R_ARM_THM_MOVT_ABS
+ - Offset: 0x000000000000001C
+ Symbol: f1
+ Type: R_ARM_THM_CALL
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f1
+ Type: STT_GNU_IFUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000019
+...
diff --git a/test/old-elf/ARM/plt-ifunc-mapping.test b/test/old-elf/ARM/plt-ifunc-mapping.test
new file mode 100644
index 000000000000..8c6d23aec084
--- /dev/null
+++ b/test/old-elf/ARM/plt-ifunc-mapping.test
@@ -0,0 +1,109 @@
+# Check that mapping symbols are properly generated for IFUNC PLT entries.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck %s
+
+# CHECK: Name: {{[$]?[a]?[.]?}}__plt_ifunc_f1
+# CHECK: Name: {{[$]?[t]?[.]?}}__plt_from_thumb_ifunc_f2
+# CHECK: Name: {{[$]?[a]?[.]?}}__plt_ifunc_f2
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: main
+ Type: R_ARM_MOVW_ABS_NC
+ - Offset: 0x000000000000000C
+ Symbol: main
+ Type: R_ARM_MOVT_ABS
+ - Offset: 0x0000000000000028
+ Symbol: f1
+ Type: R_ARM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f1
+ Type: STT_GNU_IFUNC
+ Section: .text
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: f
+ Type: R_ARM_THM_MOVW_ABS_NC
+ - Offset: 0x0000000000000008
+ Symbol: f
+ Type: R_ARM_THM_MOVT_ABS
+ - Offset: 0x000000000000001C
+ Symbol: f2
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f2
+ Type: STT_GNU_IFUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000019
+...
diff --git a/test/old-elf/ARM/rel-abs32.test b/test/old-elf/ARM/rel-abs32.test
new file mode 100644
index 000000000000..7dcf632f53d3
--- /dev/null
+++ b/test/old-elf/ARM/rel-abs32.test
@@ -0,0 +1,58 @@
+# Check handling of R_ARM_ABS32 relocation.
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401000 84004000
+# data = 0x400084 ^^
+# data main addr content
+# 0x400084 = 0x400074 + 0x10
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} main
+# CHECK: 00401000 g .data 00000004 data
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '10000000'
+ - Name: .rel.data
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .data
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: main
+ Type: R_ARM_ABS32
+ Addend: 0
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000001C
+ - Name: data
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/ARM/rel-arm-call.test b/test/old-elf/ARM/rel-arm-call.test
new file mode 100644
index 000000000000..64b789204286
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-call.test
@@ -0,0 +1,112 @@
+# Check handling of R_ARM_CALL relocation.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: 400084 1eff2fe1 00482de9 04b08de2 f7ffffeb
+# offset = -0x24 ^^
+# call site offset PC(arm) _Z1fv addr
+# 0x400090 + (-0x24) + 0x8 = 0x400074
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
+# CHECK: 00400088 g F .text {{[0-9a-f]+}} main
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error
+# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error
+
+# OVERFLOW: Relocation out of range {{.*}} (R_ARM_CALL)
+
+# good.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE200D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEB0030A0E30300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000001C
+ Symbol: _Z1fv
+ Type: R_ARM_CALL
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000014
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000014
+ Size: 0x0000000000000018
+
+# overflow.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE200D04BE204B09DE41EFF2FE100482DE904B08DE2000080EB0030A0E30300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000001C
+ Symbol: _Z1fv
+ Type: R_ARM_CALL
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000014
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000014
+ Size: 0x0000000000000018
+...
diff --git a/test/old-elf/ARM/rel-arm-jump24-veneer-b.test b/test/old-elf/ARM/rel-arm-jump24-veneer-b.test
new file mode 100644
index 000000000000..76e9523dbbe7
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-jump24-veneer-b.test
@@ -0,0 +1,122 @@
+# Check veneer generation for R_ARM_JUMP24 relocation (B instruction call).
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s
+
+# STATIC: Contents of section .text:
+# STATIC: 400074 010000ea
+# Call from main:
+# offset = 0x4 ^^
+# call site offset PC(arm) ___Z1fv_from_arm addr
+# 0x400074 + 0x4 + 0x8 = 0x400080
+#
+# Code of the veneer:
+# STATIC: {{[0-9a-f]+}} {{[0-9a-f]+}} 04f01fe5
+# STATIC: 400084 79004000
+# ^^ call addr = 0x400079
+# call addr _Z1fv addr Thumb mode
+# 0x400079 = 0x400078 | 0x1
+#
+# STATIC: SYMBOL TABLE:
+# STATIC: 00400080 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm
+# STATIC: 00400074 g F .text {{[0-9a-f]+}} main
+# STATIC: 00400078 g F .text {{[0-9a-f]+}} _Z1fv
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s
+
+# EXEC-DYN: Contents of section .text:
+# EXEC-DYN: 400114 010000ea
+# Call from main:
+# offset = 0x4 ^^
+# call site offset PC(arm) ___Z1fv_from_arm addr
+# 0x400114 + 0x4 + 0x8 = 0x400120
+#
+# Code of the veneer:
+# EXEC-DYN: {{[0-9a-f]+}} {{[0-9a-f]+}} 04f01fe5
+# EXEC-DYN: 400124 19014000
+# call addr = 0x400119 ^^
+# call addr _Z1fv addr Thumb mode
+# 0x400119 = 0x400118 | 0x1
+#
+# EXEC-DYN: SYMBOL TABLE:
+# EXEC-DYN: 00400120 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm
+# EXEC-DYN: 00400114 g F .text {{[0-9a-f]+}} main
+# EXEC-DYN: 00400118 g F .text {{[0-9a-f]+}} _Z1fv
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: FEFFFFEA
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: _Z1fv
+ Type: R_ARM_JUMP24
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ - Name: _Z1fv
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 4FF0000318467047
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+...
diff --git a/test/old-elf/ARM/rel-arm-jump24-veneer-bl.test b/test/old-elf/ARM/rel-arm-jump24-veneer-bl.test
new file mode 100644
index 000000000000..300355fbb11c
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-jump24-veneer-bl.test
@@ -0,0 +1,120 @@
+# Check veneer generation for R_ARM_JUMP24 relocation (BL<c> instruction call).
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s
+
+# STATIC: Contents of section .text:
+# STATIC: 400084 0400000b
+# Call from main:
+# offset = 0x10 ^^
+# call site offset PC(arm) ___Z1fv_from_arm addr
+# 0x400084 + 0x10 + 0x8 = 0x40009c
+#
+# Code of the veneer:
+# STATIC: 400094 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 95004000
+# call addr = 0x400095 ^^
+# call addr _Z1fv addr Thumb mode
+# 0x400095 = 0x400094 | 0x1
+#
+# STATIC: SYMBOL TABLE:
+# STATIC: 0040009c l F .text {{[0-9a-f]+}} ___Z1fv_from_arm
+# STATIC: 00400074 g F .text {{[0-9a-f]+}} main
+# STATIC: 00400094 g F .text {{[0-9a-f]+}} _Z1fv
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s
+
+# EXEC-DYN: Contents of section .text:
+# EXEC-DYN: 400124 0400000b
+# Call from main:
+# offset = 0x10 ^^
+# call site offset PC(arm) ___Z1fv_from_arm addr
+# 0x400124 + 0x10 + 0x8 = 0x40013c
+#
+# Code of the veneer:
+# EXEC-DYN: 400134 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 35014000
+# call addr = 0x400135 ^^
+# call addr _Z1fv addr Thumb mode
+# 0x400135 = 0x400134 | 0x1
+#
+# EXEC-DYN: SYMBOL TABLE:
+# EXEC-DYN: 0040013c l F .text {{[0-9a-f]+}} ___Z1fv_from_arm
+# EXEC-DYN: 00400114 g F .text {{[0-9a-f]+}} main
+# EXEC-DYN: 00400134 g F .text {{[0-9a-f]+}} _Z1fv
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE20030A0E3000053E3FEFFFF0B0030A0E30300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000010
+ Symbol: _Z1fv
+ Type: R_ARM_JUMP24
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ - Name: _Z1fv
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 4FF0000318467047
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+...
diff --git a/test/old-elf/ARM/rel-arm-jump24.test b/test/old-elf/ARM/rel-arm-jump24.test
new file mode 100644
index 000000000000..c0d8ccc8d386
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-jump24.test
@@ -0,0 +1,108 @@
+# Check handling of R_ARM_JUMP24 relocation.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: 400094 04b08de2 f5ffffea 0030a0e1 0300a0e1
+# offset = -0x2C ^^
+# call site offset PC(arm) _Z1fv addr
+# 0x400098 + (-0x2C) + 0x8 = 0x400074
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
+# CHECK: 00400090 g F .text {{[0-9a-f]+}} main
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error
+# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error
+
+# OVERFLOW: Relocation out of range {{.*}} (R_ARM_JUMP24)
+
+# good.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000024
+ Symbol: _Z1fv
+ Type: R_ARM_JUMP24
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000001C
+
+# overflow.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2000080EA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000024
+ Symbol: _Z1fv
+ Type: R_ARM_JUMP24
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000001C
+...
diff --git a/test/old-elf/ARM/rel-arm-mov.test b/test/old-elf/ARM/rel-arm-mov.test
new file mode 100644
index 000000000000..b492cc259060
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-mov.test
@@ -0,0 +1,64 @@
+# Check handling of R_ARM_MOVW_ABS_NC and R_ARM_MOVT_ABS relocation pair.
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: 400074 04b02de5 00b08de2 003001e3 403040e3
+# addrL = 0x1000 ^^
+# addrH = 0x40 ^^
+# addrH addrL _ZL5data1 addr
+# (0x40 << 16) + 0x1000 = 0x401000
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401000 l .bss 00000004 _ZL5data1
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} main
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE2003000E3003040E30A20A0E3002083E50030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: _ZL5data1
+ Type: R_ARM_MOVW_ABS_NC
+ Addend: 0
+ - Offset: 0x000000000000000C
+ Symbol: _ZL5data1
+ Type: R_ARM_MOVT_ABS
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+Symbols:
+ Local:
+ - Name: _ZL5data1
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+...
diff --git a/test/old-elf/ARM/rel-arm-prel31.test b/test/old-elf/ARM/rel-arm-prel31.test
new file mode 100644
index 000000000000..b07d5dd9fd75
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-prel31.test
@@ -0,0 +1,90 @@
+# Check handling of R_ARM_PREL31 relocation.
+# RUN: yaml2obj -format=elf -docnum=1 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec --defsym=main=__gxx_personality_v0 %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .ARM.extab:
+# CHECK: 4000a4 b1fffe7f
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400054 g F .text {{[0-9a-f]+}} __gxx_personality_v0
+
+# RUN: yaml2obj -format=elf -docnum=2 %s > %t-o.o
+# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec --defsym=main=__gxx_personality_v0 %t-o.o -o %t 2> %t-error
+# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error
+
+# OVERFLOW: Relocation out of range {{.*}} (R_ARM_PREL31)
+
+# good.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .ARM.extab
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x4
+ Content: 0000FF7F84019701B0B0B008FFFF01080E2432003A040000
+ - Name: .rel.ARM.extab
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x4
+ Info: .ARM.extab
+ Relocations:
+ - Offset: 0
+ Symbol: __gxx_personality_v0
+ Type: R_ARM_PREL31
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Content: 80B400AF00231846BD465DF8047B704780B582B000AF3B1D1846FFF7FEFFFFF7FEFFFFF7FEFF0420FFF7FEFF0346184601230360002240F20001C0F20001FFF7FEFF3B1D1846FFF7FEFFFFF7FEFF00BF
+Symbols:
+ Local:
+ Global:
+ - Name: __gxx_personality_v0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x1
+
+# overflow.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .ARM.extab
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x4
+ Content: 0000004084019701B0B0B008FFFF01080E2432003A040000
+ - Name: .rel.ARM.extab
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x4
+ Info: .ARM.extab
+ Relocations:
+ - Offset: 0
+ Symbol: __gxx_personality_v0
+ Type: R_ARM_PREL31
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Content: 80B400AF00231846BD465DF8047B704780B582B000AF3B1D1846FFF7FEFFFFF7FEFFFFF7FEFF0420FFF7FEFF0346184601230360002240F20001C0F20001FFF7FEFF3B1D1846FFF7FEFFFFF7FEFF00BF
+Symbols:
+ Local:
+ Global:
+ - Name: __gxx_personality_v0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x1
+...
diff --git a/test/old-elf/ARM/rel-arm-target1.test b/test/old-elf/ARM/rel-arm-target1.test
new file mode 100644
index 000000000000..064c68661875
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-target1.test
@@ -0,0 +1,114 @@
+# Check handling of R_ARM_TARGET1 relocation.
+#
+# 1. R_ARM_TARGET1 is equal to R_ARM_ABS32
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-abs32.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec --target1-abs %t-abs32.o -o %t-abs32
+# RUN: llvm-objdump -s -t %t-abs32 | FileCheck -check-prefix=CHECK-ABS32 %s
+#
+# CHECK-ABS32: Contents of section .data:
+# CHECK-ABS32-NEXT: 401000 84004000
+# CHECK-ABS32: SYMBOL TABLE:
+# CHECK-ABS32: 00400074 g F .text {{[0-9a-f]+}} main
+# CHECK-ABS32: 00401000 g .data 00000004 data
+#
+# 2. R_ARM_TARGET1 is equal to R_ARM_REL32
+# Check handling of R_ARM_REL32 relocation.
+# RUN: yaml2obj -format=elf %s -docnum 2 > %t-rel32.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec --target1-rel %t-rel32.o -o %t-rel32
+# RUN: llvm-objdump -s -t %t-rel32 | FileCheck -check-prefix=CHECK-REL32 %s
+#
+# CHECK-REL32: Contents of section .text:
+# CHECK-REL32-NEXT: 400074 {{[0-9a-f]+}} 880fff00
+# CHECK-REL32: SYMBOL TABLE:
+# CHECK-REL32: 00400074 g F .text {{[0-9a-f]+}} main
+# CHECK-REL32: 00401000 g .bss {{[0-9a-f]+}} _myref
+
+# abs32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20030A0E30300A0E100D04BE204B09DE41EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '10000000'
+ - Name: .rel.data
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .data
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: main
+ Type: R_ARM_TARGET1
+ Addend: 0
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000001C
+ - Name: data
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x0000000000000004
+# rel32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF0000FF0000231846BD465DF8047B7047
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: _myref
+ Type: R_ARM_TARGET1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Global:
+ - Name: _myref
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x0000000000000014
+...
diff --git a/test/old-elf/ARM/rel-arm-thm-interwork.test b/test/old-elf/ARM/rel-arm-thm-interwork.test
new file mode 100644
index 000000000000..3e0e30a614ee
--- /dev/null
+++ b/test/old-elf/ARM/rel-arm-thm-interwork.test
@@ -0,0 +1,121 @@
+# Check ARM <=> Thumb interwork.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
+
+# Check R_ARM_CALL veneer to call Thumb code
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=ARM-CALL %s
+
+# ARM-CALL: Contents of section .text:
+# ARM-CALL: 400074 00482de9 04b08de2 000000fa 0088bde8
+# offset = 0x0 ^^
+# call site offset PC(arm) _Z2f2v addr
+# 0x40007C + 0x0 + 0x8 = 0x400084
+# ARM-CALL: SYMBOL TABLE:
+# ARM-CALL: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
+# ARM-CALL: 00400084 g F .text {{[0-9a-f]+}} _Z2f2v
+# ARM-CALL: 00400090 g F .text {{[0-9a-f]+}} main
+
+# Check R_ARM_THM_CALL veneer to call ARM code
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=THM-CALL %s
+
+# THM-CALL: Contents of section .text:
+# THM-CALL: 400094 00bffff7 eeef0023 184680bd
+# offset = -0x24 ^^
+# call site aligned = Align(0x400096, 4) = 0x400094
+# call site aligned offset PC(thm) _Z1fv addr
+# 0x400094 + (-0x24) + 0x4 = 0x400074
+# THM-CALL: SYMBOL TABLE:
+# THM-CALL: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
+# THM-CALL: 00400084 g F .text {{[0-9a-f]+}} _Z2f2v
+# THM-CALL: 00400090 g F .text {{[0-9a-f]+}} main
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE2FEFFFFEB0088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: _Z2f2v
+ Type: R_ARM_CALL
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000010
+ - Name: _Z2f2v
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AFBD465DF8047B704780B500AF00BFFFF7FEFF0023184680BD
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000012
+ Symbol: _Z1fv
+ Type: R_ARM_THM_CALL
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z2f2v
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x000000000000000C
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000D
+ Size: 0x0000000000000010
+ - Name: _Z1fv
+...
diff --git a/test/old-elf/ARM/rel-base-prel.test b/test/old-elf/ARM/rel-base-prel.test
new file mode 100644
index 000000000000..054ce58ff7b8
--- /dev/null
+++ b/test/old-elf/ARM/rel-base-prel.test
@@ -0,0 +1,61 @@
+# Check handling of R_ARM_BASE_PREL relocation.
+# It only works for _GLOBAL_OFFSET_TABLE_ symbol, and returns error
+# for other cases.
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401004 fcffffff
+# offset = -0x4 ^^
+# addr site offset _GOT_
+# 0x401004 + (-0x4) = 0x401000
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401000 g *ABS* {{[0-9a-f]+}} _GLOBAL_OFFSET_TABLE_
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF00231846BD465DF8047B7047
+ - Name: .got
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '00000000'
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '00000000'
+ - Name: .rel.data
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .data
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: _GLOBAL_OFFSET_TABLE_
+ Type: R_ARM_BASE_PREL
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: _GLOBAL_OFFSET_TABLE_
+...
diff --git a/test/old-elf/ARM/rel-copy.test b/test/old-elf/ARM/rel-copy.test
new file mode 100644
index 000000000000..f181f72a2192
--- /dev/null
+++ b/test/old-elf/ARM/rel-copy.test
@@ -0,0 +1,60 @@
+# Check handling of R_ARM_COPY relocation.
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t-o.o -lobj -L%p/Inputs -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+# RUN: llvm-readobj -relocations %t | FileCheck -check-prefix=READOBJ %s
+
+# CHECK: Contents of section .rel.dyn:
+# CHECK-NEXT: 400138 00104000 14010000
+# addr = 0x401000 ^^ ^^ rel_type = 0x14 => R_ARM_COPY
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401000 g .bss 00000004 object
+#
+# READOBJ: 0x401000 R_ARM_COPY object
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B483B000AF40F20003C0F200031B687B60002318460C37BD465DF8047B7047
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000006
+ Symbol: object
+ Type: R_ARM_THM_MOVW_ABS_NC
+ - Offset: 0x000000000000000A
+ Symbol: object
+ Type: R_ARM_THM_MOVT_ABS
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$t'
+ Section: .text
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: object
+...
diff --git a/test/old-elf/ARM/rel-glob-dat.test b/test/old-elf/ARM/rel-glob-dat.test
new file mode 100644
index 000000000000..34f50c5b0e3d
--- /dev/null
+++ b/test/old-elf/ARM/rel-glob-dat.test
@@ -0,0 +1,57 @@
+# Check handling of R_ARM_GLOB_DAT relocation.
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \
+# RUN: --noinhibit-exec %t-o.o -lfn -L%p/Inputs -o %t
+# RUN: llvm-readobj -relocations %t | FileCheck %s
+
+# CHECK: 0x401000 R_ARM_GLOB_DAT fn
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE208D04DE224209FE502208FE020309FE5033092E708300BE508301BE533FF2FE10030A0E10300A0E104D04BE20088BDE82000000000000000
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000038
+ Symbol: _GLOBAL_OFFSET_TABLE_
+ Type: R_ARM_BASE_PREL
+ - Offset: 0x000000000000003C
+ Symbol: fn
+ Type: R_ARM_GOT_BREL
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$a'
+ Section: .text
+ - Name: '$d'
+ Section: .text
+ Value: 0x0000000000000038
+ Global:
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ - Name: _GLOBAL_OFFSET_TABLE_
+ - Name: fn
+...
diff --git a/test/old-elf/ARM/rel-got-brel.test b/test/old-elf/ARM/rel-got-brel.test
new file mode 100644
index 000000000000..c8786d81127f
--- /dev/null
+++ b/test/old-elf/ARM/rel-got-brel.test
@@ -0,0 +1,63 @@
+# Check handling of R_ARM_GOT_BREL relocation.
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .got:
+# CHECK-NEXT: 401000 75004000 81004000
+# f_thumb = 0x400075 ^^ ^^ main_thumb = 0x400081
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 401008 00000000 04000000
+# GOT[0] offset = 0x0 ^^ ^^ GOT[1] offset = 0x4
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} f
+# CHECK: 00400080 g F .text {{[0-9a-f]+}} main
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AFBD465DF8047B704780B400AF00231846BD465DF8047B7047
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '0000000000000000'
+ - Name: .rel.data
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .data
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: f
+ Type: R_ARM_GOT_BREL
+ - Offset: 0x0000000000000004
+ Symbol: main
+ Type: R_ARM_GOT_BREL
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000D
+ - Name: _GLOBAL_OFFSET_TABLE_
+...
diff --git a/test/old-elf/ARM/rel-group-relocs.test b/test/old-elf/ARM/rel-group-relocs.test
new file mode 100644
index 000000000000..16e82b3e4271
--- /dev/null
+++ b/test/old-elf/ARM/rel-group-relocs.test
@@ -0,0 +1,71 @@
+# Check handling of group relocations (R_ARM_ALU_PC_G0_NC, R_ARM_ALU_PC_G1_NC,
+# R_ARM_LDR_PC_G2).
+#
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: -e plt_func %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: 400074 00c68fe2 00ca8ce2 84ffbce5
+# Disassembly of section .text:
+# plt_func:
+# 400074: 00 c6 8f e2 add r12, pc, #0, #12
+# ^ after execution: r12=0x40007c
+# 400078: 00 ca 8c e2 add r12, r12, #0, #20
+# ^ after execution: r12=0x40007C
+# 40007c: 84 ff bc e5 ldr pc, [r12, #3972]!
+# ^ referenced address is 0x401000, after execution pc=0x400074
+# CHECK: Contents of section .data:
+# CHECK: 401000 74004000
+# ^ this value is written to pc after execution of comand 0x40007c
+# ^ this address is referenced by command at 0x40007c
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text 0000000c plt_func
+# CHECK: 00401000 g .data 00000004 got_func
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Content: 00C08FE200C08CE200F0BCE5
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x4
+ Relocations:
+ - Offset: 0
+ Symbol: got_func
+ Type: R_ARM_ALU_PC_G0_NC
+ Addend: -8
+ - Offset: 0x4
+ Symbol: got_func
+ Type: R_ARM_ALU_PC_G1_NC
+ Addend: -4
+ - Offset: 0x8
+ Symbol: got_func
+ Type: R_ARM_LDR_PC_G2
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x4
+ Content: 74004000
+Symbols:
+ Local:
+ Global:
+ - Name: plt_func
+ Type: STT_FUNC
+ Section: .text
+ Size: 0xC
+ - Name: got_func
+ Section: .data
+ Size: 0x4
+...
diff --git a/test/old-elf/ARM/rel-ifunc.test b/test/old-elf/ARM/rel-ifunc.test
new file mode 100644
index 000000000000..7044534af1e3
--- /dev/null
+++ b/test/old-elf/ARM/rel-ifunc.test
@@ -0,0 +1,101 @@
+# Check handling of IFUNC (gnu_indirect_function).
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .rel.plt:
+# CHECK: 400074 00104000
+# CHECK: Contents of section .plt:
+# CHECK: 40007c 00c68fe2 00ca8ce2 7cffbce5
+# CHECK: Contents of section .text:
+# CHECK: 4001a8 00482de9 04b08de2 d4ffffeb b0ffffeb
+# ^ bl #-320 (to address 0x400080=__plt_ifunc_myfunc)
+# CHECK: Contents of section .got.plt:
+# CHECK: 401000 c0004000
+# CHECK: SYMBOL TABLE:
+# CHECK: 004000c0 g .text 00000020 myfunc
+# CHECK: 00400074 g *ABS* 00000000 __rel_iplt_start
+# CHECK: 0040007c g *ABS* 00000000 __rel_iplt_end
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20130A0E30300A0E100D04BE204B09DE41EFF2FE104B02DE500B08DE20230A0E30300A0E100D04BE204B09DE41EFF2FE104B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE208D04DE208000BE508301BE533FF2FE10030A0E10300A0E104D04BE20088BDE800482DE904B08DE210D04DE2003000E3003040E308300BE5190000EA08301BE50C300BE50C301BE5003093E510300BE50C301BE5043093E57330EFE614300BE514301BE5A00053E30130A0030030A0137330EFE6000053E30600000A10301BE5003093E50300A0E1DAFFFFEB0020A0E110301BE5002083E508301BE5083083E208300BE508201BE5003000E3003040E3030052E1E0FFFF3A04D04BE20088BDE800482DE904B08DE2D4FFFFEBFEFFFFEB0030A0E30300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000040
+ Symbol: myfunc1
+ Type: R_ARM_MOVW_ABS_NC
+ - Offset: 0x0000000000000044
+ Symbol: myfunc1
+ Type: R_ARM_MOVT_ABS
+ - Offset: 0x000000000000008C
+ Symbol: __rel_iplt_start
+ Type: R_ARM_MOVW_ABS_NC
+ - Offset: 0x0000000000000090
+ Symbol: __rel_iplt_start
+ Type: R_ARM_MOVT_ABS
+ - Offset: 0x0000000000000108
+ Symbol: __rel_iplt_end
+ Type: R_ARM_MOVW_ABS_NC
+ - Offset: 0x000000000000010C
+ Symbol: __rel_iplt_end
+ Type: R_ARM_MOVT_ABS
+ - Offset: 0x000000000000012C
+ Symbol: myfunc
+ Type: R_ARM_CALL
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: '$a'
+ Section: .text
+ - Name: elf_ifunc_invoke
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000058
+ Size: 0x0000000000000028
+ - Name: apply_irel
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000080
+ Size: 0x00000000000000A0
+ Global:
+ - Name: myfunc1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000001C
+ - Name: myfunc2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000001C
+ Size: 0x000000000000001C
+ - Name: myfunc
+ Type: STT_GNU_IFUNC
+ Section: .text
+ Value: 0x0000000000000038
+ Size: 0x0000000000000020
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000120
+ Size: 0x000000000000001C
+ Weak:
+ - Name: __rel_iplt_start
+ - Name: __rel_iplt_end
+...
diff --git a/test/old-elf/ARM/rel-jump-slot.test b/test/old-elf/ARM/rel-jump-slot.test
new file mode 100644
index 000000000000..2a4f4eba8d84
--- /dev/null
+++ b/test/old-elf/ARM/rel-jump-slot.test
@@ -0,0 +1,50 @@
+# Check handling of R_ARM_JUMP_SLOT relocation.
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \
+# RUN: --noinhibit-exec %t-o.o -lfn -L%p/Inputs -o %t
+# RUN: llvm-readobj -relocations %t | FileCheck %s
+
+# CHECK: 0x40100C R_ARM_JUMP_SLOT fn 0x0
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE2FEFFFFEB0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: fn
+ Type: R_ARM_CALL
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$a'
+ Section: .text
+ Global:
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ - Name: fn
+...
diff --git a/test/old-elf/ARM/rel-rel32.test b/test/old-elf/ARM/rel-rel32.test
new file mode 100644
index 000000000000..9e5aab000523
--- /dev/null
+++ b/test/old-elf/ARM/rel-rel32.test
@@ -0,0 +1,56 @@
+# Check handling of R_ARM_REL32 relocation.
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400074 {{[0-9a-f]+}} 880fff00
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} main
+# CHECK: 00401000 g .bss {{[0-9a-f]+}} _myref
+
+---
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF0000FF0000231846BD465DF8047B7047
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: _myref
+ Type: R_ARM_REL32
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Global:
+ - Name: _myref
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x0000000000000014
+...
diff --git a/test/old-elf/ARM/rel-thm-call.test b/test/old-elf/ARM/rel-thm-call.test
new file mode 100644
index 000000000000..7e7289a99768
--- /dev/null
+++ b/test/old-elf/ARM/rel-thm-call.test
@@ -0,0 +1,114 @@
+# Check handling of R_ARM_THM_CALL relocation.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: 400084 fff7f6ff 00231846 80bd00bf
+# ^^ offset = -0x14
+# call site offset PC(thm) _Z1fv addr
+# 0x400084 + (-0x14) + 0x4 = 0x400074
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
+# CHECK: 00400080 g F .text {{[0-9a-f]+}} main
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error
+# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error
+
+# OVERFLOW: Relocation out of range {{.*}} (R_ARM_THM_CALL)
+
+# good.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AFBD465DF8047B704780B500AFFFF7FEFF0023184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000010
+ Symbol: _Z1fv
+ Type: R_ARM_THM_CALL
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x000000000000000C
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000D
+ Size: 0x000000000000000E
+
+# overflow.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AFBD465DF8047B704780B500AF00F400D00023184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000010
+ Symbol: _Z1fv
+ Type: R_ARM_THM_CALL
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x000000000000000C
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000D
+ Size: 0x000000000000000E
+...
diff --git a/test/old-elf/ARM/rel-thm-jump11.test b/test/old-elf/ARM/rel-thm-jump11.test
new file mode 100644
index 000000000000..e074b9ae1abf
--- /dev/null
+++ b/test/old-elf/ARM/rel-thm-jump11.test
@@ -0,0 +1,209 @@
+# Check handling of R_ARM_THM_JUMP11 relocation.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: 4001a4 0021c7e7
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400138 g F .text 00000060 __gnu_h2f_internal
+# CHECK: 004001a4 g F .text 00000004 __gnu_h2f_alternative
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error
+# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error
+
+# OVERFLOW: Relocation out of range {{.*}} (R_ARM_THM_JUMP11)
+
+# good.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 70B4020CC0F3C754FF2CC0F3160302F4004080B241D0002C08BF002B3BD0A4F17F0543F4000315F10E0FA8BF41F6FF7209DA15F1190FA3BFA4F166066FF07F42F2406FF07F4212EA03060CD001325208964208BF03EA42021344B3F1807F24BF5B08A4F17E0501B30F2D26DC15F1180F11DB15F10E0FB5BF4FF6F2710E35CFF6FF71AD02B7BF491BAAB2CB40002202EB5333034398B270BC70470029FBD040EA533370BC43F4FC407047102DDEDD6FEAD0336FEAC33398B2EDE740F4F84398B2E9E700BFC0F3842310B4A3F11F040029B4FA84F400F400424FEA541408BF0024C0F309002146140481B943B14203703302EBC35343EA04005DF8044B704760B1B0FA80F3153B98405B42EFE744EA40305DF8044B40F0FF40704720465DF8044B704700BF01216BE70121FEE7002167E70021FEE7
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000012A
+ Symbol: __gnu_h2f_internal
+ Type: R_ARM_THM_JUMP11
+ - Offset: 0x0000000000000132
+ Symbol: __gnu_h2f_internal
+ Type: R_ARM_THM_JUMP11
+ - Name: .text.startup
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 0020FFF7FEBF00BF
+ - Name: .rel.text.startup
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text.startup
+ Relocations:
+ - Offset: 0x0000000000000002
+ Symbol: __gnu_h2f_alternative
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$t'
+ Section: .text
+ - Name: __gnu_f2h_internal
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x00000000000000C2
+ Global:
+ - Name: __gnu_f2h_alternative
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000012D
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_alternative
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000131
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_ieee
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000129
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: main
+ Type: STT_FUNC
+ Section: .text.startup
+ Value: 0x0000000000000001
+ Size: 0x0000000000000006
+ - Name: __gnu_f2h_ieee
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000125
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_internal
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x00000000000000C5
+ Size: 0x000000000000005E
+ Visibility: STV_HIDDEN
+
+# overflow.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 70B4020CC0F3C754FF2CC0F3160302F4004080B241D0002C08BF002B3BD0A4F17F0543F4000315F10E0FA8BF41F6FF7209DA15F1190FA3BFA4F166066FF07F42F2406FF07F4212EA03060CD001325208964208BF03EA42021344B3F1807F24BF5B08A4F17E0501B30F2D26DC15F1180F11DB15F10E0FB5BF4FF6F2710E35CFF6FF71AD02B7BF491BAAB2CB40002202EB5333034398B270BC70470029FBD040EA533370BC43F4FC407047102DDEDD6FEAD0336FEAC33398B2EDE740F4F84398B2E9E700BFC0F3842310B4A3F11F040029B4FA84F400F400424FEA541408BF0024C0F309002146140481B943B14203703302EBC35343EA04005DF8044B704760B1B0FA80F3153B98405B42EFE744EA40305DF8044B40F0FF40704720465DF8044B704700BF01216BE70121FEE7002167E7002100E4
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000012A
+ Symbol: __gnu_h2f_internal
+ Type: R_ARM_THM_JUMP11
+ - Offset: 0x0000000000000132
+ Symbol: __gnu_h2f_internal
+ Type: R_ARM_THM_JUMP11
+ - Name: .text.startup
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 0020FFF7FEBF00BF
+ - Name: .rel.text.startup
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text.startup
+ Relocations:
+ - Offset: 0x0000000000000002
+ Symbol: __gnu_h2f_alternative
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$t'
+ Section: .text
+ - Name: __gnu_f2h_internal
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x00000000000000C2
+ Global:
+ - Name: __gnu_f2h_alternative
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000012D
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_alternative
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000131
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_ieee
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000129
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: main
+ Type: STT_FUNC
+ Section: .text.startup
+ Value: 0x0000000000000001
+ Size: 0x0000000000000006
+ - Name: __gnu_f2h_ieee
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000125
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_internal
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x00000000000000C5
+ Size: 0x000000000000005E
+ Visibility: STV_HIDDEN
+...
diff --git a/test/old-elf/ARM/rel-thm-jump24-veneer.test b/test/old-elf/ARM/rel-thm-jump24-veneer.test
new file mode 100644
index 000000000000..5893b53da84a
--- /dev/null
+++ b/test/old-elf/ARM/rel-thm-jump24-veneer.test
@@ -0,0 +1,120 @@
+# Check veneer generation for R_ARM_THM_JUMP24 relocation (B instruction call).
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s
+
+# STATIC: Contents of section .text:
+# STATIC: 400074 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 00f000b8
+# Call from main:
+# offset = 0x0 ^^
+# call site offset PC(thm) ___Z1fv_from_thumb addr
+# 0x400080 + 0x0 + 0x4 = 0x400084
+#
+# Code of the veneer:
+# STATIC: 400084 78470000 f9ffffea
+# offset = -0x1C ^^
+# call site offset PC(arm) _Z1fv
+# 0x400088 + (-0x1C) + 0x8 = 0x400074
+#
+# STATIC: SYMBOL TABLE:
+# STATIC: 00400084 l F .text {{[0-9a-f]+}} ___Z1fv_from_thumb
+# STATIC: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
+# STATIC: 00400080 g F .text {{[0-9a-f]+}} main
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s
+
+# EXEC-DYN: Contents of section .text:
+# EXEC-DYN: 400114 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 00f000b8
+# Call from main:
+# offset = 0x0 ^^
+# call site offset PC(thm) ___Z1fv_from_thumb addr
+# 0x400120 + 0x0 + 0x4 = 0x400124
+#
+# Code of the veneer:
+# EXEC-DYN: 400124 78470000 f9ffffea
+# offset = -0x1C ^^
+# call site offset PC(arm) _Z1fv
+# 0x400128 + (-0x1C) + 0x8 = 0x400114
+#
+# EXEC-DYN: SYMBOL TABLE:
+# EXEC-DYN: 00400124 l F .text {{[0-9a-f]+}} ___Z1fv_from_thumb
+# EXEC-DYN: 00400114 g F .text {{[0-9a-f]+}} _Z1fv
+# EXEC-DYN: 00400120 g F .text {{[0-9a-f]+}} main
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 0030A0E30300A0E11EFF2FE1
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: FFF7FEBF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: _Z1fv
+ Type: R_ARM_THM_JUMP24
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: _Z1fv
+...
diff --git a/test/old-elf/ARM/rel-thm-jump24.test b/test/old-elf/ARM/rel-thm-jump24.test
new file mode 100644
index 000000000000..b58bc053aca0
--- /dev/null
+++ b/test/old-elf/ARM/rel-thm-jump24.test
@@ -0,0 +1,110 @@
+# Check handling of R_ARM_THM_JUMP24 relocation.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: 400084 80b500af fff7f4bf 03461846 80bd00bf
+# ^^ offset = -0x18
+# call site offset PC(thm) _Z1fv addr
+# 0x400088 + (-0x18) + 0x4 = 0x400074
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} _Z1fv
+# CHECK: 00400084 g F .text {{[0-9a-f]+}} main
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: not lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t 2> %t-error
+# RUN: FileCheck -check-prefix=OVERFLOW %s < %t-error
+
+# OVERFLOW: Relocation out of range {{.*}} (R_ARM_THM_JUMP24)
+
+# good.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF00231846BD465DF8047B704780B500AFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000014
+ Symbol: _Z1fv
+ Type: R_ARM_THM_JUMP24
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000011
+
+# overflow.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF00231846BD465DF8047B704780B500AF00F400900346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000014
+ Symbol: _Z1fv
+ Type: R_ARM_THM_JUMP24
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: _Z1fv
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000011
+...
diff --git a/test/old-elf/ARM/rel-thm-mov.test b/test/old-elf/ARM/rel-thm-mov.test
new file mode 100644
index 000000000000..5e2e134ce781
--- /dev/null
+++ b/test/old-elf/ARM/rel-thm-mov.test
@@ -0,0 +1,70 @@
+# 1. Check handling of R_ARM_THM_MOVW_ABS_NC and R_THM_ARM_MOVT_ABS relocation pair.
+# 2. Check that instructions are not cropped for symbols that address Thumb code.
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck %s
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=INSN-CROP %s
+
+# CHECK: Contents of section .text:
+# CHECK: 400074 {{[0-9a-f]+}} 41f20003 c0f24003 0a221a60
+# addrL = 0x1000 ^^
+# addrH = 0x40 ^^
+# addrH addrL _ZL5data1 addr
+# (0x40 << 16) + 0x1000 = 0x401000
+# CHECK: SYMBOL TABLE:
+# CHECK: 00401000 l .bss 00000004 _ZL5data1
+# CHECK: 00400074 g F .text {{[0-9a-f]+}} main
+#
+# INSN-CROP: Contents of section .text:
+# INSN-CROP: 400074 80b400af
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF40F20003C0F200030A221A6000231846BD465DF8047B7047
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: _ZL5data1
+ Type: R_ARM_THM_MOVW_ABS_NC
+ Addend: 0
+ - Offset: 0x0000000000000008
+ Symbol: _ZL5data1
+ Type: R_ARM_THM_MOVT_ABS
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+Symbols:
+ Local:
+ - Name: _ZL5data1
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+...
diff --git a/test/old-elf/ARM/rel-tls-ie32.test b/test/old-elf/ARM/rel-tls-ie32.test
new file mode 100644
index 000000000000..e05b262cd1bc
--- /dev/null
+++ b/test/old-elf/ARM/rel-tls-ie32.test
@@ -0,0 +1,125 @@
+# Check handling of R_ARM_TLS_IE32 relocation.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-tls.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-tlsv.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-tls.o %t-tlsv.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s
+
+# STATIC: Contents of section .got:
+# STATIC-NEXT: 401008 08000000 0c000000
+# tp_off(i) = 0x08 ^^ ^^ tp_off(j) = 0x0c
+# tp_off(i) + sizeof(i) = tp_off(j)
+# 0x08 + 0x04 = 0x0c
+# STATIC: SYMBOL TABLE:
+# STATIC: 00400094 g F .text {{[0-9a-f]+}} main
+# STATIC: 00000000 g .tdata 00000004 i
+# sizeof(i) = 0x04 ^^
+# STATIC: 00000004 g .tdata 00000004 j
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-tls.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-tlsv.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t-tls.o %t-tlsv.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s
+
+# EXEC-DYN: Contents of section .rel.dyn:
+# EXEC-DYN-NEXT: 400134 08104000 13000000 0c104000 13000000
+# addr(i) = 0x401008 ^^ ^^ addr(j) = 0x40100c
+# EXEC-DYN: Contents of section .got:
+# EXEC-DYN-NEXT: 401008 00000000 04000000
+# tls_off(i) = 0x00 ^^ ^^ tls_off(j) = 0x04
+# EXEC-DYN: SYMBOL TABLE:
+# EXEC-DYN: 00400144 g F .text {{[0-9a-f]+}} main
+# EXEC-DYN: 00000000 g .tdata 00000004 i
+# EXEC-DYN: 00000004 g .tdata 00000004 j
+
+# tls.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF0C4B7B441B681DEE702FD2580A4B7B441B681DEE701FCB581A44084B7B441B681DEE701FCB585B0013441846BD465DF8047B70472E000000260000001C000000
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000038
+ Symbol: i
+ Type: R_ARM_TLS_IE32
+ - Offset: 0x000000000000003C
+ Symbol: i
+ Type: R_ARM_TLS_IE32
+ - Offset: 0x0000000000000040
+ Symbol: j
+ Type: R_ARM_TLS_IE32
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: i
+ Type: STT_TLS
+ - Name: j
+ Type: STT_TLS
+
+# tlsv.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Content: 05000000FBFFFFFF
+Symbols:
+ Global:
+ - Name: i
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x0000000000000004
+ - Name: j
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/ARM/rel-tls-le32.test b/test/old-elf/ARM/rel-tls-le32.test
new file mode 100644
index 000000000000..eba4f950515b
--- /dev/null
+++ b/test/old-elf/ARM/rel-tls-le32.test
@@ -0,0 +1,73 @@
+# Check handling of R_ARM_TLS_LE32 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=STATIC %s
+
+# STATIC: Contents of section .text:
+# STATIC: 4000b4 {{[0-9a-f]+}} 08000000
+# tp_off = 0x000008 ^^
+# STATIC: SYMBOL TABLE:
+# STATIC: 00400094 g F .text {{[0-9a-f]+}} main
+# STATIC: 00000000 g .tdata 00000004 i
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=EXEC-DYN %s
+
+# EXEC-DYN: Contents of section .text:
+# EXEC-DYN: 400154 {{[0-9a-f]+}} 08000000
+# tp_off = 0x000008 ^^
+# EXEC-DYN: SYMBOL TABLE:
+# EXEC-DYN: 00400134 g F .text {{[0-9a-f]+}} main
+# EXEC-DYN: 00000000 g .tdata 00000004 i
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE2703F1DEE10209FE5023093E70300A0E100D04BE204B09DE41EFF2FE100000000
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000024
+ Symbol: i
+ Type: R_ARM_TLS_LE32
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Content: '05000000'
+Symbols:
+ Global:
+ - Name: i
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x0000000000000004
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+...
diff --git a/test/old-elf/ARM/rel-v4bx.test b/test/old-elf/ARM/rel-v4bx.test
new file mode 100644
index 000000000000..d2d3a7772b47
--- /dev/null
+++ b/test/old-elf/ARM/rel-v4bx.test
@@ -0,0 +1,72 @@
+# REQUIRES: arm
+
+# Check handling of R_ARM_V4BX relocation.
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi \
+# RUN: --noinhibit-exec %t-o.o -o %t
+# RUN: llvm-objdump -d -triple=armv4t %t | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK: main:
+# The following instruction creates a RM_ARM_V4BX relocation that
+# allows the linker to replace the bx instruction to a ARMv4
+# compatible one. Currently lld does not change it.
+# CHECK: 400114: 1e ff 2f 01 bxeq lr
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 1EFF2F01
+ - Name: .rel.text
+ Type: SHT_REL
+ Flags: [ SHF_INFO_LINK ]
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: ''
+ Type: R_ARM_V4BX
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ - Name: .ARM.attributes
+ Type: SHT_ARM_ATTRIBUTES
+ AddressAlign: 0x0000000000000001
+ Content: 4115000000616561626900010B000000060208010901
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: '$a'
+ Section: .text
+ - Name: .ARM.attributes
+ Type: STT_SECTION
+ Section: .ARM.attributes
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+...
diff --git a/test/old-elf/ARM/thm-symbols.test b/test/old-elf/ARM/thm-symbols.test
new file mode 100644
index 000000000000..6377d1e3ef89
--- /dev/null
+++ b/test/old-elf/ARM/thm-symbols.test
@@ -0,0 +1,51 @@
+# Check that symbols formed from Thumb instructions are valid:
+# 1. Symbol address.
+# 2. Symbol content size.
+# 3. Symbol content.
+
+# RUN: yaml2obj -format=elf %s > %t-t.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu \
+# RUN: -Bstatic --noinhibit-exec %t-t.o -o %t-t
+# RUN: llvm-readobj -symbols %t-t | FileCheck -check-prefix=SYM-ADDR %s
+# RUN: llvm-readobj -symbols %t-t | FileCheck -check-prefix=SYM-SIZE %s
+# RUN: llvm-objdump -s -t %t-t | FileCheck -check-prefix=SYM-CONTENT %s
+
+# SYM-ADDR: Name: main (1)
+# SYM-ADDR-NEXT: Value: 0x400075
+
+# SYM-SIZE: Name: main (1)
+# SYM-SIZE-NEXT: Value: 0x{{[0-9a-f]+}}
+# SYM-SIZE-NEXT: Size: 16
+
+# SYM-CONTENT: Contents of section .text:
+# SYM-CONTENT-NEXT: 400074 80b400af 00231846 bd465df8 047b7047 .....#.F.F]..{pG
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF00231846BD465DF8047B7047
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+...
diff --git a/test/old-elf/ARM/two-got-for-symbol.test b/test/old-elf/ARM/two-got-for-symbol.test
new file mode 100644
index 000000000000..e0420eff1918
--- /dev/null
+++ b/test/old-elf/ARM/two-got-for-symbol.test
@@ -0,0 +1,62 @@
+# Check that two GOT entries containing R_ARM_JUMP_SLOT and
+# R_ARM_GLOB_DAT may be present for the same symbol in the linked binary.
+
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -shared \
+# RUN: --noinhibit-exec %t-o.o -lfn -L%p/Inputs -o %t
+# RUN: llvm-readobj -relocations %t | FileCheck %s
+
+# CHECK: 0x401000 R_ARM_GLOB_DAT fn 0x0
+# CHECK: 0x401010 R_ARM_JUMP_SLOT fn 0x0
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 10482DE908B08DE20CD04DE230209FE502208FE02C309FE5033092E710300BE5FEFFFFEB0040A0E110301BE533FF2FE10030A0E1033084E00300A0E108D04BE21088BDE82C00000000000000
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: fn
+ Type: R_ARM_CALL
+ - Offset: 0x0000000000000044
+ Symbol: _GLOBAL_OFFSET_TABLE_
+ Type: R_ARM_BASE_PREL
+ - Offset: 0x0000000000000048
+ Symbol: fn
+ Type: R_ARM_GOT_BREL
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: '$a'
+ Section: .text
+ - Name: '$d'
+ Section: .text
+ Value: 0x0000000000000044
+ Global:
+ - Name: f
+ Type: STT_FUNC
+ Section: .text
+ - Name: fn
+ - Name: _GLOBAL_OFFSET_TABLE_
+...
diff --git a/test/old-elf/ARM/undef-lazy-symbol.test b/test/old-elf/ARM/undef-lazy-symbol.test
new file mode 100644
index 000000000000..361c6482dabe
--- /dev/null
+++ b/test/old-elf/ARM/undef-lazy-symbol.test
@@ -0,0 +1,133 @@
+# Check that _GLOBAL_OFFSET_TABLE_ symbol is resolved
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-got.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-got.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=GOT %s
+
+# GOT: Name: _GLOBAL_OFFSET_TABLE_ (183)
+# GOT-NEXT: Value: {{[0-9]+}}
+# GOT-NEXT: Size: 0
+# GOT-NEXT: Binding: Global (0x1)
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Other: 0
+# GOT-NEXT: Section: Absolute (0xFFF1)
+
+# Check that __exidx_start/_end symbols are resolved
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-exidx.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --defsym=main=fn --noinhibit-exec %t-exidx.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=EXIDX %s
+
+# EXIDX: Name: __exidx_start (186)
+# EXIDX-NEXT: Value: {{[0-9]+}}
+# EXIDX-NEXT: Size: 0
+# EXIDX-NEXT: Binding: Global (0x1)
+# EXIDX-NEXT: Type: Object (0x1)
+# EXIDX-NEXT: Other: 0
+# EXIDX-NEXT: Section: Absolute (0xFFF1)
+#
+# EXIDX: Name: __exidx_end (200)
+# EXIDX-NEXT: Value: {{[0-9]+}}
+# EXIDX-NEXT: Size: 0
+# EXIDX-NEXT: Binding: Global (0x1)
+# EXIDX-NEXT: Type: Object (0x1)
+# EXIDX-NEXT: Other: 0
+# EXIDX-NEXT: Section: Absolute (0xFFF1)
+
+# Check that all symbols are resolved
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-got.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-exidx.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-got.o %t-exidx.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=SYMS %s
+
+# SYMS: Name: _GLOBAL_OFFSET_TABLE_ (186)
+# SYMS-NEXT: Value: {{[0-9]+}}
+# SYMS-NEXT: Size: 0
+# SYMS-NEXT: Binding: Global (0x1)
+# SYMS-NEXT: Type: Object (0x1)
+# SYMS-NEXT: Other: 0
+# SYMS-NEXT: Section: Absolute (0xFFF1)
+#
+# SYMS: Name: __exidx_start (208)
+# SYMS-NEXT: Value: {{[0-9]+}}
+# SYMS-NEXT: Size: 0
+# SYMS-NEXT: Binding: Global (0x1)
+# SYMS-NEXT: Type: Object (0x1)
+# SYMS-NEXT: Other: 0
+# SYMS-NEXT: Section: Absolute (0xFFF1)
+#
+# SYMS: Name: __exidx_end (222)
+# SYMS-NEXT: Value: {{[0-9]+}}
+# SYMS-NEXT: Size: 0
+# SYMS-NEXT: Binding: Global (0x1)
+# SYMS-NEXT: Type: Object (0x1)
+# SYMS-NEXT: Other: 0
+# SYMS-NEXT: Section: Absolute (0xFFF1)
+
+# got.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B483B000AF40F20003C0F200037B60002318460C37BD465DF8047B704700BF
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: _GLOBAL_OFFSET_TABLE_
+
+# exidx.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B483B000AF40F20003C0F200037B60002318460C37BD465DF8047B704700BF
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: fn
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: __exidx_start
+ - Name: __exidx_end
+...
diff --git a/test/old-elf/ARM/veneer-mapping.test b/test/old-elf/ARM/veneer-mapping.test
new file mode 100644
index 000000000000..ccd93eea4fbd
--- /dev/null
+++ b/test/old-elf/ARM/veneer-mapping.test
@@ -0,0 +1,92 @@
+# Check that mapping symbols are properly generated for veneers.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
+# RUN: lld -flavor old-gnu -target arm-linux-gnu --defsym=main=fa \
+# RUN: -Bstatic --noinhibit-exec %t-arm.o %t-thm.o -o %t
+# RUN: llvm-readobj -symbols %t | FileCheck %s
+
+# CHECK: Name: $a.__ft_from_arm
+# CHECK: Name: $d.__ft_from_arm
+# CHECK: Name: $t.__fa_from_thumb
+# CHECK: Name: $a.__fa_from_thumb
+
+# arm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00482DE904B08DE2FEFFFFEA0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: ft
+ Type: R_ARM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: fa
+ Type: STT_FUNC
+ Section: .text
+ - Name: ft
+
+# thm.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B500AFFFF7FEBF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: fa
+ Type: R_ARM_THM_JUMP24
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Global:
+ - Name: ft
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ - Name: fa
+...
diff --git a/test/old-elf/ARM/weak-branch.test b/test/old-elf/ARM/weak-branch.test
new file mode 100644
index 000000000000..76c7a4d15b65
--- /dev/null
+++ b/test/old-elf/ARM/weak-branch.test
@@ -0,0 +1,221 @@
+# Check weak references fixup.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-jmp11.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-jmp11.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=JMP11-CHECK %s
+
+# JMP11-CHECK: Contents of section .text:
+# JMP11-CHECK: 400194 704700bf 01216be7 012100bf 002167e7
+# ^ NOP (thumb16)
+# 40019c: 2101 movs r1, #1
+# 40019e: bf00 nop
+# JMP11-CHECK: 4001a4 002100bf
+# ^ NOP (thumb16)
+# 4001a4: 2100 movs r1, #0
+# 4001a6: bf00 nop
+# JMP11-CHECK: SYMBOL TABLE:
+# JMP11-CHECK: 00000000 w *UND* 00000000 __gnu_h2f_internal
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm-call.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-thm-call.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=THM-CALL-CHECK %s
+
+# THM-CALL-CHECK: Contents of section .text:
+# THM-CALL-CHECK: 400064 80b500af fff7f4ff aff30080 03461846
+# ^ NOP.W
+# 400068: f7ff fff4 bl 400054 <my_fn>
+# 40006c: f3af 8000 nop.w
+# 400070: 4603 mov r3, r0 ; return value has not been changed after weak fn call
+#
+# THM-CALL-CHECK: SYMBOL TABLE:
+# THM-CALL-CHECK: 00000000 w *UND* 00000000 weak_fn
+
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-arm-call.o
+# RUN: lld -flavor old-gnu -target arm -m armelf_linux_eabi -Bstatic \
+# RUN: --noinhibit-exec %t-arm-call.o -o %t
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=ARM-CALL-CHECK %s
+
+# ARM-CALL-CHECK: Contents of section .text:
+# ARM-CALL-CHECK: 400074 04b08de2 f5ffffeb 00f020e3 0030a0e1
+# ^ NOP
+# 400078: ebfffff5 bl 400054 <my_fn>
+# 40007c: e320f000 nop {0}
+# 400080: e1a03000 mov r3, r0 ; return value has not been changed after weak fn call
+#
+# ARM-CALL-CHECK: SYMBOL TABLE:
+# ARM-CALL-CHECK: 00000000 w *UND* 00000000 weak_fn
+
+# jump11.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 70B4020CC0F3C754FF2CC0F3160302F4004080B241D0002C08BF002B3BD0A4F17F0543F4000315F10E0FA8BF41F6FF7209DA15F1190FA3BFA4F166066FF07F42F2406FF07F4212EA03060CD001325208964208BF03EA42021344B3F1807F24BF5B08A4F17E0501B30F2D26DC15F1180F11DB15F10E0FB5BF4FF6F2710E35CFF6FF71AD02B7BF491BAAB2CB40002202EB5333034398B270BC70470029FBD040EA533370BC43F4FC407047102DDEDD6FEAD0336FEAC33398B2EDE740F4F84398B2E9E700BFC0F3842310B4A3F11F040029B4FA84F400F400424FEA541408BF0024C0F309002146140481B943B14203703302EBC35343EA04005DF8044B704760B1B0FA80F3153B98405B42EFE744EA40305DF8044B40F0FF40704720465DF8044B704700BF01216BE70121FEE7002167E70021FEE7
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000012A
+ Symbol: __gnu_h2f_internal
+ Type: R_ARM_THM_JUMP11
+ - Offset: 0x0000000000000132
+ Symbol: __gnu_h2f_internal
+ Type: R_ARM_THM_JUMP11
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: '$t'
+ Section: .text
+ - Name: __gnu_f2h_internal
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x00000000000000C2
+ Global:
+ - Name: __gnu_f2h_ieee
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000125
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_ieee
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000129
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_f2h_alternative
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000012D
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ - Name: __gnu_h2f_alternative
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000131
+ Size: 0x0000000000000004
+ Visibility: STV_HIDDEN
+ Weak:
+ - Name: __gnu_h2f_internal
+# thm-call.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 80B400AF01231846BD465DF8047B704780B500AFFFF7FEFFFFF7FEFF0346184680BD00BF
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000014
+ Symbol: my_fn
+ Type: R_ARM_THM_CALL
+ - Offset: 0x0000000000000018
+ Symbol: weak_fn
+ Type: R_ARM_THM_CALL
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: '$t'
+ Section: .text
+ Global:
+ - Name: my_fn
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000001
+ Size: 0x0000000000000010
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000011
+ Size: 0x0000000000000012
+ Weak:
+ - Name: weak_fn
+# arm-call.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_ARM
+ Flags: [ EF_ARM_EABI_VER5 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 04B02DE500B08DE20130A0E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEBFEFFFFEB0030A0E10300A0E10088BDE8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000024
+ Symbol: my_fn
+ Type: R_ARM_CALL
+ - Offset: 0x0000000000000028
+ Symbol: weak_fn
+ Type: R_ARM_CALL
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: '$a'
+ Section: .text
+ Global:
+ - Name: my_fn
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000001C
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000001C
+ Size: 0x000000000000001C
+ Weak:
+ - Name: weak_fn
+...
diff --git a/test/old-elf/Hexagon/Inputs/dynobj-data.c b/test/old-elf/Hexagon/Inputs/dynobj-data.c
new file mode 100644
index 000000000000..0f4ea9b80526
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/dynobj-data.c
@@ -0,0 +1,3 @@
+int d = 10;
+
+int fn() { return d; }
diff --git a/test/old-elf/Hexagon/Inputs/dynobj-data.o b/test/old-elf/Hexagon/Inputs/dynobj-data.o
new file mode 100644
index 000000000000..13d283cd0eff
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/dynobj-data.o
Binary files differ
diff --git a/test/old-elf/Hexagon/Inputs/dynobj.c b/test/old-elf/Hexagon/Inputs/dynobj.c
new file mode 100644
index 000000000000..f17fdadd6945
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/dynobj.c
@@ -0,0 +1,26 @@
+extern int shankar;
+static int a;
+static int b;
+int c;
+int fn2() {
+ return 0;
+}
+
+int fn1() {
+ return 0;
+}
+
+int fn() {
+ a = 10;
+ b = 20;
+ c = 10;
+ shankar = 20;
+ return 0;
+}
+
+int fn3() {
+ fn();
+ fn1();
+ fn2();
+ return 0;
+}
diff --git a/test/old-elf/Hexagon/Inputs/dynobj.o b/test/old-elf/Hexagon/Inputs/dynobj.o
new file mode 100644
index 000000000000..6c184f2edd60
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/dynobj.o
Binary files differ
diff --git a/test/old-elf/Hexagon/Inputs/got-plt-order.c b/test/old-elf/Hexagon/Inputs/got-plt-order.c
new file mode 100644
index 000000000000..621f670ef7c5
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/got-plt-order.c
@@ -0,0 +1,6 @@
+int c = 10;
+int fn() { c = 20; return 0; }
+
+int fn1() {
+ return fn();
+}
diff --git a/test/old-elf/Hexagon/Inputs/got-plt-order.o b/test/old-elf/Hexagon/Inputs/got-plt-order.o
new file mode 100644
index 000000000000..e97678b739bd
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/got-plt-order.o
Binary files differ
diff --git a/test/old-elf/Hexagon/Inputs/libMaxAlignment.a b/test/old-elf/Hexagon/Inputs/libMaxAlignment.a
new file mode 100644
index 000000000000..cc5461a09ae4
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/libMaxAlignment.a
Binary files differ
diff --git a/test/old-elf/Hexagon/Inputs/sda-base.o b/test/old-elf/Hexagon/Inputs/sda-base.o
new file mode 100644
index 000000000000..410a3d47d320
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/sda-base.o
Binary files differ
diff --git a/test/old-elf/Hexagon/Inputs/sdata1.c b/test/old-elf/Hexagon/Inputs/sdata1.c
new file mode 100644
index 000000000000..77c2a54c36a1
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/sdata1.c
@@ -0,0 +1,3 @@
+static int a = 0;
+
+int b = 10;
diff --git a/test/old-elf/Hexagon/Inputs/sdata1.o b/test/old-elf/Hexagon/Inputs/sdata1.o
new file mode 100644
index 000000000000..bf908fed27e9
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/sdata1.o
Binary files differ
diff --git a/test/old-elf/Hexagon/Inputs/sdata2.c b/test/old-elf/Hexagon/Inputs/sdata2.c
new file mode 100644
index 000000000000..96b37271d773
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/sdata2.c
@@ -0,0 +1,6 @@
+int sdata1 = 10;
+int sdata2 = 20;
+int sdata3 = 30;
+
+int sbss1 = 0;
+
diff --git a/test/old-elf/Hexagon/Inputs/sdata2.o b/test/old-elf/Hexagon/Inputs/sdata2.o
new file mode 100644
index 000000000000..e4ec810866e5
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/sdata2.o
Binary files differ
diff --git a/test/old-elf/Hexagon/Inputs/use-shared.hexagon b/test/old-elf/Hexagon/Inputs/use-shared.hexagon
new file mode 100644
index 000000000000..9e5ffb42d36a
--- /dev/null
+++ b/test/old-elf/Hexagon/Inputs/use-shared.hexagon
Binary files differ
diff --git a/test/old-elf/Hexagon/dynlib-data.test b/test/old-elf/Hexagon/dynlib-data.test
new file mode 100644
index 000000000000..2da312b54d43
--- /dev/null
+++ b/test/old-elf/Hexagon/dynlib-data.test
@@ -0,0 +1,9 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj-data.o \
+RUN: -o %t --noinhibit-exec -shared
+RUN: llvm-objdump -s %t > %t1
+RUN: FileCheck -check-prefix=CHECKRELOCS %s < %t1
+
+CHECKRELOCS: Contents of section .text:
+CHECKRELOCS: 00f8 01c09da0 01d89da1 3c400000 18c4496a ........<@....Ij
+CHECKRELOCS: 0108 ff7fff0f 00ff9897 00c08091 38c09d91 ............8...
+CHECKRELOCS: 0118 1ec01e96 ....
diff --git a/test/old-elf/Hexagon/dynlib-gotoff.test b/test/old-elf/Hexagon/dynlib-gotoff.test
new file mode 100644
index 000000000000..f31d23bc5ebc
--- /dev/null
+++ b/test/old-elf/Hexagon/dynlib-gotoff.test
@@ -0,0 +1,128 @@
+# This tests GOT's and PLT's for dynamic libraries for Hexagon
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o \
+RUN: -o %t --output-filetype=yaml -shared --noinhibit-exec
+RUN: FileCheck -check-prefix=CHECKGOTPLT %s < %t
+
+ - name: .PLT0
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 1C, C0, 49, 6A, 0E, 42, 9C, E2,
+CHECKGOTPLT: 4F, 40, 9C, 91, 3C, C0, 9C, 91, 0E, 42, 0E, 8C,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 16
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got0
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got0
+CHECKGOTPLT: addend: 4
+ - name: __plt_fn
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 16
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got_fn
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got_fn
+CHECKGOTPLT: addend: 4
+ - name: __plt_fn1
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 16
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got_fn1
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got_fn1
+CHECKGOTPLT: addend: 4
+ - name: __plt_fn2
+CHECKGOTPLT: type: stub
+CHECKGOTPLT: content: [ 00, 40, 00, 00, 0E, C0, 49, 6A, 1C, C0, 8E, 91,
+CHECKGOTPLT: 00, C0, 9C, 52 ]
+CHECKGOTPLT: alignment: 16
+CHECKGOTPLT: section-name: .plt
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_B32_PCREL_X
+CHECKGOTPLT: offset: 0
+ target: __got_fn2
+CHECKGOTPLT: - kind: R_HEX_6_PCREL_X
+CHECKGOTPLT: offset: 4
+ target: __got_fn2
+CHECKGOTPLT: addend: 4
+ - name: __got0
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
+CHECKGOTPLT: 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 8
+CHECKGOTPLT: section-name: .got.plt
+CHECKGOTPLT: permissions: rw-
+ - name: __got_c
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 4
+CHECKGOTPLT: section-name: .got
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_GLOB_DAT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: c
+ - name: __got_shankar
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 4
+CHECKGOTPLT: section-name: .got
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_GLOB_DAT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: shankar
+ - name: __got_fn
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 4
+CHECKGOTPLT: section-name: .got.plt
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_JMP_SLOT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn
+CHECKGOTPLT: - kind: R_HEX_32
+CHECKGOTPLT: offset: 0
+ target: .PLT0
+ - name: __got_fn1
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 4
+CHECKGOTPLT: section-name: .got.plt
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_JMP_SLOT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn1
+CHECKGOTPLT: - kind: R_HEX_32
+CHECKGOTPLT: offset: 0
+ target: .PLT0
+ - name: __got_fn2
+CHECKGOTPLT: type: got
+CHECKGOTPLT: content: [ 00, 00, 00, 00 ]
+CHECKGOTPLT: alignment: 4
+CHECKGOTPLT: section-name: .got.plt
+CHECKGOTPLT: permissions: rw-
+CHECKGOTPLT: references:
+CHECKGOTPLT: - kind: R_HEX_JMP_SLOT
+CHECKGOTPLT: offset: 0
+CHECKGOTPLT: target: fn2
+CHECKGOTPLT: - kind: R_HEX_32
+CHECKGOTPLT: offset: 0
+ target: .PLT0
diff --git a/test/old-elf/Hexagon/dynlib-hash.test b/test/old-elf/Hexagon/dynlib-hash.test
new file mode 100644
index 000000000000..e26368120970
--- /dev/null
+++ b/test/old-elf/Hexagon/dynlib-hash.test
@@ -0,0 +1,9 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o \
+RUN: -o %t --noinhibit-exec -shared
+RUN: llvm-objdump -s %t > %t1
+RUN: FileCheck -check-prefix=CHECKHASH %s < %t1
+
+CHECKHASH: Contents of section .hash:
+CHECKHASH: 0094 03000000 07000000 06000000 01000000
+CHECKHASH: 00a4 04000000 00000000 00000000 00000000
+CHECKHASH: 00b4 00000000 03000000 02000000 05000000
diff --git a/test/old-elf/Hexagon/dynlib-rela.test b/test/old-elf/Hexagon/dynlib-rela.test
new file mode 100644
index 000000000000..86e38ede6280
--- /dev/null
+++ b/test/old-elf/Hexagon/dynlib-rela.test
@@ -0,0 +1,9 @@
+# Tests that the relocation sections have the right alignment.
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/use-shared.hexagon -shared -o %t1
+RUN: llvm-readobj -sections %t1 > %t2
+RUN: FileCheck -check-prefix=SECTIONS %s < %t2
+
+SECTIONS: Section {
+SECTIONS: Name: .rela.plt (23)
+SECTIONS: AddressAlignment: 4
+SECTIONS: }
diff --git a/test/old-elf/Hexagon/dynlib-syms.test b/test/old-elf/Hexagon/dynlib-syms.test
new file mode 100644
index 000000000000..08f8930bb205
--- /dev/null
+++ b/test/old-elf/Hexagon/dynlib-syms.test
@@ -0,0 +1,7 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o \
+RUN: -o %t --noinhibit-exec -shared
+RUN: llvm-nm -n -M %t > %t1
+RUN: FileCheck -check-prefix=CHECKSYMS %s < %t1
+
+CHECKSYMS: 0000025c A _DYNAMIC
+CHECKSYMS: 00001008 A _GLOBAL_OFFSET_TABLE_
diff --git a/test/old-elf/Hexagon/dynlib.test b/test/old-elf/Hexagon/dynlib.test
new file mode 100644
index 000000000000..9e591ed06075
--- /dev/null
+++ b/test/old-elf/Hexagon/dynlib.test
@@ -0,0 +1,36 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/use-shared.hexagon -shared -o %t1
+RUN: llvm-readobj -dyn-symbols %t1 > %t2
+RUN: FileCheck -check-prefix=DYNSYMS %s < %t2
+RUN: llvm-readobj -program-headers %t1 | FileCheck %s
+
+DYNSYMS: DynamicSymbols [
+DYNSYMS: Symbol {
+DYNSYMS: Name: fn2
+DYNSYMS-NEXT: Value:
+DYNSYMS-NEXT: Size:
+DYNSYMS-NEXT: Binding: Global
+DYNSYMS-NEXT: Type: Function
+DYNSYMS-NEXT: Other:
+DYNSYMS-NEXT: Section: .text
+DYNSYMS: }
+DYNSYMS: Symbol {
+DYNSYMS: Name: fn1
+DYNSYMS-NEXT: Value:
+DYNSYMS-NEXT: Size:
+DYNSYMS-NEXT: Binding: Global
+DYNSYMS-NEXT: Type: Function
+DYNSYMS-NEXT: Other:
+DYNSYMS-NEXT: Section: .text
+DYNSYMS: }
+DYNSYMS: Symbol {
+DYNSYMS: Name: fn3
+DYNSYMS-NEXT: Value:
+DYNSYMS-NEXT: Size:
+DYNSYMS-NEXT: Binding: Global
+DYNSYMS-NEXT: Type: Function
+DYNSYMS-NEXT: Other:
+DYNSYMS-NEXT: Section: .text
+DYNSYMS-NEXT: }
+DYNSYMS-NEXT: ]
+
+CHECK-NOT: PT_PHDR
diff --git a/test/old-elf/Hexagon/hexagon-got-plt-order.test b/test/old-elf/Hexagon/hexagon-got-plt-order.test
new file mode 100644
index 000000000000..e2d37d1f6440
--- /dev/null
+++ b/test/old-elf/Hexagon/hexagon-got-plt-order.test
@@ -0,0 +1,5 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/got-plt-order.o -o %t -shared
+RUN: llvm-objdump -section-headers %t | FileCheck %s
+
+CHECK: .got
+CHECK-NEXT: .got.plt
diff --git a/test/old-elf/Hexagon/hexagon-plt-setup.test b/test/old-elf/Hexagon/hexagon-plt-setup.test
new file mode 100644
index 000000000000..51d8bd6a6b71
--- /dev/null
+++ b/test/old-elf/Hexagon/hexagon-plt-setup.test
@@ -0,0 +1,12 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/use-shared.hexagon \
+RUN: --output-filetype=yaml --noinhibit-exec -o %t2
+RUN: FileCheck %s < %t2
+
+CHECK: - name: fn3
+CHECK: references:
+CHECK: - kind: R_HEX_B22_PCREL
+CHECK: offset: 4
+ target:
+CHECK: - kind: R_HEX_B22_PCREL
+CHECK: offset: 8
+ target:
diff --git a/test/old-elf/Hexagon/maxalignment.test b/test/old-elf/Hexagon/maxalignment.test
new file mode 100644
index 000000000000..15a2bf3d80be
--- /dev/null
+++ b/test/old-elf/Hexagon/maxalignment.test
@@ -0,0 +1,8 @@
+# This tests that we lld is able to get the contentType properly for archives
+# when they intermittently get loaded at an address whose alignment is 2
+
+RUN: lld -flavor old-gnu -target hexagon --whole-archive %p/Inputs/libMaxAlignment.a \
+RUN: --noinhibit-exec -static -o %t
+RUN: llvm-nm %t | FileCheck %s
+
+CHECK: {{[0-9a-f]+}} D a
diff --git a/test/old-elf/Hexagon/rela-order.test b/test/old-elf/Hexagon/rela-order.test
new file mode 100644
index 000000000000..777b923fd737
--- /dev/null
+++ b/test/old-elf/Hexagon/rela-order.test
@@ -0,0 +1,9 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/dynobj.o -shared \
+RUN: --noinhibit-exec -o %t
+RUN: llvm-objdump -section-headers %t | FileCheck %s
+
+CHECK: .dynsym
+CHECK-NEXT: .dynstr
+CHECK-NEXT: .rela.dyn
+CHECK-NEXT: .rela.plt
+CHECK-NEXT: .plt
diff --git a/test/old-elf/Hexagon/sda-base.test b/test/old-elf/Hexagon/sda-base.test
new file mode 100644
index 000000000000..cfcafbce8377
--- /dev/null
+++ b/test/old-elf/Hexagon/sda-base.test
@@ -0,0 +1,4 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/sda-base.o -o %t1 --noinhibit-exec
+RUN: llvm-nm -n %t1 | FileCheck %s -check-prefix=sdabase
+
+sdabase: 00002000 A _SDA_BASE_
diff --git a/test/old-elf/Hexagon/zerofillquick-sdata.test b/test/old-elf/Hexagon/zerofillquick-sdata.test
new file mode 100644
index 000000000000..1b932fe6e7b1
--- /dev/null
+++ b/test/old-elf/Hexagon/zerofillquick-sdata.test
@@ -0,0 +1,18 @@
+# This tests that a typeZeroFillFast atom is associated with a section that has
+# the correct memory size.
+
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/sdata1.o %p/Inputs/sdata2.o \
+RUN: -o %t --noinhibit-exec -static
+RUN: llvm-readobj -sections %t | FileCheck -check-prefix=CHECKSECTIONSANDSIZE %s
+
+CHECKSECTIONSANDSIZE: Section {
+CHECKSECTIONSANDSIZE: Name: .sdata (13)
+CHECKSECTIONSANDSIZE: Address: 0x1000
+CHECKSECTIONSANDSIZE: Offset: 0x1000
+CHECKSECTIONSANDSIZE: Size: 24
+CHECKSECTIONSANDSIZE: }
+CHECKSECTIONSANDSIZE: Section {
+CHECKSECTIONSANDSIZE: Name: .bss (20)
+CHECKSECTIONSANDSIZE: Address: 0x1018
+CHECKSECTIONSANDSIZE: Offset: 0x1018
+CHECKSECTIONSANDSIZE: }
diff --git a/test/old-elf/Inputs/abs-test.i386 b/test/old-elf/Inputs/abs-test.i386
new file mode 100644
index 000000000000..8556c24da551
--- /dev/null
+++ b/test/old-elf/Inputs/abs-test.i386
Binary files differ
diff --git a/test/old-elf/Inputs/allowduplicates.objtxt b/test/old-elf/Inputs/allowduplicates.objtxt
new file mode 100644
index 000000000000..9b8ba8902aba
--- /dev/null
+++ b/test/old-elf/Inputs/allowduplicates.objtxt
@@ -0,0 +1,12 @@
+defined-atoms:
+ - name: .text
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
+ 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
diff --git a/test/old-elf/Inputs/bar.o.x86-64 b/test/old-elf/Inputs/bar.o.x86-64
new file mode 100644
index 000000000000..467485f0bb96
--- /dev/null
+++ b/test/old-elf/Inputs/bar.o.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/branch-test.hexagon b/test/old-elf/Inputs/branch-test.hexagon
new file mode 100644
index 000000000000..1ffb47228e32
--- /dev/null
+++ b/test/old-elf/Inputs/branch-test.hexagon
Binary files differ
diff --git a/test/old-elf/Inputs/branch-test.ppc b/test/old-elf/Inputs/branch-test.ppc
new file mode 100644
index 000000000000..4698941e7503
--- /dev/null
+++ b/test/old-elf/Inputs/branch-test.ppc
Binary files differ
diff --git a/test/old-elf/Inputs/consecutive-weak-defs.o.yaml b/test/old-elf/Inputs/consecutive-weak-defs.o.yaml
new file mode 100644
index 000000000000..cbd9c665b6d5
--- /dev/null
+++ b/test/old-elf/Inputs/consecutive-weak-defs.o.yaml
@@ -0,0 +1,65 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 554889E5E8000000005DC3554889E5B8640000005DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000005
+ Symbol: my_weak_func
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: my_func
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000000B
+ Weak:
+ - Name: my_weak_func
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000B
+ Size: 0x000000000000000B
+ - Name: my_weak_func2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000B
+ Size: 0x000000000000000B
+ - Name: my_weak_func3
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000B
+ Size: 0x000000000000000B
+...
diff --git a/test/old-elf/Inputs/constants-merge.x86-64 b/test/old-elf/Inputs/constants-merge.x86-64
new file mode 100644
index 000000000000..0087eb8f8cb5
--- /dev/null
+++ b/test/old-elf/Inputs/constants-merge.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/constdata.x86-64 b/test/old-elf/Inputs/constdata.x86-64
new file mode 100644
index 000000000000..d877a5535357
--- /dev/null
+++ b/test/old-elf/Inputs/constdata.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/foo.o.x86-64 b/test/old-elf/Inputs/foo.o.x86-64
new file mode 100644
index 000000000000..72a89eefa8ed
--- /dev/null
+++ b/test/old-elf/Inputs/foo.o.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/globalconst.c b/test/old-elf/Inputs/globalconst.c
new file mode 100644
index 000000000000..08395a88e7ca
--- /dev/null
+++ b/test/old-elf/Inputs/globalconst.c
@@ -0,0 +1,2 @@
+/* compile the code with -fmerge-all-constants */
+const char mystr[] = "foobar";
diff --git a/test/old-elf/Inputs/globalconst.o.x86-64 b/test/old-elf/Inputs/globalconst.o.x86-64
new file mode 100644
index 000000000000..d8e266e76334
--- /dev/null
+++ b/test/old-elf/Inputs/globalconst.o.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/gotpcrel.S b/test/old-elf/Inputs/gotpcrel.S
new file mode 100644
index 000000000000..300675f59612
--- /dev/null
+++ b/test/old-elf/Inputs/gotpcrel.S
@@ -0,0 +1,11 @@
+ .text
+ .globl main
+ .align 16, 0x90
+ .type main,@function
+main: # @main
+ movq blah@GOTPCREL(%rip), %rax
+ movq main@GOTPCREL(%rip), %rax
+ ret
+
+ .weak blah
+ .type blah,@function
diff --git a/test/old-elf/Inputs/gotpcrel.x86-64 b/test/old-elf/Inputs/gotpcrel.x86-64
new file mode 100644
index 000000000000..f9c61d0edf15
--- /dev/null
+++ b/test/old-elf/Inputs/gotpcrel.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/group-cmd-search-1.ls b/test/old-elf/Inputs/group-cmd-search-1.ls
new file mode 100644
index 000000000000..965369309a20
--- /dev/null
+++ b/test/old-elf/Inputs/group-cmd-search-1.ls
@@ -0,0 +1 @@
+GROUP ( shared.so-x86-64 )
diff --git a/test/old-elf/Inputs/group-cmd-search-2.ls b/test/old-elf/Inputs/group-cmd-search-2.ls
new file mode 100644
index 000000000000..f1eee6a35efa
--- /dev/null
+++ b/test/old-elf/Inputs/group-cmd-search-2.ls
@@ -0,0 +1 @@
+GROUP ( /shared.so-x86-64 )
diff --git a/test/old-elf/Inputs/group-cmd-search-3.ls b/test/old-elf/Inputs/group-cmd-search-3.ls
new file mode 100644
index 000000000000..83ce0ca62fb1
--- /dev/null
+++ b/test/old-elf/Inputs/group-cmd-search-3.ls
@@ -0,0 +1 @@
+GROUP ( -l:shared.so-x86-64 -lfnarchive )
diff --git a/test/old-elf/Inputs/ifunc.S b/test/old-elf/Inputs/ifunc.S
new file mode 100644
index 000000000000..0ac1f5a5b0bb
--- /dev/null
+++ b/test/old-elf/Inputs/ifunc.S
@@ -0,0 +1,21 @@
+ .text
+ .globl hey;
+ .type hey, @function;
+hey:
+ .type hey, @gnu_indirect_function;
+ leaq __hey_1(%rip), %rax
+ ret
+
+ .text
+ .type __hey_1, @function;
+ .globl __hey_1;
+__hey_1:
+ movq $42, %rax
+ ret
+
+ .text
+ .type plt, @function;
+ .globl plt;
+plt:
+ call hey@PLT
+ ret
diff --git a/test/old-elf/Inputs/ifunc.cpp b/test/old-elf/Inputs/ifunc.cpp
new file mode 100644
index 000000000000..2e520277d36c
--- /dev/null
+++ b/test/old-elf/Inputs/ifunc.cpp
@@ -0,0 +1,3 @@
+extern "C" int hey();
+
+int main() { return hey(); }
diff --git a/test/old-elf/Inputs/ifunc.cpp.x86-64 b/test/old-elf/Inputs/ifunc.cpp.x86-64
new file mode 100644
index 000000000000..20c812cabd2c
--- /dev/null
+++ b/test/old-elf/Inputs/ifunc.cpp.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/ifunc.x86-64 b/test/old-elf/Inputs/ifunc.x86-64
new file mode 100644
index 000000000000..36c8e04ca837
--- /dev/null
+++ b/test/old-elf/Inputs/ifunc.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/libfnarchive.a b/test/old-elf/Inputs/libfnarchive.a
new file mode 100644
index 000000000000..753acd6e2c65
--- /dev/null
+++ b/test/old-elf/Inputs/libfnarchive.a
Binary files differ
diff --git a/test/old-elf/Inputs/libifunc.x86-64.so b/test/old-elf/Inputs/libifunc.x86-64.so
new file mode 100644
index 000000000000..0f05b308ce78
--- /dev/null
+++ b/test/old-elf/Inputs/libifunc.x86-64.so
Binary files differ
diff --git a/test/old-elf/Inputs/libundef.so b/test/old-elf/Inputs/libundef.so
new file mode 100644
index 000000000000..41f2a668f360
--- /dev/null
+++ b/test/old-elf/Inputs/libundef.so
Binary files differ
diff --git a/test/old-elf/Inputs/libweaksym.so b/test/old-elf/Inputs/libweaksym.so
new file mode 100755
index 000000000000..7ff4ea56ae60
--- /dev/null
+++ b/test/old-elf/Inputs/libweaksym.so
Binary files differ
diff --git a/test/old-elf/Inputs/main-with-global-def.o.yaml b/test/old-elf/Inputs/main-with-global-def.o.yaml
new file mode 100644
index 000000000000..d3eeb8fe24b6
--- /dev/null
+++ b/test/old-elf/Inputs/main-with-global-def.o.yaml
@@ -0,0 +1,55 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 554889E5B8C80000005DC3554889E54883EC10C745FC00000000B000E8000000004883C4105DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000001D
+ Symbol: my_func
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000000B
+ Size: 0x000000000000001C
+ - Name: my_weak_func2
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000000B
+ - Name: my_func
+...
diff --git a/test/old-elf/Inputs/mainobj.x86_64 b/test/old-elf/Inputs/mainobj.x86_64
new file mode 100644
index 000000000000..d0f29418237d
--- /dev/null
+++ b/test/old-elf/Inputs/mainobj.x86_64
Binary files differ
diff --git a/test/old-elf/Inputs/no-unique-section-names.x86-64 b/test/old-elf/Inputs/no-unique-section-names.x86-64
new file mode 100644
index 000000000000..fd92f5f0c6e7
--- /dev/null
+++ b/test/old-elf/Inputs/no-unique-section-names.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/object-test.elf-hexagon b/test/old-elf/Inputs/object-test.elf-hexagon
new file mode 100644
index 000000000000..bfc85a7d0b76
--- /dev/null
+++ b/test/old-elf/Inputs/object-test.elf-hexagon
Binary files differ
diff --git a/test/old-elf/Inputs/object-test.elf-i386 b/test/old-elf/Inputs/object-test.elf-i386
new file mode 100644
index 000000000000..872684c7fcc1
--- /dev/null
+++ b/test/old-elf/Inputs/object-test.elf-i386
Binary files differ
diff --git a/test/old-elf/Inputs/phdr.i386 b/test/old-elf/Inputs/phdr.i386
new file mode 100644
index 000000000000..7c83dd314891
--- /dev/null
+++ b/test/old-elf/Inputs/phdr.i386
Binary files differ
diff --git a/test/old-elf/Inputs/quickdata-sort-test.o.elf-hexagon b/test/old-elf/Inputs/quickdata-sort-test.o.elf-hexagon
new file mode 100644
index 000000000000..03d028707129
--- /dev/null
+++ b/test/old-elf/Inputs/quickdata-sort-test.o.elf-hexagon
Binary files differ
diff --git a/test/old-elf/Inputs/quickdata-sortcommon-test.o.elf-hexagon b/test/old-elf/Inputs/quickdata-sortcommon-test.o.elf-hexagon
new file mode 100644
index 000000000000..410a3d47d320
--- /dev/null
+++ b/test/old-elf/Inputs/quickdata-sortcommon-test.o.elf-hexagon
Binary files differ
diff --git a/test/old-elf/Inputs/quickdata-test.elf-hexagon b/test/old-elf/Inputs/quickdata-test.elf-hexagon
new file mode 100644
index 000000000000..c3ae53a6babe
--- /dev/null
+++ b/test/old-elf/Inputs/quickdata-test.elf-hexagon
Binary files differ
diff --git a/test/old-elf/Inputs/reloc-test.elf-i386 b/test/old-elf/Inputs/reloc-test.elf-i386
new file mode 100644
index 000000000000..1a5558131fff
--- /dev/null
+++ b/test/old-elf/Inputs/reloc-test.elf-i386
Binary files differ
diff --git a/test/old-elf/Inputs/reloc-xb.x86 b/test/old-elf/Inputs/reloc-xb.x86
new file mode 100644
index 000000000000..4d9770aa2356
--- /dev/null
+++ b/test/old-elf/Inputs/reloc-xb.x86
Binary files differ
diff --git a/test/old-elf/Inputs/reloc-xt.x86 b/test/old-elf/Inputs/reloc-xt.x86
new file mode 100644
index 000000000000..dcdfbfb09f71
--- /dev/null
+++ b/test/old-elf/Inputs/reloc-xt.x86
Binary files differ
diff --git a/test/old-elf/Inputs/relocs-dynamic.x86-64 b/test/old-elf/Inputs/relocs-dynamic.x86-64
new file mode 100644
index 000000000000..0c44924d18e6
--- /dev/null
+++ b/test/old-elf/Inputs/relocs-dynamic.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/relocs.x86-64 b/test/old-elf/Inputs/relocs.x86-64
new file mode 100644
index 000000000000..112dfa733db9
--- /dev/null
+++ b/test/old-elf/Inputs/relocs.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/responsefile b/test/old-elf/Inputs/responsefile
new file mode 100644
index 000000000000..2fe657a0e3b0
--- /dev/null
+++ b/test/old-elf/Inputs/responsefile
@@ -0,0 +1 @@
+--inresponsefile
diff --git a/test/old-elf/Inputs/rodata-test.hexagon b/test/old-elf/Inputs/rodata-test.hexagon
new file mode 100644
index 000000000000..f448748e2abe
--- /dev/null
+++ b/test/old-elf/Inputs/rodata-test.hexagon
Binary files differ
diff --git a/test/old-elf/Inputs/rodata-test.i386 b/test/old-elf/Inputs/rodata-test.i386
new file mode 100644
index 000000000000..09f71eb59969
--- /dev/null
+++ b/test/old-elf/Inputs/rodata-test.i386
Binary files differ
diff --git a/test/old-elf/Inputs/rodata.c b/test/old-elf/Inputs/rodata.c
new file mode 100644
index 000000000000..b43c9c945898
--- /dev/null
+++ b/test/old-elf/Inputs/rodata.c
@@ -0,0 +1,4 @@
+const unsigned char *str = "llvm";
+int foo() {
+ return str[0];
+}
diff --git a/test/old-elf/Inputs/rodata.o b/test/old-elf/Inputs/rodata.o
new file mode 100644
index 000000000000..f13ddc9bba98
--- /dev/null
+++ b/test/old-elf/Inputs/rodata.o
Binary files differ
diff --git a/test/old-elf/Inputs/section-test.i386 b/test/old-elf/Inputs/section-test.i386
new file mode 100644
index 000000000000..2b447a9f8f5b
--- /dev/null
+++ b/test/old-elf/Inputs/section-test.i386
Binary files differ
diff --git a/test/old-elf/Inputs/shared.c b/test/old-elf/Inputs/shared.c
new file mode 100644
index 000000000000..2be91c4b9e45
--- /dev/null
+++ b/test/old-elf/Inputs/shared.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+
+extern int i;
+int i = 42;
+
+// Undefined weak function in a dynamic library.
+__attribute__((weak)) void weakfoo();
+
+// Regular function in a dynamic library.
+void foo() {
+ // Try to call weakfoo so that the reference to weekfoo will be included in
+ // the resulting .so file.
+ if (weakfoo)
+ weakfoo();
+ puts("Fooo!!");
+}
diff --git a/test/old-elf/Inputs/shared.so-x86-64 b/test/old-elf/Inputs/shared.so-x86-64
new file mode 100644
index 000000000000..0240f0e67431
--- /dev/null
+++ b/test/old-elf/Inputs/shared.so-x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/shndx.o-x86_64 b/test/old-elf/Inputs/shndx.o-x86_64
new file mode 100644
index 000000000000..9e3e5d8526d7
--- /dev/null
+++ b/test/old-elf/Inputs/shndx.o-x86_64
Binary files differ
diff --git a/test/old-elf/Inputs/stripped-empty.x86_64 b/test/old-elf/Inputs/stripped-empty.x86_64
new file mode 100644
index 000000000000..7368ba280d79
--- /dev/null
+++ b/test/old-elf/Inputs/stripped-empty.x86_64
Binary files differ
diff --git a/test/old-elf/Inputs/target-test.hexagon b/test/old-elf/Inputs/target-test.hexagon
new file mode 100644
index 000000000000..7da114561920
--- /dev/null
+++ b/test/old-elf/Inputs/target-test.hexagon
Binary files differ
diff --git a/test/old-elf/Inputs/target-test.ppc b/test/old-elf/Inputs/target-test.ppc
new file mode 100644
index 000000000000..001be338c20d
--- /dev/null
+++ b/test/old-elf/Inputs/target-test.ppc
Binary files differ
diff --git a/test/old-elf/Inputs/tls-tbss-size.yaml b/test/old-elf/Inputs/tls-tbss-size.yaml
new file mode 100644
index 000000000000..0577dd157c6e
--- /dev/null
+++ b/test/old-elf/Inputs/tls-tbss-size.yaml
@@ -0,0 +1,59 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .tbss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Size: 16
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: t1.c
+ Type: STT_FILE
+ - Name: .tbss
+ Type: STT_TLS
+ Section: .tbss
+ Global:
+ - Name: t0
+ Type: STT_TLS
+ Section: .tbss
+ Size: 0x0000000000000004
+ - Name: t1
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: t2
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000008
+ Size: 0x0000000000000004
+ - Name: t3
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x000000000000000C
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/Inputs/tls.S b/test/old-elf/Inputs/tls.S
new file mode 100644
index 000000000000..7d9eab647b53
--- /dev/null
+++ b/test/old-elf/Inputs/tls.S
@@ -0,0 +1,50 @@
+ .text
+ .globl main
+ .align 16, 0x90
+ .type main,@function
+main: # @main
+ callq GOTTPOFF
+ addl %fs:tls1@TPOFF, %eax
+ addl %fs:tls0@TPOFF, %eax
+ addl %fs:tls2@TPOFF, %eax
+ ret
+
+ .text
+ .globl GOTTPOFF
+ .type GOTTPOFF,@function
+GOTTPOFF:
+ movq tls2@GOTTPOFF(%rip), %rax
+ movl %fs:0(%rax), %eax
+ ret
+
+ .text
+ .globl TLSLD
+ .type TLSLD,@function
+TLSLD:
+ leaq tls0@tlsld(%rip), %rdi
+ call __tls_get_addr@plt
+ leaq tls0@dtpoff(%rax), %rax
+ ret
+
+ .type tls0,@object # @tls0
+ .section .tbss,"awT",@nobits
+ .globl tls0
+ .align 4
+tls0:
+ .long 0 # 0x0
+ .size tls0, 4
+
+ .type tls1,@object # @tls1
+ .globl tls1
+ .align 4
+tls1:
+ .long 0 # 0x0
+ .size tls1, 4
+
+ .type tls2,@object # @tls2
+ .section .tdata,"awT",@progbits
+ .globl tls2
+ .align 4
+tls2:
+ .long 1 # 0x1
+ .size tls2, 4
diff --git a/test/old-elf/Inputs/tls.c b/test/old-elf/Inputs/tls.c
new file mode 100644
index 000000000000..672350756562
--- /dev/null
+++ b/test/old-elf/Inputs/tls.c
@@ -0,0 +1,11 @@
+extern __thread int tls0;
+extern __thread int tls1;
+extern __thread int tls2;
+
+__thread int tls0 = 0;
+__thread int tls1 = 0;
+__thread int tls2 = 1;
+
+int main() {
+ return tls0 + tls1 + tls2;
+}
diff --git a/test/old-elf/Inputs/tls.x86-64 b/test/old-elf/Inputs/tls.x86-64
new file mode 100644
index 000000000000..b420ce89b19b
--- /dev/null
+++ b/test/old-elf/Inputs/tls.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/tlsAddr.x86-64 b/test/old-elf/Inputs/tlsAddr.x86-64
new file mode 100644
index 000000000000..16cc9ab25abf
--- /dev/null
+++ b/test/old-elf/Inputs/tlsAddr.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/tlsaddr.c b/test/old-elf/Inputs/tlsaddr.c
new file mode 100644
index 000000000000..f62d57b3bfb4
--- /dev/null
+++ b/test/old-elf/Inputs/tlsaddr.c
@@ -0,0 +1,8 @@
+__thread int tls0 = 0;
+__thread int tls1 = 0;
+__thread int tls2 = 1;
+__thread int tls3 = 2;
+
+int main() {
+ return tls0 + tls1 + tls2;
+}
diff --git a/test/old-elf/Inputs/undef-from-main-so.c b/test/old-elf/Inputs/undef-from-main-so.c
new file mode 100644
index 000000000000..f1cb63db7ada
--- /dev/null
+++ b/test/old-elf/Inputs/undef-from-main-so.c
@@ -0,0 +1 @@
+int x[2] = {1, 2};
diff --git a/test/old-elf/Inputs/undef-from-main.c b/test/old-elf/Inputs/undef-from-main.c
new file mode 100644
index 000000000000..366d934dd84f
--- /dev/null
+++ b/test/old-elf/Inputs/undef-from-main.c
@@ -0,0 +1,5 @@
+extern int x[2];
+
+int main() {
+ x[0] = 2;
+}
diff --git a/test/old-elf/Inputs/undef-pc32.o b/test/old-elf/Inputs/undef-pc32.o
new file mode 100644
index 000000000000..954916d59991
--- /dev/null
+++ b/test/old-elf/Inputs/undef-pc32.o
Binary files differ
diff --git a/test/old-elf/Inputs/undef.o b/test/old-elf/Inputs/undef.o
new file mode 100644
index 000000000000..3c9b60c6ca33
--- /dev/null
+++ b/test/old-elf/Inputs/undef.o
Binary files differ
diff --git a/test/old-elf/Inputs/undef2-so.o.yaml b/test/old-elf/Inputs/undef2-so.o.yaml
new file mode 100644
index 000000000000..f640cea39a5d
--- /dev/null
+++ b/test/old-elf/Inputs/undef2-so.o.yaml
@@ -0,0 +1,49 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000001
+ Content: 554889E5488B05000000008B005DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000007
+ Symbol: myexportedsymbol
+ Type: R_X86_64_GOTPCREL
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: func
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000000F
+ - Name: _GLOBAL_OFFSET_TABLE_
+ - Name: myexportedsymbol
diff --git a/test/old-elf/Inputs/use-shared-32s.c b/test/old-elf/Inputs/use-shared-32s.c
new file mode 100644
index 000000000000..63054cb036ea
--- /dev/null
+++ b/test/old-elf/Inputs/use-shared-32s.c
@@ -0,0 +1,8 @@
+void foo();
+
+void (*func)();
+
+int main() {
+ func = foo;
+ func();
+}
diff --git a/test/old-elf/Inputs/use-shared-32s.x86-64 b/test/old-elf/Inputs/use-shared-32s.x86-64
new file mode 100644
index 000000000000..7e223677b93f
--- /dev/null
+++ b/test/old-elf/Inputs/use-shared-32s.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/use-shared.c b/test/old-elf/Inputs/use-shared.c
new file mode 100644
index 000000000000..b370eaa4fac2
--- /dev/null
+++ b/test/old-elf/Inputs/use-shared.c
@@ -0,0 +1,7 @@
+extern int i;
+void foo();
+
+int main() {
+ foo();
+ return i;
+}
diff --git a/test/old-elf/Inputs/use-shared.x86-64 b/test/old-elf/Inputs/use-shared.x86-64
new file mode 100644
index 000000000000..25e1eb87a2b4
--- /dev/null
+++ b/test/old-elf/Inputs/use-shared.x86-64
Binary files differ
diff --git a/test/old-elf/Inputs/weaksym.o b/test/old-elf/Inputs/weaksym.o
new file mode 100644
index 000000000000..010ce704a313
--- /dev/null
+++ b/test/old-elf/Inputs/weaksym.o
Binary files differ
diff --git a/test/old-elf/Inputs/writersyms.o b/test/old-elf/Inputs/writersyms.o
new file mode 100644
index 000000000000..7cd472d99d77
--- /dev/null
+++ b/test/old-elf/Inputs/writersyms.o
Binary files differ
diff --git a/test/old-elf/Inputs/x86-64-relocs.S b/test/old-elf/Inputs/x86-64-relocs.S
new file mode 100644
index 000000000000..2547c0f19bb0
--- /dev/null
+++ b/test/old-elf/Inputs/x86-64-relocs.S
@@ -0,0 +1,12 @@
+ .text
+ .globl main
+ .align 16, 0x90
+ .type main,@function
+main: # @main
+ call foo@PLT
+ ret
+
+ .globl foo
+ .type foo,@function
+foo:
+ ret
diff --git a/test/old-elf/Mips/abi-flags-01.test b/test/old-elf/Mips/abi-flags-01.test
new file mode 100644
index 000000000000..d2eb13f3186a
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-01.test
@@ -0,0 +1,35 @@
+# Check rejecting .MIPS.abiflags section with a wrong version.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: {{.*}}abi-flags-01.test.tmp.o: .MIPS.abiflags section has unsupported version '1'
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ Version: 1
+ ISA: MIPS32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/abi-flags-02.test b/test/old-elf/Mips/abi-flags-02.test
new file mode 100644
index 000000000000..f3c1f29abc55
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-02.test
@@ -0,0 +1,92 @@
+# Check generation of .MIPS.abiflags section under the following conditions:
+# - There is the only input object file
+# - The input file has valid .MIPS.abiflags section
+#
+# The .MIPS.abiflags section in the output file should have the same
+# settings as the input section.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -s -program-headers -mips-abi-flags %t.so | FileCheck %s
+
+# CHECK: Section {
+# CHECK: Index: 1
+# CHECK-NEXT: Name: .MIPS.abiflags
+# CHECK-NEXT: Type: SHT_MIPS_ABIFLAGS
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: Size: 24
+# CHECK-NEXT: Link: 0
+# CHECK-NEXT: Info: 0
+# CHECK-NEXT: AddressAlignment: 8
+# CHECK-NEXT: EntrySize: 24
+# CHECK-NEXT: }
+
+# CHECK: ProgramHeaders [
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_MIPS_ABIFLAGS (0x70000003)
+# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: FileSize: 24
+# CHECK-NEXT: MemSize: 24
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: PF_R
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+
+# CHECK: MIPS ABI Flags {
+# CHECK-NEXT: Version: 0
+# CHECK-NEXT: ISA: MIPS32r2
+# CHECK-NEXT: ISA Extension: None (0x0)
+# CHECK-NEXT: ASEs [ (0x800)
+# CHECK-NEXT: microMIPS (0x800)
+# CHECK-NEXT: ]
+# CHECK-NEXT: FP ABI: Hard float (32-bit CPU, Any FPU) (0x5)
+# CHECK-NEXT: GPR size: 32
+# CHECK-NEXT: CPR1 size: 32
+# CHECK-NEXT: CPR2 size: 0
+# CHECK-NEXT: Flags 1 [ (0x0)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Flags 2: 0x0
+# CHECK-NEXT: }
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ ISAExtension: EXT_NONE
+ ASEs: [ MICROMIPS ]
+ FpABI: FP_XX
+ GPRSize: REG_32
+ CPR1Size: REG_32
+ CPR2Size: REG_NONE
+ Flags1: [ ]
+ Flags2: 0x0
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/abi-flags-03.test b/test/old-elf/Mips/abi-flags-03.test
new file mode 100644
index 000000000000..a28bb2826730
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-03.test
@@ -0,0 +1,149 @@
+# Check generation of .MIPS.abiflags section under the following conditions:
+# - There are multiple input object files
+# - Every input file has valid .MIPS.abiflags section
+# - All .MIPS.abiflags sections are compatible with each other
+#
+# The .MIPS.abiflags section in the output file should reproduce result
+# of merging input object file sections.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t3.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o %t2.o %t3.o
+# RUN: llvm-readobj -mips-abi-flags %t.so | FileCheck %s
+
+# CHECK: MIPS ABI Flags {
+# CHECK-NEXT: Version: 0
+# CHECK-NEXT: ISA: MIPS32r2
+# CHECK-NEXT: ISA Extension: None (0x0)
+# CHECK-NEXT: ASEs [ (0x810)
+# CHECK-NEXT: MDMX (0x10)
+# CHECK-NEXT: microMIPS (0x800)
+# CHECK-NEXT: ]
+# CHECK-NEXT: FP ABI: Hard float (double precision) (0x1)
+# CHECK-NEXT: GPR size: 32
+# CHECK-NEXT: CPR1 size: 64
+# CHECK-NEXT: CPR2 size: 0
+# CHECK-NEXT: Flags 1 [ (0x1)
+# CHECK-NEXT: ODDSPREG
+# CHECK-NEXT: ]
+# CHECK-NEXT: Flags 2: 0x0
+# CHECK-NEXT: }
+
+# o1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_MDMX]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ ISAExtension: EXT_NONE
+ ASEs: [ MDMX ]
+ FpABI: FP_DOUBLE
+ GPRSize: REG_32
+ CPR1Size: REG_64
+ CPR2Size: REG_NONE
+ Flags1: [ ]
+ Flags2: 0x0
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# o2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ ISAExtension: EXT_NONE
+ ASEs: [ MICROMIPS ]
+ FpABI: FP_XX
+ GPRSize: REG_32
+ CPR1Size: REG_32
+ CPR2Size: REG_NONE
+ Flags1: [ODDSPREG]
+ Flags2: 0x0
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# o3.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ ISAExtension: EXT_NONE
+ ASEs: [ MICROMIPS ]
+ FpABI: FP_XX
+ GPRSize: REG_32
+ CPR1Size: REG_32
+ CPR2Size: REG_NONE
+ Flags1: [ ]
+ Flags2: 0x0
+
+Symbols:
+ Global:
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/abi-flags-04.test b/test/old-elf/Mips/abi-flags-04.test
new file mode 100644
index 000000000000..6cde797dd3a0
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-04.test
@@ -0,0 +1,125 @@
+# Check generation of .MIPS.abiflags section under the following conditions:
+# - There are multiple input object files
+# - Every input file has valid .MIPS.abiflags section
+# - .MIPS.abiflags sections have different but compatible FP ABI
+#
+# The .MIPS.abiflags section in the output file should reproduce result
+# of merging FP ABI flags.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-xx.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-double.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-64.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-64a.o
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1 %t-xx.o %t-double.o
+# RUN: llvm-readobj -mips-abi-flags %t1 | FileCheck -check-prefix=XX-DOUBLE %s
+
+# XX-DOUBLE: FP ABI: Hard float (double precision) (0x1)
+# XX-DOUBLE: GPR size: 32
+# XX-DOUBLE: CPR1 size: 32
+# XX-DOUBLE: Flags 1 [ (0x0)
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2 %t-xx.o %t-64.o
+# RUN: llvm-readobj -mips-abi-flags %t2 | FileCheck -check-prefix=XX-64 %s
+
+# XX-64: FP ABI: Hard float (32-bit CPU, 64-bit FPU) (0x6)
+# XX-64: GPR size: 32
+# XX-64: CPR1 size: 64
+# XX-64: Flags 1 [ (0x1)
+# XX-64: ODDSPREG (0x1)
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t3 %t-xx.o %t-64a.o
+# RUN: llvm-readobj -mips-abi-flags %t3 | FileCheck -check-prefix=XX-64A %s
+
+# XX-64A: FP ABI: Hard float compat (32-bit CPU, 64-bit FPU) (0x7)
+# XX-64A: GPR size: 32
+# XX-64A: CPR1 size: 64
+# XX-64A: Flags 1 [ (0x0)
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t4 %t-64.o %t-64a.o
+# RUN: llvm-readobj -mips-abi-flags %t4 | FileCheck -check-prefix=64-64A %s
+
+# 64-64A: FP ABI: Hard float (32-bit CPU, 64-bit FPU) (0x6)
+# 64-64A: GPR size: 32
+# 64-64A: CPR1 size: 64
+# 64-64A: Flags 1 [ (0x1)
+# 64-64A: ODDSPREG (0x1)
+
+# xx.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ FpABI: FP_XX
+ GPRSize: REG_32
+ CPR1Size: REG_32
+
+# double.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ FpABI: FP_DOUBLE
+ GPRSize: REG_32
+ CPR1Size: REG_32
+
+# 64.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ FpABI: FP_64
+ GPRSize: REG_32
+ CPR1Size: REG_64
+ Flags1: [ODDSPREG]
+
+# 64a.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ FpABI: FP_64A
+ GPRSize: REG_32
+ CPR1Size: REG_64
+ Flags1: []
+...
diff --git a/test/old-elf/Mips/abi-flags-05.test b/test/old-elf/Mips/abi-flags-05.test
new file mode 100644
index 000000000000..6a009db7344a
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-05.test
@@ -0,0 +1,186 @@
+# Check generation of .MIPS.abiflags section under the following conditions:
+# - There are multiple input object files
+# - Every input file has valid .MIPS.abiflags section
+# - .MIPS.abiflags sections have different and incompatible FP ABI
+#
+# The .MIPS.abiflags section in the output file should reproduce result
+# of merging FP ABI flags but the linker must show a warning.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-xx.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-dbl.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-sgl.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-soft.o
+# RUN: yaml2obj -format=elf -docnum 5 %s > %t-64.o
+# RUN: yaml2obj -format=elf -docnum 6 %s > %t-64a.o
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1 %t-xx.o %t-sgl.o 2>&1 \
+# RUN: | FileCheck -check-prefix=XX-SINGLE-WARN %s
+
+# XX-SINGLE-WARN: FP ABI {{-mfpxx|-msingle-float}} is incompatible with {{-msingle-float|-mfpxx}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2 %t-xx.o %t-soft.o 2>&1 \
+# RUN: | FileCheck -check-prefix=XX-SOFT-WARN %s
+
+# XX-SOFT-WARN: FP ABI {{-mfpxx|-msoft-float}} is incompatible with {{-msoft-float|-mfpxx}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t3 %t-dbl.o %t-sgl.o 2>&1 \
+# RUN: | FileCheck -check-prefix=DOUBLE-SINGLE-WARN %s
+
+# DOUBLE-SINGLE-WARN: FP ABI {{-mdouble-float|-msingle-float}} is incompatible with {{-msingle-float|-mdouble-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t4 %t-dbl.o %t-soft.o 2>&1 \
+# RUN: | FileCheck -check-prefix=DOUBLE-SOFT-WARN %s
+
+# DOUBLE-SOFT-WARN: FP ABI {{-mdouble-float|-msoft-float}} is incompatible with {{-msoft-float|-mdouble-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t5 %t-dbl.o %t-64.o 2>&1 \
+# RUN: | FileCheck -check-prefix=DOUBLE-64-WARN %s
+
+# DOUBLE-64-WARN: FP ABI {{-mdouble-float|-mgp32 -mfp64}} is incompatible with {{-mgp32 -mfp64|-mdouble-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t6 %t-dbl.o %t-64a.o 2>&1 \
+# RUN: | FileCheck -check-prefix=DOUBLE-64A-WARN %s
+
+# DOUBLE-64A-WARN: FP ABI {{-mdouble-float|-mgp32 -mfp64 -mno-odd-spreg}} is incompatible with {{-mgp32 -mfp64 -mno-odd-spreg|-mdouble-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t7 %t-sgl.o %t-soft.o 2>&1 \
+# RUN: | FileCheck -check-prefix=SINGLE-SOFT-WARN %s
+
+# SINGLE-SOFT-WARN: FP ABI {{-msingle-float|-msoft-float}} is incompatible with {{-msoft-float|-msingle-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t8 %t-sgl.o %t-64.o 2>&1 \
+# RUN: | FileCheck -check-prefix=SINGLE-64-WARN %s
+
+# SINGLE-64-WARN: FP ABI {{-msingle-float|-mgp32 -mfp64}} is incompatible with {{-mgp32 -mfp64|-msingle-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t9 %t-sgl.o %t-64a.o 2>&1 \
+# RUN: | FileCheck -check-prefix=SINGLE-64A-WARN %s
+
+# SINGLE-64A-WARN: FP ABI {{-msingle-float|-mgp32 -mfp64 -mno-odd-spreg}} is incompatible with {{-mgp32 -mfp64 -mno-odd-spreg|-msingle-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t10 %t-soft.o %t-64.o 2>&1 \
+# RUN: | FileCheck -check-prefix=SOFT-64-WARN %s
+
+# SOFT-64-WARN: FP ABI {{-msoft-float|-mgp32 -mfp64}} is incompatible with {{-mgp32 -mfp64|-msoft-float}}
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t11 %t-soft.o %t-64a.o 2>&1 \
+# RUN: | FileCheck -check-prefix=SOFT-64A-WARN %s
+
+# SOFT-64A-WARN: FP ABI {{-msoft-float|-mgp32 -mfp64 -mno-odd-spreg}} is incompatible with {{-mgp32 -mfp64 -mno-odd-spreg|-msoft-float}}
+
+# xx.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ FpABI: FP_XX
+ GPRSize: REG_32
+ CPR1Size: REG_32
+
+# double.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ FpABI: FP_DOUBLE
+ GPRSize: REG_32
+ CPR1Size: REG_32
+
+# single.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ FpABI: FP_SINGLE
+ GPRSize: REG_32
+ CPR1Size: REG_32
+
+# soft.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ FpABI: FP_SOFT
+ GPRSize: REG_32
+ CPR1Size: REG_NONE
+
+# 64.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ FpABI: FP_64
+ GPRSize: REG_32
+ CPR1Size: REG_64
+ Flags1: [ODDSPREG]
+
+# 64a.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ FpABI: FP_64A
+ GPRSize: REG_32
+ CPR1Size: REG_64
+ Flags1: []
+...
diff --git a/test/old-elf/Mips/abi-flags-06.test b/test/old-elf/Mips/abi-flags-06.test
new file mode 100644
index 000000000000..d7df379039bb
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-06.test
@@ -0,0 +1,79 @@
+# Check generation of .MIPS.abiflags section under the following conditions:
+# - There are multiple input object files
+# - Not all input files have a .MIPS.abiflags section
+#
+# The .MIPS.abiflags section in the output file should reproduce result
+# of merging input object file sections and data come from ELF header flags.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-abi.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-elf.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-abi.o %t-elf.o
+# RUN: llvm-readobj -mips-abi-flags %t.so | FileCheck %s
+
+# CHECK: MIPS ABI Flags {
+# CHECK-NEXT: Version: 0
+# CHECK-NEXT: ISA: MIPS32r2
+# CHECK-NEXT: ISA Extension: None (0x0)
+# CHECK-NEXT: ASEs [ (0x810)
+# CHECK-NEXT: MDMX (0x10)
+# CHECK-NEXT: microMIPS (0x800)
+# CHECK-NEXT: ]
+# CHECK-NEXT: FP ABI: Hard float (double precision) (0x1)
+# CHECK-NEXT: GPR size: 32
+# CHECK-NEXT: CPR1 size: 64
+# CHECK-NEXT: CPR2 size: 0
+# CHECK-NEXT: Flags 1 [ (0x0)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Flags 2: 0x0
+# CHECK-NEXT: }
+
+# abi.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_MDMX]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ ISAExtension: EXT_NONE
+ ASEs: [ MDMX ]
+ FpABI: FP_DOUBLE
+ GPRSize: REG_32
+ CPR1Size: REG_64
+ CPR2Size: REG_NONE
+ Flags1: [ ]
+ Flags2: 0x0
+
+# elf.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/abi-flags-07.test b/test/old-elf/Mips/abi-flags-07.test
new file mode 100644
index 000000000000..6cae9b2feb4d
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-07.test
@@ -0,0 +1,60 @@
+# Check that .MIPS.abiflags section is not written if no input object files
+# contain that section.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o %t2.o
+# RUN: llvm-readobj -mips-abi-flags %t.so | FileCheck %s
+
+# CHECK: There is no .MIPS.abiflags section in the file.
+
+# abi.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_MDMX]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# elf.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/abi-flags-08.test b/test/old-elf/Mips/abi-flags-08.test
new file mode 100644
index 000000000000..c4b75bcf4516
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-08.test
@@ -0,0 +1,71 @@
+# Check that the linker shows errors if ELF header flags
+# and .MIPS.abiflags section are incompatible.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-isa.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-ext.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-ases.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-isa.o 2>&1 \
+# RUN: | FileCheck -check-prefix=ISA-ERR %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-ext.o 2>&1 \
+# RUN: | FileCheck -check-prefix=EXT-ERR %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t3.so %t-ases.o 2>&1 \
+# RUN: | FileCheck -check-prefix=ASE-ERR %s
+# RUN: llvm-readobj -mips-abi-flags %t1.so %t2.so %t3.so \
+# RUN: | FileCheck -check-prefix=SEC %s
+
+# ISA-ERR: inconsistent ISA between .MIPS.abiflags and ELF header e_flags field
+# EXT-ERR: inconsistent ISA between .MIPS.abiflags and ELF header e_flags field
+# ASE-ERR: inconsistent ASEs between .MIPS.abiflags and ELF header e_flags field
+
+# SEC: There is no .MIPS.abiflags section in the file.
+
+# isa.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+
+# ext.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_3, EF_MIPS_MACH_4650]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS3
+ ISAExtension: EXT_4120
+
+# ases.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ ASEs: []
+
+...
diff --git a/test/old-elf/Mips/abi-flags-09.test b/test/old-elf/Mips/abi-flags-09.test
new file mode 100644
index 000000000000..1ab03abe3810
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-09.test
@@ -0,0 +1,67 @@
+# Check position of PT_MIPS_ABIFLAGS segment.
+# It should go right after the PT_INTERP segment.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s
+
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_INTERP
+# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: FileSize: 13
+# CHECK-NEXT: MemSize: 13
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: PF_R
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 1
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_MIPS_ABIFLAGS
+# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: FileSize: 24
+# CHECK-NEXT: MemSize: 24
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: PF_R
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ ISAExtension: EXT_NONE
+ ASEs: [ MICROMIPS ]
+ FpABI: FP_XX
+ GPRSize: REG_32
+ CPR1Size: REG_32
+ CPR2Size: REG_NONE
+ Flags1: [ ]
+ Flags2: 0x0
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/abi-flags-10.test b/test/old-elf/Mips/abi-flags-10.test
new file mode 100644
index 000000000000..50732d5c1151
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-10.test
@@ -0,0 +1,60 @@
+# Check that SHT_MIPS_REGINFO section does not get a separate segment
+# if there is a SHT_MIPS_ABIFLAGS section.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s
+
+# CHECK: ProgramHeaders [
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR
+# CHECK: }
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_INTERP
+# CHECK: }
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_MIPS_ABIFLAGS
+# CHECK: }
+# CHECK-NOT: Type: PT_MIPS_REGINFO
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "F0000000E0000000D0000000C0000000B000000000100000"
+
+- Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 2
+ ISAExtension: EXT_NONE
+ ASEs: [ MICROMIPS ]
+ FpABI: FP_XX
+ GPRSize: REG_32
+ CPR1Size: REG_32
+ CPR2Size: REG_NONE
+ Flags1: [ ]
+ Flags2: 0x0
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/abi-flags-11.test b/test/old-elf/Mips/abi-flags-11.test
new file mode 100644
index 000000000000..e0e8547abbc7
--- /dev/null
+++ b/test/old-elf/Mips/abi-flags-11.test
@@ -0,0 +1,59 @@
+# Check position of PT_MIPS_REGINFO segment.
+# It should go right after the PT_INTERP segment.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s
+
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_INTERP
+# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: FileSize: 13
+# CHECK-NEXT: MemSize: 13
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: PF_R
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 1
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_MIPS_REGINFO
+# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: FileSize: 24
+# CHECK-NEXT: MemSize: 24
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: PF_R
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 4
+# CHECK-NEXT: }
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Size: 4
+ AddressAlign: 16
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "F0000000E0000000D0000000C0000000B000000000100000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/base-address-64.test b/test/old-elf/Mips/base-address-64.test
new file mode 100644
index 000000000000..6b553d227820
--- /dev/null
+++ b/test/old-elf/Mips/base-address-64.test
@@ -0,0 +1,80 @@
+# Check executable base address configuration. Base address should be
+# equal to 0x400000 and the MIPS_BASE_ADDRESS dynamic tag's value should
+# be the same.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el --noinhibit-exec -o %t.exe %t.o
+# RUN: llvm-readobj -dynamic-table -program-headers %t.exe | FileCheck %s
+
+# CHECK: DynamicSection [ (15 entries)
+# CHECK: Tag Type Name/Value
+# CHECK-NEXT: 0x0000000000000004 HASH 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x0000000000000005 STRTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x0000000000000006 SYMTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x000000000000000A STRSZ 1 (bytes)
+# CHECK-NEXT: 0x000000000000000B SYMENT 24 (bytes)
+# CHECK-NEXT: 0x0000000070000001 MIPS_RLD_VERSION 1
+# CHECK-NEXT: 0x0000000070000016 MIPS_RLD_MAP 0x120002000
+# CHECK-NEXT: 0x0000000070000035 MIPS_RLD_MAP_REL 0x1DB8
+# CHECK-NEXT: 0x0000000070000005 MIPS_FLAGS NOTPOT
+# CHECK-NEXT: 0x0000000070000006 MIPS_BASE_ADDRESS 0x120000000
+# CHECK-NEXT: 0x000000007000000A MIPS_LOCAL_GOTNO 2
+# CHECK-NEXT: 0x0000000070000011 MIPS_SYMTABNO 1
+# CHECK-NEXT: 0x0000000070000013 MIPS_GOTSYM 0x1
+# CHECK-NEXT: 0x0000000000000003 PLTGOT 0x120001000
+# CHECK-NEXT: 0x0000000000000000 NULL 0x0
+# CHECK-NEXT: ]
+
+# CHECK: ProgramHeaders [
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_PHDR (0x6)
+# CHECK: Offset: 0x40
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_INTERP (0x3)
+# CHECK: Offset: 0x190
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_LOAD (0x1)
+# CHECK-NEXT: Offset: 0x0
+# CHECK-NEXT: VirtualAddress: 0x120000000
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_64R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x10
+ Size: 0x00
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x10
+ Size: 0x00
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: main
+ Section: .text
diff --git a/test/old-elf/Mips/base-address.test b/test/old-elf/Mips/base-address.test
new file mode 100644
index 000000000000..67c04326cc15
--- /dev/null
+++ b/test/old-elf/Mips/base-address.test
@@ -0,0 +1,95 @@
+# Check executable base address configuration. Base address should be
+# equal to 0x400000 and the MIPS_BASE_ADDRESS dynamic tag's value should
+# be the same.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -o %t.exe %t.o
+# RUN: llvm-readobj -dynamic-table -program-headers %t.exe | FileCheck %s
+
+# CHECK: DynamicSection [ (15 entries)
+# CHECK: Tag Type Name/Value
+# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x0000000A STRSZ 1 (bytes)
+# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes)
+# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1
+# CHECK-NEXT: 0x70000016 MIPS_RLD_MAP 0x402000
+# CHECK-NEXT: 0x70000035 MIPS_RLD_MAP_REL 0x1E9C
+# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT
+# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x400000
+# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2
+# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 1
+# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x1
+# CHECK-NEXT: 0x00000003 PLTGOT 0x401000
+# CHECK-NEXT: 0x00000000 NULL 0x0
+# CHECK-NEXT: ]
+
+# CHECK: ProgramHeaders [
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_PHDR (0x6)
+# CHECK: Offset: 0x34
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_INTERP (0x3)
+# CHECK: Offset: 0xF4
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_LOAD (0x1)
+# CHECK: Offset: 0x0
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_LOAD (0x1)
+# CHECK: Offset: 0x1000
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_LOAD (0x1)
+# CHECK: Offset: 0x2000
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ProgramHeader {
+# CHECK: Type: PT_DYNAMIC (0x2)
+# CHECK: Offset: 0x12C
+# CHECK: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK: }
+# CHECK: ]
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: main
+ Section: .text
diff --git a/test/old-elf/Mips/ctors-order.test b/test/old-elf/Mips/ctors-order.test
new file mode 100644
index 000000000000..b33ed43292e7
--- /dev/null
+++ b/test/old-elf/Mips/ctors-order.test
@@ -0,0 +1,164 @@
+# Check ordering of .ctors.* sections.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-crtbeginS.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-crtendS.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-obj.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --output-filetype=yaml \
+# RUN: %t-crtbeginS.o %t-obj.o %t-crtendS.o | FileCheck %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-crtbeginS.o %t-obj.o %t-crtendS.o
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=RAW %s
+
+# CHECK: defined-atoms:
+# CHECK-NEXT: - type: data
+# CHECK-NEXT: alignment: 4
+# CHECK-NEXT: section-choice: custom-required
+# CHECK-NEXT: section-name: .ctors
+# CHECK-NEXT: references:
+# CHECK-NEXT: - kind: layout-after
+# CHECK-NEXT: offset: 0
+# CHECK-NEXT: target: __CTOR_LIST__
+# CHECK-NEXT: - name: __CTOR_LIST__
+# CHECK-NEXT: type: data
+# CHECK-NEXT: content: [ FF, FF, FF, FF ]
+# CHECK-NEXT: alignment: 4
+# CHECK-NEXT: section-choice: custom-required
+# CHECK-NEXT: section-name: .ctors
+# CHECK-NEXT: - type: data
+# CHECK-NEXT: content: [ 11, 11, 11, 11 ]
+# CHECK-NEXT: alignment: 4
+# CHECK-NEXT: section-choice: custom-required
+# CHECK-NEXT: section-name: .ctors.1
+# CHECK-NEXT: - type: data
+# CHECK-NEXT: content: [ 22, 22, 22, 22 ]
+# CHECK-NEXT: alignment: 4
+# CHECK-NEXT: section-choice: custom-required
+# CHECK-NEXT: section-name: .ctors.2
+# CHECK-NEXT: - ref-name: L004
+# CHECK-NEXT: type: data
+# CHECK-NEXT: alignment: 4
+# CHECK-NEXT: section-choice: custom-required
+# CHECK-NEXT: section-name: .ctors
+# CHECK-NEXT: references:
+# CHECK-NEXT: - kind: layout-after
+# CHECK-NEXT: offset: 0
+# CHECK-NEXT: target: __CTOR_END__
+# CHECK-NEXT: - name: __CTOR_END__
+# CHECK-NEXT: type: data
+# CHECK-NEXT: content: [ 00, 00, 00, 00 ]
+# CHECK-NEXT: alignment: 4
+# CHECK-NEXT: section-choice: custom-required
+# CHECK-NEXT: section-name: .ctors
+
+# RAW: Contents of section .ctors:
+# RAW-NEXT: 1000 ffffffff 11111111 22222222 00000000
+
+# crtbeginS.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .ctors
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Content: 'FFFFFFFF'
+
+Symbols:
+ Local:
+ - Name: .ctors
+ Type: STT_SECTION
+ Section: .ctors
+ - Name: __CTOR_LIST__
+ Type: STT_OBJECT
+ Section: .ctors
+
+# crtendS.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x0F
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: .ctors
+ Type: R_MIPS_GOT16
+ - Offset: 0x04
+ Symbol: .ctors
+ Type: R_MIPS_LO16
+ - Offset: 0x08
+ Symbol: .ctors
+ Type: R_MIPS_GOT16
+ - Offset: 0x0C
+ Symbol: .ctors
+ Type: R_MIPS_LO16
+ - Name: .ctors
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .ctors
+ Type: STT_SECTION
+ Section: .ctors
+ - Name: __CTOR_END__
+ Type: STT_OBJECT
+ Section: .ctors
+ - Name: __do_global_ctors_aux
+ Type: STT_FUNC
+ Section: .text
+
+# obj.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .ctors.2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Content: '22222222'
+ - Name: .ctors.1
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Content: '11111111'
+
+Symbols:
+ Local:
+ - Name: .ctors.2
+ Type: STT_SECTION
+ Section: .ctors.2
+ - Name: .ctors.1
+ Type: STT_SECTION
+ Section: .ctors.1
+...
diff --git a/test/old-elf/Mips/driver-hash-style.test b/test/old-elf/Mips/driver-hash-style.test
new file mode 100644
index 000000000000..0ab636c427c9
--- /dev/null
+++ b/test/old-elf/Mips/driver-hash-style.test
@@ -0,0 +1,15 @@
+# REQUIRES: mips
+
+# Check that the driver rejects all --hash-style arguments except 'sysv'
+# because it is the only style supported by MIPS ABI.
+
+# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
+# RUN: not lld -flavor old-gnu -target mips --hash-style=both %t.o -o %t.exe 2>&1 \
+# RUN: | FileCheck %s
+# RUN: not lld -flavor old-gnu -target mips --hash-style=gnu %t.o -o %t.exe 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: error: .gnu.hash is incompatible with the MIPS ABI
+
+ .globl __start;
+__start:
diff --git a/test/old-elf/Mips/dt-textrel-64.test b/test/old-elf/Mips/dt-textrel-64.test
new file mode 100644
index 000000000000..152e82372799
--- /dev/null
+++ b/test/old-elf/Mips/dt-textrel-64.test
@@ -0,0 +1,74 @@
+# Check that if a dynamic relocation R_MIPS_64 modify a read-only section,
+# .dynamic section contains the DT_TEXTREL tag.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck %s
+
+# CHECK: 0x{{[0-9A-F]+}} TEXTREL
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x08
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Size: 0x8
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_64
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x8
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/dt-textrel.test b/test/old-elf/Mips/dt-textrel.test
new file mode 100644
index 000000000000..af86f4926273
--- /dev/null
+++ b/test/old-elf/Mips/dt-textrel.test
@@ -0,0 +1,74 @@
+# Check that if a dynamic relocation modify a read-only section,
+# .dynamic section contains the DT_TEXTREL tag.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck %s
+
+# CHECK: 0x{{[0-9A-F]+}} TEXTREL
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x04
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x04
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '00000000'
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_32
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/dynamic-linking.test b/test/old-elf/Mips/dynamic-linking.test
new file mode 100644
index 000000000000..aeab7645ed51
--- /dev/null
+++ b/test/old-elf/Mips/dynamic-linking.test
@@ -0,0 +1,22 @@
+# REQUIRES: mips
+
+# Check _DYNAMIC_LINKING symbol definition.
+
+# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
+# RUN: lld -flavor old-gnu -target mips %t.o -o %t.exe
+# RUN: llvm-nm %t.exe | FileCheck -check-prefix=EXE-DYN %s
+
+# EXE-DYN: 00000001 A _DYNAMIC_LINKING
+
+# RUN: lld -flavor old-gnu -target mips -static %t.o -o %t.exe
+# RUN: llvm-nm -just-symbol-name %t.exe | FileCheck -check-prefix=EXE-STATIC %s
+
+# EXE-STATIC-NOT: _DYNAMIC_LINKING
+
+# RUN: lld -flavor old-gnu -target mips -shared %t.o -o %t.so
+# RUN: llvm-nm -just-symbol-name %t.so | FileCheck -check-prefix=DYNLIB %s
+
+# DYNLIB-NOT: _DYNAMIC_LINKING
+
+ .globl __start;
+__start:
diff --git a/test/old-elf/Mips/dynamic-sym.test b/test/old-elf/Mips/dynamic-sym.test
new file mode 100644
index 000000000000..43a69d82c3a3
--- /dev/null
+++ b/test/old-elf/Mips/dynamic-sym.test
@@ -0,0 +1,41 @@
+# Check _DYNAMIC symbol's value
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -e T0 -o %t.so %t.o
+# RUN: llvm-objdump -h -t %t.so | FileCheck -check-prefix=SHARED %s
+
+# SHARED: Sections:
+# SHARED: Idx Name Size Address Type
+# SHARED: 5 .dynamic 00000068 00000000[[ADDR:[0-9a-f]+]]
+
+# SHARED: SYMBOL TABLE:
+# SHARED: [[ADDR]] g .dynamic 00000000 _DYNAMIC
+
+# RUN: lld -flavor old-gnu -target mipsel -e main -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -h -t %t.exe | FileCheck -check-prefix=EXE %s
+
+# EXE: Sections:
+# EXE: Idx Name Size Address Type
+# EXE: 6 .dynamic 00000078 00000000[[ADDR:[0-9a-f]+]]
+
+# EXE: SYMBOL TABLE:
+# EXE: [[ADDR]] g .dynamic 00000000 _DYNAMIC
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+ AddressAlign: 0x10
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
diff --git a/test/old-elf/Mips/dynlib-dynamic.test b/test/old-elf/Mips/dynlib-dynamic.test
new file mode 100644
index 000000000000..fca036a52624
--- /dev/null
+++ b/test/old-elf/Mips/dynlib-dynamic.test
@@ -0,0 +1,110 @@
+# Check MIPS specific tags in the dynamic table.
+
+# Build shared library
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t.so %t.o
+# RUN: llvm-readobj -dynamic-table %t.so | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK: Arch: mipsel
+# CHECK: AddressSize: 32bit
+# CHECK: LoadName:
+# CHECK: DynamicSection [ (13 entries)
+# CHECK: Tag Type Name/Value
+# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x0000000A STRSZ 17 (bytes)
+# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes)
+# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1
+# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT
+# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x0
+# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 4
+# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 4
+# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x2
+# CHECK-NEXT: 0x00000003 PLTGOT 0x1000
+# CHECK-NEXT: 0x00000000 NULL 0x0
+# CHECK-NEXT: ]
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x18
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: '$.str1'
+ Type: R_MIPS_GOT16
+ - Offset: 0x04
+ Symbol: '$.str1'
+ Type: R_MIPS_LO16
+ - Offset: 0x08
+ Symbol: '$.str2'
+ Type: R_MIPS_GOT16
+ - Offset: 0x0C
+ Symbol: '$.str2'
+ Type: R_MIPS_LO16
+ - Offset: 0x10
+ Symbol: glob2
+ Type: R_MIPS_CALL16
+ - Offset: 0x14
+ Symbol: ext1
+ Type: R_MIPS_CALL16
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+ - Name: .rodata.str1
+ Type: SHT_PROGBITS
+ AddressAlign: 0x01
+ Size: 0x05
+ - Name: .rodata.str2
+ Type: SHT_PROGBITS
+ AddressAlign: 0x01
+ Size: 0x05
+
+Symbols:
+ Local:
+ - Name: '$.str1'
+ Section: .rodata.str1
+ - Name: '$.str2'
+ Section: .rodata.str2
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .rodata.str1
+ Type: STT_SECTION
+ Section: .rodata.str1
+ - Name: .rodata.str2
+ Type: STT_SECTION
+ Section: .rodata.str2
+ Global:
+ - Name: glob
+ Section: .text
+ - Name: ext1
+ - Name: glob2
diff --git a/test/old-elf/Mips/dynlib-dynsym-micro.test b/test/old-elf/Mips/dynlib-dynsym-micro.test
new file mode 100644
index 000000000000..6757847fac73
--- /dev/null
+++ b/test/old-elf/Mips/dynlib-dynsym-micro.test
@@ -0,0 +1,208 @@
+# 1. Check sorting of .dynsym content accordingly to .got section
+# in case of using microMIPS relocations.
+# 2. Check that microMIPS records in a dynamic symbol table have:
+# - cleared the STO_MIPS_MICROMIPS flag
+# - adjusted adress
+
+# Build shared library
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t-so %t.o
+# RUN: llvm-readobj -dyn-symbols %t-so | FileCheck -check-prefix=CHECK-DYN %s
+
+# Build shared library (yaml format)
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \
+# RUN: --output-filetype=yaml -o %t-yaml %t.o
+# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t-yaml
+
+# CHECK-DYN: Format: ELF32-mips
+# CHECK-DYN: Arch: mipsel
+# CHECK-DYN: AddressSize: 32bit
+# CHECK-DYN: LoadName:
+# CHECK-DYN: DynamicSymbols [
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: @ (0)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Local (0x0)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: bar@ (5)
+# CHECK-DYN: Value: 0x139
+# CHECK-DYN: Size: 4
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: Function (0x2)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: .text (0x4)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: foo@ (1)
+# CHECK-DYN: Value: 0x121
+# CHECK-DYN: Size: 24
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: Function (0x2)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: .text (0x4)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: ext1@ (9)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: ext2@ (14)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: ]
+
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 80 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - ref-name: L000
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: L007
+# CHECK-GOT: - ref-name: L002
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: L008
+# CHECK-GOT: - ref-name: L004
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: foo
+# CHECK-GOT: - ref-name: L005
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: ext1
+# CHECK-GOT: - ref-name: L006
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: ext2
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x1C
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: .rodata.str1
+ Type: R_MICROMIPS_GOT16
+ - Offset: 0x04
+ Symbol: .rodata.str1
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x08
+ Symbol: .rodata.str2
+ Type: R_MICROMIPS_GOT16
+ - Offset: 0x0C
+ Symbol: .rodata.str2
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x10
+ Symbol: foo
+ Type: R_MICROMIPS_CALL16
+ - Offset: 0x14
+ Symbol: ext1
+ Type: R_MICROMIPS_CALL16
+ - Offset: 0x18
+ Symbol: ext2
+ Type: R_MICROMIPS_CALL16
+ - Name: .rodata.str1
+ Type: SHT_PROGBITS
+ AddressAlign: 0x01
+ Size: 0x05
+ - Name: .rodata.str2
+ Type: SHT_PROGBITS
+ AddressAlign: 0x01
+ Size: 0x05
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .rodata.str1
+ Type: STT_SECTION
+ Section: .rodata.str1
+ - Name: .rodata.str2
+ Type: STT_SECTION
+ Section: .rodata.str2
+ Global:
+ - Name: bar
+ Section: .text
+ Value: 0x18
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: foo
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: ext1
+ - Name: ext2
+...
diff --git a/test/old-elf/Mips/dynlib-dynsym.test b/test/old-elf/Mips/dynlib-dynsym.test
new file mode 100644
index 000000000000..23b0cd6a90c2
--- /dev/null
+++ b/test/old-elf/Mips/dynlib-dynsym.test
@@ -0,0 +1,202 @@
+# Check sorting of .dynsym content accordingly to .got section.
+
+# Build shared library
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t-so %t.o
+# RUN: llvm-readobj -dyn-symbols %t-so | FileCheck -check-prefix=CHECK-DYN %s
+
+# Build shared library (yaml format)
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \
+# RUN: --output-filetype=yaml -o %t-yaml %t.o
+# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t-yaml
+
+# CHECK-DYN: Format: ELF32-mips
+# CHECK-DYN: Arch: mipsel
+# CHECK-DYN: AddressSize: 32bit
+# CHECK-DYN: LoadName:
+# CHECK-DYN: DynamicSymbols [
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: @ (0)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Local (0x0)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: bar@ (5)
+# CHECK-DYN: Value: 0x138
+# CHECK-DYN: Size: 4
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: Function (0x2)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: .text (0x4)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: foo@ (1)
+# CHECK-DYN: Value: 0x120
+# CHECK-DYN: Size: 24
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: Function (0x2)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: .text (0x4)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: ext1@ (9)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: ext2@ (14)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Global (0x1)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: ]
+
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 80 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - ref-name: L000
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: L007
+# CHECK-GOT: - ref-name: L002
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_32_HI16
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: L008
+# CHECK-GOT: - ref-name: L004
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: foo
+# CHECK-GOT: - ref-name: L005
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: ext1
+# CHECK-GOT: - ref-name: L006
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: ext2
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x1C
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: .rodata.str1
+ Type: R_MIPS_GOT16
+ - Offset: 0x04
+ Symbol: .rodata.str1
+ Type: R_MIPS_LO16
+ - Offset: 0x08
+ Symbol: .rodata.str2
+ Type: R_MIPS_GOT16
+ - Offset: 0x0C
+ Symbol: .rodata.str2
+ Type: R_MIPS_LO16
+ - Offset: 0x10
+ Symbol: foo
+ Type: R_MIPS_CALL16
+ - Offset: 0x14
+ Symbol: ext1
+ Type: R_MIPS_CALL16
+ - Offset: 0x18
+ Symbol: ext2
+ Type: R_MIPS_CALL16
+ - Name: .rodata.str1
+ Type: SHT_PROGBITS
+ AddressAlign: 0x01
+ Size: 0x05
+ - Name: .rodata.str2
+ Type: SHT_PROGBITS
+ AddressAlign: 0x01
+ Size: 0x05
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .rodata.str1
+ Type: STT_SECTION
+ Section: .rodata.str1
+ - Name: .rodata.str2
+ Type: STT_SECTION
+ Section: .rodata.str2
+ Global:
+ - Name: bar
+ Section: .text
+ Value: 0x18
+ - Name: foo
+ Section: .text
+ - Name: ext1
+ - Name: ext2
+...
diff --git a/test/old-elf/Mips/dynlib-fileheader-64.test b/test/old-elf/Mips/dynlib-fileheader-64.test
new file mode 100644
index 000000000000..f3b45d4d738e
--- /dev/null
+++ b/test/old-elf/Mips/dynlib-fileheader-64.test
@@ -0,0 +1,72 @@
+# Check ELF Header for 64-bit shared library.
+
+# Build shared library
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Format: ELF64-mips
+# CHECK: Arch: mips64el
+# CHECK: AddressSize: 64bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 64-bit (0x2)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 0
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: SharedObject (0x3)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x80000006)
+# CHECK: EF_MIPS_ARCH_64R2 (0x80000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_PIC (0x2)
+# CHECK: ]
+# CHECK: HeaderSize: 64
+# CHECK: ProgramHeaderEntrySize: 56
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 64
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK: }
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ Global:
+ - Name: data
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/dynlib-fileheader-micro-64.test b/test/old-elf/Mips/dynlib-fileheader-micro-64.test
new file mode 100644
index 000000000000..531cee134caf
--- /dev/null
+++ b/test/old-elf/Mips/dynlib-fileheader-micro-64.test
@@ -0,0 +1,75 @@
+# Check ELF Header for shared library in case of microMIPS symbols.
+
+# Build shared library
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Format: ELF64-mips
+# CHECK-NEXT: Arch: mips64el
+# CHECK-NEXT: AddressSize: 64bit
+# CHECK-NEXT: LoadName:
+# CHECK-NEXT: ElfHeader {
+# CHECK-NEXT: Ident {
+# CHECK-NEXT: Magic: (7F 45 4C 46)
+# CHECK-NEXT: Class: 64-bit (0x2)
+# CHECK-NEXT: DataEncoding: LittleEndian (0x1)
+# CHECK-NEXT: FileVersion: 1
+# CHECK-NEXT: OS/ABI: SystemV (0x0)
+# CHECK-NEXT: ABIVersion: 0
+# CHECK-NEXT: Unused: (00 00 00 00 00 00 00)
+# CHECK-NEXT: }
+# CHECK-NEXT: Type: SharedObject (0x3)
+# CHECK-NEXT: Machine: EM_MIPS (0x8)
+# CHECK-NEXT: Version: 1
+# CHECK-NEXT: Entry: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: Flags [ (0x82000007)
+# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000)
+# CHECK-NEXT: EF_MIPS_CPIC (0x4)
+# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK-NEXT: EF_MIPS_NOREORDER (0x1)
+# CHECK-NEXT: EF_MIPS_PIC (0x2)
+# CHECK-NEXT: ]
+# CHECK-NEXT: HeaderSize: 64
+# CHECK-NEXT: ProgramHeaderEntrySize: 56
+# CHECK-NEXT: ProgramHeaderCount: {{[0-9]+}}
+# CHECK-NEXT: SectionHeaderEntrySize: 64
+# CHECK-NEXT: SectionHeaderCount: {{[0-9]+}}
+# CHECK-NEXT: StringTableSectionIndex: {{[0-9]+}}
+# CHECK-NEXT:}
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_MICROMIPS, EF_MIPS_ARCH_64R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ Other: [ STO_MIPS_MICROMIPS ]
diff --git a/test/old-elf/Mips/dynlib-fileheader-micro.test b/test/old-elf/Mips/dynlib-fileheader-micro.test
new file mode 100644
index 000000000000..dcd38f1036d0
--- /dev/null
+++ b/test/old-elf/Mips/dynlib-fileheader-micro.test
@@ -0,0 +1,79 @@
+# Check ELF Header for shared library in case of microMIPS symbols.
+
+# Build shared library
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK-NEXT: Arch: mipsel
+# CHECK-NEXT: AddressSize: 32bit
+# CHECK-NEXT: LoadName:
+# CHECK-NEXT: ElfHeader {
+# CHECK-NEXT: Ident {
+# CHECK-NEXT: Magic: (7F 45 4C 46)
+# CHECK-NEXT: Class: 32-bit (0x1)
+# CHECK-NEXT: DataEncoding: LittleEndian (0x1)
+# CHECK-NEXT: FileVersion: 1
+# CHECK-NEXT: OS/ABI: SystemV (0x0)
+# CHECK-NEXT: ABIVersion: 0
+# CHECK-NEXT: Unused: (00 00 00 00 00 00 00)
+# CHECK-NEXT: }
+# CHECK-NEXT: Type: SharedObject (0x3)
+# CHECK-NEXT: Machine: EM_MIPS (0x8)
+# CHECK-NEXT: Version: 1
+# CHECK-NEXT: Entry: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: Flags [ (0x72001007)
+# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# CHECK-NEXT: EF_MIPS_ARCH_32R2 (0x70000000)
+# CHECK-NEXT: EF_MIPS_CPIC (0x4)
+# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK-NEXT: EF_MIPS_NOREORDER (0x1)
+# CHECK-NEXT: EF_MIPS_PIC (0x2)
+# CHECK-NEXT: ]
+# CHECK-NEXT: HeaderSize: 52
+# CHECK-NEXT: ProgramHeaderEntrySize: 32
+# CHECK-NEXT: ProgramHeaderCount: {{[0-9]+}}
+# CHECK-NEXT: SectionHeaderEntrySize: 40
+# CHECK-NEXT: SectionHeaderCount: {{[0-9]+}}
+# CHECK-NEXT: StringTableSectionIndex: {{[0-9]+}}
+# CHECK-NEXT:}
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+ - Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x08
+ ISA: MIPS32
+ ISARevision: 2
+ ASEs: [ MICROMIPS ]
+
+Symbols:
+ Global:
+ - Name: glob
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
diff --git a/test/old-elf/Mips/dynlib-fileheader.test b/test/old-elf/Mips/dynlib-fileheader.test
new file mode 100644
index 000000000000..a3b4a19a90f1
--- /dev/null
+++ b/test/old-elf/Mips/dynlib-fileheader.test
@@ -0,0 +1,76 @@
+# Check ELF Header for shared library.
+
+# Build shared library
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK: Arch: mipsel
+# CHECK: AddressSize: 32bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 32-bit (0x1)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 0
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: SharedObject (0x3)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x70001007)
+# CHECK: EF_MIPS_ABI_O32 (0x1000)
+# CHECK: EF_MIPS_ARCH_32R2 (0x70000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: EF_MIPS_PIC (0x2)
+# CHECK: ]
+# CHECK: HeaderSize: 52
+# CHECK: ProgramHeaderEntrySize: 32
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 40
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK:}
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x00
+ - Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x08
+ ISA: MIPS32
+ ISARevision: 2
+
+Symbols:
+ Global:
+ - Name: glob
+ Section: .text
diff --git a/test/old-elf/Mips/dynsym-table-1.test b/test/old-elf/Mips/dynsym-table-1.test
new file mode 100644
index 000000000000..8821ae358254
--- /dev/null
+++ b/test/old-elf/Mips/dynsym-table-1.test
@@ -0,0 +1,127 @@
+# Check that LLD does not populate an executable file dynamic symbol table
+# by unnecessary symbols.
+# 1. bar.so defines T2
+# 2. foo.so defines T1 and references T2
+# 3. main.o reference T1
+# 4. a.out dynamic table should contain T1 entry only
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-bar.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-foo.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-bar.so %t-bar.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-foo.so %t-foo.o %t-bar.so
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe --as-needed \
+# RUN: %t-main.o %t-foo.so %t-bar.so
+# RUN: llvm-readobj -dt -dynamic-table %t.exe | FileCheck %s
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T1@ ({{.*}})
+# CHECK-NEXT: Value: {{.*}}
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 8
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: 0x00000003 PLTGOT 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (dynsym-table-1.test.tmp-foo.so)
+# CHECK-NEXT: 0x00000000 NULL 0x0
+
+# bar.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+Symbols:
+ Global:
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+
+# foo.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x08
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T2
+ Type: R_MIPS_CALL16
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: T2
+
+# main.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x08
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_32
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/dynsym-table-2.test b/test/old-elf/Mips/dynsym-table-2.test
new file mode 100644
index 000000000000..ad85bfe84e43
--- /dev/null
+++ b/test/old-elf/Mips/dynsym-table-2.test
@@ -0,0 +1,105 @@
+# Check that LLD does not populate a shared library dynamic symbol table
+# by unnecessary symbols.
+# 1. bar.so defines T2 and T3
+# 2. foo.so defines T1 and references T2
+# 4. foo.so dynamic table should contain T1 and T2 entries only
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-bar.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-foo.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-bar.so %t-bar.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-foo.so %t-foo.o %t-bar.so
+# RUN: llvm-readobj -dt -dynamic-table %t-foo.so | FileCheck %s
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T1@ ({{.*}})
+# CHECK-NEXT: Value: {{.*}}
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text (0x4)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T2@ ({{.*}})
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: 0x00000003 PLTGOT 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (dynsym-table-2.test.tmp-bar.so)
+# CHECK-NEXT: 0x00000000 NULL 0x0
+
+# bar.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+Symbols:
+ Global:
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ - Name: T3
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x04
+ Size: 0x04
+
+# foo.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x08
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T2
+ Type: R_MIPS_CALL16
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/e-flags-merge-1-64.test b/test/old-elf/Mips/e-flags-merge-1-64.test
new file mode 100644
index 000000000000..3e52afd223cd
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-1-64.test
@@ -0,0 +1,30 @@
+# Check that the linker shows an error when object
+# file has unsupported ASE flags.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-mips16.o
+# RUN: not lld -flavor old-gnu -target mips64el -e T -o %t.exe %t-mips16.o 2>&1 | \
+# RUN: FileCheck -check-prefix=MIPS16 %s
+
+# MIPS16: Unsupported extension: MIPS16
+
+# mips16.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64, EF_MIPS_ARCH_ASE_M16]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: T
+ Section: .text
+...
diff --git a/test/old-elf/Mips/e-flags-merge-1.test b/test/old-elf/Mips/e-flags-merge-1.test
new file mode 100644
index 000000000000..bc100534112d
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-1.test
@@ -0,0 +1,56 @@
+# Check that the linker shows an error when object file has missed
+# or unsupported ABI and ARCH flags or unsupported ASE flags.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-no-abi.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T -o %t.exe %t-no-abi.o 2>&1 | \
+# RUN: FileCheck -check-prefix=INVALID-ABI %s
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-mips16.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T -o %t.exe %t-mips16.o 2>&1 | \
+# RUN: FileCheck -check-prefix=MIPS16 %s
+
+# INVALID-ABI: Unsupported ABI
+# MIPS16: Unsupported extension: MIPS16
+
+# no-abi.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: []
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T
+ Section: .text
+
+# mips16.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_ARCH_ASE_M16]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T
+ Section: .text
+...
diff --git a/test/old-elf/Mips/e-flags-merge-10.test b/test/old-elf/Mips/e-flags-merge-10.test
new file mode 100644
index 000000000000..5dacaa0e069d
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-10.test
@@ -0,0 +1,43 @@
+# Check that LLD shows an error and does not link files with mips32r2
+# and mips32r6 instructions sets.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32r2.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-32r6.o
+
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-32r2.o %t-32r6.o 2>&1 | FileCheck %s
+
+# CHECK: Linking modules with incompatible ISA
+
+# 32r2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# 32r6.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-11.test b/test/old-elf/Mips/e-flags-merge-11.test
new file mode 100644
index 000000000000..e61eb0d6d65a
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-11.test
@@ -0,0 +1,43 @@
+# Check that LLD shows an error and does not link files with mips64r2
+# and mips64r6 instructions sets.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-64r2.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64r6.o
+
+# RUN: not lld -flavor old-gnu -target mips64el -shared -o %t.so \
+# RUN: %t-64r2.o %t-64r6.o 2>&1 | FileCheck %s
+
+# CHECK: Linking modules with incompatible ISA
+
+# 64r2.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# 64r6.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64R6]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-12.test b/test/old-elf/Mips/e-flags-merge-12.test
new file mode 100644
index 000000000000..0a0c43fc996a
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-12.test
@@ -0,0 +1,44 @@
+# Check that LLD shows an error and does not link files with O32 and N32 ABIs.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o32.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-n32.o
+
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-o32.o %t-n32.o 2>&1 | FileCheck %s
+
+# CHECK: Linking modules with incompatible ABI
+
+# o32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_32BITMODE, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# n32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI2,
+ EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-2-64.test b/test/old-elf/Mips/e-flags-merge-2-64.test
new file mode 100644
index 000000000000..4e024d2a465b
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-2-64.test
@@ -0,0 +1,33 @@
+# Check that the linker copies ELF header flags from the single input object
+# file to the generated executable
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -e T -o %t.exe %t.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Flags [ (0x62000001)
+# CHECK-NEXT: EF_MIPS_ARCH_64 (0x60000000)
+# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK-NEXT: EF_MIPS_NOREORDER (0x1)
+# CHECK-NEXT: ]
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ARCH_64, EF_MIPS_NOREORDER, EF_MIPS_MICROMIPS ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: T
+ Section: .text
+...
diff --git a/test/old-elf/Mips/e-flags-merge-2.test b/test/old-elf/Mips/e-flags-merge-2.test
new file mode 100644
index 000000000000..3ca531728728
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-2.test
@@ -0,0 +1,35 @@
+# Check that the linker copies ELF header flags from the single input object
+# file to the generated executable
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T -o %t.exe %t.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Flags [ (0x52001001)
+# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# CHECK-NEXT: EF_MIPS_ARCH_32 (0x50000000)
+# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK-NEXT: EF_MIPS_NOREORDER (0x1)
+# CHECK-NEXT: ]
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32,
+ EF_MIPS_NOREORDER, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T
+ Section: .text
+...
diff --git a/test/old-elf/Mips/e-flags-merge-3-64.test b/test/old-elf/Mips/e-flags-merge-3-64.test
new file mode 100644
index 000000000000..45326813e12f
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-3-64.test
@@ -0,0 +1,130 @@
+# Check PIC/CPIC flags merging in case of multiple input objects.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-cpic.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-both.o
+
+# RUN: lld -flavor old-gnu -target mips64el -e T1 -o %t-abi1.exe \
+# RUN: %t-none.o %t-pic.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s
+# RUN: llvm-readobj -file-headers %t-abi1.exe \
+# RUN: | FileCheck -check-prefix=ABI-CALLS1 %s
+
+# RUN: lld -flavor old-gnu -target mips64el -e T1 -o %t-abi2.exe \
+# RUN: %t-cpic.o %t-none.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s
+# RUN: llvm-readobj -file-headers %t-abi2.exe \
+# RUN: | FileCheck -check-prefix=ABI-CALLS2 %s
+
+# RUN: lld -flavor old-gnu -target mips64el -e T2 -o %t-cpic.exe %t-cpic.o %t-pic.o
+# RUN: llvm-readobj -file-headers %t-cpic.exe | FileCheck -check-prefix=CPIC %s
+
+# RUN: lld -flavor old-gnu -target mips64el -e T3 -o %t-both.exe %t-pic.o %t-both.o
+# RUN: llvm-readobj -file-headers %t-both.exe | FileCheck -check-prefix=BOTH %s
+
+# ABI-CALLS-WARN: lld warning: linking abicalls and non-abicalls files
+
+# ABI-CALLS1: Flags [ (0x60000004)
+# ABI-CALLS1-NEXT: EF_MIPS_ARCH_64 (0x60000000)
+# ABI-CALLS1-NEXT: EF_MIPS_CPIC (0x4)
+# ABI-CALLS1-NEXT: ]
+
+# ABI-CALLS2: Flags [ (0x60000004)
+# ABI-CALLS2-NEXT: EF_MIPS_ARCH_64 (0x60000000)
+# ABI-CALLS2-NEXT: EF_MIPS_CPIC (0x4)
+# ABI-CALLS2-NEXT: ]
+
+# CPIC: Flags [ (0x60000004)
+# CPIC-NEXT: EF_MIPS_ARCH_64 (0x60000000)
+# CPIC-NEXT: EF_MIPS_CPIC (0x4)
+# CPIC-NEXT: ]
+
+# BOTH: Flags [ (0x60000006)
+# BOTH-NEXT: EF_MIPS_ARCH_64 (0x60000000)
+# BOTH-NEXT: EF_MIPS_CPIC (0x4)
+# BOTH-NEXT: EF_MIPS_PIC (0x2)
+# BOTH-NEXT: ]
+
+# none.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+
+# cpic.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64, EF_MIPS_CPIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64, EF_MIPS_PIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: T3
+ Section: .text
+
+# both.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64, EF_MIPS_CPIC, EF_MIPS_PIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: T4
+ Section: .text
+...
diff --git a/test/old-elf/Mips/e-flags-merge-3.test b/test/old-elf/Mips/e-flags-merge-3.test
new file mode 100644
index 000000000000..612f0b458631
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-3.test
@@ -0,0 +1,134 @@
+# Check PIC/CPIC flags merging in case of multiple input objects.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-cpic.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-both.o
+
+# RUN: lld -flavor old-gnu -target mipsel -e T1 -o %t-abi1.exe \
+# RUN: %t-none.o %t-pic.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s
+# RUN: llvm-readobj -file-headers %t-abi1.exe \
+# RUN: | FileCheck -check-prefix=ABI-CALLS1 %s
+
+# RUN: lld -flavor old-gnu -target mipsel -e T1 -o %t-abi2.exe \
+# RUN: %t-cpic.o %t-none.o 2>&1 | FileCheck -check-prefix=ABI-CALLS-WARN %s
+# RUN: llvm-readobj -file-headers %t-abi2.exe \
+# RUN: | FileCheck -check-prefix=ABI-CALLS2 %s
+
+# RUN: lld -flavor old-gnu -target mipsel -e T2 -o %t-cpic.exe %t-cpic.o %t-pic.o
+# RUN: llvm-readobj -file-headers %t-cpic.exe | FileCheck -check-prefix=CPIC %s
+
+# RUN: lld -flavor old-gnu -target mipsel -e T3 -o %t-both.exe %t-pic.o %t-both.o
+# RUN: llvm-readobj -file-headers %t-both.exe | FileCheck -check-prefix=BOTH %s
+
+# ABI-CALLS-WARN: lld warning: linking abicalls and non-abicalls files
+
+# ABI-CALLS1: Flags [ (0x50001004)
+# ABI-CALLS1-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# ABI-CALLS1-NEXT: EF_MIPS_ARCH_32 (0x50000000)
+# ABI-CALLS1-NEXT: EF_MIPS_CPIC (0x4)
+# ABI-CALLS1-NEXT: ]
+
+# ABI-CALLS2: Flags [ (0x50001004)
+# ABI-CALLS2-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# ABI-CALLS2-NEXT: EF_MIPS_ARCH_32 (0x50000000)
+# ABI-CALLS2-NEXT: EF_MIPS_CPIC (0x4)
+# ABI-CALLS2-NEXT: ]
+
+# CPIC: Flags [ (0x50001004)
+# CPIC-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# CPIC-NEXT: EF_MIPS_ARCH_32 (0x50000000)
+# CPIC-NEXT: EF_MIPS_CPIC (0x4)
+# CPIC-NEXT: ]
+
+# BOTH: Flags [ (0x50001006)
+# BOTH-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# BOTH-NEXT: EF_MIPS_ARCH_32 (0x50000000)
+# BOTH-NEXT: EF_MIPS_CPIC (0x4)
+# BOTH-NEXT: EF_MIPS_PIC (0x2)
+# BOTH-NEXT: ]
+
+# none.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+
+# cpic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_PIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T3
+ Section: .text
+
+# both.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T4
+ Section: .text
+...
diff --git a/test/old-elf/Mips/e-flags-merge-4-64.test b/test/old-elf/Mips/e-flags-merge-4-64.test
new file mode 100644
index 000000000000..59a8bf131d95
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-4-64.test
@@ -0,0 +1,64 @@
+# Check ELF flags merging.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-noreorder.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o
+
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so \
+# RUN: %t-none.o %t-noreorder.o %t-micro.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Flags [ (0x82000001)
+# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000)
+# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK-NEXT: EF_MIPS_NOREORDER (0x1)
+# CHECK-NEXT: ]
+
+# none.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_5]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+# noreorder.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64, EF_MIPS_NOREORDER]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+# micro.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64R2, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+...
diff --git a/test/old-elf/Mips/e-flags-merge-4.test b/test/old-elf/Mips/e-flags-merge-4.test
new file mode 100644
index 000000000000..6a2de375e624
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-4.test
@@ -0,0 +1,65 @@
+# Check ELF flags merging.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-none.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-noreorder.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-none.o %t-noreorder.o %t-micro.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Flags [ (0x52001001)
+# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# CHECK-NEXT: EF_MIPS_ARCH_32 (0x50000000)
+# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK-NEXT: EF_MIPS_NOREORDER (0x1)
+# CHECK-NEXT: ]
+
+# none.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# noreorder.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_NOREORDER]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# micro.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-5-64.test b/test/old-elf/Mips/e-flags-merge-5-64.test
new file mode 100644
index 000000000000..f1fdac2c8c05
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-5-64.test
@@ -0,0 +1,42 @@
+# Check that LLD does not allow to mix 32 and 64-bit MIPS object files.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o
+
+# RUN: not lld -flavor old-gnu -target mips64el -shared -o %t.so \
+# RUN: %t-32.o %t-64.o 2>&1 | FileCheck %s
+
+# CHECK: ELF64 expected, but got ELF32
+
+# 32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# 64.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+...
diff --git a/test/old-elf/Mips/e-flags-merge-5.test b/test/old-elf/Mips/e-flags-merge-5.test
new file mode 100644
index 000000000000..56edc4bfa10f
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-5.test
@@ -0,0 +1,42 @@
+# Check that LLD does not allow to mix 32 and 64-bit MIPS object files.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o
+
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-32.o %t-64.o 2>&1 | FileCheck %s
+
+# CHECK: ELF32 expected, but got ELF64
+
+# 32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# 64.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-6-64.test b/test/old-elf/Mips/e-flags-merge-6-64.test
new file mode 100644
index 000000000000..9f83365441af
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-6-64.test
@@ -0,0 +1,79 @@
+# Check selecting ELF header ARCH flag.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-m3.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-m5.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-m64.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-m64r2.o
+
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so \
+# RUN: %t-m64.o %t-m5.o %t-m64r2.o %t-m3.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Flags [ (0x80000000)
+# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000)
+# CHECK-NEXT: ]
+
+# m3.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_3]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+# m5.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_5]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+# m64.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+# m64r2.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+...
diff --git a/test/old-elf/Mips/e-flags-merge-6.test b/test/old-elf/Mips/e-flags-merge-6.test
new file mode 100644
index 000000000000..0d8bcee5ad64
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-6.test
@@ -0,0 +1,80 @@
+# Check selecting ELF header ARCH flag.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-m1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-m2.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-m32.o
+# RUN: yaml2obj -format=elf -docnum 4 %s > %t-m32r2.o
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-m32.o %t-m2.o %t-m32r2.o %t-m1.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Flags [ (0x70001000)
+# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# CHECK-NEXT: EF_MIPS_ARCH_32R2 (0x70000000)
+# CHECK-NEXT: ]
+
+# m1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_1]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# m2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# m32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# m32r2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-7-64.test b/test/old-elf/Mips/e-flags-merge-7-64.test
new file mode 100644
index 000000000000..0e74ac53684a
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-7-64.test
@@ -0,0 +1,42 @@
+# Check that LLD does not allow to mix nan2008 and legacy MIPS object files.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-2008.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-legacy.o
+
+# RUN: not lld -flavor old-gnu -target mips64el -shared -o %t.so \
+# RUN: %t-2008.o %t-legacy.o 2>&1 | FileCheck %s
+
+# CHECK: Linking -mnan=2008 and -mnan=legacy modules
+
+# 2008.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64, EF_MIPS_NAN2008]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+# legacy.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+...
diff --git a/test/old-elf/Mips/e-flags-merge-7.test b/test/old-elf/Mips/e-flags-merge-7.test
new file mode 100644
index 000000000000..08051df506be
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-7.test
@@ -0,0 +1,42 @@
+# Check that LLD does not allow to mix nan2008 and legacy MIPS object files.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-2008.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-legacy.o
+
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-2008.o %t-legacy.o 2>&1 | FileCheck %s
+
+# CHECK: Linking -mnan=2008 and -mnan=legacy modules
+
+# 2008.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_NAN2008]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# legacy.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-8.test b/test/old-elf/Mips/e-flags-merge-8.test
new file mode 100644
index 000000000000..2a2fdfee3c46
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-8.test
@@ -0,0 +1,65 @@
+# Check that LLD links files with mips32 and mips64 instructions
+# if all these files satisfy O32 ABI.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-64r2.o
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-32.o %t-64.o %t-64r2.o
+# RUN: llvm-readobj -file-headers %t.so | FileCheck %s
+
+# CHECK: Flags [ (0x80001100)
+# CHECK-NEXT: EF_MIPS_32BITMODE (0x100)
+# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# CHECK-NEXT: EF_MIPS_ARCH_64R2 (0x80000000)
+# CHECK-NEXT: ]
+
+
+# 32.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# 64.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_64, EF_MIPS_32BITMODE]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# 64r2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_64R2, EF_MIPS_32BITMODE]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/e-flags-merge-9.test b/test/old-elf/Mips/e-flags-merge-9.test
new file mode 100644
index 000000000000..ada24d788c9a
--- /dev/null
+++ b/test/old-elf/Mips/e-flags-merge-9.test
@@ -0,0 +1,43 @@
+# Check that LLD shows an error and does not link files with mips32r2
+# and mips64 instructions sets.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-32r2.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-64.o
+
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so \
+# RUN: %t-32r2.o %t-64.o 2>&1 | FileCheck %s
+
+# CHECK: Linking modules with incompatible ISA
+
+# 32r2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+# 64.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_64, EF_MIPS_32BITMODE]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/entry-name.test b/test/old-elf/Mips/entry-name.test
new file mode 100644
index 000000000000..f6ce0c4f223b
--- /dev/null
+++ b/test/old-elf/Mips/entry-name.test
@@ -0,0 +1,26 @@
+# Check name of executable entry symbol.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -o %t.exe %t.o
+# RUN: llvm-nm %t.exe | FileCheck %s
+
+# CHECK: U __start
+# CHECK: {{[0-9A-F]+}} T main
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: main
+ Section: .text
diff --git a/test/old-elf/Mips/exe-dynamic.test b/test/old-elf/Mips/exe-dynamic.test
new file mode 100644
index 000000000000..93fdce9fdc7d
--- /dev/null
+++ b/test/old-elf/Mips/exe-dynamic.test
@@ -0,0 +1,110 @@
+# Check MIPS specific tags in the dynamic table in case executable linking.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK: Arch: mipsel
+# CHECK: AddressSize: 32bit
+# CHECK: LoadName:
+# CHECK: DynamicSection [ (20 entries)
+# CHECK: Tag Type Name/Value
+# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x0000000A STRSZ 28 (bytes)
+# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes)
+# CHECK-NEXT: 0x00000002 PLTRELSZ 8 (bytes)
+# CHECK-NEXT: 0x70000032 MIPS_PLTGOT 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000014 PLTREL REL
+# CHECK-NEXT: 0x00000017 JMPREL 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1
+# CHECK-NEXT: 0x70000016 MIPS_RLD_MAP 0x40200C
+# CHECK-NEXT: 0x70000035 MIPS_RLD_MAP_REL 0x1E0C
+# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT
+# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x400000
+# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2
+# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 2
+# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x2
+# CHECK-NEXT: 0x00000003 PLTGOT 0x{{[0-9A-F]+}}
+# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (exe-dynamic.test.tmp.so)
+# CHECK-NEXT: 0x00000000 NULL 0x0
+# CHECK-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: 0000000C000000000000000C000000000000000C00000000
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_26
+ Addend: 0
+ - Offset: 0x08
+ Symbol: .text
+ Type: R_MIPS_26
+ Addend: 0
+ - Offset: 0x10
+ Symbol: glob
+ Type: R_MIPS_26
+ Addend: 0
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ Value: 0x08
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/exe-dynsym-micro.test b/test/old-elf/Mips/exe-dynsym-micro.test
new file mode 100644
index 000000000000..477e174f3d6c
--- /dev/null
+++ b/test/old-elf/Mips/exe-dynsym-micro.test
@@ -0,0 +1,94 @@
+# Check that symbol referenced by an entry in the global part of GOT
+# has a corresponded entry in the .dynsym section. This test covers
+# the case when the GOT entry created because of the R_MICROMIPS_GOT16
+# relocation.
+
+# Build executable
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t.o
+# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=CHECK-DYN %s
+
+# Build executabl (yaml format)e
+# RUN: lld -flavor old-gnu -target mipsel -e glob \
+# RUN: --output-filetype=yaml -o %t.yaml %t.o
+# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t.yaml
+
+# CHECK-DYN: Format: ELF32-mips
+# CHECK-DYN: Arch: mipsel
+# CHECK-DYN: AddressSize: 32bit
+# CHECK-DYN: LoadName:
+# CHECK-DYN: DynamicSymbols [
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: @ (0)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Local (0x0)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: weakf@ (1)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Weak (0x2)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: ]
+
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 80 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - ref-name: L000
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: weakf
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: weakf
+ Type: R_MICROMIPS_GOT16
+
+Symbols:
+ Global:
+ - Name: glob
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+ Weak:
+ - Name: weakf
diff --git a/test/old-elf/Mips/exe-dynsym.test b/test/old-elf/Mips/exe-dynsym.test
new file mode 100644
index 000000000000..c50ce67d5f57
--- /dev/null
+++ b/test/old-elf/Mips/exe-dynsym.test
@@ -0,0 +1,91 @@
+# Check that symbol referenced by an entry in the global part of GOT
+# has a corresponded entry in the .dynsym section.
+
+# Build executable
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t.o
+# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=CHECK-DYN %s
+
+# Build executabl (yaml format)e
+# RUN: lld -flavor old-gnu -target mipsel -e glob \
+# RUN: --output-filetype=yaml -o %t.yaml %t.o
+# RUN: FileCheck -check-prefix=CHECK-GOT %s < %t.yaml
+
+# CHECK-DYN: Format: ELF32-mips
+# CHECK-DYN: Arch: mipsel
+# CHECK-DYN: AddressSize: 32bit
+# CHECK-DYN: LoadName:
+# CHECK-DYN: DynamicSymbols [
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: @ (0)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Local (0x0)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: Symbol {
+# CHECK-DYN: Name: weakf@ (1)
+# CHECK-DYN: Value: 0x0
+# CHECK-DYN: Size: 0
+# CHECK-DYN: Binding: Weak (0x2)
+# CHECK-DYN: Type: None (0x0)
+# CHECK-DYN: Other: 0
+# CHECK-DYN: Section: Undefined (0x0)
+# CHECK-DYN: }
+# CHECK-DYN: ]
+
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - type: got
+# CHECK-GOT: content: [ 00, 00, 00, 80 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: - ref-name: L000
+# CHECK-GOT: type: got
+# CHECK-GOT: content: [ 00, 00, 00, 00 ]
+# CHECK-GOT: alignment: 4
+# CHECK-GOT: section-choice: custom-required
+# CHECK-GOT: section-name: .got
+# CHECK-GOT: permissions: rw-
+# CHECK-GOT: references:
+# CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# CHECK-GOT: offset: 0
+# CHECK-GOT: target: weakf
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: weakf
+ Type: R_MIPS_GOT16
+
+Symbols:
+ Global:
+ - Name: glob
+ Section: .text
+ Weak:
+ - Name: weakf
diff --git a/test/old-elf/Mips/exe-fileheader-02.test b/test/old-elf/Mips/exe-fileheader-02.test
new file mode 100644
index 000000000000..b3cd88c139b6
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-02.test
@@ -0,0 +1,62 @@
+# Check that LLD set ABIVersion to '1' if it generates executable
+# file without EF_MIPS_PIC in the ELF header.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK: Arch: mipsel
+# CHECK: AddressSize: 32bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 32-bit (0x1)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 1
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: Executable (0x2)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x50001005)
+# CHECK: EF_MIPS_ABI_O32 (0x1000)
+# CHECK: EF_MIPS_ARCH_32 (0x50000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: ]
+# CHECK: HeaderSize: 52
+# CHECK: ProgramHeaderEntrySize: 32
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 40
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK: }
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+...
diff --git a/test/old-elf/Mips/exe-fileheader-03.test b/test/old-elf/Mips/exe-fileheader-03.test
new file mode 100644
index 000000000000..dfe4fcc43e67
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-03.test
@@ -0,0 +1,72 @@
+# Check that LLD set ABIVersion to '3' if it generates executable
+# file with FP_64 / FP_64A floating point abi flags.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK: Arch: mipsel
+# CHECK: AddressSize: 32bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 32-bit (0x1)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 3
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: Executable (0x2)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x50001005)
+# CHECK: EF_MIPS_ABI_O32 (0x1000)
+# CHECK: EF_MIPS_ARCH_32 (0x50000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: ]
+# CHECK: HeaderSize: 52
+# CHECK: ProgramHeaderEntrySize: 32
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 40
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK: }
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+ - Name: .MIPS.abiflags
+ Type: SHT_MIPS_ABIFLAGS
+ AddressAlign: 8
+ ISA: MIPS32
+ ISARevision: 1
+ ISAExtension: EXT_NONE
+ FpABI: FP_64
+ GPRSize: REG_32
+ CPR1Size: REG_64
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+...
diff --git a/test/old-elf/Mips/exe-fileheader-64.test b/test/old-elf/Mips/exe-fileheader-64.test
new file mode 100644
index 000000000000..20bb43a216d5
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-64.test
@@ -0,0 +1,66 @@
+# Check ELF Header for 64-bit executable file.
+
+# Build executable
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e glob -o %t.exe %t-o.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF64-mips
+# CHECK: Arch: mips64el
+# CHECK: AddressSize: 64bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 64-bit (0x2)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 0
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: Executable (0x2)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x60000007)
+# CHECK: EF_MIPS_ARCH_64 (0x60000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: EF_MIPS_PIC (0x2)
+# CHECK: ]
+# CHECK: HeaderSize: 64
+# CHECK: ProgramHeaderEntrySize: 56
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 64
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK: }
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_64 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+...
diff --git a/test/old-elf/Mips/exe-fileheader-be-64.test b/test/old-elf/Mips/exe-fileheader-be-64.test
new file mode 100644
index 000000000000..70457fe217c6
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-be-64.test
@@ -0,0 +1,60 @@
+# Check ELF Header for non-pic big-endian 64-bit executable file.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64 -o %t.exe %t.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF64-mips
+# CHECK: Arch: mips64
+# CHECK: AddressSize: 64bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 64-bit (0x2)
+# CHECK: DataEncoding: BigEndian (0x2)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 0
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: Executable (0x2)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x60000007)
+# CHECK: EF_MIPS_ARCH_64 (0x60000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: EF_MIPS_PIC (0x2)
+# CHECK: ]
+# CHECK: HeaderSize: 64
+# CHECK: ProgramHeaderEntrySize: 56
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 64
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK: }
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+...
diff --git a/test/old-elf/Mips/exe-fileheader-be.test b/test/old-elf/Mips/exe-fileheader-be.test
new file mode 100644
index 000000000000..292a92e59097
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-be.test
@@ -0,0 +1,60 @@
+# Check ELF Header for non-pic big-endian 32-bit executable file.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips -o %t.exe %t.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK: Arch: mips
+# CHECK: AddressSize: 32bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 32-bit (0x1)
+# CHECK: DataEncoding: BigEndian (0x2)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 1
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: Executable (0x2)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x50001005)
+# CHECK: EF_MIPS_ABI_O32 (0x1000)
+# CHECK: EF_MIPS_ARCH_32 (0x50000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: ]
+# CHECK: HeaderSize: 52
+# CHECK: ProgramHeaderEntrySize: 32
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 40
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK: }
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+...
diff --git a/test/old-elf/Mips/exe-fileheader-micro-64.test b/test/old-elf/Mips/exe-fileheader-micro-64.test
new file mode 100644
index 000000000000..a37d2d710637
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-micro-64.test
@@ -0,0 +1,68 @@
+# Check ELF Header for 64-bit executable file in case of microMIPS entry symbol.
+
+# Build executable
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e glob -o %t.exe %t-o.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF64-mips
+# CHECK: Arch: mips64el
+# CHECK: AddressSize: 64bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 64-bit (0x2)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 0
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: Executable (0x2)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x82000007)
+# CHECK: EF_MIPS_ARCH_64R2 (0x80000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: EF_MIPS_PIC (0x2)
+# CHECK: ]
+# CHECK: HeaderSize: 64
+# CHECK: ProgramHeaderEntrySize: 56
+# CHECK: ProgramHeaderCount: 6
+# CHECK: SectionHeaderEntrySize: 64
+# CHECK: SectionHeaderCount: 12
+# CHECK: StringTableSectionIndex: 9
+# CHECK: }
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_MICROMIPS, EF_MIPS_ARCH_64R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+...
diff --git a/test/old-elf/Mips/exe-fileheader-micro.test b/test/old-elf/Mips/exe-fileheader-micro.test
new file mode 100644
index 000000000000..0adaf5b17373
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-micro.test
@@ -0,0 +1,69 @@
+# Check ELF Header for non-pic executable file in case
+# of microMIPS entry symbol.
+
+# Build executable
+# RUN: yaml2obj -format=elf %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK-NEXT: Arch: mipsel
+# CHECK-NEXT: AddressSize: 32bit
+# CHECK-NEXT: LoadName:
+# CHECK-NEXT: ElfHeader {
+# CHECK-NEXT: Ident {
+# CHECK-NEXT: Magic: (7F 45 4C 46)
+# CHECK-NEXT: Class: 32-bit (0x1)
+# CHECK-NEXT: DataEncoding: LittleEndian (0x1)
+# CHECK-NEXT: FileVersion: 1
+# CHECK-NEXT: OS/ABI: SystemV (0x0)
+# CHECK-NEXT: ABIVersion: 1
+# CHECK-NEXT: Unused: (00 00 00 00 00 00 00)
+# CHECK-NEXT: }
+# CHECK-NEXT: Type: Executable (0x2)
+# CHECK-NEXT: Machine: EM_MIPS (0x8)
+# CHECK-NEXT: Version: 1
+# CHECK-NEXT: Entry: 0x{{[0-9A-F]+[13579bdf]}}
+# CHECK-NEXT: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: Flags [ (0x72001005)
+# CHECK-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# CHECK-NEXT: EF_MIPS_ARCH_32R2 (0x70000000)
+# CHECK-NEXT: EF_MIPS_CPIC (0x4)
+# CHECK-NEXT: EF_MIPS_MICROMIPS (0x2000000)
+# CHECK-NEXT: EF_MIPS_NOREORDER (0x1)
+# CHECK-NEXT: ]
+# CHECK-NEXT: HeaderSize: 52
+# CHECK-NEXT: ProgramHeaderEntrySize: 32
+# CHECK-NEXT: ProgramHeaderCount: 6
+# CHECK-NEXT: SectionHeaderEntrySize: 40
+# CHECK-NEXT: SectionHeaderCount: 12
+# CHECK-NEXT: StringTableSectionIndex: 9
+# CHECK-NEXT: }
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+...
diff --git a/test/old-elf/Mips/exe-fileheader-n32.test b/test/old-elf/Mips/exe-fileheader-n32.test
new file mode 100644
index 000000000000..f6a1725b4443
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader-n32.test
@@ -0,0 +1,65 @@
+# Check ELF Header for N32 ABI executable file.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK-NEXT: Arch: mipsel
+# CHECK-NEXT: AddressSize: 32bit
+# CHECK-NEXT: LoadName:
+# CHECK-NEXT: ElfHeader {
+# CHECK-NEXT: Ident {
+# CHECK-NEXT: Magic: (7F 45 4C 46)
+# CHECK-NEXT: Class: 32-bit
+# CHECK-NEXT: DataEncoding: LittleEndian
+# CHECK-NEXT: FileVersion: 1
+# CHECK-NEXT: OS/ABI: SystemV
+# CHECK-NEXT: ABIVersion: 0
+# CHECK-NEXT: Unused: (00 00 00 00 00 00 00)
+# CHECK-NEXT: }
+# CHECK-NEXT: Type: Executable
+# CHECK-NEXT: Machine: EM_MIPS
+# CHECK-NEXT: Version: 1
+# CHECK-NEXT: Entry: 0x10000130
+# CHECK-NEXT: ProgramHeaderOffset: 0x34
+# CHECK-NEXT: SectionHeaderOffset: 0x22C0
+# CHECK-NEXT: Flags [ (0x60000027)
+# CHECK-NEXT: EF_MIPS_ABI2
+# CHECK-NEXT: EF_MIPS_ARCH_64
+# CHECK-NEXT: EF_MIPS_CPIC
+# CHECK-NEXT: EF_MIPS_NOREORDER
+# CHECK-NEXT: EF_MIPS_PIC
+# CHECK-NEXT: ]
+# CHECK-NEXT: HeaderSize: 52
+# CHECK-NEXT: ProgramHeaderEntrySize: 32
+# CHECK-NEXT: ProgramHeaderCount: {{[0-9]+}}
+# CHECK-NEXT: SectionHeaderEntrySize: 40
+# CHECK-NEXT: SectionHeaderCount: {{[0-9]+}}
+# CHECK-NEXT: StringTableSectionIndex: {{[0-9]+}}
+# CHECK-NEXT: }
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI2, EF_MIPS_ARCH_64 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 8
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: __start
+ Section: .text
+...
diff --git a/test/old-elf/Mips/exe-fileheader.test b/test/old-elf/Mips/exe-fileheader.test
new file mode 100644
index 000000000000..0188a682b3fb
--- /dev/null
+++ b/test/old-elf/Mips/exe-fileheader.test
@@ -0,0 +1,105 @@
+# Check ELF Header for non-pic executable file.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: Format: ELF32-mips
+# CHECK: Arch: mipsel
+# CHECK: AddressSize: 32bit
+# CHECK: LoadName:
+# CHECK: ElfHeader {
+# CHECK: Ident {
+# CHECK: Magic: (7F 45 4C 46)
+# CHECK: Class: 32-bit (0x1)
+# CHECK: DataEncoding: LittleEndian (0x1)
+# CHECK: FileVersion: 1
+# CHECK: OS/ABI: SystemV (0x0)
+# CHECK: ABIVersion: 1
+# CHECK: Unused: (00 00 00 00 00 00 00)
+# CHECK: }
+# CHECK: Type: Executable (0x2)
+# CHECK: Machine: EM_MIPS (0x8)
+# CHECK: Version: 1
+# CHECK: Entry: 0x{{[0-9A-F]+}}
+# CHECK: ProgramHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: SectionHeaderOffset: 0x{{[0-9A-F]+}}
+# CHECK: Flags [ (0x50001005)
+# CHECK: EF_MIPS_ABI_O32 (0x1000)
+# CHECK: EF_MIPS_ARCH_32 (0x50000000)
+# CHECK: EF_MIPS_CPIC (0x4)
+# CHECK: EF_MIPS_NOREORDER (0x1)
+# CHECK: ]
+# CHECK: HeaderSize: 52
+# CHECK: ProgramHeaderEntrySize: 32
+# CHECK: ProgramHeaderCount: {{[0-9]+}}
+# CHECK: SectionHeaderEntrySize: 40
+# CHECK: SectionHeaderCount: {{[0-9]+}}
+# CHECK: StringTableSectionIndex: {{[0-9]+}}
+# CHECK: }
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/exe-got-micro.test b/test/old-elf/Mips/exe-got-micro.test
new file mode 100644
index 000000000000..7b3a919880de
--- /dev/null
+++ b/test/old-elf/Mips/exe-got-micro.test
@@ -0,0 +1,115 @@
+# Check that external symbol defined in the executable file
+# and referenced by R_MICROMIPS_CALL16 relocation has a corresponded
+# entry in the local GOT section.
+#
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob \
+# RUN: --output-filetype=yaml -o %t.exe %t-o.o %t.so
+# RUN: FileCheck -check-prefix=GOT %s < %t.exe
+
+# GOT header
+# GOT: - type: got
+# GOT: content: [ 00, 00, 00, 00 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# GOT: - type: got
+# GOT: content: [ 00, 00, 00, 80 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# Local GOT entry for 'glob' symbol
+# GOT: - ref-name: L000
+# GOT: type: got
+# GOT: content: [ 00, 00, 00, 00 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# GOT: references:
+# GOT: - kind: R_MIPS_32
+# GOT: offset: 0
+# GOT: target: glob
+# Global GOT entry for 'T1' symbol
+# GOT: - ref-name: L001
+# GOT: type: got
+# GOT: content: [ 00, 00, 00, 00 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# GOT: references:
+# GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# GOT: offset: 0
+# GOT: target: T1
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: glob
+ Type: R_MICROMIPS_CALL16
+ - Offset: 0x04
+ Symbol: T1
+ Type: R_MICROMIPS_CALL16
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/exe-got.test b/test/old-elf/Mips/exe-got.test
new file mode 100644
index 000000000000..636de16b4202
--- /dev/null
+++ b/test/old-elf/Mips/exe-got.test
@@ -0,0 +1,116 @@
+# Check that external symbol defined in the executable file
+# and referenced by R_MIPS_CALL16 relocation has a corresponded
+# entry in the local GOT section.
+#
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob \
+# RUN: --output-filetype=yaml -o %t.exe %t-o.o %t.so
+# RUN: FileCheck -check-prefix=GOT %s < %t.exe
+
+# GOT header
+# GOT: - type: got
+# GOT: content: [ 00, 00, 00, 00 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# GOT: - type: got
+# GOT: content: [ 00, 00, 00, 80 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# Local GOT entry for 'glob' symbol
+# GOT: - ref-name: L000
+# GOT: type: got
+# GOT: content: [ 00, 00, 00, 00 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# GOT: references:
+# GOT: - kind: R_MIPS_32
+# GOT: offset: 0
+# GOT: target: glob
+# Global GOT entry for 'T1' symbol
+# GOT: - ref-name: L001
+# GOT: type: got
+# GOT: content: [ 00, 00, 00, 00 ]
+# GOT: alignment: 4
+# GOT: section-choice: custom-required
+# GOT: section-name: .got
+# GOT: permissions: rw-
+# GOT: references:
+# GOT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# GOT: offset: 0
+# GOT: target: T1
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: glob
+ Type: R_MIPS_CALL16
+ Addend: 0
+ - Offset: 0x04
+ Symbol: T1
+ Type: R_MIPS_CALL16
+ Addend: 0
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/got-page-32-micro.test b/test/old-elf/Mips/got-page-32-micro.test
new file mode 100644
index 000000000000..5457ab9f1879
--- /dev/null
+++ b/test/old-elf/Mips/got-page-32-micro.test
@@ -0,0 +1,251 @@
+# Check handling of R_MICROMIPS_GOT_DISP / PAGE / OFST relocations
+# in case of O32 ABI.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \
+# RUN: | FileCheck -check-prefix=GOT %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+
+# GOT: Symbol {
+# GOT: Name: LT3
+# GOT-NEXT: Value: 0x[[LT3:[0-9A-F]+]]
+# GOT: Symbol {
+# GOT: Name: LT4
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: T0
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: LT1
+# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]]
+# GOT: Symbol {
+# GOT: Name: LT2
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: T1@
+# GOT-NEXT: Value: 0x0
+# GOT: Symbol {
+# GOT: Name: T2@
+# GOT-NEXT: Value: 0x0
+
+# GOT: Primary GOT {
+# GOT-NEXT: Canonical gp value: 0x408FF0
+# GOT-NEXT: Reserved entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401000
+# GOT-NEXT: Access: -32752
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Purpose: Lazy resolver
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401004
+# GOT-NEXT: Access: -32748
+# GOT-NEXT: Initial: 0x80000000
+# GOT-NEXT: Purpose: Module pointer (GNU extension)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x[[LT1]]
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x40100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x400000
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x400000
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401014
+# GOT-NEXT: Access: -32732
+# GOT-NEXT: Initial: 0x[[LT3]]
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401018
+# GOT-NEXT: Access: -32728
+# GOT-NEXT: Initial: 0x400000
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x40101C
+# GOT-NEXT: Access: -32724
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401020
+# GOT-NEXT: Access: -32720
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Number of TLS and multi-GOT entries: 0
+# GOT-NEXT: }
+
+# RAW: Contents of section .text:
+# RAW-NEXT: {{[0-9a-f]+}} 00002c80 00001880 00002c80 00003080
+# ^ = -32724 (T1)
+# ^ = -32744 (LT1)
+# ^ -32724 (T1)
+# ^ -32720 (T2)
+# RAW-NEXT: {{[0-9a-f]+}} 00001c80 00002080 00000000 00000000
+# ^ -32740 (PAGE)
+# ^ -32736 (PAGE)
+# ^ T1 OFST
+# ^ T2 OFST
+# RAW-NEXT: {{[0-9a-f]+}} 0000a501 0000a901 00002480 00002880
+# ^ LT1 OFST
+# ^ LT2 OFST
+# ^ = -32732 (LT3)
+# ^ -32728 (PAGE)
+# RAW-NEXT: {{[0-9a-f]+}} 0000b101 00000000
+# ^ LT4 OFST
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_32R2, EF_MIPS_ABI_O32, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 0x4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_32R2, EF_MIPS_ABI_O32, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Size: 0x38
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MICROMIPS_GOT_DISP
+ - Offset: 0x4
+ Symbol: LT1
+ Type: R_MICROMIPS_GOT_DISP
+ - Offset: 0x8
+ Symbol: T1
+ Type: R_MICROMIPS_GOT_PAGE
+ - Offset: 0xC
+ Symbol: T2
+ Type: R_MICROMIPS_GOT_PAGE
+ - Offset: 0x10
+ Symbol: LT1
+ Type: R_MICROMIPS_GOT_PAGE
+ - Offset: 0x14
+ Symbol: LT2
+ Type: R_MICROMIPS_GOT_PAGE
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MICROMIPS_GOT_OFST
+ - Offset: 0x1C
+ Symbol: T2
+ Type: R_MICROMIPS_GOT_OFST
+ - Offset: 0x20
+ Symbol: LT1
+ Type: R_MICROMIPS_GOT_OFST
+ - Offset: 0x24
+ Symbol: LT2
+ Type: R_MICROMIPS_GOT_OFST
+ - Offset: 0x28
+ Symbol: LT3
+ Type: R_MICROMIPS_GOT_DISP
+ - Offset: 0x2C
+ Symbol: LT4
+ Type: R_MICROMIPS_GOT_PAGE
+ - Offset: 0x30
+ Symbol: LT4
+ Type: R_MICROMIPS_GOT_OFST
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: LT3
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x30
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: LT4
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x34
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x8
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: LT1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x28
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: LT2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x2c
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/got-page-32.test b/test/old-elf/Mips/got-page-32.test
new file mode 100644
index 000000000000..44f45536d501
--- /dev/null
+++ b/test/old-elf/Mips/got-page-32.test
@@ -0,0 +1,244 @@
+# Check handling of R_MIPS_GOT_DISP / PAGE / OFST relocations.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \
+# RUN: | FileCheck -check-prefix=GOT %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+
+# GOT: Symbol {
+# GOT: Name: LT3 (12)
+# GOT-NEXT: Value: 0x[[LT3:[0-9A-F]+]]
+# GOT: Symbol {
+# GOT: Name: LT4 (16)
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: T0 (1)
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: LT1 (4)
+# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]]
+# GOT: Symbol {
+# GOT: Name: LT2 (8)
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: T1@ (1)
+# GOT-NEXT: Value: 0x0
+# GOT: Symbol {
+# GOT: Name: T2@ (4)
+# GOT-NEXT: Value: 0x0
+
+# GOT: Primary GOT {
+# GOT-NEXT: Canonical gp value: 0x408FF0
+# GOT-NEXT: Reserved entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401000
+# GOT-NEXT: Access: -32752
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Purpose: Lazy resolver
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401004
+# GOT-NEXT: Access: -32748
+# GOT-NEXT: Initial: 0x80000000
+# GOT-NEXT: Purpose: Module pointer (GNU extension)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x[[LT1]]
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x40100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x400000
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x400000
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401014
+# GOT-NEXT: Access: -32732
+# GOT-NEXT: Initial: 0x[[LT3]]
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401018
+# GOT-NEXT: Access: -32728
+# GOT-NEXT: Initial: 0x400000
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x40101C
+# GOT-NEXT: Access: -32724
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401020
+# GOT-NEXT: Access: -32720
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Number of TLS and multi-GOT entries: 0
+# GOT-NEXT: }
+
+# RAW: Contents of section .text:
+# RAW-NEXT: {{[0-9a-f]+}} 2c800000 18800000 2c800000 30800000
+# ^ = -32724 (T1)
+# ^ = -32744 (LT1)
+# ^ -32724 (T1)
+# ^ -32720 (T2)
+# RAW-NEXT: {{[0-9a-f]+}} 1c800000 20800000 00000000 00000000
+# ^ -32740 (PAGE)
+# ^ -32736 (PAGE)
+# ^ T1 OFST
+# ^ T2 OFST
+# RAW-NEXT: {{[0-9a-f]+}} 9c010000 a0010000 24800000 28800000
+# ^ LT1 OFST
+# ^ LT2 OFST
+# ^ = -32732 (LT3)
+# ^ -32728 (PAGE)
+# RAW-NEXT: {{[0-9a-f]+}} a8010000 00000000
+# ^ LT4 OFST
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_32, EF_MIPS_ABI_O32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 0x4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_32, EF_MIPS_ABI_O32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Size: 0x38
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x4
+ Symbol: LT1
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x8
+ Symbol: T1
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0xC
+ Symbol: T2
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x10
+ Symbol: LT1
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x14
+ Symbol: LT2
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x1C
+ Symbol: T2
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x20
+ Symbol: LT1
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x24
+ Symbol: LT2
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x28
+ Symbol: LT3
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x2C
+ Symbol: LT4
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x30
+ Symbol: LT4
+ Type: R_MIPS_GOT_OFST
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: LT3
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x30
+ Size: 0x4
+ - Name: LT4
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x34
+ Size: 0x4
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x8
+ - Name: LT1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x28
+ Size: 0x4
+ - Name: LT2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x2c
+ Size: 0x4
+ - Name: T1
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/got-page-64-micro.test b/test/old-elf/Mips/got-page-64-micro.test
new file mode 100644
index 000000000000..37bae77001e4
--- /dev/null
+++ b/test/old-elf/Mips/got-page-64-micro.test
@@ -0,0 +1,210 @@
+# Check handling of R_MICROMIPS_GOT_DISP / PAGE / OFST relocations
+# in case of N64 ABI.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \
+# RUN: | FileCheck -check-prefix=GOT %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+
+# GOT: Symbol {
+# GOT: Name: T0
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: LT1
+# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]]
+# GOT: Symbol {
+# GOT: Name: LT2
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: T1@
+# GOT-NEXT: Value: 0x0
+# GOT: Symbol {
+# GOT: Name: T2@
+# GOT-NEXT: Value: 0x0
+
+# GOT: Primary GOT {
+# GOT-NEXT: Canonical gp value: 0x120008FF0
+# GOT-NEXT: Reserved entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001000
+# GOT-NEXT: Access: -32752
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Purpose: Lazy resolver
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x8000000000000000
+# GOT-NEXT: Purpose: Module pointer (GNU extension)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x[[LT1]]
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001018
+# GOT-NEXT: Access: -32728
+# GOT-NEXT: Initial: 0x120000000
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001020
+# GOT-NEXT: Access: -32720
+# GOT-NEXT: Initial: 0x120000000
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001028
+# GOT-NEXT: Access: -32712
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001030
+# GOT-NEXT: Access: -32704
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Number of TLS and multi-GOT entries: 0
+# GOT-NEXT: }
+
+# RAW: Contents of section .text:
+# RAW-NEXT: {{[0-9a-f]+}} 38800000 20800000 38800000 40800000
+# ^ = -32712 (T1)
+# ^ = -32736 (LT1)
+# ^ -32712 (T1)
+# ^ -32704 (T2)
+# RAW-NEXT: {{[0-9a-f]+}} 28800000 30800000 00000000 00000000
+# ^ -32728 (PAGE)
+# ^ -32720 (PAGE)
+# ^ T1 OFST
+# ^ T2 OFST
+# RAW-NEXT: {{[0-9a-f]+}} 59020000 5d020000 00000000 00000000
+# ^ LT1 OFST
+# ^ LT2 OFST
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_64R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 0x4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ARCH_64R2, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Size: 0x30
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x4
+ Symbol: LT1
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x8
+ Symbol: T1
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0xC
+ Symbol: T2
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x10
+ Symbol: LT1
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x14
+ Symbol: LT2
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x1C
+ Symbol: T2
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x20
+ Symbol: LT1
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x24
+ Symbol: LT2
+ Type: R_MIPS_GOT_OFST
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x8
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: LT1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x28
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: LT2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x2c
+ Size: 0x4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/got-page-64.test b/test/old-elf/Mips/got-page-64.test
new file mode 100644
index 000000000000..3c6ef57c78f5
--- /dev/null
+++ b/test/old-elf/Mips/got-page-64.test
@@ -0,0 +1,203 @@
+# Check handling of R_MIPS_GOT_DISP / PAGE / OFST relocations.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -symbols -dyn-symbols -mips-plt-got %t.exe \
+# RUN: | FileCheck -check-prefix=GOT %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+
+# GOT: Symbol {
+# GOT: Name: T0 (1)
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: LT1 (4)
+# GOT-NEXT: Value: 0x[[LT1:[0-9A-F]+]]
+# GOT: Symbol {
+# GOT: Name: LT2 (8)
+# GOT-NEXT: Value: 0x{{[0-9A-F]+}}
+# GOT: Symbol {
+# GOT: Name: T1@ (1)
+# GOT-NEXT: Value: 0x0
+# GOT: Symbol {
+# GOT: Name: T2@ (4)
+# GOT-NEXT: Value: 0x0
+
+# GOT: Primary GOT {
+# GOT-NEXT: Canonical gp value: 0x120008FF0
+# GOT-NEXT: Reserved entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001000
+# GOT-NEXT: Access: -32752
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Purpose: Lazy resolver
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x8000000000000000
+# GOT-NEXT: Purpose: Module pointer (GNU extension)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x[[LT1]]
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001018
+# GOT-NEXT: Access: -32728
+# GOT-NEXT: Initial: 0x120000000
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001020
+# GOT-NEXT: Access: -32720
+# GOT-NEXT: Initial: 0x120000000
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001028
+# GOT-NEXT: Access: -32712
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001030
+# GOT-NEXT: Access: -32704
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Number of TLS and multi-GOT entries: 0
+# GOT-NEXT: }
+
+# RAW: Contents of section .text:
+# RAW-NEXT: {{[0-9a-f]+}} 38800000 20800000 38800000 40800000
+# ^ = -32712 (T1)
+# ^ = -32736 (LT1)
+# ^ -32712 (T1)
+# ^ -32704 (T2)
+# RAW-NEXT: {{[0-9a-f]+}} 28800000 30800000 00000000 00000000
+# ^ -32728 (PAGE)
+# ^ -32720 (PAGE)
+# ^ T1 OFST
+# ^ T2 OFST
+# RAW-NEXT: {{[0-9a-f]+}} 50020000 54020000 00000000 00000000
+# ^ LT1 OFST
+# ^ LT2 OFST
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 0x4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x4
+ Size: 0x30
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x4
+ Symbol: LT1
+ Type: R_MIPS_GOT_DISP
+ - Offset: 0x8
+ Symbol: T1
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0xC
+ Symbol: T2
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x10
+ Symbol: LT1
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x14
+ Symbol: LT2
+ Type: R_MIPS_GOT_PAGE
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x1C
+ Symbol: T2
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x20
+ Symbol: LT1
+ Type: R_MIPS_GOT_OFST
+ - Offset: 0x24
+ Symbol: LT2
+ Type: R_MIPS_GOT_OFST
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x8
+ - Name: LT1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x28
+ Size: 0x4
+ - Name: LT2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x2c
+ Size: 0x4
+ - Name: T1
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/got16-2.test b/test/old-elf/Mips/got16-2.test
new file mode 100644
index 000000000000..01f11a5920cd
--- /dev/null
+++ b/test/old-elf/Mips/got16-2.test
@@ -0,0 +1,73 @@
+# Check handling of R_MIPS_GOT16 relocation against local
+# symbols when addresses of local data cross 64 KBytes border.
+
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t-exe %t-obj
+# RUN: llvm-objdump -s %t-exe | FileCheck %s
+
+# CHECK: Contents of section .got:
+# CHECK-NEXT: 40a000 00000000 00000080 00004000 00004100 ..........@...A.
+# lazy module 0x400000 0x410000
+# resolver pointer for L1 for L2
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '00000000000000000000000000000000'
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Address: 0x1000
+ Relocations:
+ - Offset: 0
+ Symbol: L1
+ Type: R_MIPS_GOT16
+ - Offset: 4
+ Symbol: L1
+ Type: R_MIPS_LO16
+ - Offset: 8
+ Symbol: L2
+ Type: R_MIPS_GOT16
+ - Offset: 12
+ Symbol: L2
+ Type: R_MIPS_LO16
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x9000
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: L1
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x00
+ Size: 0x8000
+ - Name: L2
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x8000
+ Size: 0x04
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
diff --git a/test/old-elf/Mips/got16-micro.test b/test/old-elf/Mips/got16-micro.test
new file mode 100644
index 000000000000..25de08e95c4e
--- /dev/null
+++ b/test/old-elf/Mips/got16-micro.test
@@ -0,0 +1,165 @@
+# REQUIRES: mips
+
+# Check handling of global/local R_MICROMIPS_GOT16 relocations.
+# RUN: llvm-mc -triple=mipsel -mattr=micromips -relocation-model=pic \
+# RUN: -filetype=obj -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \
+# RUN: --output-filetype=yaml %t.o \
+# RUN: | FileCheck -check-prefix YAML %s
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t2 %t.o
+# RUN: llvm-objdump -t -disassemble -mattr=micromips %t2 \
+# RUN: | FileCheck -check-prefix RAW %s
+
+# Function glob
+# YAML: - name: main
+# YAML: scope: global
+# YAML: content: [ 5C, FC, 00, 00, 42, 30, 00, 00, 5C, FC, 00, 00,
+# YAML: 42, 30, 00, 00, 5C, FC, 00, 00, 5C, FC, 00, 00,
+# YAML: 5C, FC, 00, 00 ]
+# YAML: alignment: 4 mod 16
+# YAML: code-model: mips-micro
+# YAML: references:
+# YAML-NEXT: - kind: R_MICROMIPS_GOT16
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: L000
+# YAML-NEXT: - kind: R_MICROMIPS_LO16
+# YAML-NEXT: offset: 4
+# YAML-NEXT: target: data_1
+# YAML-NEXT: - kind: R_MICROMIPS_GOT16
+# YAML-NEXT: offset: 8
+# YAML-NEXT: target: L001
+# YAML-NEXT: - kind: R_MICROMIPS_LO16
+# YAML-NEXT: offset: 12
+# YAML-NEXT: target: data_2
+# YAML-NEXT: - kind: R_MICROMIPS_GOT16
+# YAML-NEXT: offset: 16
+# YAML-NEXT: target: L002
+# YAML-NEXT: - kind: R_MICROMIPS_CALL16
+# YAML-NEXT: offset: 20
+# YAML-NEXT: target: L003
+# YAML-NEXT: - kind: R_MICROMIPS_CALL16
+# YAML-NEXT: offset: 24
+# YAML-NEXT: target: L004
+
+# Local GOT entries:
+# YAML: - ref-name: L000
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: data_1
+# YAML-NEXT: - ref-name: L001
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: data_2
+# YAML-NEXT: - ref-name: L002
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: R_MIPS_32
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: data_h
+
+# Global GOT entries:
+# YAML-NEXT: - ref-name: L003
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: bar
+# YAML-NEXT: - kind: R_MIPS_32
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: bar
+# YAML-NEXT: - ref-name: L004
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: foo
+
+# RAW: Disassembly of section .text:
+# RAW: main:
+# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 18 80 lw $2, -32744($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 42 30 40 10 addiu $2, $2, 4160
+# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 1c 80 lw $2, -32740($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 42 30 60 20 addiu $2, $2, 8288
+# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 20 80 lw $2, -32736($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 24 80 lw $2, -32732($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 5c fc 28 80 lw $2, -32728($gp)
+
+# RAW: SYMBOL TABLE:
+# RAW: {{[0x0-9a-f]+}} *UND* 00000000
+# RAW: {{[0x0-9a-f]+}} l .data 00001020 data_1
+# RAW: {{[0x0-9a-f]+}} l .data 00000001 data_2
+# RAW: {{[0x0-9a-f]+}} g F .text 00000004 bar
+# RAW: {{[0x0-9a-f]+}} g F .text 0000001c main
+# RAW: {{[0x0-9a-f]+}} g .data 00000001 data_h
+
+ .data
+ .type data_1, @object
+ .size data_1, 4128
+data_1:
+ .byte 1
+ .space 4127
+ .type data_2, @object
+ .size data_2, 1
+data_2:
+ .byte 2
+ .hidden data_h
+ .globl data_h
+ .type data_h, @object
+ .size data_h, 1
+data_h:
+ .byte 3
+
+ .text
+ .globl bar
+ .set micromips
+ .ent bar
+ .type bar, @function
+bar:
+ nop
+ .end bar
+ .size bar, .-bar
+
+ .globl main
+ .set micromips
+ .ent main
+ .type main, @function
+main:
+ lw $2,%got(data_1)($28)
+ addiu $2,$2,%lo(data_1)
+ lw $2,%got(data_2)($28)
+ addiu $2,$2,%lo(data_2)
+ lw $2,%got(data_h)($28)
+ lw $2,%call16(bar)($28)
+ lw $2,%call16(foo)($28)
+
+ .end main
+ .size main, .-main
diff --git a/test/old-elf/Mips/got16.test b/test/old-elf/Mips/got16.test
new file mode 100644
index 000000000000..4dde15a11c26
--- /dev/null
+++ b/test/old-elf/Mips/got16.test
@@ -0,0 +1,196 @@
+# REQUIRES: mips
+
+# Check handling of global/local GOT16 relocations.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \
+# RUN: --output-filetype=yaml %t.o \
+# RUN: | FileCheck -check-prefix YAML %s
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t2 %t.o
+# RUN: llvm-objdump -t -disassemble %t2 | FileCheck -check-prefix RAW %s
+
+# Function glob
+# YAML: - name: glob
+# YAML: scope: global
+# YAML: content: [ 00, 00, 84, 8F, 00, 00, 84, 24, 01, 00, 84, 8F,
+# YAML: 00, 02, 84, 24, 00, 00, 84, 8F, 00, 00, 84, 8F,
+# YAML: 00, 00, 84, 8F ]
+# YAML: alignment: 4
+# YAML: references:
+# YAML: - kind: R_MIPS_GOT16
+# YAML: offset: 0
+# YAML: target: L000
+# YAML: - kind: R_MIPS_LO16
+# YAML: offset: 4
+# YAML: target: L009
+# YAML: - kind: R_MIPS_GOT16
+# YAML: offset: 8
+# YAML: target: L002
+# YAML: addend: 66048
+# YAML: - kind: R_MIPS_LO16
+# YAML: offset: 12
+# YAML: target: L009
+# YAML: addend: 512
+# YAML: - kind: R_MIPS_GOT16
+# YAML: offset: 16
+# YAML: target: L004
+# YAML: - kind: R_MIPS_CALL16
+# YAML: offset: 20
+# YAML: target: L005
+# YAML: - kind: R_MIPS_CALL16
+# YAML: offset: 24
+# YAML: target: L006
+
+# Local GOT entries:
+# YAML: - ref-name: L000
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: L009
+# YAML-NEXT: - ref-name: L002
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_32_HI16
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: L009
+# YAML-NEXT: addend: 66048
+# YAML-NEXT: - ref-name: L004
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: R_MIPS_32
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: hidden
+
+# Global GOT entries:
+# YAML-NEXT: - ref-name: L005
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: glob
+# YAML-NEXT: - kind: R_MIPS_32
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: glob
+# YAML-NEXT: - ref-name: L006
+# YAML-NEXT: type: got
+# YAML-NEXT: content: [ 00, 00, 00, 00 ]
+# YAML-NEXT: alignment: 4
+# YAML-NEXT: section-choice: custom-required
+# YAML-NEXT: section-name: .got
+# YAML-NEXT: permissions: rw-
+# YAML-NEXT: references:
+# YAML-NEXT: - kind: LLD_R_MIPS_GLOBAL_GOT
+# YAML-NEXT: offset: 0
+# YAML-NEXT: target: extern
+
+# RAW: Disassembly of section .text:
+# RAW: glob:
+# RAW-NEXT: {{[0x0-9a-f]+}}: 18 80 84 8f lw $4, -32744($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 00 20 84 24 addiu $4, $4, 8192
+# RAW-NEXT: {{[0x0-9a-f]+}}: 1c 80 84 8f lw $4, -32740($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 00 22 84 24 addiu $4, $4, 8704
+# RAW-NEXT: {{[0x0-9a-f]+}}: 20 80 84 8f lw $4, -32736($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 24 80 84 8f lw $4, -32732($gp)
+# RAW-NEXT: {{[0x0-9a-f]+}}: 28 80 84 8f lw $4, -32728($gp)
+
+# RAW: SYMBOL TABLE:
+# RAW: {{[0x0-9a-f]+}} *UND* 00000000
+# RAW: {{[0x0-9a-f]+}} l .data 00000000 str1
+# RAW: {{[0x0-9a-f]+}} l .data 00000005 str2
+# RAW: {{[0x0-9a-f]+}} g F .text 0000001c glob
+# RAW: {{[0x0-9a-f]+}} g .data 00000004 hidden
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '0000848F000084240100848F000284240000848F0000848F0000848F'
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: .data
+ Type: R_MIPS_GOT16
+ - Offset: 0x04
+ Symbol: .data
+ Type: R_MIPS_LO16
+ - Offset: 0x08
+ Symbol: .data
+ Type: R_MIPS_GOT16
+ - Offset: 0x0C
+ Symbol: .data
+ Type: R_MIPS_LO16
+ - Offset: 0x10
+ Symbol: hidden
+ Type: R_MIPS_GOT16
+ - Offset: 0x14
+ Symbol: glob
+ Type: R_MIPS_CALL16
+ - Offset: 0x18
+ Symbol: extern
+ Type: R_MIPS_CALL16
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x10209
+
+Symbols:
+ Local:
+ - Name: str1
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x10200
+ - Name: str2
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x10200
+ Size: 0x05
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ Global:
+ - Name: glob
+ Section: .text
+ - Name: hidden
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x10205
+ Size: 0x04
+ Visibility: STV_HIDDEN
+ - Name: extern
diff --git a/test/old-elf/Mips/gotsym.test b/test/old-elf/Mips/gotsym.test
new file mode 100644
index 000000000000..bc89ba5d3768
--- /dev/null
+++ b/test/old-elf/Mips/gotsym.test
@@ -0,0 +1,43 @@
+# Check _gp_disp and GOT_OFFSET_TABLE value
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t.so %t.o
+# RUN: llvm-objdump -h -t %t.so | FileCheck -check-prefix=SHARED %s
+
+# SHARED: Sections:
+# SHARED: Idx Name Size Address Type
+# SHARED: 6 .got 00000008 0000000000001000 DATA
+# SHARED: SYMBOL TABLE:
+# SHARED: 00001000 .got 00000000 _GLOBAL_OFFSET_TABLE_
+# SHARED: 00008ff0 g *ABS* 00000000 _gp
+# SHARED: 00008ff0 g *ABS* 00000000 _gp_disp
+
+# RUN: lld -flavor old-gnu -target mipsel -e main --noinhibit-exec -o %t.exe %t.o
+# RUN: llvm-objdump -h -t %t.exe | FileCheck -check-prefix=EXE %s
+
+# EXE: Sections:
+# EXE: Idx Name Size Address Type
+# EXE: 7 .got 00000008 0000000000401000 DATA
+# EXE: SYMBOL TABLE:
+# EXE: 00401000 .got 00000000 _GLOBAL_OFFSET_TABLE_
+# EXE: 00408ff0 g *ABS* 00000000 _gp
+# EXE: 00408ff0 g *ABS* 00000000 _gp_disp
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: main
+ Section: .text
diff --git a/test/old-elf/Mips/gp-sym-1-micro.test b/test/old-elf/Mips/gp-sym-1-micro.test
new file mode 100644
index 000000000000..0e1bea9c38da
--- /dev/null
+++ b/test/old-elf/Mips/gp-sym-1-micro.test
@@ -0,0 +1,88 @@
+# Check that microMIPS relocations against __gnu_local_gp
+# use "gp" value as target.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -symbols %t.exe | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=SEC %s
+
+# SYM: Name: _gp
+# SYM-NEXT: Value: 0x408FF0
+
+# SEC: Contents of section .text:
+# SEC-NEXT: 400184 00004100 0000f08f 2000bc00 ..A..... ...
+# SEC: Contents of section .got:
+# SEC-NEXT: 401000 00000000 00000080 ........
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 12
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: __gnu_local_gp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x04
+ Symbol: __gnu_local_gp
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x08
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: __gnu_local_gp
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/gp-sym-1.test b/test/old-elf/Mips/gp-sym-1.test
new file mode 100644
index 000000000000..ebb73c3afd60
--- /dev/null
+++ b/test/old-elf/Mips/gp-sym-1.test
@@ -0,0 +1,86 @@
+# Check that relocations against __gnu_local_gp use "gp" value as target.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -symbols %t.exe | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=SEC %s
+
+# SYM: Name: _gp
+# SYM-NEXT: Value: 0x408FF0
+
+# SEC: Contents of section .text:
+# SEC-NEXT: 400190 41000000 f08f0000 60001000
+# SEC: Contents of section .got:
+# SEC-NEXT: 401000 00000000 00000080
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 12
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: __gnu_local_gp
+ Type: R_MIPS_HI16
+ - Offset: 0x04
+ Symbol: __gnu_local_gp
+ Type: R_MIPS_LO16
+ - Offset: 0x08
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: __gnu_local_gp
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/gp-sym-2.test b/test/old-elf/Mips/gp-sym-2.test
new file mode 100644
index 000000000000..b6d95f350af3
--- /dev/null
+++ b/test/old-elf/Mips/gp-sym-2.test
@@ -0,0 +1,103 @@
+# Check that R_MIPS32 relocation against __gnu_local_gp causes emitting
+# of R_MIPS_REL32 relocation in case of shared library file linking
+# and does not produce any dynamic relocation in case of linking a non-shared
+# executable file.
+
+# Now the test failed because the __gnu_local_gp symbol becomes defined
+# absolute symbol and we do not generate R_MIPS_REL32 in case of shared
+# library linking.
+# XFAIL: *
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-1.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t-1.so
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=EXE %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t-2.so %t-o.o %t-1.so
+# RUN: llvm-readobj -r %t-2.so | FileCheck -check-prefix=SO %s
+
+# EXE: Relocations [
+# EXE-NEXT: ]
+
+# SO: Relocations [
+# SO-NEXT: Section (5) .rel.dyn {
+# SO-NEXT: 0x0 R_MIPS_NONE - 0x0
+# SO-NEXT: 0x2EC R_MIPS_REL32 __gnu_local_gp 0x0
+# SO-NEXT: }
+# SO-NEXT: ]
+
+# so.so
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 12
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: __gnu_local_gp
+ Type: R_MIPS_32
+ - Offset: 0x04
+ Symbol: T1
+ Type: R_MIPS_LO16
+ - Offset: 0x08
+ Symbol: T2
+ Type: R_MIPS_CALL16
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: __gnu_local_gp
+ - Name: T1
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/hilo16-1.test b/test/old-elf/Mips/hilo16-1.test
new file mode 100644
index 000000000000..b284140f748f
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-1.test
@@ -0,0 +1,40 @@
+# REQUIRES: mips
+
+# Check handling multiple HI16 relocation followed by a single LO16 relocation.
+
+# RUN: llvm-mc -arch=mipsel -filetype=obj -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -d -t %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: T0:
+# CHECK-NEXT: 400180: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: 42 00 08 3c lui $8, 66
+# CHECK-NEXT: {{[0-9a-f]+}}: 3e 00 08 3c lui $8, 62
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 02 08 3c lui $8, 576
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 fe 08 3c lui $8, 65088
+# CHECK-NEXT: {{[0-9a-f]+}}: a5 01 08 25 addiu $8, $8, 421
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400180 g F .text 00000024 T0
+# CHECK: 004001a4 g F .text 00000004 T1
+
+ .text
+ .globl T0
+T0:
+ lui $8, %hi(T1+1)
+ lui $8, %hi(T1-1)
+ lui $8, %hi(T1+0x1ff)
+ lui $8, %hi(T1+(-0x1ff))
+ lui $8, %hi(T1+0x1ffff)
+ lui $8, %hi(T1+(-0x1ffff))
+ lui $8, %hi(T1+0x1ffffff)
+ lui $8, %hi(T1+(-0x1ffffff))
+ addiu $8, $8, %lo(T1+(-0x1ffffff))
+
+ .globl T1
+T1:
+ nop
diff --git a/test/old-elf/Mips/hilo16-2.test b/test/old-elf/Mips/hilo16-2.test
new file mode 100644
index 000000000000..e47b9003a8dd
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-2.test
@@ -0,0 +1,70 @@
+# REQUIRES: mips
+
+# Check handling of HI16 and LO16 relocations for regular symbol.
+#
+# R_MIPS_HI16: (AHL + S) - (short)(AHL + S)
+# R_MIPS_LO16: AHL + S
+# where AHL = (AHI << 16) + ALO
+
+# RUN: llvm-mc -arch=mipsel -filetype=obj -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: T0:
+# CHECK-NEXT: 400180: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: c1 01 08 25 addiu $8, $8, 449
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: bf 01 08 25 addiu $8, $8, 447
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: bf 03 08 25 addiu $8, $8, 959
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64
+# CHECK-NEXT: {{[0-9a-f]+}}: c1 ff 08 25 addiu $8, $8, -63
+#
+# CHECK: T1:
+# CHECK-NEXT: 4001a0: 42 00 08 3c lui $8, 66
+# CHECK-NEXT: {{[0-9a-f]+}}: bf 01 08 25 addiu $8, $8, 447
+# CHECK-NEXT: {{[0-9a-f]+}}: 3e 00 08 3c lui $8, 62
+# CHECK-NEXT: {{[0-9a-f]+}}: c1 01 08 25 addiu $8, $8, 449
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 02 08 3c lui $8, 576
+# CHECK-NEXT: {{[0-9a-f]+}}: bf 01 08 25 addiu $8, $8, 447
+# CHECK-NEXT: {{[0-9a-f]+}}: 40 fe 08 3c lui $8, 65088
+# CHECK-NEXT: {{[0-9a-f]+}}: c1 01 08 25 addiu $8, $8, 449
+#
+# CHECK: T2:
+# CHECK-NEXT: 4001c0: 00 00 00 00 nop
+
+ .section .text.1,"ax",@progbits
+ .align 4
+ .globl T0
+T0:
+ lui $8, %hi(T2+1)
+ addiu $8, $8, %lo(T2+1)
+ lui $8, %hi(T2+(-1))
+ addiu $8, $8, %lo(T2+(-1))
+ lui $8, %hi(T2+0x1ff)
+ addiu $8, $8, %lo(T2+0x1ff)
+ lui $8, %hi(T2+(-0x1ff))
+ addiu $8, $8, %lo(T2+(-0x1ff))
+ .size T0, .-T0
+
+ .section .text.2,"ax",@progbits
+ .align 4
+ .globl T1
+T1:
+ lui $8, %hi(T2+0x1ffff)
+ addiu $8, $8, %lo(T2+0x1ffff)
+ lui $8, %hi(T2+(-0x1ffff))
+ addiu $8, $8, %lo(T2+(-0x1ffff))
+ lui $8, %hi(T2+0x1ffffff)
+ addiu $8, $8, %lo(T2+0x1ffffff)
+ lui $8, %hi(T2+(-0x1ffffff))
+ addiu $8, $8, %lo(T2+(-0x1ffffff))
+ .size T1, .-T1
+
+ .section .text.3,"ax",@progbits
+ .align 4
+ .globl T2
+T2:
+ nop
+ .size T2, .-T2
diff --git a/test/old-elf/Mips/hilo16-3-overflow.test b/test/old-elf/Mips/hilo16-3-overflow.test
new file mode 100644
index 000000000000..94fc90b3be54
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-3-overflow.test
@@ -0,0 +1,44 @@
+# Check R_MIPS_HI16 relocation overflow handling.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to _gp_disp+2147483648 of type 5 (R_MIPS_HI16)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0080000000000000"
+# ^ %hi(gp+0x80000000)
+# ^ %lo(gp+0x80000000)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0x4
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: _gp_disp
diff --git a/test/old-elf/Mips/hilo16-3.test b/test/old-elf/Mips/hilo16-3.test
new file mode 100644
index 000000000000..17873c0a629c
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-3.test
@@ -0,0 +1,74 @@
+# Check handling of HI16 and LO16 relocations for _gp_disp.
+#
+# R_MIPS_HI16: (AHL + GP - P) - (short)(AHL + GP - P)
+# R_MIPS_LO16: AHL + GP - P + 4
+# where AHL = (AHI << 16) + ALO
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-objdump -s -t %t.so | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 00d0 0100083c 218f0885 0100083c 178f0885
+# CHECK-NEXT: 00e0 0100083c 0f910885 0100083c 098d0885
+# CHECK-NEXT: 00f0 0200083c ffff0885
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 000000d0 g F .text 00000028 T0
+# CHECK: 00008ff0 g *ABS* 00000000 _gp_disp
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000083C010008850000083CFFFF08850000083CFF0108850000083C01FE08850200083CFFFF0885"
+# ^ %hi(gp+1) ^ %hi(gp-1) ^ %hi(gp+0x1ff) ^ %hi(gp-0x1ff) ^ %lo(gp+0x1ffff)
+# ^ %lo(gp+1) ^ %lo(gp-1) ^ %lo(gp+0x1ff) ^ %lo(gp-0x1ff)
+# ^ %hi(gp+0x1ffff)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0x4
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+ - Offset: 0x8
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0xC
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+ - Offset: 0x10
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0x14
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+ - Offset: 0x18
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0x1C
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 80
+ - Name: _gp_disp
diff --git a/test/old-elf/Mips/hilo16-4.test b/test/old-elf/Mips/hilo16-4.test
new file mode 100644
index 000000000000..2db17344e30f
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-4.test
@@ -0,0 +1,93 @@
+# REQUIRES: mips
+
+# Check pairing of R_MIPS_HI16 and R_MIPS_LO16 relocations.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -e glob1 -o %t-exe %t-obj
+# RUN: llvm-objdump -t -disassemble %t-exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK: glob1:
+# CHECK-NEXT: 400130: 40 00 04 3c lui $4, 64
+# CHECK-NEXT: 400134: ff 9f a6 8c lw $6, -24577($5)
+
+# CHECK: glob2:
+# CHECK-NEXT: 400138: 00 20 c7 80 lb $7, 8192($6)
+# CHECK-NEXT: 40013c: 04 20 c8 80 lb $8, 8196($6)
+
+# CHECK: glob3:
+# CHECK-NEXT: 400140: 40 80 05 3c lui $5, 32832
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400130 g F .text 00000008 glob1
+# CHECK: 00400138 g F .text 00000008 glob2
+# CHECK: 00400140 g F .text 00000004 glob3
+# CHECK: 00402000 g .data 0000000c X
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+# glob1:
+# lui $4,%hi(X) # rel A
+# lw $6,%lo(X+32767)($5) # rel B
+# glob2:
+# lb $7,%lo(X)($6) # rel C
+# lb $8,%lo(X+4)($6) # rel D
+# glob3:
+# lui $5,%hi(X+32767) # rel E
+ Content: "0000043CFF7FA68C0000C7800400C880FF7F053C"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "000000000000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x10 # rel E
+ Symbol: X
+ Type: R_MIPS_HI16
+ - Offset: 0x04 # rel B
+ Symbol: X
+ Type: R_MIPS_LO16
+ - Offset: 0x00 # rel A
+ Symbol: X
+ Type: R_MIPS_HI16
+ - Offset: 0x0C # rel D
+ Symbol: X
+ Type: R_MIPS_LO16
+ - Offset: 0x08 # rel C
+ Symbol: X
+ Type: R_MIPS_LO16
+
+Symbols:
+ Global:
+ - Name: glob1
+ Section: .text
+ Value: 0x0
+ Size: 8
+ - Name: glob2
+ Section: .text
+ Value: 0x8
+ Size: 8
+ - Name: glob3
+ Section: .text
+ Value: 0x10
+ Size: 4
+ - Name: X
+ Section: .data
+ Value: 0x0
+ Size: 12
diff --git a/test/old-elf/Mips/hilo16-5.test b/test/old-elf/Mips/hilo16-5.test
new file mode 100644
index 000000000000..597425e8ba74
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-5.test
@@ -0,0 +1,103 @@
+# Check that linker shows a warning when
+# there is orphaned R_MIPS_HI16 relocation.
+
+# RUN: yaml2obj -format=elf -o %t-so.o -docnum 1 %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -o %t-o.o -docnum 2 %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so 2>&1 \
+# RUN: | FileCheck -check-prefix=DIAG %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=DATA %s
+
+# DIAG: lld warning: cannot matching LO16 relocation
+# DIAG: lld warning: cannot matching LO16 relocation
+
+# DATA: Contents of section .data:
+# DATA-NEXT: 402000 40000000 10200000 40000000 @.... ..@...
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "000000000000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MIPS_HI16
+ - Offset: 0x08
+ Symbol: D2
+ Type: R_MIPS_HI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_LO16
+ - Offset: 0x08
+ Symbol: .text
+ Type: R_MIPS_HI16
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: D1
+ - Name: D2
+...
diff --git a/test/old-elf/Mips/hilo16-8-micro.test b/test/old-elf/Mips/hilo16-8-micro.test
new file mode 100644
index 000000000000..ef8ac782341c
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-8-micro.test
@@ -0,0 +1,81 @@
+# REQUIRES: mips
+
+# Check calculation of AHL addendums for R_MICROMIPS_HI16 / R_MICROMIPS_LO16
+# relocations for a regular symbol.
+
+# RUN: llvm-mc -arch=mipsel -filetype=obj -mattr=micromips -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: T0:
+# CHECK-NEXT: 400180: a8 41 40 00 lui $8, 64
+# CHECK-NEXT: 400184: 08 31 c1 01 addiu $8, $8, 449
+# CHECK-NEXT: 400188: a8 41 41 00 lui $8, 65
+# CHECK-NEXT: 40018c: 08 31 bf 81 addiu $8, $8, -32321
+# CHECK-NEXT: 400190: a8 41 41 00 lui $8, 65
+# CHECK-NEXT: 400194: 08 31 40 82 addiu $8, $8, -32192
+# CHECK-NEXT: 400198: a8 41 42 00 lui $8, 66
+# CHECK-NEXT: 40019c: 08 31 c0 81 addiu $8, $8, -32320
+#
+# CHECK: T1:
+# CHECK-NEXT: 4001a0: a8 41 40 40 lui $8, 16448
+# CHECK-NEXT: 4001a4: 08 31 c0 01 addiu $8, $8, 448
+# CHECK-NEXT: 4001a8: a8 41 40 80 lui $8, 32832
+# CHECK-NEXT: 4001ac: 08 31 c0 01 addiu $8, $8, 448
+# CHECK-NEXT: 4001b0: a8 41 c1 80 lui $8, 32961
+# CHECK-NEXT: 4001b4: 08 31 40 82 addiu $8, $8, -32192
+# CHECK-NEXT: 4001b8: 00 00 00 00 nop
+# CHECK-NEXT: 4001bc: 00 00 00 00 nop
+#
+# CHECK: T2:
+# CHECK-NEXT: 4001c0: 00 00 00 00 nop
+# CHECK-NEXT: 4001c4: a8 41 40 00 lui $8, 64
+# CHECK-NEXT: 4001c8: a8 41 40 00 lui $8, 64
+# CHECK-NEXT: 4001cc: a8 41 41 00 lui $8, 65
+# CHECK-NEXT: 4001d0: a8 41 42 00 lui $8, 66
+# CHECK-NEXT: 4001d4: a8 41 40 40 lui $8, 16448
+# CHECK-NEXT: 4001d8: a8 41 40 80 lui $8, 32832
+# CHECK-NEXT: 4001dc: a8 41 c1 80 lui $8, 32961
+# CHECK-NEXT: 4001e0: 08 31 00 82 addiu $8, $8, -32256
+
+ .section .text.1,"ax",@progbits
+ .align 4
+ .globl T0
+T0:
+ lui $8, %hi(T2+1)
+ addiu $8, $8, %lo(T2+1)
+ lui $8, %hi(T2+0x7fff)
+ addiu $8, $8, %lo(T2+0x7fff)
+ lui $8, %hi(T2+0x8080)
+ addiu $8, $8, %lo(T2+0x8080)
+ lui $8, %hi(T2+0x18000)
+ addiu $8, $8, %lo(T2+0x18000)
+ .size T0, .-T0
+
+ .section .text.2,"ax",@progbits
+ .align 4
+ .globl T1
+T1:
+ lui $8, %hi(T2+0x40000000)
+ addiu $8, $8, %lo(T2+0x40000000)
+ lui $8, %hi(T2+0x80000000)
+ addiu $8, $8, %lo(T2+0x80000000)
+ lui $8, %hi(T2+0x80808080)
+ addiu $8, $8, %lo(T2+0x80808080)
+ .size T1, .-T1
+
+ .section .text.3,"ax",@progbits
+ .align 4
+ .globl T2
+T2:
+ nop
+ lui $8, %hi(T0+0x1)
+ lui $8, %hi(T0+0x7fff)
+ lui $8, %hi(T0+0x8080)
+ lui $8, %hi(T0+0x18000)
+ lui $8, %hi(T0+0x40000000)
+ lui $8, %hi(T0+0x80000000)
+ lui $8, %hi(T0+0x80808080)
+ addiu $8, $8, %lo(T0+0x80808080)
+ .size T2, .-T2
diff --git a/test/old-elf/Mips/hilo16-9-micro.test b/test/old-elf/Mips/hilo16-9-micro.test
new file mode 100644
index 000000000000..293e35f36cd5
--- /dev/null
+++ b/test/old-elf/Mips/hilo16-9-micro.test
@@ -0,0 +1,142 @@
+# Check calculation of AHL addendums for R_MICROMIPS_HI16 / R_MICROMIPS_LO16
+# relocations for the _gp_disp symbol.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-objdump -s -t %t.so | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 0110 00000100 0000e08e 00000100 0000d60e
+# CHECK-NEXT: 0120 00000100 00004f0f 00000000 00000000
+# CHECK-NEXT: 0130 00000200 0000bf0e 00000140 0000378f
+# CHECK-NEXT: 0140 00000100 00000100 00000200 00000300
+# CHECK-NEXT: 0150 00000140 00001f8f
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 00000110 g F .text 00000018 T0
+# CHECK: 00000130 g F .text 00000010 T1
+# CHECK: 00000140 g F .text 00000018 T2
+# CHECK: 00008ff0 g *ABS* 00000000 _gp_disp
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text.1
+ Type: SHT_PROGBITS
+ Content: "0000000000000100000000000000FF7F0000010000008080"
+# ^ %hi(gp+0x1) ^ %hi(gp+0x7fff) ^ %lo(gp+0x8080)
+# ^ %lo(gp+0x1) ^ %lo(gp+0x7fff)
+# ^ %hi(gp+0x8080)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text.1
+ Type: SHT_REL
+ Info: .text.1
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x4
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x8
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0xC
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x10
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x14
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_LO16
+
+- Name: .text.2
+ Type: SHT_PROGBITS
+ Content: "00000200000000800000004000008000"
+# ^ %hi(gp+0x18000) ^ %lo(gp+0x40000080)
+# ^ %lo(gp+0x18000)
+# ^ %hi(gp+0x40000080)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text.2
+ Type: SHT_REL
+ Info: .text.2
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x4
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x8
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0xC
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_LO16
+
+- Name: .text.3
+ Type: SHT_PROGBITS
+ Content: "000000000000000000000100000002000000004000008000"
+# ^ %hi(gp+0x1) ^ %hi(gp+0x8080) ^ %lo(gp+0x40000080)
+# ^ %hi(gp+0x7fff) ^ %hi(gp+0x40000080)
+# ^ %hi(gp+0x18000)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text.3
+ Type: SHT_REL
+ Info: .text.3
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x4
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x8
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0xC
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x10
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x14
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text.1
+ Type: STT_FUNC
+ Value: 0
+ Size: 24
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ Section: .text.2
+ Type: STT_FUNC
+ Value: 0
+ Size: 16
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+ Section: .text.3
+ Type: STT_FUNC
+ Value: 0
+ Size: 24
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: _gp_disp
diff --git a/test/old-elf/Mips/initfini-micro.test b/test/old-elf/Mips/initfini-micro.test
new file mode 100644
index 000000000000..ca2708f1bb29
--- /dev/null
+++ b/test/old-elf/Mips/initfini-micro.test
@@ -0,0 +1,45 @@
+# Check that if _init/_fini symbols are microMIPS encoded, DT_INIT/DT_FINI tags
+# use adjusted values with set the last bit.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -symbols -dynamic-table %t.so | FileCheck %s
+
+# CHECK: Name: _init (1)
+# CHECK-NEXT: Value: 0xF5
+# CHECK: Name: _fini (7)
+# CHECK-NEXT: Value: 0xF9
+#
+# CHECK: 0x0000000C INIT 0xF5
+# CHECK: 0x0000000D FINI 0xF9
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x18
+
+Symbols:
+ Global:
+ - Name: _init
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0
+ Size: 0x4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: _fini
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x4
+ Size: 0x4
+ Other: [ STO_MIPS_MICROMIPS ]
+...
diff --git a/test/old-elf/Mips/interpreter-64.test b/test/old-elf/Mips/interpreter-64.test
new file mode 100644
index 000000000000..7cfd0c51a3c4
--- /dev/null
+++ b/test/old-elf/Mips/interpreter-64.test
@@ -0,0 +1,26 @@
+# Check program interpreter setup.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -e main -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .interp:
+# CHECK-NEXT: {{[0-9a-f]+}} 2f6c6962 36342f6c 642e736f 2e3100 /lib64/ld.so.1.
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64 ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: main
+ Section: .text
diff --git a/test/old-elf/Mips/interpreter-n32.test b/test/old-elf/Mips/interpreter-n32.test
new file mode 100644
index 000000000000..7d17256ba43c
--- /dev/null
+++ b/test/old-elf/Mips/interpreter-n32.test
@@ -0,0 +1,27 @@
+# Check program interpreter setup in case of N32 ABI.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .interp:
+# CHECK-NEXT: {{[0-9a-f ]+}} /lib32/ld.so.1.
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64, EF_MIPS_ABI2 ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
diff --git a/test/old-elf/Mips/interpreter.test b/test/old-elf/Mips/interpreter.test
new file mode 100644
index 000000000000..4ae17b42df1c
--- /dev/null
+++ b/test/old-elf/Mips/interpreter.test
@@ -0,0 +1,26 @@
+# Check program interpreter setup.
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e main -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .interp:
+# CHECK-NEXT: {{[0-9a-f]+}} 2f6c6962 2f6c642e 736f2e31 00 /lib/ld.so.1.
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: main
+ Section: .text
diff --git a/test/old-elf/Mips/invalid-reginfo.test b/test/old-elf/Mips/invalid-reginfo.test
new file mode 100644
index 000000000000..2856ecc92607
--- /dev/null
+++ b/test/old-elf/Mips/invalid-reginfo.test
@@ -0,0 +1,28 @@
+# Check that LLD shows an error if .reginfo section has invalid size
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -o %t.exe %t.o 2>&1 | FileCheck %s
+
+# CHECK: Invalid size of MIPS_REGINFO section
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x01
+ Size: 0x25
+Symbols:
+ Global:
+ - Name: main
+ Section: .text
diff --git a/test/old-elf/Mips/jalx-align-err.test b/test/old-elf/Mips/jalx-align-err.test
new file mode 100644
index 000000000000..8fc5310bbad8
--- /dev/null
+++ b/test/old-elf/Mips/jalx-align-err.test
@@ -0,0 +1,46 @@
+# Check that LLD shows an error if jalx target value is not word-aligned.
+
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t-exe %t-obj 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: The jalx target 0x{{[0-9a-f]+}} is not word-aligned
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 6
+ Size: 2
diff --git a/test/old-elf/Mips/jalx-jalr.test b/test/old-elf/Mips/jalx-jalr.test
new file mode 100644
index 000000000000..d02e9d7c2bac
--- /dev/null
+++ b/test/old-elf/Mips/jalx-jalr.test
@@ -0,0 +1,47 @@
+# Check that R_MIPS_JALR relocation does not affect code in case of cross jump.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9a-f]+}} 08002003 00000000
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_MICROMIPS, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Content: "0800200300000000"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: M1
+ Type: R_MIPS_JALR
+
+Symbols:
+ Global:
+ - Name: __start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: M1
+ Type: STT_FUNC
+ Section: .text
+ Value: 4
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
diff --git a/test/old-elf/Mips/jalx.test b/test/old-elf/Mips/jalx.test
new file mode 100644
index 000000000000..60d6ea71193c
--- /dev/null
+++ b/test/old-elf/Mips/jalx.test
@@ -0,0 +1,71 @@
+# Check jal => jalx conversion in case of mixed microMIPS and regular code.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T1 -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+# RUN: llvm-nm %t.exe | FileCheck -check-prefix=SYM %s
+
+# RAW: Contents of section .text:
+# RAW-NEXT: 400130 00000000 4c001074 10f04d00 4e001074
+
+# SYM: 00400138 T M1
+# SYM: 00400130 T M2
+# SYM: 0040013c T T1
+# SYM: 00400134 T T2
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_MICROMIPS, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Content: "000000000000000c00f400000000000c"
+# ^ M2 ^ T2 ^ M1 ^ T1
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 4
+ Symbol: M2
+ Type: R_MIPS_26
+ - Offset: 8
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+ - Offset: 12
+ Symbol: M1
+ Type: R_MIPS_26
+
+Symbols:
+ Global:
+ - Name: M2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Value: 4
+ Size: 4
+ - Name: M1
+ Type: STT_FUNC
+ Section: .text
+ Value: 8
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 12
+ Size: 4
diff --git a/test/old-elf/Mips/jump-fix-err.test b/test/old-elf/Mips/jump-fix-err.test
new file mode 100644
index 000000000000..0e5a5298a731
--- /dev/null
+++ b/test/old-elf/Mips/jump-fix-err.test
@@ -0,0 +1,45 @@
+# Check that LLD shows an error in case
+# of replacing an unknown unstruction by jalx.
+
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: not lld -flavor old-gnu -target mipsel -o %t-exe %t-obj 2>&1 | FileCheck %s
+
+# CHECK: Unsupported jump opcode (0x0) for ISA modes cross call
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T0
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Type: STT_FUNC
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
diff --git a/test/old-elf/Mips/la25-stub-be.test b/test/old-elf/Mips/la25-stub-be.test
new file mode 100644
index 000000000000..9527e7a80644
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub-be.test
@@ -0,0 +1,113 @@
+# REQUIRES: mips
+
+# Check LA25 stubs creation in the big-endian case.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o
+# RUN: lld -flavor old-gnu -target mips -o %t.exe %t-npic.o %t-pic.o %t-main.o
+
+# RUN: llvm-objdump -disassemble %t.exe | FileCheck %s
+
+# CHECK: 400170: 3c 19 00 40 lui $25, 64
+# CHECK-NEXT: 400174: 08 10 00 50 j 4194624
+# CHECK-NEXT: 400178: 27 39 01 40 addiu $25, $25, 320
+# CHECK-NEXT: 40017c: 00 00 00 00 nop
+
+# npic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1N
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# main.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 40
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 8
+ Symbol: .text
+ Type: R_MIPS_26
+ - Offset: 16
+ Symbol: __start
+ Type: R_MIPS_26
+ - Offset: 24
+ Symbol: T1N
+ Type: R_MIPS_26
+ - Offset: 32
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 16
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: __start
+ Section: .text
+ - Name: T1
+ - Name: T1N
+...
diff --git a/test/old-elf/Mips/la25-stub-micro-be.test b/test/old-elf/Mips/la25-stub-micro-be.test
new file mode 100644
index 000000000000..0bea3e6ac8b0
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub-micro-be.test
@@ -0,0 +1,121 @@
+# REQUIRES: mips
+
+# Check LA25 stubs creation in the big-endian case.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o
+# RUN: lld -flavor old-gnu -target mips -o %t.exe %t-npic.o %t-pic.o %t-main.o
+
+# RUN: llvm-objdump -disassemble -mattr=micromips %t.exe | FileCheck %s
+
+# CHECK: 400170: 41 be 00 40 lui $fp, 64
+# CHECK-NEXT: 400174: d4 20 00 a0 j 4194624
+# CHECK-NEXT: 400178: 33 39 01 41 addiu $25, $25, 321
+# CHECK-NEXT: 40017c: 00 00 00 00 nop
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_CPIC, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1N
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+
+# main.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_CPIC, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Content: '0000000000000000f400000000000000f400000000000000f400000000000000f400000000000000'
+# jal loc jal glob jal T1N jal T1
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 8
+ Symbol: .text
+ Type: R_MICROMIPS_26_S1
+ - Offset: 16
+ Symbol: glob
+ Type: R_MICROMIPS_26_S1
+ - Offset: 24
+ Symbol: T1N
+ Type: R_MICROMIPS_26_S1
+ - Offset: 32
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 16
+ Size: 24
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: __start
+ Section: .text
+ Size: 16
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ - Name: T1N
+...
diff --git a/test/old-elf/Mips/la25-stub-micro.test b/test/old-elf/Mips/la25-stub-micro.test
new file mode 100644
index 000000000000..c01da5908829
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub-micro.test
@@ -0,0 +1,136 @@
+# Check microMIPS LA25 stubs creation when PIC code
+# is called from non-PIC routines.
+
+# Build executable from pic and non-pic code.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe \
+# RUN: %t-npic.o %t-pic.o %t-main.o
+
+# RUN: llvm-nm %t.exe | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=ASM %s
+
+# SYM: 00400140 T T1
+# SYM: 00400130 T T1N
+# SYM: 00400144 T glob
+# SYM: 00400154 t loc
+
+# ASM: Contents of section .text:
+# ASM-NEXT: 400130 00000000 00000000 00000000 00000000
+# ASM-NEXT: 400140 00000000 00000000 00000000 10f05100
+# 0x100055 << 2 == 0x400154 (jalx glob) --^
+# ASM-NEXT: 400150 00000000 20f4a200 00000000 20f49800
+# ^-- 0x100055 << 2 == 0x400154 (jal glob)
+# 0x10004c << 2 == 0x400130 (jal T1N) --^
+# ASM-NEXT: 400160 00000000 20f4b800 00000000 00000000
+# ^-- 0x100054 << 2 == 0x400170 (jal T1 stub)
+# ASM-NEXT: 400170 b9414000 20d4a000 39334101 00000000
+# ^-- j 0x400140 (T1)
+
+# npic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_CPIC, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x04
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1N
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x04
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+
+# main.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_CPIC, EF_MIPS_MICROMIPS ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '000000000000000000f400000000000000f400000000000000f400000000000000f4000000000000'
+# jal loc jal glob jal T1N jal T1
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x08
+ Symbol: .text
+ Type: R_MICROMIPS_26_S1
+ - Offset: 0x10
+ Symbol: glob
+ Type: R_MICROMIPS_26_S1
+ - Offset: 0x18
+ Symbol: T1N
+ Type: R_MICROMIPS_26_S1
+ - Offset: 0x20
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 0x10
+ Size: 0x18
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ Size: 0x10
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ - Name: T1N
+...
diff --git a/test/old-elf/Mips/la25-stub-npic-01.test b/test/old-elf/Mips/la25-stub-npic-01.test
new file mode 100644
index 000000000000..9ff6af06cb2b
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub-npic-01.test
@@ -0,0 +1,153 @@
+# Check that LA25 stubs are created for branch relocations
+# when a PIC function is called from non-pic code.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-reg.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe \
+# RUN: %t-reg.o %t-micro.o %t-pic.o
+
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK-NOT: Contents of section .plt:
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400130 5c001000 0f000000 0e000000 0d000000
+# ^ T0 ^ .pic.T1 (0x400170)
+# ^ 0x400134 + 0x3c = 0x400170
+# ^ ...
+# CHECK-NEXT: 400140 2000c000 1e000000 1c000000 00001a00
+# ^ T3 ^ .pic.T2
+# ^ ...
+# CHECK-NEXT: 400150 00000c00 00000000 00000000 00000000
+# CHECK-NEXT: 400160 00000000 00000000 00000000 00000000
+# ^ T1 ^ T2
+# CHECK-NEXT: 400170 4000193c 58001008 60013927 00000000
+# ^ .pic.T1
+# CHECK-NEXT: 400180 b9414000 20d4b200 39336501 00000000
+# ^ .pic.T2
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400130 g F .text 00000010 T0
+# CHECK: 00400140 g F .text 00000014 T3
+# CHECK: 00400160 g F .text 00000004 T1
+# CHECK: 00400164 g F .text 00000004 T2
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32,
+ EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+
+# reg.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 16
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_26
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_PC16
+ - Offset: 8
+ Symbol: T1
+ Type: R_MIPS_PC21_S2
+ - Offset: 12
+ Symbol: T1
+ Type: R_MIPS_PC26_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Size: 16
+ - Name: T1
+
+# micro.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 20
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+ - Offset: 4
+ Symbol: T2
+ Type: R_MICROMIPS_PC7_S1
+ - Offset: 8
+ Symbol: T2
+ Type: R_MICROMIPS_PC10_S1
+ - Offset: 12
+ Symbol: T2
+ Type: R_MICROMIPS_PC16_S1
+ - Offset: 16
+ Symbol: T2
+ Type: R_MICROMIPS_PC23_S2
+
+Symbols:
+ Global:
+ - Name: T3
+ Section: .text
+ Size: 20
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/la25-stub-npic-02.test b/test/old-elf/Mips/la25-stub-npic-02.test
new file mode 100644
index 000000000000..4f2eb14d8c92
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub-npic-02.test
@@ -0,0 +1,123 @@
+# Check that LA25 stubs are created for branch relocations
+# when a PIC function is defined in a non-PIC file and
+# is called from non-pic code.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t1.o %t2.o
+
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK-NOT: Contents of section .plt:
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400130 00000000 00000000 58001000 09000000
+# ^ T1 ^ T2 ^ .pic.T1 (0x400160)
+# CHECK-NEXT: 400140 08000000 07000000 2000b800 12000000
+# ^ .pic.T2 (0x400170)
+# CHECK-NEXT: 400150 10000000 00000e00 00000600 00000000
+# CHECK-NEXT: 400160 4000193c 4c001008 30013927 00000000
+# ^ .pic.T1
+# CHECK-NEXT: 400170 b9414000 20d49a00 39333501 00000000
+# ^ .pic.T2
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400130 g F .text 00000004 T1
+# CHECK: 00400134 g F .text 00000004 T2
+# CHECK: 00400138 g F .text 00000010 T0
+# CHECK: 00400148 g F .text 00000014 T3
+
+# 1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ Other: [STO_MIPS_PIC]
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS, STO_MIPS_PIC]
+
+# 2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 36
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_26
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_PC16
+ - Offset: 8
+ Symbol: T1
+ Type: R_MIPS_PC21_S2
+ - Offset: 12
+ Symbol: T1
+ Type: R_MIPS_PC26_S2
+ - Offset: 16
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+ - Offset: 20
+ Symbol: T2
+ Type: R_MICROMIPS_PC7_S1
+ - Offset: 24
+ Symbol: T2
+ Type: R_MICROMIPS_PC10_S1
+ - Offset: 28
+ Symbol: T2
+ Type: R_MICROMIPS_PC16_S1
+ - Offset: 32
+ Symbol: T2
+ Type: R_MICROMIPS_PC23_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Value: 0
+ Size: 16
+ - Name: T3
+ Section: .text
+ Value: 16
+ Size: 20
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/la25-stub-npic-shared.test b/test/old-elf/Mips/la25-stub-npic-shared.test
new file mode 100644
index 000000000000..72bac30f86ad
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub-npic-shared.test
@@ -0,0 +1,152 @@
+# Check that PLT entries are created for branch relocations
+# when a PIC shared library function is called from non-pic code.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-reg.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-pic.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-reg.o %t-micro.o %t.so
+
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .plt:
+# CHECK-NEXT: 400190 40001c3c 0020998f 00209c27 23c01c03
+# CHECK-NEXT: 4001a0 2578e003 82c01800 09f82003 feff1827
+# CHECK-NEXT: 4001b0 40000f3c 0820f98d 08002003 0820f825
+# ^ PLT.T1
+# CHECK-NEXT: 4001c0 00799307 22ff0000 9945020f
+# ^ PLT.T2
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 4001cc 6c001000 f8ff0000 f7ff1f00 f6ffff03
+# ^ T0 ^ PLT.T1 (0x4001b0)
+# ^ 0x4001d0 -32 = 0x4001b0
+# ^ ...
+# CHECK-NEXT: 4001dc 2000e000 70000000 ee030000 0000ecff
+# ^ T3 ^ PLT.T2
+# ^ ...
+# CHECK-NEXT: 4001ec 7f00f5ff
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 004001cc g F .text 00000010 T0
+# CHECK: 004001dc g F .text 00000014 T3
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32,
+ EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+
+# reg.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 16
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_26
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_PC16
+ - Offset: 8
+ Symbol: T1
+ Type: R_MIPS_PC21_S2
+ - Offset: 12
+ Symbol: T1
+ Type: R_MIPS_PC26_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Size: 16
+ - Name: T1
+
+# micro.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 20
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+ - Offset: 4
+ Symbol: T2
+ Type: R_MICROMIPS_PC7_S1
+ - Offset: 8
+ Symbol: T2
+ Type: R_MICROMIPS_PC10_S1
+ - Offset: 12
+ Symbol: T2
+ Type: R_MICROMIPS_PC16_S1
+ - Offset: 16
+ Symbol: T2
+ Type: R_MICROMIPS_PC23_S2
+
+Symbols:
+ Global:
+ - Name: T3
+ Section: .text
+ Size: 20
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/la25-stub-pic.test b/test/old-elf/Mips/la25-stub-pic.test
new file mode 100644
index 000000000000..8db88404aaef
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub-pic.test
@@ -0,0 +1,144 @@
+# Check that we do not create LA26 stubs and PLT entries
+# when a PIC function is called from PIC code.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-reg.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-micro.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o %t-reg.o %t-micro.o
+
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK-NOT: Contents of section .plt:
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400130 00000000 00000000 4c001000 fdff0000
+# ^ T1 ^ T2 ^ T1 (0x400130)
+# ^ 0x40013c - 12 = 0x0x400130
+# CHECK-NEXT: 400140 fcff1f00 fbffff03 20009a00 74000000
+# ^ T2 (0x400134)
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 00400130 g F .text 00000004 T1
+# CHECK: 00400134 g F .text 00000004 T2
+# CHECK: 00400138 g F .text 00000010 T0
+# CHECK: 00400148 g F .text 00000014 T3
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32,
+ EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+
+# reg.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 16
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_26
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_PC16
+ - Offset: 8
+ Symbol: T1
+ Type: R_MIPS_PC21_S2
+ - Offset: 12
+ Symbol: T1
+ Type: R_MIPS_PC26_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Size: 16
+ - Name: T1
+
+# micro.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32,
+ EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 20
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+ - Offset: 4
+ Symbol: T2
+ Type: R_MICROMIPS_PC7_S1
+ - Offset: 8
+ Symbol: T2
+ Type: R_MICROMIPS_PC10_S1
+ - Offset: 12
+ Symbol: T2
+ Type: R_MICROMIPS_PC16_S1
+ - Offset: 16
+ Symbol: T2
+ Type: R_MICROMIPS_PC23_S2
+
+Symbols:
+ Global:
+ - Name: T3
+ Section: .text
+ Size: 20
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/la25-stub.test b/test/old-elf/Mips/la25-stub.test
new file mode 100644
index 000000000000..4df7f85e8c89
--- /dev/null
+++ b/test/old-elf/Mips/la25-stub.test
@@ -0,0 +1,133 @@
+# Check LA25 stubs creation when PIC code is called from non-PIC routines.
+
+# Build executable from pic and non-pic code.
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-npic.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-pic.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-main.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe \
+# RUN: %t-npic.o %t-pic.o %t-main.o
+
+# RUN: llvm-readobj -t %t.exe | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=ASM %s
+
+# SYM: Name: loc (13)
+# SYM-NEXT: Value: 0x400154
+# SYM: Name: T1N (1)
+# SYM-NEXT: Value: 0x400130
+# SYM: Name: T1 (5)
+# SYM-NEXT: Value: 0x400140
+# SYM: Name: glob (8)
+# SYM-NEXT: Value: 0x400144
+
+# ASM: Contents of section .text:
+# ASM-NEXT: 400130 00000000 00000000 00000000 00000000
+# ASM-NEXT: 400140 00000000 00000000 00000000 51001000
+# 0x100051 << 2 == 0x400144 (glob) --^
+# ASM-NEXT: 400150 00000000 51001000 00000000 4c001000
+# ^-- 0x100051 << 2 == 0x400144 (glob)
+# 0x100044 << 2 == 0x400110 (T1N) --^
+# ASM-NEXT: 400160 00000000 5c001000 00000000 00000000
+# ^-- 0x10005c << 2 == 0x400170 (T1 stub)
+# ASM-NEXT: 400170 4000193c 50001008 40013927 00000000
+# ^-- j 0x400140 (T1)
+
+# npic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x04
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1N
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# pic.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC, EF_MIPS_PIC ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x04
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# main.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32, EF_MIPS_CPIC ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x28
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x08
+ Symbol: .text
+ Type: R_MIPS_26
+ Addend: 0
+ - Offset: 0x10
+ Symbol: glob
+ Type: R_MIPS_26
+ Addend: 0
+ - Offset: 0x18
+ Symbol: T1N
+ Type: R_MIPS_26
+ Addend: 0
+ - Offset: 0x20
+ Symbol: T1
+ Type: R_MIPS_26
+ Addend: 0
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 0x10
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ - Name: T1
+ - Name: T1N
+...
diff --git a/test/old-elf/Mips/mips-options-01.test b/test/old-elf/Mips/mips-options-01.test
new file mode 100644
index 000000000000..8f2e63ca3b5f
--- /dev/null
+++ b/test/old-elf/Mips/mips-options-01.test
@@ -0,0 +1,34 @@
+# Check that LLD does not write a .MIPS.options section if input
+# object file does not contain such section.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o
+# RUN: llvm-readobj -s -dynamic-table %t.so | FileCheck %s
+
+# CHECK: Sections [
+# CHECK-NOT: Name: .MIPS.options
+
+# CHECK: DynamicSection [
+# CHECK-NOT: 0x{{[0-9A-F]+}} MIPS_OPTIONS
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/mips-options-02.test b/test/old-elf/Mips/mips-options-02.test
new file mode 100644
index 000000000000..a5f19e55735f
--- /dev/null
+++ b/test/old-elf/Mips/mips-options-02.test
@@ -0,0 +1,104 @@
+# Check merging input .MIPS.options sections.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t1.o %t2.o
+# RUN: llvm-readobj -s -dynamic-table %t.so | FileCheck -check-prefix=SEC %s
+# RUN: llvm-objdump -s -t %t.so | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -program-headers %t.so | FileCheck -check-prefix=PHDR %s
+
+# SEC: Index: 1
+# SEC-NEXT: Name: .MIPS.options (1)
+# SEC-NEXT: Type: SHT_MIPS_OPTIONS (0x7000000D)
+# SEC-NEXT: Flags [ (0x8000002)
+# SEC-NEXT: SHF_ALLOC (0x2)
+# SEC-NEXT: SHF_MIPS_NOSTRIP (0x8000000)
+# SEC-NEXT: ]
+# SEC-NEXT: Address: 0x[[OPT_ADDR:[0-9A-F]+]]
+# SEC-NEXT: Offset: {{[0-9A-F]+}}
+# SEC-NEXT: Size: 40
+# SEC-NEXT: Link: 0
+# SEC-NEXT: Info: 0
+# SEC-NEXT: AddressAlignment: 8
+# SEC-NEXT: EntrySize: 1
+
+# SEC: DynamicSection [
+# SEC: 0x{{[0-9A-F]+}} MIPS_OPTIONS 0x[[OPT_ADDR]]
+
+# RAW: Contents of section .MIPS.options:
+# RAW-NEXT: {{[0-9a-f]+}} 01280000 00000000 f0000001 00000000
+# RAW-NEXT: {{[0-9a-f]+}} e0000002 d0000003 b0000004 c0000005
+# RAW-NEXT: {{[0-9a-f]+}} f08f0000 00000000
+
+# RAW: SYMBOL TABLE:
+# RAW: 0000000000008ff0 g *ABS* 00000000 _gp
+
+# Check that %t.so contains only two PT_LOAD segments
+# PHDR: ProgramHeaders
+# PHDR: Type: PT_LOAD
+# PHDR: Type: PT_LOAD
+# PHDR-NOT: Type: PT_LOAD
+# PHDR: Type: PT_DYNAMIC
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+# v ODK_NULL 0x18 bytes long v ODK_REGINFO
+ Content: "0018000000000000000000000000000000000000000000000128000000000000F000000000000000E0000000D0000000B0000000C00000000010000000000000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+# v ODK_NULL 0x18 bytes long v ODK_REGINFO
+ Content: "00180000000000000000000000000000000000000000000001280000000000000000000100000000000000020000000300000004000000050000010000000000"
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/mips-options-03.test b/test/old-elf/Mips/mips-options-03.test
new file mode 100644
index 000000000000..a0dea5709b6f
--- /dev/null
+++ b/test/old-elf/Mips/mips-options-03.test
@@ -0,0 +1,41 @@
+# Check handling a zero-filled input .MIPS.options section.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o
+# RUN: llvm-objdump -s -t %t.so | FileCheck %s
+
+# CHECK: Contents of section .MIPS.options:
+# CHECK-NEXT: {{[0-9a-f]+}} 01280000 00000000 00000000 00000000
+# CHECK-NEXT: {{[0-9a-f]+}} 00000000 00000000 00000000 00000000
+# CHECK-NEXT: {{[0-9a-f]+}} f08f0000 00000000
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 00008ff0 g *ABS* 00000000 _gp
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+ Content: "01280000000000000000000000000000000000000000000000000000000000000000000000000000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/mips-options-04.test b/test/old-elf/Mips/mips-options-04.test
new file mode 100644
index 000000000000..5df94aae9257
--- /dev/null
+++ b/test/old-elf/Mips/mips-options-04.test
@@ -0,0 +1,77 @@
+# Check that .MIPS.options sections from shared libraries do not affect
+# output .MIPS.options section content.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t.exe.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.so %t.exe.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .MIPS.options:
+# CHECK-NEXT: {{[0-9a-f]+}} 01280000 00000000 44444444 00000000
+# CHECK-NEXT: {{[0-9a-f]+}} 44444444 44444444 44444444 44444444
+# CHECK-NEXT: {{[0-9a-f]+}} f08f0020 01000000
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 20008ff0 g *ABS* 00000000 _gp
+
+# t.so.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+ Content: "01280000000000001111111100000000111111111111111111111111111111110010000000000000"
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t.exe.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+ Content: "01280000000000004444444400000000444444444444444444444444444444440010000000000000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/mips-options-05.test b/test/old-elf/Mips/mips-options-05.test
new file mode 100644
index 000000000000..f7e9728b3cf4
--- /dev/null
+++ b/test/old-elf/Mips/mips-options-05.test
@@ -0,0 +1,119 @@
+# Check that .MIPS.options section gets register usage mask from "used" files
+# only. In this test case we take only t2.o from liboptions.a and should not
+# add register usage masks from t1.o to the output .MIPS.options section.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: llvm-ar q %T/liboptions.a %t1.o %t2.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t3.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t3.o -L%T -loptions
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .MIPS.options:
+# CHECK-NEXT: {{[0-9a-f]+}} 01280000 00000000 66666666 00000000
+# CHECK-NEXT: {{[0-9a-f]+}} 66666666 66666666 66666666 66666666
+# CHECK-NEXT: {{[0-9a-f]+}} f08f0020 01000000
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 20008ff0 g *ABS* 00000000 _gp
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+ Content: "01280000000000001111111100000000111111111111111111111111111111110010000000000000"
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+ Content: "01280000000000002222222200000000222222222222222222222222222222220010000000000000"
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t3.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T2
+ Type: R_MIPS_32
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 8
+ Content: "01280000000000004444444400000000444444444444444444444444444444440010000000000000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/mips-options-gp0.test b/test/old-elf/Mips/mips-options-gp0.test
new file mode 100644
index 000000000000..73e578347f2c
--- /dev/null
+++ b/test/old-elf/Mips/mips-options-gp0.test
@@ -0,0 +1,77 @@
+# Check reading GP0 value from .MIPS.options section
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -e G1 -shared -o %t.so %t.o
+# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s
+
+# SYM: Name: L1
+# SYM-NEXT: Value: 0x15C
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Local (0x0)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x5)
+
+# SYM: Name: _gp
+# SYM-NEXT: Value: 0x8FF0
+# SYM-NEXT: Size: 0
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Object (0x1)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: Absolute (0xFFF1)
+
+# 0xffff816c == 0x0 (addend) + 0x015C (L1) + 0x1000 (GP0) - 0x8ff0 (_gp)
+# SEC: Contents of section .rodata:
+# SEC-NEXT: {{[0-9a-f]+}} 6c81ffff 00000000 00000000 00000000
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64R2 ]
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+
+- Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 16
+
+- Name: .rel.rodata
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0
+ Symbol: L1
+ Type: R_MIPS_GPREL32
+
+- Name: .MIPS.options
+ Type: SHT_MIPS_OPTIONS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x01
+ Content: "012800000000000000000000000000000000000000000000000000000000000000100000"
+
+Symbols:
+ Local:
+ - Name: L1
+ Section: .text
+ Value: 0x00
+ Size: 0x04
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
+ Global:
+ - Name: G1
+ Section: .text
+ Value: 0x04
+ Size: 0x04
diff --git a/test/old-elf/Mips/n32-rela-chain.test b/test/old-elf/Mips/n32-rela-chain.test
new file mode 100644
index 000000000000..9569eb7c5855
--- /dev/null
+++ b/test/old-elf/Mips/n32-rela-chain.test
@@ -0,0 +1,68 @@
+# Check grouping of multiple consecutive relocations in case of N32
+# and 64-bit MIPS ABIs.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 10000130 00001001 00002004
+
+# CHECK: 10002000 l .data 00000004 D0
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64, EF_MIPS_ABI2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 8
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: D0
+ Type: R_MIPS_32
+ Addend: 0x10000
+ - Offset: 0
+ Symbol: D0
+ Type: R_MIPS_HI16
+ - Offset: 4
+ Symbol: D0
+ Type: R_MIPS_32
+ Addend: 4
+ - Offset: 4
+ Symbol: D0
+ Type: R_MIPS_LO16
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Local:
+ - Name: D0
+ Type: STT_FUNC
+ Section: .data
+ Value: 0
+ Size: 4
+ Global:
+ - Name: __start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 8
+...
diff --git a/test/old-elf/Mips/n64-rel-chain.test b/test/old-elf/Mips/n64-rel-chain.test
new file mode 100644
index 000000000000..3797c4321701
--- /dev/null
+++ b/test/old-elf/Mips/n64-rel-chain.test
@@ -0,0 +1,204 @@
+# Check handling MIPS N64 ABI relocation "chains".
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -s -t -dt -mips-plt-got %t.exe | \
+# RUN: FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+
+# SYM: Section {
+# SYM: Index: 6
+# SYM-NEXT: Name: .rodata
+# SYM-NEXT: Type: SHT_PROGBITS
+# SYM-NEXT: Flags [
+# SYM-NEXT: SHF_ALLOC
+# SYM-NEXT: ]
+# SYM-NEXT: Address: 0x120000230
+#
+# SYM: Symbol {
+# SYM: Name: LT1
+# SYM-NEXT: Value: 0x120000210
+# SYM-NEXT: Size: 16
+# SYM-NEXT: Binding: Global
+# SYM-NEXT: Type: Function
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text
+# SYM-NEXT: }
+# SYM: Symbol {
+# SYM: Name: T0
+# SYM-NEXT: Value: 0x120000220
+# SYM-NEXT: Size: 16
+# SYM-NEXT: Binding: Global
+# SYM-NEXT: Type: Function
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text
+# SYM-NEXT: }
+# SYM: Symbol {
+# SYM: Name: T1@
+# SYM-NEXT: Value: 0x0
+# SYM-NEXT: Size: 0
+# SYM-NEXT: Binding: Global
+# SYM-NEXT: Type: Function
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: Undefined
+# SYM-NEXT: }
+#
+# SYM: Canonical gp value: 0x120008FF0
+# SYM: Local entries [
+# SYM-NEXT: Entry {
+# SYM-NEXT: Address: 0x{{[0-9A-F]+}}
+# SYM-NEXT: Access: -32736
+# SYM-NEXT: Initial: 0x120000000
+# SYM-NEXT: }
+# SYM-NEXT: ]
+# SYM-NEXT: Global entries [
+# SYM-NEXT: Entry {
+# SYM-NEXT: Address: 0x{{[0-9A-F]+}}
+# SYM-NEXT: Access: -32728
+# SYM-NEXT: Initial: 0x0
+# SYM-NEXT: Value: 0x0
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Section: Undefined (0x0)
+# SYM-NEXT: Name: T1@ (1)
+# SYM-NEXT: }
+# SYM-NEXT: ]
+
+# RAW: Contents of section .text:
+# RAW-NEXT: 120000210 01000000 00000000 e08d0000 00000000
+# ^
+# S - GP = 0x120000210 - 0x120008ff0 = -36320
+# S - A = 0 - (-36320) = 36320
+# (AHL + S + 0x8000) >> 16 = 1
+# ^
+# S - GP = 0x120000210 - 0x120008ff0 = -36320
+# S - A = 0 - (-36320) = 36320
+# AHL + S = 0x8DE0
+# RAW-NEXT: 120000220 20800000 38020000 28800000 00000000
+# ^ 0x8020 = -32736 GOT
+# ^ (0x120000230 + 8 - page) = 0x238
+# ^ 0x8028 = -32728
+# RAW: Contents of section .pdr:
+# RAW-NEXT: 0000 10020020 20020020
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 8
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 8
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 32
+
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 8
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: LT1
+ Type: R_MIPS_GPREL16
+ Type2: R_MIPS_SUB
+ Type3: R_MIPS_HI16
+ - Offset: 0x08
+ Symbol: LT1
+ Type: R_MIPS_GPREL16
+ Type2: R_MIPS_SUB
+ Type3: R_MIPS_LO16
+ - Offset: 0x10
+ Symbol: .rodata
+ Type: R_MIPS_GOT_PAGE
+ Addend: 8
+ - Offset: 0x14
+ Symbol: .rodata
+ Type: R_MIPS_GOT_OFST
+ Addend: 8
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MIPS_CALL16
+
+ - Name: .pdr
+ Type: SHT_PROGBITS
+ AddressAlign: 4
+ Size: 8
+
+ - Name: .rela.pdr
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 8
+ Info: .pdr
+ Relocations:
+ - Offset: 0x00
+ Symbol: LT1
+ Type: R_MIPS_32
+ - Offset: 0x04
+ Symbol: T0
+ Type: R_MIPS_32
+
+ - Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 16
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
+ - Name: .pdr
+ Type: STT_SECTION
+ Section: .pdr
+
+ Global:
+ - Name: LT1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x00
+ Size: 0x10
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x10
+ Size: 0x10
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/n64-rel-shift.test b/test/old-elf/Mips/n64-rel-shift.test
new file mode 100644
index 000000000000..31a780beb998
--- /dev/null
+++ b/test/old-elf/Mips/n64-rel-shift.test
@@ -0,0 +1,48 @@
+# Check that LLD shift right relocation result after calculation
+# each relocations in N64 relocation chain.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o
+# RUN: llvm-objdump -s %t.so | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9a-f]+}} 00000000 01000000 00000000 00000000
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 16
+
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 8
+ Info: .text
+ Relocations:
+ - Offset: 4
+ Symbol: T1
+ Addend: 8
+ Type: R_MIPS_PC19_S2
+ Type2: R_MIPS_64
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 8
+ - Name: bar
+ Type: STT_FUNC
+ Section: .text
+ Value: 8
+ Size: 8
diff --git a/test/old-elf/Mips/opt-emulation.test b/test/old-elf/Mips/opt-emulation.test
new file mode 100644
index 000000000000..a48b49bfaa02
--- /dev/null
+++ b/test/old-elf/Mips/opt-emulation.test
@@ -0,0 +1,43 @@
+# Check MIPS specific arguments of the -m command line option.
+
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -m elf32ltsmip -o %t-exe %t-obj
+# RUN: llvm-readobj -file-headers %t-exe | FileCheck -check-prefix=LE-O32 %s
+# RUN: lld -flavor old-gnu -target mipsel -melf32ltsmip -o %t-exe %t-obj
+# RUN: llvm-readobj -file-headers %t-exe | FileCheck -check-prefix=LE-O32 %s
+
+# LE-O32: Class: 32-bit (0x1)
+# LE-O32: DataEncoding: LittleEndian (0x1)
+# LE-O32: FileVersion: 1
+# LE-O32: OS/ABI: SystemV (0x0)
+# LE-O32: ABIVersion: 1
+# LE-O32: Machine: EM_MIPS (0x8)
+# LE-O32: Version: 1
+# LE-O32: Flags [ (0x70001005)
+# LE-O32-NEXT: EF_MIPS_ABI_O32 (0x1000)
+# LE-O32-NEXT: EF_MIPS_ARCH_32R2 (0x70000000)
+# LE-O32-NEXT: EF_MIPS_CPIC (0x4)
+# LE-O32-NEXT: EF_MIPS_NOREORDER (0x1)
+# LE-O32-NEXT: ]
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Value: 0x0
+ Size: 4
diff --git a/test/old-elf/Mips/pc23-range.test b/test/old-elf/Mips/pc23-range.test
new file mode 100644
index 000000000000..89e9ab7bb73f
--- /dev/null
+++ b/test/old-elf/Mips/pc23-range.test
@@ -0,0 +1,54 @@
+# Check that LLD shows an error if ADDIUPC immediate is out of range.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -o %t.exe %t.o 2>&1 | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}}: reference from __start+4 to T0+4 of type 173 (R_MICROMIPS_PC23_S2)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000080780100"
+# ^ PC23: 1 << 2 = 4 => T0 + 4 - 4 = T0
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x4000000
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 4
+ Symbol: T0
+ Type: R_MICROMIPS_PC23_S2
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Type: STT_FUNC
+ Size: 8
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: TZ
+ Section: .data
+ Type: STT_FUNC
+ Value: 0
+ Size: 0x2000000
+ - Name: T0
+ Section: .data
+ Type: STT_FUNC
+ Value: 0x2000000
+ Size: 4
diff --git a/test/old-elf/Mips/plt-entry-mixed-1.test b/test/old-elf/Mips/plt-entry-mixed-1.test
new file mode 100644
index 000000000000..e05eec4c8109
--- /dev/null
+++ b/test/old-elf/Mips/plt-entry-mixed-1.test
@@ -0,0 +1,114 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Object file contains both R_MIPS_26 and microMIPS non-jal relocations.
+# b) The R_MIPS_26 relocation handled first.
+# Check:
+# a) PLT contains the only regular entry.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .plt:
+# CHECK-NEXT: .plt:
+# CHECK-NEXT: 400170: 40 00 1c 3c lui $gp, 64
+# CHECK-NEXT: 400174: 00 20 99 8f lw $25, 8192($gp)
+# CHECK-NEXT: 400178: 00 20 9c 27 addiu $gp, $gp, 8192
+# CHECK-NEXT: 40017c: 23 c0 1c 03 subu $24, $24, $gp
+# CHECK-NEXT: 400180: 25 78 e0 03 move $15, $ra
+# CHECK-NEXT: 400184: 82 c0 18 00 srl $24, $24, 2
+# CHECK-NEXT: 400188: 09 f8 20 03 jalr $25
+# CHECK-NEXT: 40018c: fe ff 18 27 addiu $24, $24, -2
+# CHECK-NEXT: 400190: 40 00 0f 3c lui $15, 64
+# CHECK-NEXT: 400194: 08 20 f9 8d lw $25, 8200($15)
+# CHECK-NEXT: 400198: 08 00 20 03 jr $25
+# CHECK-NEXT: 40019c: 08 20 f8 25 addiu $24, $15, 8200
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000C00000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x8
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-entry-mixed-2.test b/test/old-elf/Mips/plt-entry-mixed-2.test
new file mode 100644
index 000000000000..299aa5ce065c
--- /dev/null
+++ b/test/old-elf/Mips/plt-entry-mixed-2.test
@@ -0,0 +1,93 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Object file contains both R_MIPS_26 and R_MICROMIPS_26_S1 relocations.
+# Check:
+# a) PLT contains both regular and compressed PLT entries
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# FIXME (simon): Check the disassembler output when llvm-objdump starts
+# to support microMIPS instruction encoding.
+
+# CHECK: Contents of section .plt:
+# CHECK-NEXT: 400170 40001c3c 0020998f 00209c27 23c01c03
+# CHECK-NEXT: 400180 2578e003 82c01800 09f82003 feff1827
+# CHECK-NEXT: 400190 40000f3c 0820f98d 08002003 0820f825
+# CHECK-NEXT: 4001a0 00799a07 22ff0000 9945020f
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000C000000000000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: T2
+ Type: R_MIPS_26
+ - Offset: 0x8
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 0x8
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/plt-entry-mixed-3.test b/test/old-elf/Mips/plt-entry-mixed-3.test
new file mode 100644
index 000000000000..c946ecc82d2f
--- /dev/null
+++ b/test/old-elf/Mips/plt-entry-mixed-3.test
@@ -0,0 +1,98 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Object file contains microMIPS instructions.
+# b) There is a relocation refers arbitrary symbols and requires a PLT entry.
+# Check:
+# a) PLT contains a compressed entry.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# FIXME (simon): Check the disassembler output when llvm-objdump starts
+# to support microMIPS instruction encoding.
+
+# CHECK: Contents of section .plt:
+# CHECK-NEXT: 400170 8079a407 23ff0000 35052525 0233feff .y..#...5.%%.3..
+# CHECK-NEXT: 400180 ff0df945 830f000c 0079a007 22ff0000 ...E.....y.."...
+# CHECK-NEXT: 400190 9945020f .E..
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 16
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 16
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-entry-mixed-4.test b/test/old-elf/Mips/plt-entry-mixed-4.test
new file mode 100644
index 000000000000..ba8b04866b98
--- /dev/null
+++ b/test/old-elf/Mips/plt-entry-mixed-4.test
@@ -0,0 +1,85 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Object file contains R_MIPS_26 relocation refers to the microMIPS symbol.
+# Check:
+# a) PLT contains a regular non-compressed entry.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t.o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o.o %t.so
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# FIXME (simon): Check the disassembler output when llvm-objdump starts
+# to support microMIPS instruction encoding.
+
+# CHECK: Contents of section .plt:
+# CHECK-NEXT: 400170 40001c3c 0020998f 00209c27 23c01c03
+# CHECK-NEXT: 400180 2578e003 82c01800 09f82003 feff1827
+# CHECK-NEXT: 400190 40000f3c 0820f98d 08002003 0820f825
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000C00000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x8
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-entry-r6-be.test b/test/old-elf/Mips/plt-entry-r6-be.test
new file mode 100644
index 000000000000..3e15ece894e0
--- /dev/null
+++ b/test/old-elf/Mips/plt-entry-r6-be.test
@@ -0,0 +1,109 @@
+# REQUIRES: mips
+
+# Check generation of PLT entries in case of R6 big-endian target ABI.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .plt:
+# CHECK-NEXT: .plt:
+# CHECK-NEXT: 400160: 3c 1c 00 40 lui $gp, 64
+# CHECK-NEXT: 400164: 8f 99 20 00 lw $25, 8192($gp)
+# CHECK-NEXT: 400168: 27 9c 20 00 addiu $gp, $gp, 8192
+# CHECK-NEXT: 40016c: 03 1c c0 23 subu $24, $24, $gp
+# CHECK-NEXT: 400170: 03 e0 78 25 move $15, $ra
+# CHECK-NEXT: 400174: 00 18 c0 82 srl $24, $24, 2
+# CHECK-NEXT: 400178: 03 20 f8 09 jalr $25
+# CHECK-NEXT: 40017c: 27 18 ff fe addiu $24, $24, -2
+# CHECK-NEXT: 400180: 3c 0f 00 40 lui $15, 64
+# CHECK-NEXT: 400184: 8d f9 20 08 lw $25, 8200($15)
+# CHECK-NEXT: 400188: 03 20 00 09 jr $25
+# CHECK-NEXT: 40018c: 25 f8 20 08 addiu $24, $15, 8200
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0C00000000000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x8
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-entry-r6.test b/test/old-elf/Mips/plt-entry-r6.test
new file mode 100644
index 000000000000..0d8bbf494afe
--- /dev/null
+++ b/test/old-elf/Mips/plt-entry-r6.test
@@ -0,0 +1,109 @@
+# REQUIRES: mips
+
+# Check generation of PLT entries in case of R6 target ABI.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .plt:
+# CHECK-NEXT: .plt:
+# CHECK-NEXT: 400160: 40 00 1c 3c lui $gp, 64
+# CHECK-NEXT: 400164: 00 20 99 8f lw $25, 8192($gp)
+# CHECK-NEXT: 400168: 00 20 9c 27 addiu $gp, $gp, 8192
+# CHECK-NEXT: 40016c: 23 c0 1c 03 subu $24, $24, $gp
+# CHECK-NEXT: 400170: 25 78 e0 03 move $15, $ra
+# CHECK-NEXT: 400174: 82 c0 18 00 srl $24, $24, 2
+# CHECK-NEXT: 400178: 09 f8 20 03 jalr $25
+# CHECK-NEXT: 40017c: fe ff 18 27 addiu $24, $24, -2
+# CHECK-NEXT: 400180: 40 00 0f 3c lui $15, 64
+# CHECK-NEXT: 400184: 08 20 f9 8d lw $25, 8200($15)
+# CHECK-NEXT: 400188: 09 00 20 03 jr $25
+# CHECK-NEXT: 40018c: 08 20 f8 25 addiu $24, $15, 8200
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000C00000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x8
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-header-be.test b/test/old-elf/Mips/plt-header-be.test
new file mode 100644
index 000000000000..e453e44f76d6
--- /dev/null
+++ b/test/old-elf/Mips/plt-header-be.test
@@ -0,0 +1,104 @@
+# REQUIRES: mips
+
+# Check initialization of big-endian .plt header entries.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -section-headers -disassemble %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .plt:
+# CHECK-NEXT: .plt:
+# CHECK-NEXT: 400160: 3c 1c 00 40 lui $gp, 64
+# CHECK-NEXT: 400164: 8f 99 20 00 lw $25, 8192($gp)
+# CHECK-NEXT: 400168: 27 9c 20 00 addiu $gp, $gp, 8192
+# CHECK-NEXT: 40016c: 03 1c c0 23 subu $24, $24, $gp
+# CHECK-NEXT: 400170: 03 e0 78 25 move $15, $ra
+# CHECK-NEXT: 400174: 00 18 c0 82 srl $24, $24, 2
+# CHECK-NEXT: 400178: 03 20 f8 09 jalr $25
+# CHECK-NEXT: 40017c: 27 18 ff fe addiu $24, $24, -2
+
+# CHECK-NEXT: 400180: 3c 0f 00 40 lui $15, 64
+# CHECK-NEXT: 400184: 8d f9 20 08 lw $25, 8200($15)
+# CHECK-NEXT: 400188: 03 20 00 08 jr $25
+# CHECK-NEXT: 40018c: 25 f8 20 08 addiu $24, $15, 8200
+
+# CHECK: Sections:
+# CHECK: Idx Name Size Address Type
+# CHECK: 6 .plt 00000030 0000000000400160 TEXT DATA
+# CHECK: 10 .got.plt 0000000c 0000000000402000 DATA
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 12
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 32
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 8
+ Symbol: .text
+ Type: R_MIPS_26
+ - Offset: 16
+ Symbol: __start
+ Type: R_MIPS_26
+ - Offset: 24
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 16
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+
+ Global:
+ - Name: __start
+ Section: .text
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-header-micro-be.test b/test/old-elf/Mips/plt-header-micro-be.test
new file mode 100644
index 000000000000..e9aa51ef85eb
--- /dev/null
+++ b/test/old-elf/Mips/plt-header-micro-be.test
@@ -0,0 +1,105 @@
+# REQUIRES: mips
+
+# Check initialization of .plt header entries
+# if all PLT entries use microMIPS big-endian encoding.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: lld -flavor old-gnu -target mips -shared -o %t.so %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mips -o %t.exe %t2.o %t.so
+# RUN: llvm-objdump -section-headers -d -mattr=micromips %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .plt:
+# CHECK-NEXT: .plt:
+# CHECK-NEXT: 400170: 79 80 07 a4 addiupc $3, 7824
+# CHECK-NEXT: 400174: ff 23 00 00 lw $25, 0($3)
+# CHECK-NEXT: 400178: 05 35 subu16 $2, $2, $3
+# CHECK-NEXT: 40017a: 25 25 srl16 $2, $2, 2
+# CHECK-NEXT: 40017c: 33 02 ff fe addiu $24, $2, -2
+# CHECK-NEXT: 400180: 0d ff move $15, $ra
+# CHECK-NEXT: 400182: 45 f9 jalrs16 $25
+# CHECK-NEXT: 400184: 0f 83 move $gp, $3
+# CHECK-NEXT: 400186: 0c 00 nop
+
+# CHECK-NEXT: 400188: 79 00 07 a0 addiupc $2, 7808
+# CHECK-NEXT: 40018c: ff 22 00 00 lw $25, 0($2)
+# CHECK-NEXT: 400190: 45 99 jr16 $25
+# CHECK-NEXT: 400192: 0f 02 move $24, $2
+
+# CHECK: Sections:
+# CHECK: Idx Name Size Address Type
+# CHECK: 6 .plt 00000024 0000000000400170 TEXT DATA
+# CHECK: 10 .got.plt 0000000c 0000000000402000 DATA
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 12
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '0000000000000000f40000000000000000000000f400000000000000f4000000'
+# jal .text jal __start jal T1
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 8
+ Symbol: .text
+ Type: R_MICROMIPS_26_S1
+ - Offset: 20
+ Symbol: __start
+ Type: R_MICROMIPS_26_S1
+ - Offset: 28
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 16
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: __start
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-header-micro.test b/test/old-elf/Mips/plt-header-micro.test
new file mode 100644
index 000000000000..743c4c332184
--- /dev/null
+++ b/test/old-elf/Mips/plt-header-micro.test
@@ -0,0 +1,108 @@
+# REQUIRES: mips
+
+# Check initialization of .plt header entries
+# if all PLT entries use microMIPS encoding.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck -check-prefix=DIS %s
+# RUN: llvm-objdump -section-headers %t.exe | FileCheck -check-prefix=EXE %s
+
+# DIS: Disassembly of section .plt:
+# DIS-NEXT: .plt:
+# DIS-NEXT: 400170: 80 79 a4 07 addiupc $3, 7824
+# DIS-NEXT: 400174: 23 ff 00 00 lw $25, 0($3)
+# DIS-NEXT: 400178: 35 05 subu16 $2, $2, $3
+# DIS-NEXT: 40017a: 25 25 srl16 $2, $2, 2
+# DIS-NEXT: 40017c: 02 33 fe ff addiu $24, $2, -2
+# DIS-NEXT: 400180: ff 0d move $15, $ra
+# DIS-NEXT: 400182: f9 45 jalrs16 $25
+# DIS-NEXT: 400184: 83 0f move $gp, $3
+# DIS-NEXT: 400186: 00 0c nop
+
+# DIS-NEXT: 400188: 00 79 a0 07 addiupc $2, 7808
+# DIS-NEXT: 40018c: 22 ff 00 00 lw $25, 0($2)
+# DIS-NEXT: 400190: 99 45 jr16 $25
+# DIS-NEXT: 400192: 02 0f move $24, $2
+
+# EXE: Sections:
+# EXE: Idx Name Size Address Type
+# EXE: 6 .plt 00000024 0000000000400170 TEXT DATA
+# EXE: 10 .got.plt 0000000c 0000000000402000 DATA
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '000000000000000000f4000000000000f400000000000000f400000000000000'
+# jal .text jal glob jal T1
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x08
+ Symbol: .text
+ Type: R_MICROMIPS_26_S1
+ - Offset: 0x10
+ Symbol: glob
+ Type: R_MICROMIPS_26_S1
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 0x10
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-header-mixed.test b/test/old-elf/Mips/plt-header-mixed.test
new file mode 100644
index 000000000000..456f5a91c98b
--- /dev/null
+++ b/test/old-elf/Mips/plt-header-mixed.test
@@ -0,0 +1,105 @@
+# REQUIRES: mips
+
+# Check initialization of .plt header entries if there are both regular
+# and microMIPS encoded PLT entries. Check that R_MIPS_26 and R_MICROMIPS_26_S1
+# relocation with the same target cause generation of two distinct PLT entries.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e globR -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -d %t.exe | FileCheck -check-prefix=DIS %s
+# RUN: llvm-objdump -section-headers %t.exe | FileCheck -check-prefix=EXE %s
+
+# DIS: Disassembly of section .plt:
+# DIS-NEXT: .plt:
+# DIS-NEXT: 400170: 40 00 1c 3c lui $gp, 64
+# DIS-NEXT: 400174: 00 20 99 8f lw $25, 8192($gp)
+# DIS-NEXT: 400178: 00 20 9c 27 addiu $gp, $gp, 8192
+# DIS-NEXT: 40017c: 23 c0 1c 03 subu $24, $24, $gp
+# DIS-NEXT: 400180: 25 78 e0 03 move $15, $ra
+# DIS-NEXT: 400184: 82 c0 18 00 srl $24, $24, 2
+# DIS-NEXT: 400188: 09 f8 20 03 jalr $25
+# DIS-NEXT: 40018c: fe ff 18 27 addiu $24, $24, -2
+
+# DIS-NEXT: 400190: 40 00 0f 3c lui $15, 64
+# DIS-NEXT: 400194: 08 20 f9 8d lw $25, 8200($15)
+# DIS-NEXT: 400198: 08 00 20 03 jr $25
+# DIS-NEXT: 40019c: 08 20 f8 25 addiu $24, $15, 8200
+
+# FIXME (simon): Check micromips PLT entry
+# DIS-NEXT: 4001a8: 99 45 02 0f jal 201922148
+
+# EXE: Sections:
+# EXE: Idx Name Size Address Type
+# EXE: 6 .plt 0000003c 0000000000400170 TEXT DATA
+# EXE: 10 .got.plt 0000000c 0000000000402000 DATA
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x8
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x0
+ Symbol: T1
+ Type: R_MIPS_26
+ - Offset: 0x4
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Global:
+ - Name: globR
+ Section: .text
+ Value: 0x0
+ Size: 0x4
+ - Name: globM
+ Section: .text
+ Value: 0x4
+ Size: 0x4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/plt-header.test b/test/old-elf/Mips/plt-header.test
new file mode 100644
index 000000000000..6d303254d16d
--- /dev/null
+++ b/test/old-elf/Mips/plt-header.test
@@ -0,0 +1,99 @@
+# REQUIRES: mips
+
+# Check initialization of .plt header entries.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -section-headers -disassemble %t.exe | \
+# RUN: FileCheck -check-prefix=EXE %s
+
+# EXE: Disassembly of section .plt:
+# EXE: .plt:
+# PLT0 entry. Points to the .got.plt[0]
+# EXE-NEXT: 400160: 40 00 1c 3c lui $gp, 64
+# EXE-NEXT: 400164: 00 20 99 8f lw $25, 8192($gp)
+# EXE-NEXT: 400168: 00 20 9c 27 addiu $gp, $gp, 8192
+# EXE-NEXT: 40016c: 23 c0 1c 03 subu $24, $24, $gp
+# EXE-NEXT: 400170: 25 78 e0 03 move $15, $ra
+# EXE-NEXT: 400174: 82 c0 18 00 srl $24, $24, 2
+# EXE-NEXT: 400178: 09 f8 20 03 jalr $25
+# EXE-NEXT: 40017c: fe ff 18 27 addiu $24, $24, -2
+
+# EXE: Sections:
+# EXE: Idx Name Size Address Type
+# EXE: 6 .plt 00000030 0000000000400160 TEXT DATA
+# EXE: 10 .got.plt 0000000c 0000000000402000 DATA
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x20
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x08
+ Symbol: .text
+ Type: R_MIPS_26
+ - Offset: 0x10
+ Symbol: glob
+ Type: R_MIPS_26
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 0x10
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/r26-1-micro.test b/test/old-elf/Mips/r26-1-micro.test
new file mode 100644
index 000000000000..c59b5aa61a53
--- /dev/null
+++ b/test/old-elf/Mips/r26-1-micro.test
@@ -0,0 +1,131 @@
+# REQUIRES: mips
+
+# Check handling of R_MICROMIPS_26_S1 relocation.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: llvm-readobj -relocations %t-o.o | \
+# RUN: FileCheck -check-prefix=OBJ-REL %s
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -relocations %t.exe | FileCheck -check-prefix=EXE-REL %s
+# RUN: llvm-objdump -section-headers %t.exe | FileCheck -check-prefix=EXE %s
+# RUN: llvm-objdump -s -d -mattr=micromips %t.exe | \
+# RUN: FileCheck -check-prefix=DIS %s
+
+# Object file has three R_MICROMIPS_26_S1 relocations
+# OBJ-REL: Relocations [
+# OBJ-REL-NEXT: Section (2) .rel.text {
+# OBJ-REL-NEXT: 0x8 R_MICROMIPS_26_S1 loc 0x0
+# OBJ-REL-NEXT: 0x10 R_MICROMIPS_26_S1 glob 0x0
+# OBJ-REL-NEXT: 0x18 R_MICROMIPS_26_S1 T1 0x0
+# OBJ-REL-NEXT: }
+# OBJ-REL-NEXT: ]
+
+# Executable file has the only relocation for external symbol
+# EXE-REL: Relocations [
+# EXE-REL-NEXT: Section (5) .rel.plt {
+# EXE-REL-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0
+# EXE-REL-NEXT: }
+# EXE-REL-NEXT: ]
+
+# EXE: Sections:
+# EXE: Idx Name Size Address Type
+# EXE: 6 .plt 00000024 0000000000400160 TEXT DATA
+# EXE: 10 .got.plt 0000000c 0000000000402000 DATA
+
+# DIS: Disassembly of section .plt:
+# DIS-NEXT: .plt:
+# DIS-NEXT: 400160: 80 79 a8 07 addiupc $3, 7840
+# DIS-NEXT: 400164: 23 ff 00 00 lw $25, 0($3)
+# DIS-NEXT: 400168: 35 05 subu16 $2, $2, $3
+# DIS-NEXT: 40016a: 25 25 srl16 $2, $2, 2
+# DIS-NEXT: 40016c: 02 33 fe ff addiu $24, $2, -2
+# DIS-NEXT: 400170: ff 0d move $15, $ra
+# DIS-NEXT: 400172: f9 45 jalrs16 $25
+# DIS-NEXT: 400174: 83 0f move $gp, $3
+# DIS-NEXT: 400176: 00 0c nop
+
+# DIS-NEXT: 400178: 00 79 a4 07 addiupc $2, 7824
+# DIS-NEXT: 40017c: 22 ff 00 00 lw $25, 0($2)
+# DIS-NEXT: 400180: 99 45 jr16 $25
+# DIS-NEXT: 400182: 02 0f move $24, $2
+
+# DIS: Contents of section .text:
+# DIS-NEXT: 400184 09f82003 00000000 2400ca0c 00000000 .. .....$.......
+# DIS-NEXT: 400194 2000c20c 00000000 2000bc0c 00000000 ....... .......
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '09F82003000000000400000C000000000000000C000000000000000C00000000'
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x08
+ Symbol: loc
+ Type: R_MICROMIPS_26_S1
+ - Offset: 0x10
+ Symbol: glob
+ Type: R_MICROMIPS_26_S1
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 0x10
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/r26-1.test b/test/old-elf/Mips/r26-1.test
new file mode 100644
index 000000000000..41c58deceedb
--- /dev/null
+++ b/test/old-elf/Mips/r26-1.test
@@ -0,0 +1,132 @@
+# REQUIRES: mips
+
+# Check handling of R_MIPS_26 relocation.
+
+# Build shared library
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: llvm-readobj -relocations %t-o.o | \
+# RUN: FileCheck -check-prefix=OBJ-REL %s
+# RUN: lld -flavor old-gnu -target mipsel -e glob -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -section-headers -disassemble %t.exe | \
+# RUN: FileCheck -check-prefix=EXE %s
+# RUN: llvm-readobj -relocations %t.exe | FileCheck -check-prefix=EXE-REL %s
+
+# Object file has three R_MIPS_26 relocations
+# OBJ-REL: Relocations [
+# OBJ-REL-NEXT: Section (2) .rel.text {
+# OBJ-REL-NEXT: 0x8 R_MIPS_26 .text 0x0
+# OBJ-REL-NEXT: 0x10 R_MIPS_26 glob 0x0
+# OBJ-REL-NEXT: 0x18 R_MIPS_26 T1 0x0
+# OBJ-REL-NEXT: }
+# OBJ-REL-NEXT: ]
+
+# Executable file has the only relocation for external symbol
+# EXE-REL: Relocations [
+# EXE-REL-NEXT: Section (5) .rel.plt {
+# EXE-REL-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0
+# EXE-REL-NEXT: }
+# EXE-REL-NEXT: ]
+
+# EXE: Disassembly of section .plt:
+# EXE: .plt:
+# PLTA entry. Points to the .got.plt[1]
+# EXE: 400180: 40 00 0f 3c lui $15, 64
+# EXE-NEXT: 400184: 08 20 f9 8d lw $25, 8200($15)
+# EXE-NEXT: 400188: 08 00 20 03 jr $25
+# EXE-NEXT: 40018c: 08 20 f8 25 addiu $24, $15, 8200
+
+# EXE: Disassembly of section .text:
+# EXE: glob:
+# EXE-NEXT: 400190: 09 f8 20 03 jalr $25
+# EXE-NEXT: 400194: 00 00 00 00 nop
+#
+# Jump to 'loc' label address
+# EXE-NEXT: 400198: 68 00 10 0c jal 4194720
+# EXE-NEXT: 40019c: 00 00 00 00 nop
+#
+# EXE: loc:
+# Jump to 'glob' label address
+# EXE-NEXT: 4001a0: 64 00 10 0c jal 4194704
+# EXE-NEXT: 4001a4: 00 00 00 00 nop
+#
+# Jump to the first PLT entry (.plt + 32) for T1 entry
+# EXE-NEXT: 4001a8: 60 00 10 0c jal 4194688
+# EXE-NEXT: 4001ac: 00 00 00 00 nop
+
+# EXE: Sections:
+# EXE: Idx Name Size Address Type
+# EXE: 6 .plt 00000030 0000000000400160 TEXT DATA
+# EXE: 10 .got.plt 0000000c 0000000000402000 DATA
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: '09F82003000000000400000C000000000000000C000000000000000C00000000'
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x08
+ Symbol: .text
+ Type: R_MIPS_26
+ - Offset: 0x10
+ Symbol: glob
+ Type: R_MIPS_26
+ - Offset: 0x18
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Local:
+ - Name: loc
+ Section: .text
+ Value: 0x10
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: glob
+ Section: .text
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/r26-2-micro.test b/test/old-elf/Mips/r26-2-micro.test
new file mode 100644
index 000000000000..7d4f86e57f70
--- /dev/null
+++ b/test/old-elf/Mips/r26-2-micro.test
@@ -0,0 +1,31 @@
+# REQUIRES: mips
+
+# Check reading addendum for R_MICROMIPS_26_S1 relocation.
+# RUN: llvm-mc -arch=mipsel -filetype=obj -mattr=micromips -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o
+# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: __start:
+# CHECK-NEXT: 400180: 10 f0 60 70 jalx 2154688
+# CHECK-NEXT: 400184: 00 00 00 00 nop
+# CHECK-NEXT: 400188: 10 f0 68 70 jalx 2154704
+# CHECK-NEXT: 40018c: 00 00 00 00 nop
+# CHECK-NEXT: 400190: 10 f0 58 00 jalx 2097328
+# CHECK-NEXT: 400194: 00 00 00 00 nop
+# CHECK-NEXT: 400198: 10 f0 62 00 jalx 2097348
+# CHECK-NEXT: 40019c: 00 00 00 00 nop
+#
+# CHECK: loc:
+# CHECK-NEXT: 4001a0: 00 00 00 00 nop
+
+ .text
+ .globl __start
+__start:
+ jal __start + 0x1C000
+ jal loc + 0x1C000
+ jal __start + 0x7ffffe2
+ jal loc + 0x7ffffea
+
+loc:
+ nop
diff --git a/test/old-elf/Mips/r26-2.test b/test/old-elf/Mips/r26-2.test
new file mode 100644
index 000000000000..b9db959d3ea7
--- /dev/null
+++ b/test/old-elf/Mips/r26-2.test
@@ -0,0 +1,31 @@
+# REQUIRES: mips
+
+# Check reading addendum for R_MIPS_26 relocation.
+# RUN: llvm-mc -arch=mipsel -filetype=obj -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t.o
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: __start:
+# CHECK-NEXT: 400180: 60 70 10 0c jal 4309376
+# CHECK-NEXT: 400184: 00 00 00 00 nop
+# CHECK-NEXT: 400188: 68 70 10 0c jal 4309408
+# CHECK-NEXT: 40018c: 00 00 00 00 nop
+# CHECK-NEXT: 400190: 5f 00 10 0c jal 4194684
+# CHECK-NEXT: 400194: 00 00 00 00 nop
+# CHECK-NEXT: 400198: 67 00 10 0c jal 4194716
+# CHECK-NEXT: 40019c: 00 00 00 00 nop
+#
+# CHECK: loc:
+# CHECK-NEXT: 4001a0: 00 00 00 00 nop
+
+ .text
+ .globl __start
+__start:
+ jal __start + 0x1C000
+ jal loc + 0x1C000
+ jal __start + (-1)
+ jal loc + (-1)
+
+loc:
+ nop
diff --git a/test/old-elf/Mips/reginfo-01.test b/test/old-elf/Mips/reginfo-01.test
new file mode 100644
index 000000000000..ee7cd6a5fcee
--- /dev/null
+++ b/test/old-elf/Mips/reginfo-01.test
@@ -0,0 +1,30 @@
+# Check that LLD does not write a .reginfo section if input
+# object file does not contain such section.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -s %t.so | FileCheck %s
+
+# CHECK-NOT: Name: .reginfo
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/reginfo-02.test b/test/old-elf/Mips/reginfo-02.test
new file mode 100644
index 000000000000..41eac01a11b1
--- /dev/null
+++ b/test/old-elf/Mips/reginfo-02.test
@@ -0,0 +1,107 @@
+# Check merging input .reginfo sections.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o %t2.o
+# RUN: llvm-readobj -program-headers -s -t -mips-reginfo %t.so | FileCheck %s
+
+# CHECK: Index: 1
+# CHECK-NEXT: Name: .reginfo (1)
+# CHECK-NEXT: Type: SHT_MIPS_REGINFO
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address: {{[0-9A-F]+}}
+# CHECK-NEXT: Offset: {{[0-9A-F]+}}
+# CHECK-NEXT: Size: 24
+# CHECK-NEXT: Link: 0
+# CHECK-NEXT: Info: 0
+# CHECK-NEXT: AddressAlignment: 4
+# CHECK-NEXT: EntrySize: 24
+
+# CHECK: Name: _gp
+# CHECK-NEXT: 0x8FF0
+
+# CHECK: ProgramHeaders [
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_MIPS_REGINFO
+# CHECK-NEXT: Offset: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: VirtualAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: FileSize: 24
+# CHECK-NEXT: MemSize: 24
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: PF_R
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 4
+# CHECK-NEXT: }
+
+# CHECK: MIPS RegInfo {
+# CHECK-NEXT: GP: 0x8FF0
+# CHECK-NEXT: General Mask: 0x10000F0
+# CHECK-NEXT: Co-Proc Mask0: 0x20000E0
+# CHECK-NEXT: Co-Proc Mask1: 0x30000D0
+# CHECK-NEXT: Co-Proc Mask2: 0x40000C0
+# CHECK-NEXT: Co-Proc Mask3: 0x50000B0
+# CHECK-NEXT: }
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "F0000000E0000000D0000000C0000000B000000000100000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "000000010000000200000003000000040000000500000100"
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/reginfo-03.test b/test/old-elf/Mips/reginfo-03.test
new file mode 100644
index 000000000000..edee1440d358
--- /dev/null
+++ b/test/old-elf/Mips/reginfo-03.test
@@ -0,0 +1,45 @@
+# Check handling a zero-filled input .reginfo section.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -t -mips-reginfo %t.so | FileCheck %s
+
+# CHECK: Name: _gp
+# CHECK-NEXT: 0x8FF0
+
+# CHECK: MIPS RegInfo {
+# CHECK-NEXT: GP: 0x8FF0
+# CHECK-NEXT: General Mask: 0x0
+# CHECK-NEXT: Co-Proc Mask0: 0x0
+# CHECK-NEXT: Co-Proc Mask1: 0x0
+# CHECK-NEXT: Co-Proc Mask2: 0x0
+# CHECK-NEXT: Co-Proc Mask3: 0x0
+# CHECK-NEXT: }
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "000000000000000000000000000000000000000000000000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/reginfo-04.test b/test/old-elf/Mips/reginfo-04.test
new file mode 100644
index 000000000000..bad34e5003f7
--- /dev/null
+++ b/test/old-elf/Mips/reginfo-04.test
@@ -0,0 +1,81 @@
+# Check that .reginfo sections from shared libraries do not affect
+# output .reginfo section content.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t.exe.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.so %t.exe.o
+# RUN: llvm-readobj -t -mips-reginfo %t.exe | FileCheck %s
+
+# CHECK: Name: _gp
+# CHECK-NEXT: 0x408FF0
+
+# CHECK: MIPS RegInfo {
+# CHECK-NEXT: GP: 0x408FF0
+# CHECK-NEXT: General Mask: 0x44444444
+# CHECK-NEXT: Co-Proc Mask0: 0x44444444
+# CHECK-NEXT: Co-Proc Mask1: 0x44444444
+# CHECK-NEXT: Co-Proc Mask2: 0x44444444
+# CHECK-NEXT: Co-Proc Mask3: 0x44444444
+# CHECK-NEXT: }
+
+# t.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "111111111111111111111111111111111111111100100000"
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t.exe.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "444444444444444444444444444444444444444400000000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/reginfo-05.test b/test/old-elf/Mips/reginfo-05.test
new file mode 100644
index 000000000000..9de9fa62149a
--- /dev/null
+++ b/test/old-elf/Mips/reginfo-05.test
@@ -0,0 +1,123 @@
+# Check that .reginfo section gets register usage mask from "used" files only.
+# In this test case we take only t2.o from libreginfo.a and should not add
+# register usage masks from t1.o to the output .reginfo section.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: llvm-ar q %T/libreginfo.a %t1.o %t2.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t3.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t3.o -L%T -lreginfo
+# RUN: llvm-readobj -t -mips-reginfo %t.exe | FileCheck %s
+
+# CHECK: Name: _gp
+# CHECK-NEXT: 0x408FF0
+
+# CHECK: MIPS RegInfo {
+# CHECK-NEXT: GP: 0x408FF0
+# CHECK-NEXT: General Mask: 0x66666666
+# CHECK-NEXT: Co-Proc Mask0: 0x66666666
+# CHECK-NEXT: Co-Proc Mask1: 0x66666666
+# CHECK-NEXT: Co-Proc Mask2: 0x66666666
+# CHECK-NEXT: Co-Proc Mask3: 0x66666666
+# CHECK-NEXT: }
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "111111111111111111111111111111111111111100000000"
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "222222222222222222222222222222222222222200000000"
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t3.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T2
+ Type: R_MIPS_32
+
+- Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: "444444444444444444444444444444444444444400000000"
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/rel-16-overflow.test b/test/old-elf/Mips/rel-16-overflow.test
new file mode 100644
index 000000000000..e2a73f693361
--- /dev/null
+++ b/test/old-elf/Mips/rel-16-overflow.test
@@ -0,0 +1,45 @@
+# Check R_MIPS_16 relocation overflow handling.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to T1+32767 of type 1 (R_MIPS_16)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "ff7f00000000000000000000"
+# ^ T1
+# ^ T0 A := 0x7fff
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-16.test b/test/old-elf/Mips/rel-16.test
new file mode 100644
index 000000000000..24961e8b78ff
--- /dev/null
+++ b/test/old-elf/Mips/rel-16.test
@@ -0,0 +1,51 @@
+# Check handling of R_MIPS_16 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 00f0 f0000000 00000000 00000000
+# ^ V = (T1 - 8) = T0
+
+# CHECK: SYMBOL TABLE:
+# CHECK: 000000f0 g F .text 00000008 T0
+# CHECK: 000000f8 g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "f8ff00000000000000000000"
+# ^ T1
+# ^ T0 A := 0xfff8 = -8
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-32-be.test b/test/old-elf/Mips/rel-32-be.test
new file mode 100644
index 000000000000..3eac8a2848f0
--- /dev/null
+++ b/test/old-elf/Mips/rel-32-be.test
@@ -0,0 +1,60 @@
+# Check handling of R_MIPS_32 relocation in the big-endian case.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 402000 00000000 01402088 01402084
+# ^^ D2 + 0x1000080 = 0x1402088
+# ^^ D1 + 0x1000080 = 0x1402084
+# CHECK: SYMBOL TABLE:
+# CHECK: 00402004 g .data 00000004 D1
+# CHECK: 00402008 g .data 00000004 D2
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2MSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ AddressAlign: 16
+ Flags: [SHF_ALLOC]
+ Size: 4
+
+- Name: .data
+ Type: SHT_PROGBITS
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+ Content: "000000000100008001000080"
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 4
+ Symbol: D2
+ Type: R_MIPS_32
+ - Offset: 8
+ Symbol: D1
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: D1
+ Section: .data
+ Value: 4
+ Size: 4
+ - Name: D2
+ Section: .data
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-32.test b/test/old-elf/Mips/rel-32.test
new file mode 100644
index 000000000000..f028d79c8688
--- /dev/null
+++ b/test/old-elf/Mips/rel-32.test
@@ -0,0 +1,59 @@
+# Check handling of R_MIPS_32 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 402000 00000000 09204080 05204080 ..... @.. @.
+# ^^ data2 + 0x80000001 = 0x80402009
+# ^^ data1 + 0x80000001 = 0x80402005
+# CHECK: SYMBOL TABLE:
+# CHECK: 00402004 g .data 00000004 data1
+# CHECK: 00402008 g .data 00000004 data2
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "000000000100008001000080"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x4
+ Symbol: data2
+ Type: R_MIPS_32
+ - Offset: 0x8
+ Symbol: data1
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Value: 0x4
+ Size: 4
+ - Name: data2
+ Section: .data
+ Value: 0x8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-64.test b/test/old-elf/Mips/rel-64.test
new file mode 100644
index 000000000000..c97ff991c0c4
--- /dev/null
+++ b/test/old-elf/Mips/rel-64.test
@@ -0,0 +1,61 @@
+# Check handling of R_MIPS_64 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 120002000 d1010020 01000000 d0010020 01000100 ... ....... ....
+# ^^ __start + 1 = 0x1200001d1
+# ^^ __start + 0x1000000000000
+# = 0x10001200001d0
+# CHECK: SYMBOL TABLE:
+# CHECK: 00000001200001d0 g .rodata 00000008 __start
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_ALLOC]
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x10
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: __start
+ Type: R_MIPS_64
+ Addend: 1
+ - Offset: 0x8
+ Symbol: __start
+ Type: R_MIPS_64
+ Addend: 0x1000000000000
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Value: 0x0
+ Size: 8
+ - Name: data1
+ Section: .data
+ Value: 0x0
+ Size: 8
+ - Name: data2
+ Section: .data
+ Value: 0x8
+ Size: 8
diff --git a/test/old-elf/Mips/rel-call-hilo-01.test b/test/old-elf/Mips/rel-call-hilo-01.test
new file mode 100644
index 000000000000..88f2e337d928
--- /dev/null
+++ b/test/old-elf/Mips/rel-call-hilo-01.test
@@ -0,0 +1,109 @@
+# Check handling of R_MIPS_CALL_HI16 / R_MIPS_CALL_LO16 relocations.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so
+# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s
+
+# RAW: Contents of section .text:
+# RAW-NEXT: 0110 00000000 18800000 00000000 1c800000
+# ^ -32744 ^ -32740
+# RAW-NEXT: 0120 00000000
+
+# RAW: SYMBOL TABLE:
+# RAW: 00000120 l F .text 00000004 T1
+
+# GOT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x120
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# t1.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t2.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 20
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_CALL_HI16
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_CALL_LO16
+ - Offset: 8
+ Symbol: T2
+ Type: R_MIPS_CALL_HI16
+ - Offset: 12
+ Symbol: T2
+ Type: R_MIPS_CALL_LO16
+
+Symbols:
+ Local:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 16
+ Size: 4
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 16
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/rel-call-hilo-micro.test b/test/old-elf/Mips/rel-call-hilo-micro.test
new file mode 100644
index 000000000000..0df68def92b3
--- /dev/null
+++ b/test/old-elf/Mips/rel-call-hilo-micro.test
@@ -0,0 +1,154 @@
+# Check handling of R_MICROMIPS_CALL_HI16 / R_MICROMIPS_CALL_LO16 relocations.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so
+# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s
+
+# RAW: Contents of section .text:
+# RAW-NEXT: 0130 00000000 00001880 00000000 00002080
+# ^ -32744 ^ -32736
+# RAW-NEXT: 0140 00000000 00001c80 00000000 00002480
+# ^ -32740 ^ -32732
+# RAW-NEXT: 0150 00000000 00000000
+
+# RAW: SYMBOL TABLE:
+# RAW: 00000140 l F .text 00000014 T1
+# RAW: 00000154 l F .text 00000004 M1
+
+# GOT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x140
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x155
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1014
+# GOT-NEXT: Access: -32732
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: M2@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# t1.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: M2
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+
+# t2.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 40
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MICROMIPS_CALL_HI16
+ - Offset: 4
+ Symbol: T1
+ Type: R_MICROMIPS_CALL_LO16
+ - Offset: 8
+ Symbol: T2
+ Type: R_MICROMIPS_CALL_HI16
+ - Offset: 12
+ Symbol: T2
+ Type: R_MICROMIPS_CALL_LO16
+ - Offset: 16
+ Symbol: M1
+ Type: R_MICROMIPS_CALL_HI16
+ - Offset: 20
+ Symbol: M1
+ Type: R_MICROMIPS_CALL_LO16
+ - Offset: 24
+ Symbol: M2
+ Type: R_MICROMIPS_CALL_HI16
+ - Offset: 28
+ Symbol: M2
+ Type: R_MICROMIPS_CALL_LO16
+
+Symbols:
+ Local:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 16
+ Size: 4
+ - Name: M1
+ Section: .text
+ Type: STT_FUNC
+ Value: 36
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 16
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+ - Name: M2
+...
diff --git a/test/old-elf/Mips/rel-copy-micro.test b/test/old-elf/Mips/rel-copy-micro.test
new file mode 100644
index 000000000000..ba47c84a2c5c
--- /dev/null
+++ b/test/old-elf/Mips/rel-copy-micro.test
@@ -0,0 +1,159 @@
+# Check R_MIPS_COPY relocation emitting
+# when linking non-shared executable file.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so1.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-so2.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-so2.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t1.so %t2.so
+# RUN: llvm-readobj -dt -r -dynamic-table %t.exe | FileCheck %s
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (5) .rel.dyn {
+# CHECK-NEXT: 0x402010 R_MIPS_COPY D1 0x0
+# CHECK-NEXT: 0x402018 R_MIPS_COPY D2 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (1)
+# CHECK-NEXT: Value: 0x402010
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .bss
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D2@ (4)
+# CHECK-NEXT: Value: 0x402018
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .bss
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSection [ ({{.*}} entries)
+# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy-micro.test.tmp1.so)
+# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy-micro.test.tmp2.so)
+# CHECK-NEXT: 0x00000000 NULL 0x0
+# CHECK-NEXT: ]
+
+# so1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+
+# so2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x04
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x08
+ Symbol: D2
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x08
+ Symbol: D2
+ Type: R_MICROMIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+...
diff --git a/test/old-elf/Mips/rel-copy-pc.test b/test/old-elf/Mips/rel-copy-pc.test
new file mode 100644
index 000000000000..cf723f53719c
--- /dev/null
+++ b/test/old-elf/Mips/rel-copy-pc.test
@@ -0,0 +1,113 @@
+# Check R_MIPS_COPY relocation emitting caused by R_MIPS_PCHI16 / R_MIPS_PCLO16
+# relocations when linking non-shared executable file.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -dynamic-table %t.exe | FileCheck %s
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (5) .rel.dyn {
+# CHECK-NEXT: 0x402008 R_MIPS_COPY D1 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (1)
+# CHECK-NEXT: Value: 0x402008
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .bss
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSection [ ({{.*}} entries)
+# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy-pc.test.tmp.so)
+# CHECK-NEXT: 0x00000000 NULL 0x0
+# CHECK-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: D1
+ Type: R_MIPS_PCHI16
+ - Offset: 0
+ Symbol: D1
+ Type: R_MIPS_PCLO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 4
+ - Name: D1
+...
diff --git a/test/old-elf/Mips/rel-copy.test b/test/old-elf/Mips/rel-copy.test
new file mode 100644
index 000000000000..751034dcd728
--- /dev/null
+++ b/test/old-elf/Mips/rel-copy.test
@@ -0,0 +1,177 @@
+# Check R_MIPS_COPY relocation emitting
+# when linking non-shared executable file.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so1.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-so2.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-so2.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t1.so %t2.so
+# RUN: llvm-readobj -dt -r -dynamic-table %t.exe | FileCheck %s
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (5) .rel.dyn {
+# CHECK-NEXT: 0x402004 R_MIPS_REL32 D2 0x0
+# CHECK-NEXT: 0x402010 R_MIPS_COPY D1 0x0
+# CHECK-NEXT: 0x402018 R_MIPS_COPY D3 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (1)
+# CHECK-NEXT: Value: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .bss
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D3@ (4)
+# CHECK-NEXT: Value: 0x{{[0-9A-F]+}}
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .bss
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D2@ (7)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSection [ ({{.*}} entries)
+# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy.test.tmp1.so)
+# CHECK: 0x00000001 NEEDED SharedLibrary (rel-copy.test.tmp2.so)
+# CHECK-NEXT: 0x00000000 NULL 0x0
+# CHECK-NEXT: ]
+
+# so1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# so2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x04
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: D3
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MIPS_LO16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_32
+ - Offset: 0x08
+ Symbol: D3
+ Type: R_MIPS_HI16
+ - Offset: 0x08
+ Symbol: D3
+ Type: R_MIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ - Name: D3
+...
diff --git a/test/old-elf/Mips/rel-dynamic-01-micro.test b/test/old-elf/Mips/rel-dynamic-01-micro.test
new file mode 100644
index 000000000000..56dd7dfdeccd
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-01-micro.test
@@ -0,0 +1,201 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# Check:
+# a) Emitting R_MIPS_COPY, R_MIPS_JUMP_SLOT relocations.
+# b) PLT entries creation.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck -check-prefix=DIS %s
+# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s
+
+# DIS: Disassembly of section .plt:
+# DIS-NEXT: .plt:
+# DIS-NEXT: 4001b0: 80 79 94 07 addiupc $3, 7760
+# DIS-NEXT: 4001b4: 23 ff 00 00 lw $25, 0($3)
+# DIS-NEXT: 4001b8: 35 05 subu16 $2, $2, $3
+# DIS-NEXT: 4001ba: 25 25 srl16 $2, $2, 2
+# DIS-NEXT: 4001bc: 02 33 fe ff addiu $24, $2, -2
+# DIS-NEXT: 4001c0: ff 0d move $15, $ra
+# DIS-NEXT: 4001c2: f9 45 jalrs16 $25
+# DIS-NEXT: 4001c4: 83 0f move $gp, $3
+# DIS-NEXT: 4001c6: 00 0c nop
+
+# DIS-NEXT: 4001c8: 00 79 90 07 addiupc $2, 7744
+# DIS-NEXT: 4001cc: 22 ff 00 00 lw $25, 0($2)
+# DIS-NEXT: 4001d0: 99 45 jr16 $25
+# DIS-NEXT: 4001d2: 02 0f move $24, $2
+
+# DIS-NEXT: 4001d4: 00 79 8e 07 addiupc $2, 7736
+# DIS-NEXT: 4001d8: 22 ff 00 00 lw $25, 0($2)
+# DIS-NEXT: 4001dc: 99 45 jr16 $25
+# DIS-NEXT: 4001de: 02 0f move $24, $2
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: Section (5) .rel.dyn {
+# PLT-SYM-NEXT: 0x402020 R_MIPS_COPY D1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Section (6) .rel.plt {
+# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T3 0x0
+# PLT-SYM-NEXT: 0x40200C R_MIPS_JUMP_SLOT T1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: @ (0)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Local (0x0)
+# PLT-SYM-NEXT: Type: None (0x0)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: D1@ (1)
+# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-SYM-NEXT: Size: 8
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Object (0x1)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: .bss
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T1@ (4)
+# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 8
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T3@ (7)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MICROMIPS_26_S1
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MICROMIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+...
diff --git a/test/old-elf/Mips/rel-dynamic-01.test b/test/old-elf/Mips/rel-dynamic-01.test
new file mode 100644
index 000000000000..e24449eeeb58
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-01.test
@@ -0,0 +1,261 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# Check:
+# a) Emitting R_MIPS_REL32, R_MIPS_COPY, R_MIPS_JUMP_SLOT relocations.
+# b) PLT entries creation.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -disassemble %t.exe | FileCheck -check-prefix=PLT %s
+# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# PLT: Disassembly of section .plt:
+# PLT-NEXT: .plt:
+# PLT-NEXT: 4001f0: 40 00 1c 3c lui $gp, 64
+# PLT-NEXT: 4001f4: 00 20 99 8f lw $25, 8192($gp)
+# PLT-NEXT: 4001f8: 00 20 9c 27 addiu $gp, $gp, 8192
+# PLT-NEXT: 4001fc: 23 c0 1c 03 subu $24, $24, $gp
+# PLT-NEXT: 400200: 25 78 e0 03 move $15, $ra
+# PLT-NEXT: 400204: 82 c0 18 00 srl $24, $24, 2
+# PLT-NEXT: 400208: 09 f8 20 03 jalr $25
+# PLT-NEXT: 40020c: fe ff 18 27 addiu $24, $24, -2
+#
+# PLT-NEXT: 400210: 40 00 0f 3c lui $15, 64
+# PLT-NEXT: 400214: 08 20 f9 8d lw $25, 8200($15)
+# PLT-NEXT: 400218: 08 00 20 03 jr $25
+# PLT-NEXT: 40021c: 08 20 f8 25 addiu $24, $15, 8200
+#
+# PLT-NEXT: 400220: 40 00 0f 3c lui $15, 64
+# PLT-NEXT: 400224: 0c 20 f9 8d lw $25, 8204($15)
+# PLT-NEXT: 400228: 08 00 20 03 jr $25
+# PLT-NEXT: 40022c: 0c 20 f8 25 addiu $24, $15, 8204
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: Section (5) .rel.dyn {
+# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 T2 0x0
+# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 D2 0x0
+# PLT-SYM-NEXT: 0x402020 R_MIPS_COPY D1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Section (6) .rel.plt {
+# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T3 0x0
+# PLT-SYM-NEXT: 0x40200C R_MIPS_JUMP_SLOT T1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: @ (0)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Local (0x0)
+# PLT-SYM-NEXT: Type: None (0x0)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: D1@ (1)
+# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-SYM-NEXT: Size: 4
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Object (0x1)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: .bss
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T1@ (4)
+# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 8
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T3@ (10)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T2@ (7)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: D2@ (13)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 4
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Object (0x1)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x{{[0-9A-F]+}}
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x{{[0-9A-F]+}}
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D2@ (13)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_LO16
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_HI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_LO16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ Type: STT_OBJECT
+...
diff --git a/test/old-elf/Mips/rel-dynamic-02.test b/test/old-elf/Mips/rel-dynamic-02.test
new file mode 100644
index 000000000000..24b7c624c6a0
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-02.test
@@ -0,0 +1,101 @@
+# Conditions:
+# a) Linking a shared library.
+# b) Relocations' targets are undefined symbols.
+# Check:
+# a) Emitting R_MIPS_REL32 relocations for both undefined symbols.
+# b) There should be no PLT entries.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec -o %t.so %t.o
+# RUN: llvm-readobj -dt -r -s %t.so | FileCheck %s
+
+# CHECK: Sections [
+# CHECK: Section {
+# CHECK-NOT: Name: .plt ({{[0-9]+}})
+#
+# CHECK: Relocations [
+# CHECK-NEXT: Section (4) .rel.dyn {
+# CHECK-NEXT: 0x[[ADDR1:[0-9A-Z]+]] R_MIPS_REL32 T1 0x0
+# CHECK-NEXT: 0x[[ADDR2:[0-9A-Z]+]] R_MIPS_REL32 T1 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+#
+# CHECK: Symbol {
+# CHECK: Name: T0@
+# CHECK-NEXT: Value: 0x[[ADDR1]]
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: Function
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text
+# CHECK-NEXT: }
+# CHECK: Symbol {
+# CHECK: Name: D0@
+# CHECK-NEXT: Value: 0x[[ADDR2]]
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: Object
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .data
+# CHECK-NEXT: }
+# CHECK: Symbol {
+# CHECK: Name: T1@
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global
+# CHECK-NEXT: Type: None
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined
+# CHECK-NEXT: }
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_32
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 8
diff --git a/test/old-elf/Mips/rel-dynamic-03-micro.test b/test/old-elf/Mips/rel-dynamic-03-micro.test
new file mode 100644
index 000000000000..891649d8cdbc
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-03-micro.test
@@ -0,0 +1,133 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' target is a symbol defined in the shared object.
+# c) The target symbol is referenced by both branch (R_MICROMIPS_26_S1)
+# and regular (R_MIPS_32) relocations.
+# Check:
+# a) There should be no R_MIPS_REL32 relocation.
+# b) Linker creates a single PLT entry.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -d -mattr=micromips %t.exe | FileCheck -check-prefix=DIS %s
+# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s
+
+# DIS: Disassembly of section .plt:
+# DIS-NEXT: .plt:
+# DIS-NEXT: 400170: 80 79 a4 07 addiupc $3, 7824
+# DIS-NEXT: 400174: 23 ff 00 00 lw $25, 0($3)
+# DIS-NEXT: 400178: 35 05 subu16 $2, $2, $3
+# DIS-NEXT: 40017a: 25 25 srl16 $2, $2, 2
+# DIS-NEXT: 40017c: 02 33 fe ff addiu $24, $2, -2
+# DIS-NEXT: 400180: ff 0d move $15, $ra
+# DIS-NEXT: 400182: f9 45 jalrs16 $25
+# DIS-NEXT: 400184: 83 0f move $gp, $3
+# DIS-NEXT: 400186: 00 0c nop
+
+# DIS-NEXT: 400188: 00 79 a0 07 addiupc $2, 7808
+# DIS-NEXT: 40018c: 22 ff 00 00 lw $25, 0($2)
+# DIS-NEXT: 400190: 99 45 jr16 $25
+# DIS-NEXT: 400192: 02 0f move $24, $2
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: Section (5) .rel.plt {
+# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: Name: T1@ (1)
+# PLT-SYM-NEXT: Value: 0x400189
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 8
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T1
+ Type: R_MICROMIPS_26_S1
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T1
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+...
diff --git a/test/old-elf/Mips/rel-dynamic-03.test b/test/old-elf/Mips/rel-dynamic-03.test
new file mode 100644
index 000000000000..2552473ca80f
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-03.test
@@ -0,0 +1,129 @@
+# REQUIRES: mips
+
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' target is a symbol defined in the shared object.
+# c) The target symbol is referenced by both branch (R_MIPS_26)
+# and regular (R_MIPS_32) relocations.
+# Check:
+# a) There should be no R_MIPS_REL32 relocation.
+# b) Linker creates a single PLT entry.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -disassemble %t.exe | FileCheck -check-prefix=PLT %s
+# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s
+
+# PLT: Disassembly of section .plt:
+# PLT-NEXT: .plt:
+# PLT-NEXT: 400160: 40 00 1c 3c lui $gp, 64
+# PLT-NEXT: 400164: 00 20 99 8f lw $25, 8192($gp)
+# PLT-NEXT: 400168: 00 20 9c 27 addiu $gp, $gp, 8192
+# PLT-NEXT: 40016c: 23 c0 1c 03 subu $24, $24, $gp
+# PLT-NEXT: 400170: 25 78 e0 03 move $15, $ra
+# PLT-NEXT: 400174: 82 c0 18 00 srl $24, $24, 2
+# PLT-NEXT: 400178: 09 f8 20 03 jalr $25
+# PLT-NEXT: 40017c: fe ff 18 27 addiu $24, $24, -2
+#
+# PLT-NEXT: 400180: 40 00 0f 3c lui $15, 64
+# PLT-NEXT: 400184: 08 20 f9 8d lw $25, 8200($15)
+# PLT-NEXT: 400188: 08 00 20 03 jr $25
+# PLT-NEXT: 40018c: 08 20 f8 25 addiu $24, $15, 8200
+#
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: Section (5) .rel.plt {
+# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: Name: T1@ (1)
+# PLT-SYM-NEXT: Value: 0x400180
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 8
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T1
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T1
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+...
diff --git a/test/old-elf/Mips/rel-dynamic-04-micro.test b/test/old-elf/Mips/rel-dynamic-04-micro.test
new file mode 100644
index 000000000000..de1131c67f43
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-04-micro.test
@@ -0,0 +1,226 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# c) Relocations modify a writable section.
+# d) The first symbol is referenced by R_MIPS32 relocation only
+# e) The second symbol is referenced by R_MIPS_32
+# and R_MICROMIPS_26_S1 relocations.
+# f) The third symbol is referenced by R_MICROMIPS_26_S1
+# and R_MIPS_32 relocations.
+# Check:
+# a) There should be the only R_MIPS_REL32 relocation.
+# b) Linker creates a couple of PLT entry for both symbols referenced
+# by the R_MICROMIPS_26_S1 branch relocation.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# PLT: Section {
+# PLT: Index: 5
+# PLT-NEXT: Name: .rel.dyn (31)
+# PLT-NEXT: Type: SHT_REL (0x9)
+# PLT-NEXT: Flags [ (0x2)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x4010A0
+# PLT-NEXT: Offset: 0x10A0
+# PLT-NEXT: Size: 8
+# PLT-NEXT: Link: 3
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 4
+# PLT-NEXT: EntrySize: 8
+# PLT-NEXT: }
+# PLT-NEXT: Section {
+# PLT-NEXT: Index: 6
+# PLT-NEXT: Name: .rel.plt (40)
+# PLT-NEXT: Type: SHT_REL (0x9)
+# PLT-NEXT: Flags [ (0x2)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x4010A8
+# PLT-NEXT: Offset: 0x10A8
+# PLT-NEXT: Size: 16
+# PLT-NEXT: Link: 3
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 4
+# PLT-NEXT: EntrySize: 8
+# PLT-NEXT: }
+# PLT-NEXT: Section {
+# PLT-NEXT: Index: 7
+# PLT-NEXT: Name: .plt (49)
+# PLT-NEXT: Type: SHT_PROGBITS (0x1)
+# PLT-NEXT: Flags [ (0x6)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: SHF_EXECINSTR (0x4)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x4010C0
+# PLT-NEXT: Offset: 0x10C0
+# PLT-NEXT: Size: 48
+# PLT-NEXT: Link: 0
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 16
+# PLT-NEXT: EntrySize: 0
+# PLT-NEXT: }
+
+# PLT: Relocations [
+# PLT-NEXT: Section (5) .rel.dyn {
+# PLT-NEXT: 0x400120 R_MIPS_REL32 T1 0x0
+# PLT-NEXT: }
+# PLT-NEXT: Section (6) .rel.plt {
+# PLT-NEXT: 0x403008 R_MIPS_JUMP_SLOT T2 0x0
+# PLT-NEXT: 0x40300C R_MIPS_JUMP_SLOT T3 0x0
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# PLT: DynamicSymbols [
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: @ (0)
+# PLT-NEXT: Value: 0x0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Local (0x0)
+# PLT-NEXT: Type: None (0x0)
+# PLT-NEXT: Other: 0
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T2@ (4)
+# PLT-NEXT: Value: 0x4010D9
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T3@ (7)
+# PLT-NEXT: Value: 0x4010E5
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T1@ (1)
+# PLT-NEXT: Value: 0x0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 0
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x402008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x14
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ # There is no branch relocation for T1.
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_32
+ # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ...
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+ # ... but R_MICROMIPS_26_S1 creates PLT entry
+ # and makes R_MIPS_REL32 redundant.
+ - Offset: 0x08
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+ # Create PLT entry for T3 symbol.
+ - Offset: 0x0c
+ Symbol: T3
+ Type: R_MICROMIPS_26_S1
+ # Take in account existing PLT entry and do not create R_MIPS_REL32.
+ - Offset: 0x10
+ Symbol: T3
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x14
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+...
diff --git a/test/old-elf/Mips/rel-dynamic-04.test b/test/old-elf/Mips/rel-dynamic-04.test
new file mode 100644
index 000000000000..df8c676af330
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-04.test
@@ -0,0 +1,221 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# c) Relocations modify a writable section.
+# d) The first symbol is referenced by R_MIPS32 relocation only
+# e) The second symbol is referenced by R_MIPS_32 and R_MIPS26 relocations.
+# f) The third symbol is referenced by R_MIPS26 and R_MIPS_32 relocations.
+# Check:
+# a) There should be the only R_MIPS_REL32 relocation.
+# b) Linker creates a couple of PLT entry for both symbols referenced
+# by the R_MIPS_26 branch relocation.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# PLT: Section {
+# PLT: Index: 5
+# PLT-NEXT: Name: .rel.dyn (31)
+# PLT-NEXT: Type: SHT_REL (0x9)
+# PLT-NEXT: Flags [ (0x2)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x40109C
+# PLT-NEXT: Offset: 0x109C
+# PLT-NEXT: Size: 8
+# PLT-NEXT: Link: 3
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 4
+# PLT-NEXT: EntrySize: 8
+# PLT-NEXT: }
+# PLT-NEXT: Section {
+# PLT-NEXT: Index: 6
+# PLT-NEXT: Name: .rel.plt (40)
+# PLT-NEXT: Type: SHT_REL (0x9)
+# PLT-NEXT: Flags [ (0x2)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x4010A4
+# PLT-NEXT: Offset: 0x10A4
+# PLT-NEXT: Size: 16
+# PLT-NEXT: Link: 3
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 4
+# PLT-NEXT: EntrySize: 8
+# PLT-NEXT: }
+# PLT-NEXT: Section {
+# PLT-NEXT: Index: 7
+# PLT-NEXT: Name: .plt (49)
+# PLT-NEXT: Type: SHT_PROGBITS (0x1)
+# PLT-NEXT: Flags [ (0x6)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: SHF_EXECINSTR (0x4)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x4010C0
+# PLT-NEXT: Offset: 0x10C0
+# PLT-NEXT: Size: 64
+# PLT-NEXT: Link: 0
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 16
+# PLT-NEXT: EntrySize: 0
+# PLT-NEXT: }
+
+# PLT: Relocations [
+# PLT-NEXT: Section (5) .rel.dyn {
+# PLT-NEXT: 0x400120 R_MIPS_REL32 T1 0x0
+# PLT-NEXT: }
+# PLT-NEXT: Section (6) .rel.plt {
+# PLT-NEXT: 0x403008 R_MIPS_JUMP_SLOT T2 0x0
+# PLT-NEXT: 0x40300C R_MIPS_JUMP_SLOT T3 0x0
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# PLT: DynamicSymbols [
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: @ (0)
+# PLT-NEXT: Value: 0x0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Local (0x0)
+# PLT-NEXT: Type: None (0x0)
+# PLT-NEXT: Other: 0
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T2@ (4)
+# PLT-NEXT: Value: 0x4010E0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T3@ (7)
+# PLT-NEXT: Value: 0x4010F0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T1@ (1)
+# PLT-NEXT: Value: 0x0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 0
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x402008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ # There is no branch relocation for T1.
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_32
+ # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ...
+ - Offset: 0x00
+ Symbol: T2
+ Type: R_MIPS_32
+ # ... but R_MIPS_26 creates PLT entry and makes R_MIPS_REL32 redundant.
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_26
+ # Create PLT entry for T3 symbol.
+ - Offset: 0x00
+ Symbol: T3
+ Type: R_MIPS_26
+ # Take in account existing PLT entry and do not create R_MIPS_REL32.
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+...
diff --git a/test/old-elf/Mips/rel-dynamic-05-micro.test b/test/old-elf/Mips/rel-dynamic-05-micro.test
new file mode 100644
index 000000000000..16c6a9c6aad5
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-05-micro.test
@@ -0,0 +1,192 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# c) Relocations modify a read-only section.
+# d) The first symbol is referenced by R_MIPS32 relocation only
+# e) The second symbol is referenced by R_MIPS_32
+# and R_MICROMIPS_26_S1 relocations.
+# f) The third symbol is referenced by R_MICROMIPS_26_S1
+# and R_MIPS_32 relocations.
+# Check:
+# a) There should be no R_MIPS_REL32 relocations.
+# b) Linker creates PLT entries for all three relocations.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s
+
+# PLT: Section {
+# PLT: Index: 5
+# PLT-NEXT: Name: .rel.plt (31)
+# PLT-NEXT: Type: SHT_REL (0x9)
+# PLT-NEXT: Flags [ (0x2)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x400194
+# PLT-NEXT: Offset: 0x194
+# PLT-NEXT: Size: 24
+# PLT-NEXT: Link: 3
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 4
+# PLT-NEXT: EntrySize: 8
+# PLT-NEXT: }
+# PLT-NEXT: Section {
+# PLT-NEXT: Index: 6
+# PLT-NEXT: Name: .plt (40)
+# PLT-NEXT: Type: SHT_PROGBITS (0x1)
+# PLT-NEXT: Flags [ (0x6)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: SHF_EXECINSTR (0x4)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x4001B0
+# PLT-NEXT: Offset: 0x1B0
+# PLT-NEXT: Size: 60
+# PLT-NEXT: Link: 0
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 16
+# PLT-NEXT: EntrySize: 0
+# PLT-NEXT: }
+
+# PLT: Relocations [
+# PLT-NEXT: Section (5) .rel.plt {
+# PLT-NEXT: 0x402008 R_MIPS_JUMP_SLOT T1 0x0
+# PLT-NEXT: 0x40200C R_MIPS_JUMP_SLOT T2 0x0
+# PLT-NEXT: 0x402010 R_MIPS_JUMP_SLOT T3 0x0
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# PLT: DynamicSymbols [
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: @ (0)
+# PLT-NEXT: Value: 0x0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Local (0x0)
+# PLT-NEXT: Type: None (0x0)
+# PLT-NEXT: Other: 0
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T1@ (1)
+# PLT-NEXT: Value: 0x4001C9
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T2@ (4)
+# PLT-NEXT: Value: 0x4001D5
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T3@ (7)
+# PLT-NEXT: Value: 0x4001E1
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x14
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ # There is no branch relocation for T1.
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_32
+ # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ...
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+ # ... but R_MICROMIPS_26_S1 creates PLT entry and makes R_MIPS_REL32 redundant.
+ - Offset: 0x08
+ Symbol: T2
+ Type: R_MICROMIPS_26_S1
+ # Create PLT entry for T3 symbol.
+ - Offset: 0x0C
+ Symbol: T3
+ Type: R_MICROMIPS_26_S1
+ # Take in account existing PLT entry and do not create R_MIPS_REL32.
+ - Offset: 0x10
+ Symbol: T3
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 0x14
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+...
diff --git a/test/old-elf/Mips/rel-dynamic-05.test b/test/old-elf/Mips/rel-dynamic-05.test
new file mode 100644
index 000000000000..8348bc511fbd
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-05.test
@@ -0,0 +1,188 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# c) Relocations modify a read-only section.
+# d) The first symbol is referenced by R_MIPS32 relocation only
+# e) The second symbol is referenced by R_MIPS_32 and R_MIPS26 relocations.
+# f) The third symbol is referenced by R_MIPS26 and R_MIPS_32 relocations.
+# Check:
+# a) There should be no R_MIPS_REL32 relocations.
+# b) Linker creates PLT entries for all three relocations.
+# c) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT %s
+
+# PLT: Section {
+# PLT: Index: 5
+# PLT-NEXT: Name: .rel.plt (31)
+# PLT-NEXT: Type: SHT_REL (0x9)
+# PLT-NEXT: Flags [ (0x2)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x{{[0-9A-F]+}}
+# PLT-NEXT: Offset: 0x{{[0-9A-F]+}}
+# PLT-NEXT: Size: 24
+# PLT-NEXT: Link: 3
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 4
+# PLT-NEXT: EntrySize: 8
+# PLT-NEXT: }
+# PLT-NEXT: Section {
+# PLT-NEXT: Index: 6
+# PLT-NEXT: Name: .plt (40)
+# PLT-NEXT: Type: SHT_PROGBITS (0x1)
+# PLT-NEXT: Flags [ (0x6)
+# PLT-NEXT: SHF_ALLOC (0x2)
+# PLT-NEXT: SHF_EXECINSTR (0x4)
+# PLT-NEXT: ]
+# PLT-NEXT: Address: 0x{{[0-9A-F]+}}
+# PLT-NEXT: Offset: 0x{{[0-9A-F]+}}
+# PLT-NEXT: Size: 80
+# PLT-NEXT: Link: 0
+# PLT-NEXT: Info: 0
+# PLT-NEXT: AddressAlignment: 16
+# PLT-NEXT: EntrySize: 0
+# PLT-NEXT: }
+
+# PLT: Relocations [
+# PLT-NEXT: Section (5) .rel.plt {
+# PLT-NEXT: {{[0-9A-F]+}} R_MIPS_JUMP_SLOT T1 0x0
+# PLT-NEXT: {{[0-9A-F]+}} R_MIPS_JUMP_SLOT T2 0x0
+# PLT-NEXT: {{[0-9A-F]+}} R_MIPS_JUMP_SLOT T3 0x0
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# PLT: DynamicSymbols [
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: @ (0)
+# PLT-NEXT: Value: 0x0
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Local (0x0)
+# PLT-NEXT: Type: None (0x0)
+# PLT-NEXT: Other: 0
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T1@ (1)
+# PLT-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T2@ (4)
+# PLT-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: Symbol {
+# PLT-NEXT: Name: T3@ (7)
+# PLT-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-NEXT: Size: 0
+# PLT-NEXT: Binding: Global (0x1)
+# PLT-NEXT: Type: Function (0x2)
+# PLT-NEXT: Other: 8
+# PLT-NEXT: Section: Undefined (0x0)
+# PLT-NEXT: }
+# PLT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+
+# o.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ # There is no branch relocation for T1.
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_32
+ # The R_MIPS_32 relocation for T2 might produce R_MIPS_REL32 ...
+ - Offset: 0x00
+ Symbol: T2
+ Type: R_MIPS_32
+ # ... but R_MIPS_26 creates PLT entry and makes R_MIPS_REL32 redundant.
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_26
+ # Create PLT entry for T3 symbol.
+ - Offset: 0x00
+ Symbol: T3
+ Type: R_MIPS_26
+ # Take in account existing PLT entry and do not create R_MIPS_REL32.
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+...
diff --git a/test/old-elf/Mips/rel-dynamic-06-64.test b/test/old-elf/Mips/rel-dynamic-06-64.test
new file mode 100644
index 000000000000..6b0d28993f94
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-06-64.test
@@ -0,0 +1,114 @@
+# Conditions:
+# a) Linking a shared library.
+# b) The first relocation modifies a regular .text section.
+# c) The second relocation modifies a .pdr section without SHF_ALLOC flag.
+# Check:
+# a) There should be no PLT entries.
+# b) Linker creates a single R_MIPS_REL32 relocation.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o
+# RUN: llvm-readobj -dt -r -s %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-readobj -mips-plt-got %t.so | FileCheck -check-prefix=GOT %s
+
+# SYM: Sections [
+# SYM: Section {
+# SYM-NOT: Name: .plt ({{[0-9]+}})
+
+# SYM: Relocations [
+# SYM-NEXT: Section (4) .rel.dyn {
+# SYM-NEXT: 0x[[ADDR:[0-9A-Z]+]] R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T0 0x0
+# SYM-NEXT: }
+# SYM-NEXT: ]
+
+# SYM: Symbol {
+# SYM: Name: @ (0)
+# SYM-NEXT: Value: 0x0
+# SYM-NEXT: Size: 0
+# SYM-NEXT: Binding: Local (0x0)
+# SYM-NEXT: Type: None (0x0)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: Undefined (0x0)
+# SYM-NEXT: }
+# SYM: Symbol {
+# SYM: Name: T1@ (4)
+# SYM-NEXT: Value: 0x174
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x5)
+# SYM-NEXT: }
+# SYM: Symbol {
+# SYM: Name: T0@ (1)
+# SYM-NEXT: Value: 0x[[ADDR]]
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x5)
+# SYM-NEXT: }
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x170
+# GOT-NEXT: Value: 0x170
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: .text (0x5)
+# GOT-NEXT: Name: T0@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_RELA
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T0
+ Type: R_MIPS_64
+
+- Name: .pdr
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+
+- Name: .rel.pdr
+ Type: SHT_RELA
+ Info: .pdr
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_64
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
diff --git a/test/old-elf/Mips/rel-dynamic-06.test b/test/old-elf/Mips/rel-dynamic-06.test
new file mode 100644
index 000000000000..ead7dfb08ddf
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-06.test
@@ -0,0 +1,115 @@
+# Conditions:
+# a) Linking a shared library.
+# b) The first relocation modifies a regular .text section.
+# c) The second relocation modifies a .pdr section without SHF_ALLOC flag.
+# Check:
+# a) There should be no PLT entries.
+# b) Linker creates a single R_MIPS_REL32 relocation.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -dt -r -s %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-readobj -mips-plt-got %t.so | FileCheck -check-prefix=GOT %s
+
+# SYM: Sections [
+# SYM: Section {
+# SYM-NOT: Name: .plt ({{[0-9]+}})
+
+# SYM: Relocations [
+# SYM-NEXT: Section (4) .rel.dyn {
+# SYM-NEXT: 0x[[ADDR:[0-9A-Z]+]] R_MIPS_REL32 T0 0x0
+# SYM-NEXT: }
+# SYM-NEXT: ]
+
+# SYM: Symbol {
+# SYM: Name: @ (0)
+# SYM-NEXT: Value: 0x0
+# SYM-NEXT: Size: 0
+# SYM-NEXT: Binding: Local (0x0)
+# SYM-NEXT: Type: None (0x0)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: Undefined (0x0)
+# SYM-NEXT: }
+# SYM: Symbol {
+# SYM: Name: T1@ (4)
+# SYM-NEXT: Value: 0x104
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x5)
+# SYM-NEXT: }
+# SYM: Symbol {
+# SYM: Name: T0@ (1)
+# SYM-NEXT: Value: 0x[[ADDR]]
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x5)
+# SYM-NEXT: }
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x100
+# GOT-NEXT: Value: 0x100
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: .text (0x5)
+# GOT-NEXT: Name: T0@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T0
+ Type: R_MIPS_32
+
+- Name: .pdr
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: []
+
+- Name: .rel.pdr
+ Type: SHT_REL
+ Info: .pdr
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
diff --git a/test/old-elf/Mips/rel-dynamic-07-64.test b/test/old-elf/Mips/rel-dynamic-07-64.test
new file mode 100644
index 000000000000..823a66d521e2
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-07-64.test
@@ -0,0 +1,348 @@
+# Conditions:
+# a) Linking a shared library.
+# b) There ars multiple R_MIPS_64 relocations with various targets.
+# Check:
+# a) Emitting of R_MIPS_REL32 relocations.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t1.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -shared --noinhibit-exec \
+# RUN: -o %t2.so %t-o.o %t1.so
+# RUN: llvm-readobj -dt -r -sections %t2.so | FileCheck %s
+# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s
+
+# CHECK: Sections [
+# CHECK: Section {
+# CHECK-NOT: Name: .plt ({{[0-9]+}})
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (4) .rel.dyn {
+# CHECK-NEXT: 0x2000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T0 0x0
+# CHECK-NEXT: 0x2000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T4 0x0
+# CHECK-NEXT: 0x2000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D2 0x0
+# CHECK-NEXT: 0x2004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T1 0x0
+# CHECK-NEXT: 0x2008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T2 0x0
+# CHECK-NEXT: 0x2004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D0 0x0
+# CHECK-NEXT: 0x2008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D1 0x0
+# CHECK-NEXT: 0x2004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D4 0x0
+# CHECK-NEXT: 0x2008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE U1 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T0@ (1)
+# CHECK-NEXT: Value: 0x324
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text (0x5)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T4@ (7)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D2@ (25)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T1@ (16)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T2@ (19)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D0@ (4)
+# CHECK-NEXT: Value: 0x2004
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .data (0x8)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (22)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D4@ (10)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: U1@ (13)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x324
+# GOT-NEXT: Value: 0x324
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: .text (0x5)
+# GOT-NEXT: Name: T0@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1018
+# GOT-NEXT: Access: -32728
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: None (0x0)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T4@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1020
+# GOT-NEXT: Access: -32720
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D2@ (25)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1028
+# GOT-NEXT: Access: -32712
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (16)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1030
+# GOT-NEXT: Access: -32704
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (19)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1038
+# GOT-NEXT: Access: -32696
+# GOT-NEXT: Initial: 0x2004
+# GOT-NEXT: Value: 0x2004
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: .data (0x8)
+# GOT-NEXT: Name: D0@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1040
+# GOT-NEXT: Access: -32688
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D1@ (22)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1048
+# GOT-NEXT: Access: -32680
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: None (0x0)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D4@ (10)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1050
+# GOT-NEXT: Access: -32672
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: None (0x0)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: U1@ (13)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00 # T0 is a defined function
+ Symbol: T0
+ Type: R_MIPS_64
+ - Offset: 0x04 # T1 is a function from shared lib
+ Symbol: T1
+ Type: R_MIPS_64
+ - Offset: 0x08 # T2 has unknown type and defined in shared lib
+ Symbol: T2
+ Type: R_MIPS_64
+ - Offset: 0x00 # T4 is an undefined function
+ Symbol: T4
+ Type: R_MIPS_64
+ - Offset: 0x04 # D0 is a defined data object
+ Symbol: D0
+ Type: R_MIPS_64
+ - Offset: 0x08 # D1 is a data object from shared lib
+ Symbol: D1
+ Type: R_MIPS_64
+ - Offset: 0x00 # D2 has unknown type and defined in shared lib
+ Symbol: D2
+ Type: R_MIPS_64
+ - Offset: 0x04 # D4 is an undefined data object
+ Symbol: D4
+ Type: R_MIPS_64
+ - Offset: 0x08 # U1 is undefined and has unknown type
+ Symbol: U1
+ Type: R_MIPS_64
+
+Symbols:
+ Local:
+ - Name: LT0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: LD0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 4
+
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ - Name: T4
+ Type: STT_FUNC
+
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ - Name: D4
+ Type: STT_OBJECT
+ - Name: U1
+...
diff --git a/test/old-elf/Mips/rel-dynamic-07.test b/test/old-elf/Mips/rel-dynamic-07.test
new file mode 100644
index 000000000000..41c31c66a5f3
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-07.test
@@ -0,0 +1,363 @@
+# Conditions:
+# a) Linking a shared library.
+# b) There ars multiple R_MIPS_32 relocations with various targets.
+# Check:
+# a) Emitting of R_MIPS_REL32 relocations.
+# b) There should be no R_MIPS_REL32 relocations for the _gp_disp symbol.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -shared --noinhibit-exec \
+# RUN: -o %t2.so %t-o.o %t1.so
+# RUN: llvm-readobj -dt -r -sections %t2.so | FileCheck %s
+# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s
+
+# CHECK: Sections [
+# CHECK: Section {
+# CHECK-NOT: Name: .plt ({{[0-9]+}})
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (4) .rel.dyn {
+# CHECK-NEXT: 0x2000 R_MIPS_REL32 T0 0x0
+# CHECK-NEXT: 0x2000 R_MIPS_REL32 T4 0x0
+# CHECK-NEXT: 0x2000 R_MIPS_REL32 D2 0x0
+# CHECK-NEXT: 0x2004 R_MIPS_REL32 T1 0x0
+# CHECK-NEXT: 0x2008 R_MIPS_REL32 T2 0x0
+# CHECK-NEXT: 0x2004 R_MIPS_REL32 D0 0x0
+# CHECK-NEXT: 0x2008 R_MIPS_REL32 D1 0x0
+# CHECK-NEXT: 0x2004 R_MIPS_REL32 D4 0x0
+# CHECK-NEXT: 0x2008 R_MIPS_REL32 U1 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T0@ (1)
+# CHECK-NEXT: Value: 0x214
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .text (0x5)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T4@ (7)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D2@ (25)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T1@ (16)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T2@ (19)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D0@ (4)
+# CHECK-NEXT: Value: 0x2004
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: .data (0x8)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (22)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D4@ (10)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: U1@ (13)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x214
+# GOT-NEXT: Value: 0x214
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: .text (0x5)
+# GOT-NEXT: Name: T0@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: None (0x0)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T4@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D2@ (25)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1014
+# GOT-NEXT: Access: -32732
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (16)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1018
+# GOT-NEXT: Access: -32728
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (19)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x101C
+# GOT-NEXT: Access: -32724
+# GOT-NEXT: Initial: 0x2004
+# GOT-NEXT: Value: 0x2004
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: .data (0x8)
+# GOT-NEXT: Name: D0@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1020
+# GOT-NEXT: Access: -32720
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D1@ (22)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1024
+# GOT-NEXT: Access: -32716
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: None (0x0)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D4@ (10)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1028
+# GOT-NEXT: Access: -32712
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: None (0x0)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: U1@ (13)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00 # T0 is a defined function
+ Symbol: T0
+ Type: R_MIPS_32
+ - Offset: 0x04 # T1 is a function from shared lib
+ Symbol: T1
+ Type: R_MIPS_32
+ - Offset: 0x08 # T2 has unknown type and defined in shared lib
+ Symbol: T2
+ Type: R_MIPS_32
+ - Offset: 0x00 # T4 is an undefined function
+ Symbol: T4
+ Type: R_MIPS_32
+ - Offset: 0x04 # D0 is a defined data object
+ Symbol: D0
+ Type: R_MIPS_32
+ - Offset: 0x08 # D1 is a data object from shared lib
+ Symbol: D1
+ Type: R_MIPS_32
+ - Offset: 0x00 # D2 has unknown type and defined in shared lib
+ Symbol: D2
+ Type: R_MIPS_32
+ - Offset: 0x04 # D4 is an undefined data object
+ Symbol: D4
+ Type: R_MIPS_32
+ - Offset: 0x08 # U1 is undefined and has unknown type
+ Symbol: U1
+ Type: R_MIPS_32
+
+Symbols:
+ Local:
+ - Name: LT0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: LD0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+
+ Global:
+ - Name: _gp_disp
+ Type: STT_OBJECT
+
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ - Name: T4
+ Type: STT_FUNC
+
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ - Name: D4
+ Type: STT_OBJECT
+ - Name: U1
diff --git a/test/old-elf/Mips/rel-dynamic-08-64.test b/test/old-elf/Mips/rel-dynamic-08-64.test
new file mode 100644
index 000000000000..019b8e5161a8
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-08-64.test
@@ -0,0 +1,275 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) There ars multiple R_MIPS_64/R_MIPS_HI16/R_MIPS_LO16 relocations
+# with various targets.
+# Check:
+# a) Emitting of R_MIPS_REL32 relocations.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 --noinhibit-exec \
+# RUN: -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -sections %t.exe | FileCheck %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# CHECK: Sections [
+# CHECK: Section {
+# CHECK-NOT: Name: .plt ({{[0-9]+}})
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (5) .rel.dyn {
+# CHECK-NEXT: 0x120002000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D2 0x0
+# CHECK-NEXT: 0x120002004 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T1 0x0
+# CHECK-NEXT: 0x120002008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T2 0x0
+# CHECK-NEXT: 0x120002008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE D1 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D2@ (10)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T1@ (1)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T2@ (4)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (7)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D2@ (10)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001018
+# GOT-NEXT: Access: -32728
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001020
+# GOT-NEXT: Access: -32720
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x120001028
+# GOT-NEXT: Access: -32712
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D1@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_RELA
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+
+- Name: .rel.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00 # LT0 is a locally defined function
+ Symbol: LT0
+ Type: R_MIPS_64
+ - Offset: 0x00 # LD0 is a locally defined data object
+ Symbol: LD0
+ Type: R_MIPS_64
+ - Offset: 0x00 # T0 is a defined function
+ Symbol: T0
+ Type: R_MIPS_64
+ - Offset: 0x04 # T1 is a function from shared lib
+ Symbol: T1
+ Type: R_MIPS_64
+ - Offset: 0x08 # T2 has unknown type and defined in shared lib
+ Symbol: T2
+ Type: R_MIPS_64
+ - Offset: 0x00 # T4 is an undefined function
+ Symbol: T4
+ Type: R_MIPS_64
+ - Offset: 0x04 # D0 is a defined data object
+ Symbol: D0
+ Type: R_MIPS_64
+ - Offset: 0x08 # D1 is a data object from shared lib
+ Symbol: D1
+ Type: R_MIPS_64
+ - Offset: 0x00 # D2 has unknown type and defined in shared lib
+ Symbol: D2
+ Type: R_MIPS_64
+ - Offset: 0x04 # D4 is an undefined data object
+ Symbol: D4
+ Type: R_MIPS_64
+ - Offset: 0x08 # U1 is undefined and has unknown type
+ Symbol: U1
+ Type: R_MIPS_64
+
+Symbols:
+ Local:
+ - Name: LT0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: LD0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 4
+
+ Global:
+ - Name: _gp_disp
+ Type: STT_OBJECT
+
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ - Name: T4
+ Type: STT_FUNC
+
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ - Name: D4
+ Type: STT_OBJECT
+ - Name: U1
+...
diff --git a/test/old-elf/Mips/rel-dynamic-08-micro.test b/test/old-elf/Mips/rel-dynamic-08-micro.test
new file mode 100644
index 000000000000..2d25b504ee28
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-08-micro.test
@@ -0,0 +1,278 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) There ars multiple R_MIPS_32/R_MICROMIPS_HI16/R_MICROMIPS_LO16
+# relocations with various targets.
+# Check:
+# a) Emitting of R_MIPS_REL32 relocations.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 --noinhibit-exec \
+# RUN: -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -sections %t.exe | FileCheck %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# CHECK: Sections [
+# CHECK: Section {
+# CHECK-NOT: Name: .plt ({{[0-9]+}})
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (5) .rel.dyn {
+# CHECK-NEXT: 0x402000 R_MIPS_REL32 D2 0x0
+# CHECK-NEXT: 0x402004 R_MIPS_REL32 T1 0x0
+# CHECK-NEXT: 0x402008 R_MIPS_REL32 T2 0x0
+# CHECK-NEXT: 0x402008 R_MIPS_REL32 D1 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D2@ (10)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T1@ (1)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T2@ (4)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (7)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D2@ (10)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x40100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401014
+# GOT-NEXT: Access: -32732
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D1@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MICROMIPS_LO16
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00 # LT0 is a locally defined function
+ Symbol: LT0
+ Type: R_MIPS_32
+ - Offset: 0x00 # LD0 is a locally defined data object
+ Symbol: LD0
+ Type: R_MIPS_32
+ - Offset: 0x00 # T0 is a defined function
+ Symbol: T0
+ Type: R_MIPS_32
+ - Offset: 0x04 # T1 is a function from shared lib
+ Symbol: T1
+ Type: R_MIPS_32
+ - Offset: 0x08 # T2 has unknown type and defined in shared lib
+ Symbol: T2
+ Type: R_MIPS_32
+ - Offset: 0x00 # T4 is an undefined function
+ Symbol: T4
+ Type: R_MIPS_32
+ - Offset: 0x04 # D0 is a defined data object
+ Symbol: D0
+ Type: R_MIPS_32
+ - Offset: 0x08 # D1 is a data object from shared lib
+ Symbol: D1
+ Type: R_MIPS_32
+ - Offset: 0x00 # D2 has unknown type and defined in shared lib
+ Symbol: D2
+ Type: R_MIPS_32
+ - Offset: 0x04 # D4 is an undefined data object
+ Symbol: D4
+ Type: R_MIPS_32
+ - Offset: 0x08 # U1 is undefined and has unknown type
+ Symbol: U1
+ Type: R_MIPS_32
+
+Symbols:
+ Local:
+ - Name: LT0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: LD0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+
+ Global:
+ - Name: _gp_disp
+ Type: STT_OBJECT
+
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 8
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ - Name: T4
+ Type: STT_FUNC
+
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ - Name: D4
+ Type: STT_OBJECT
+ - Name: U1
+...
diff --git a/test/old-elf/Mips/rel-dynamic-08.test b/test/old-elf/Mips/rel-dynamic-08.test
new file mode 100644
index 000000000000..a89e6ecf480e
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-08.test
@@ -0,0 +1,275 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) There ars multiple R_MIPS_32/R_MIPS_HI16/R_MIPS_LO16 relocations
+# with various targets.
+# Check:
+# a) Emitting of R_MIPS_REL32 relocations.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 --noinhibit-exec \
+# RUN: -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r -sections %t.exe | FileCheck %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# CHECK: Sections [
+# CHECK: Section {
+# CHECK-NOT: Name: .plt ({{[0-9]+}})
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section (5) .rel.dyn {
+# CHECK-NEXT: 0x402000 R_MIPS_REL32 D2 0x0
+# CHECK-NEXT: 0x402004 R_MIPS_REL32 T1 0x0
+# CHECK-NEXT: 0x402008 R_MIPS_REL32 T2 0x0
+# CHECK-NEXT: 0x402008 R_MIPS_REL32 D1 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# CHECK: DynamicSymbols [
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: @ (0)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Local (0x0)
+# CHECK-NEXT: Type: None (0x0)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D2@ (10)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T1@ (1)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: T2@ (4)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 0
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Function (0x2)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: Symbol {
+# CHECK-NEXT: Name: D1@ (7)
+# CHECK-NEXT: Value: 0x0
+# CHECK-NEXT: Size: 4
+# CHECK-NEXT: Binding: Global (0x1)
+# CHECK-NEXT: Type: Object (0x1)
+# CHECK-NEXT: Other: 0
+# CHECK-NEXT: Section: Undefined (0x0)
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D2@ (10)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x40100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401014
+# GOT-NEXT: Access: -32732
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D1@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: _gp_disp
+ Type: R_MIPS_LO16
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00 # LT0 is a locally defined function
+ Symbol: LT0
+ Type: R_MIPS_32
+ - Offset: 0x00 # LD0 is a locally defined data object
+ Symbol: LD0
+ Type: R_MIPS_32
+ - Offset: 0x00 # T0 is a defined function
+ Symbol: T0
+ Type: R_MIPS_32
+ - Offset: 0x04 # T1 is a function from shared lib
+ Symbol: T1
+ Type: R_MIPS_32
+ - Offset: 0x08 # T2 has unknown type and defined in shared lib
+ Symbol: T2
+ Type: R_MIPS_32
+ - Offset: 0x00 # T4 is an undefined function
+ Symbol: T4
+ Type: R_MIPS_32
+ - Offset: 0x04 # D0 is a defined data object
+ Symbol: D0
+ Type: R_MIPS_32
+ - Offset: 0x08 # D1 is a data object from shared lib
+ Symbol: D1
+ Type: R_MIPS_32
+ - Offset: 0x00 # D2 has unknown type and defined in shared lib
+ Symbol: D2
+ Type: R_MIPS_32
+ - Offset: 0x04 # D4 is an undefined data object
+ Symbol: D4
+ Type: R_MIPS_32
+ - Offset: 0x08 # U1 is undefined and has unknown type
+ Symbol: U1
+ Type: R_MIPS_32
+
+Symbols:
+ Local:
+ - Name: LT0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: LD0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+
+ Global:
+ - Name: _gp_disp
+ Type: STT_OBJECT
+
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ - Name: T4
+ Type: STT_FUNC
+
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ - Name: D4
+ Type: STT_OBJECT
+ - Name: U1
+...
diff --git a/test/old-elf/Mips/rel-dynamic-09-micro.test b/test/old-elf/Mips/rel-dynamic-09-micro.test
new file mode 100644
index 000000000000..2011ae079645
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-09-micro.test
@@ -0,0 +1,109 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are undefined symbols.
+# Check:
+# a) There should be no dynamic relocations.
+# b) There should be no PLT entries.
+#
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -e T0 -o %t2-exe %t-obj
+# RUN: llvm-readobj -dt -r -s %t2-exe | FileCheck -check-prefix=PLT-SYM %s
+
+# PLT-SYM: Sections [
+# PLT-SYM: Section {
+# PLT-SYM-NOT: Name: .plt ({{[0-9]+}})
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: @ (0)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Local (0x0)
+# PLT-SYM-NEXT: Type: None (0x0)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MICROMIPS_26_S1
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ Type: STT_OBJECT
diff --git a/test/old-elf/Mips/rel-dynamic-09.test b/test/old-elf/Mips/rel-dynamic-09.test
new file mode 100644
index 000000000000..9b02ec1b5707
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-09.test
@@ -0,0 +1,107 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are undefined symbols.
+# Check:
+# a) There should be no dynamic relocations.
+# b) There should be no PLT entries.
+#
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel --noinhibit-exec -e T0 -o %t2-exe %t-obj
+# RUN: llvm-readobj -dt -r -s %t2-exe | FileCheck -check-prefix=PLT-SYM %s
+
+# PLT-SYM: Sections [
+# PLT-SYM: Section {
+# PLT-SYM-NOT: Name: .plt ({{[0-9]+}})
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: @ (0)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Local (0x0)
+# PLT-SYM-NEXT: Type: None (0x0)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_LO16
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_HI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_LO16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ Type: STT_OBJECT
diff --git a/test/old-elf/Mips/rel-dynamic-10-micro.test b/test/old-elf/Mips/rel-dynamic-10-micro.test
new file mode 100644
index 000000000000..4600af85c27c
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-10-micro.test
@@ -0,0 +1,166 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the other object.
+# Check:
+# a) There should be no dynamic relocations.
+# b) There should be no PLT entries.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o2.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o
+# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT-SYM %s
+
+# PLT-SYM: Sections [
+# PLT-SYM: Section {
+# PLT-SYM-NOT: Name: .plt ({{[0-9]+}})
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: @ (0)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Local (0x0)
+# PLT-SYM-NEXT: Type: None (0x0)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# o1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o2.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MICROMIPS_26_S1
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MICROMIPS_HI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MICROMIPS_LO16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ Type: STT_OBJECT
+...
diff --git a/test/old-elf/Mips/rel-dynamic-10.test b/test/old-elf/Mips/rel-dynamic-10.test
new file mode 100644
index 000000000000..68a311df73e4
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-10.test
@@ -0,0 +1,160 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the other object.
+# Check:
+# a) There should be no dynamic relocations.
+# b) There should be no PLT entries.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-o1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o2.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o
+# RUN: llvm-readobj -dt -r -s %t.exe | FileCheck -check-prefix=PLT-SYM %s
+
+# PLT-SYM: Sections [
+# PLT-SYM: Section {
+# PLT-SYM-NOT: Name: .plt ({{[0-9]+}})
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: @ (0)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Local (0x0)
+# PLT-SYM-NEXT: Type: None (0x0)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# o1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o2.o
+---
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_HI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_LO16
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_HI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_LO16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ Type: STT_OBJECT
+...
diff --git a/test/old-elf/Mips/rel-dynamic-11.test b/test/old-elf/Mips/rel-dynamic-11.test
new file mode 100644
index 000000000000..01edbd64812f
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-11.test
@@ -0,0 +1,110 @@
+# Conditions:
+# a) Linking a shared library.
+# b) Relocations' targets are symbols defined in the other shared object.
+# Check:
+# a) Emitting R_MIPS_REL32 relocations for both symbols.
+# b) There should be no PLT entries.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t-o.o %t1.so
+# RUN: llvm-readobj -dt -r -s %t2.so | FileCheck -check-prefix=PLT-SYM %s
+
+# PLT-SYM: Sections [
+# PLT-SYM: Section {
+# PLT-SYM-NOT: Name: .plt ({{[0-9]+}})
+#
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: Section (4) .rel.dyn {
+# PLT-SYM-NEXT: 0x150 R_MIPS_REL32 T1 0x0
+# PLT-SYM-NEXT: 0x2000 R_MIPS_REL32 T1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+#
+# PLT-SYM: Name: T1@ (7)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_32
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T1
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+...
diff --git a/test/old-elf/Mips/rel-dynamic-12.test b/test/old-elf/Mips/rel-dynamic-12.test
new file mode 100644
index 000000000000..c684df3f2628
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-12.test
@@ -0,0 +1,237 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# c) Relocations are R_MIPS_PCHI16 / R_MIPS_PCLO16.
+# Check:
+# a) Emitting R_MIPS_REL32, R_MIPS_COPY, R_MIPS_JUMP_SLOT relocations.
+# b) STO_MIPS_PLT flag in the dynamic symbol table for symbols require
+# a pointer equality.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: Section (5) .rel.dyn {
+# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 T2 0x0
+# PLT-SYM-NEXT: 0x402014 R_MIPS_REL32 D2 0x0
+# PLT-SYM-NEXT: 0x402020 R_MIPS_COPY D1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Section (6) .rel.plt {
+# PLT-SYM-NEXT: 0x402008 R_MIPS_JUMP_SLOT T3 0x0
+# PLT-SYM-NEXT: 0x40200C R_MIPS_JUMP_SLOT T1 0x0
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: @ (0)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Local (0x0)
+# PLT-SYM-NEXT: Type: None (0x0)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: D1@ (1)
+# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-SYM-NEXT: Size: 4
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Object (0x1)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: .bss
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T1@ (4)
+# PLT-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 8
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T3@ (10)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: T2@ (7)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 0
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Function (0x2)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: Symbol {
+# PLT-SYM-NEXT: Name: D2@ (13)
+# PLT-SYM-NEXT: Value: 0x0
+# PLT-SYM-NEXT: Size: 4
+# PLT-SYM-NEXT: Binding: Global (0x1)
+# PLT-SYM-NEXT: Type: Object (0x1)
+# PLT-SYM-NEXT: Other: 0
+# PLT-SYM-NEXT: Section: Undefined (0x0)
+# PLT-SYM-NEXT: }
+# PLT-SYM-NEXT: ]
+
+# GOT: Local entries [
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x{{[0-9A-F]+}}
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x{{[0-9A-F]+}}
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Object (0x1)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: D2@ (13)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x0C
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x4
+ Size: 4
+ - Name: T3
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x8
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 4
+ - Name: D2
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x4
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x04
+ Symbol: T3
+ Type: R_MIPS_26
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_PCHI16
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_PCLO16
+ - Offset: 0x04
+ Symbol: T2
+ Type: R_MIPS_32
+
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_PCHI16
+ - Offset: 0x04
+ Symbol: D1
+ Type: R_MIPS_PCLO16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_32
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: T3
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+ - Name: D2
+ Type: STT_OBJECT
+...
diff --git a/test/old-elf/Mips/rel-dynamic-13.test b/test/old-elf/Mips/rel-dynamic-13.test
new file mode 100644
index 000000000000..2bf014e51025
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-13.test
@@ -0,0 +1,94 @@
+# Conditions:
+# a) Linking a non-shared 32-bit executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# Check:
+# a) Emitting R_MIPS_REL32 relocation.
+# b) Applying addendum from the original relocation.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s
+
+# RAW: Contents of section .data:
+# RAW-NEXT: 402000 01000000
+
+# REL: Relocations [
+# REL-NEXT: Section (5) .rel.dyn {
+# REL-NEXT: 0x402000 R_MIPS_REL32 T1 0x0
+# REL-NEXT: }
+# REL-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_32
+ Addend: 1
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/rel-dynamic-14.test b/test/old-elf/Mips/rel-dynamic-14.test
new file mode 100644
index 000000000000..33197ae92b81
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-14.test
@@ -0,0 +1,94 @@
+# Conditions:
+# a) Linking a non-shared 64-bit executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# Check:
+# a) Emitting R_MIPS_REL32/R_MIPS_64 relocation.
+# b) Applying addendum from the original relocation.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s
+
+# RAW: Contents of section .data:
+# RAW-NEXT: 120002000 04000000 00000000
+
+# REL: Relocations [
+# REL-NEXT: Section (5) .rel.dyn {
+# REL-NEXT: 0x120002000 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE T1 0x0
+# REL-NEXT: }
+# REL-NEXT: ]
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_64
+ Addend: 4
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/rel-dynamic-15.test b/test/old-elf/Mips/rel-dynamic-15.test
new file mode 100644
index 000000000000..13e2083bfc02
--- /dev/null
+++ b/test/old-elf/Mips/rel-dynamic-15.test
@@ -0,0 +1,81 @@
+# Check that LLD generates dynamic relocation R_MIPS_REL32 for local
+# symbols if the symbols referenced by R_MIPS_32 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s
+
+# RAW: Contents of section .text:
+# RAW-NEXT: 0120 00000000 00000000
+# RAW: Contents of section .data.rel.local:
+# RAW-NEXT: 2000 20010000 00000000
+
+# REL: Relocations [
+# REL-NEXT: Section (4) .rel.dyn {
+# REL-NEXT: 0x2000 R_MIPS_REL32 - 0x0
+# REL-NEXT: 0x2004 R_MIPS_REL32 T1 0x0
+# REL-NEXT: }
+# REL-NEXT: ]
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 8
+
+ - Name: .data.rel.local
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 4
+ Size: 8
+
+ - Name: .rel.data.rel.local
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .data.rel.local
+ Relocations:
+ - Offset: 0
+ Symbol: .text
+ Type: R_MIPS_32
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_32
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: .data.rel.local
+ Type: STT_SECTION
+ Section: .data.rel.local
+
+ Global:
+ - Name: D0
+ Type: STT_OBJECT
+ Section: .data.rel.local
+ Value: 0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 4
+ Size: 4
+...
diff --git a/test/old-elf/Mips/rel-eh-01.test b/test/old-elf/Mips/rel-eh-01.test
new file mode 100644
index 000000000000..08e5d78683a8
--- /dev/null
+++ b/test/old-elf/Mips/rel-eh-01.test
@@ -0,0 +1,186 @@
+# Check R_MIPS_EH relocation handling: writing result of a relocation
+# calculation, adding GOT entries etc.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 3 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t1.o %t2.o %t.so
+# RUN: llvm-objdump -s -t %t.exe | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -mips-plt-got %t.exe | FileCheck -check-prefix=GOT %s
+
+# RAW: Contents of section .gnu_extab:
+# RAW-NEXT: 400178 001880ff ff000000 1c80ffff 2080ffff
+# ^ T1 GOT entry = 0xffff8018 = -32744
+# ^ L1 GOT entry = 0xffff801c = -32740
+# E1 GOT entry = 0xffff8020 = -32736 ^
+# RAW: Contents of section .got:
+# RAW-NEXT: 401000 00000000 00000080 60014000 00204000
+# RAW-NEXT: 401010 00000000
+
+# RAW: SYMBOL TABLE:
+# RAW: 00402000 l .data 00000004 L1
+# RAW: 00400160 g F .text 00000004 T1
+
+# GOT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x400160
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x40100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x402000
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x401010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: E1@ (1)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Number of TLS and multi-GOT entries: 0
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: E1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+ AddressAlign: 16
+ Size: 8
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [SHF_WRITE, SHF_ALLOC]
+ AddressAlign: 16
+ Size: 4
+
+ - Name: .gnu_extab
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ AddressAlign: 4
+ Size: 16
+
+ - Name: .rel.gnu_extab
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .gnu_extab
+ Relocations:
+ - Offset: 1
+ Symbol: T1
+ Type: R_MIPS_EH
+ - Offset: 8
+ Symbol: L1
+ Type: R_MIPS_EH
+ - Offset: 12
+ Symbol: E1
+ Type: R_MIPS_EH
+
+ - Name: .eh_frame_entry
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ AddressAlign: 4
+ Content: "0000000100000001"
+
+ - Name: .rel.eh_frame_entry
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .eh_frame_entry
+ Relocations:
+ - Offset: 0
+ Symbol: .text
+ Type: R_MIPS_PC32
+ - Offset: 4
+ Symbol: .gnu_extab
+ Type: R_MIPS_PC32
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .gnu_extab
+ Type: STT_SECTION
+ Section: .gnu_extab
+ - Name: L1
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0
+ Size: 4
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 8
+ - Name: E1
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/rel-eh-02.test b/test/old-elf/Mips/rel-eh-02.test
new file mode 100644
index 000000000000..e78c967ed301
--- /dev/null
+++ b/test/old-elf/Mips/rel-eh-02.test
@@ -0,0 +1,130 @@
+# Conditions:
+# a) Linking a non-shared executable file.
+# b) Relocations' targets are symbols defined in the shared object.
+# Check:
+# a) The R_MIPS_REL32 relocation is not created for any symbols.
+# b) The R_MIPS_COPY relocation is created for the D1 symbol.
+# c) No entries in the dynamic symbols table has the STO_MIPS_PLT flag.
+#
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-o.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o %t.so
+# RUN: llvm-readobj -dt -r %t.exe | FileCheck -check-prefix=PLT-SYM %s
+
+# PLT-SYM: Relocations [
+# PLT-SYM-NEXT: Section (5) .rel.dyn {
+# PLT-SYM-NEXT: 0x{{[0-9A-F]+}} R_MIPS_COPY D1 0x0
+# PLT-SYM-NEXT: }
+
+# PLT-SYM: DynamicSymbols [
+# PLT-SYM-NOT: Other: 8
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 4
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
+ - Name: D1
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0
+ Size: 4
+
+# o.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_EXECINSTR, SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_WRITE, SHF_ALLOC]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_26
+ - Offset: 4
+ Symbol: D1
+ Type: R_MIPS_PC32
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_EH
+ - Offset: 4
+ Symbol: T2
+ Type: R_MIPS_EH
+ - Offset: 8
+ Symbol: D1
+ Type: R_MIPS_EH
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 8
+ - Name: T1
+ Type: STT_FUNC
+ - Name: T2
+ Type: STT_FUNC
+ - Name: D0
+ Section: .data
+ Type: STT_OBJECT
+ Value: 0x0
+ Size: 8
+ - Name: D1
+ Type: STT_OBJECT
+...
diff --git a/test/old-elf/Mips/rel-eh-03.test b/test/old-elf/Mips/rel-eh-03.test
new file mode 100644
index 000000000000..63ed74cd56f8
--- /dev/null
+++ b/test/old-elf/Mips/rel-eh-03.test
@@ -0,0 +1,128 @@
+# Check R_MIPS_EH relocation handling in case of -pcrel-eh-reloc option.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 \
+# RUN: -pcrel-eh-reloc -o %t.exe %t1.o %t2.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck -check-prefix=RAW %s
+
+# RAW: Contents of section .gnu_extab:
+# RAW-NEXT: 400148 00e7ffff ff000000 b01e0000 00000000
+# ^ 0x400130 + 0 - 0x400149 = 0xffffffe7
+# ^ 0x402000 + 0 - 0x400150 = 0x1eb0
+# E1 GOT entry = 0xffff8020 = -32736 ^
+# RAW: Contents of section .got:
+# RAW-NEXT: 401000 00000000 00000080
+
+# RAW: SYMBOL TABLE:
+# RAW: 00402000 l .data 00000004 L1
+# RAW: 00400130 g F .text 00000004 T1
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+ AddressAlign: 16
+ Size: 8
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [SHF_WRITE, SHF_ALLOC]
+ AddressAlign: 16
+ Size: 4
+
+ - Name: .gnu_extab
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ AddressAlign: 4
+ Size: 16
+
+ - Name: .rel.gnu_extab
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .gnu_extab
+ Relocations:
+ - Offset: 1
+ Symbol: T1
+ Type: R_MIPS_EH
+ - Offset: 8
+ Symbol: L1
+ Type: R_MIPS_EH
+
+ - Name: .eh_frame_entry
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ AddressAlign: 4
+ Content: "0000000100000001"
+
+ - Name: .rel.eh_frame_entry
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .eh_frame_entry
+ Relocations:
+ - Offset: 0
+ Symbol: .text
+ Type: R_MIPS_PC32
+ - Offset: 4
+ Symbol: .gnu_extab
+ Type: R_MIPS_PC32
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .gnu_extab
+ Type: STT_SECTION
+ Section: .gnu_extab
+ - Name: L1
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0
+ Size: 4
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 8
+ - Name: T1
+...
diff --git a/test/old-elf/Mips/rel-got-hilo-01.test b/test/old-elf/Mips/rel-got-hilo-01.test
new file mode 100644
index 000000000000..c73d8765cbd5
--- /dev/null
+++ b/test/old-elf/Mips/rel-got-hilo-01.test
@@ -0,0 +1,109 @@
+# Check handling of R_MIPS_GOT_HI16 / R_MIPS_GOT_LO16 relocations.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so
+# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s
+
+# RAW: Contents of section .text:
+# RAW-NEXT: 0110 00000000 18800000 00000000 1c800000
+# ^ -32744 ^ -32740
+# RAW-NEXT: 0120 00000000
+
+# RAW: SYMBOL TABLE:
+# RAW: 00000120 l F .text 00000004 T1
+
+# GOT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x120
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# t1.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 4
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+
+# t2.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 20
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_GOT_HI16
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_GOT_LO16
+ - Offset: 8
+ Symbol: T2
+ Type: R_MIPS_GOT_HI16
+ - Offset: 12
+ Symbol: T2
+ Type: R_MIPS_GOT_LO16
+
+Symbols:
+ Local:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 16
+ Size: 4
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 16
+ - Name: T2
+...
diff --git a/test/old-elf/Mips/rel-got-hilo-micro.test b/test/old-elf/Mips/rel-got-hilo-micro.test
new file mode 100644
index 000000000000..39dd1848f92e
--- /dev/null
+++ b/test/old-elf/Mips/rel-got-hilo-micro.test
@@ -0,0 +1,154 @@
+# Check handling of R_MICROMIPS_GOT_HI16 / R_MICROMIPS_GOT_LO16 relocations.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t1.so %t1.so.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.so.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t2.so %t2.so.o %t1.so
+# RUN: llvm-objdump -s -t %t2.so | FileCheck -check-prefix=RAW %s
+# RUN: llvm-readobj -mips-plt-got %t2.so | FileCheck -check-prefix=GOT %s
+
+# RAW: Contents of section .text:
+# RAW-NEXT: 0130 00000000 00001880 00000000 00002080
+# ^ -32744 ^ -32736
+# RAW-NEXT: 0140 00000000 00001c80 00000000 00002480
+# ^ -32740 ^ -32732
+# RAW-NEXT: 0150 00000000 00000000
+
+# RAW: SYMBOL TABLE:
+# RAW: 00000150 l F .text 00000004 T1
+# RAW: 00000154 l F .text 00000004 M1
+
+# GOT: Local entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1008
+# GOT-NEXT: Access: -32744
+# GOT-NEXT: Initial: 0x150
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x100C
+# GOT-NEXT: Access: -32740
+# GOT-NEXT: Initial: 0x155
+# GOT-NEXT: }
+# GOT-NEXT: ]
+# GOT-NEXT: Global entries [
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1010
+# GOT-NEXT: Access: -32736
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: T2@ (4)
+# GOT-NEXT: }
+# GOT-NEXT: Entry {
+# GOT-NEXT: Address: 0x1014
+# GOT-NEXT: Access: -32732
+# GOT-NEXT: Initial: 0x0
+# GOT-NEXT: Value: 0x0
+# GOT-NEXT: Type: Function (0x2)
+# GOT-NEXT: Section: Undefined (0x0)
+# GOT-NEXT: Name: M2@ (7)
+# GOT-NEXT: }
+# GOT-NEXT: ]
+
+# t1.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+Symbols:
+ Global:
+ - Name: T2
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: M2
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+
+# t2.so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 40
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MICROMIPS_GOT_HI16
+ - Offset: 4
+ Symbol: T1
+ Type: R_MICROMIPS_GOT_LO16
+ - Offset: 8
+ Symbol: T2
+ Type: R_MICROMIPS_GOT_HI16
+ - Offset: 12
+ Symbol: T2
+ Type: R_MICROMIPS_GOT_LO16
+ - Offset: 16
+ Symbol: M1
+ Type: R_MICROMIPS_GOT_HI16
+ - Offset: 20
+ Symbol: M1
+ Type: R_MICROMIPS_GOT_LO16
+ - Offset: 24
+ Symbol: M2
+ Type: R_MICROMIPS_GOT_HI16
+ - Offset: 28
+ Symbol: M2
+ Type: R_MICROMIPS_GOT_LO16
+
+Symbols:
+ Local:
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 32
+ Size: 4
+ - Name: M1
+ Section: .text
+ Type: STT_FUNC
+ Value: 36
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 32
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T2
+ - Name: M2
+...
diff --git a/test/old-elf/Mips/rel-gprel16-micro-overflow.test b/test/old-elf/Mips/rel-gprel16-micro-overflow.test
new file mode 100644
index 000000000000..7b023aecba41
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel16-micro-overflow.test
@@ -0,0 +1,57 @@
+# Check R_MICROMIPS_GPREL16 relocation overflow handling.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}} reference from +0 to L0+0 of type 136 (R_MICROMIPS_GPREL16)
+# CHECK: Relocation out of range in file {{.*}} reference from +4 to G0+0 of type 136 (R_MICROMIPS_GPREL16)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Type: SHT_PROGBITS
+ Name: .text
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+- Type: SHT_PROGBITS
+ Name: .rodata
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Size: 8
+
+- Type: SHT_REL
+ Name: .rel.rodata
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: L0
+ Type: R_MICROMIPS_GPREL16
+ - Offset: 4
+ Symbol: G0
+ Type: R_MICROMIPS_GPREL16
+
+Symbols:
+ Local:
+ - Name: L0
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
+ Global:
+ - Name: G0
+ Section: .text
+ Value: 4
+ Size: 4
diff --git a/test/old-elf/Mips/rel-gprel16-micro.test b/test/old-elf/Mips/rel-gprel16-micro.test
new file mode 100644
index 000000000000..c0119a51e484
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel16-micro.test
@@ -0,0 +1,78 @@
+# Check R_MICROMIPS_GPREL16 relocation handling.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s
+
+# SYM: Name: L0
+# SYM-NEXT: Value: 0x104
+# SYM-NEXT: Size: 4
+
+# SYM: Name: G0
+# SYM-NEXT: Value: 0x108
+# SYM-NEXT: Size: 4
+
+# SYM: Name: _gp
+# SYM-NEXT: Value: 0x8FF0
+# SYM-NEXT: Size: 0
+
+# SEC: Contents of section .rodata:
+# SEC-NEXT: 010c 00001071 000017f1
+# ^ 0x104 (L0) + 0x10000 (GP0) - 0x8ff0 (_gp) - 4 = 0x7110
+# ^ 0x108 (G0) - 0x8ff0 (_gp) + 0x7fff = 0xf117
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Type: SHT_PROGBITS
+ Name: .text
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+- Type: SHT_PROGBITS
+ Name: .rodata
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: 0000fcff0000ff7f
+
+- Type: SHT_REL
+ Name: .rel.rodata
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: L0
+ Type: R_MICROMIPS_GPREL16
+ - Offset: 4
+ Symbol: G0
+ Type: R_MICROMIPS_GPREL16
+
+- Type: SHT_MIPS_REGINFO
+ Name: .reginfo
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 1
+ Content: 000000000000000000000000000000000000000000000100
+
+Symbols:
+ Local:
+ - Name: L0
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
+ Global:
+ - Name: G0
+ Section: .text
+ Value: 4
+ Size: 4
diff --git a/test/old-elf/Mips/rel-gprel16-overflow.test b/test/old-elf/Mips/rel-gprel16-overflow.test
new file mode 100644
index 000000000000..2943b5d200f4
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel16-overflow.test
@@ -0,0 +1,48 @@
+# Check R_MIPS_GPREL16 relocation overflow handling.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}} reference from +0 to T1+-32768 of type 7 (R_MIPS_GPREL16)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Type: SHT_PROGBITS
+ Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 4
+
+- Type: SHT_PROGBITS
+ Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: 00800000
+
+- Type: SHT_REL
+ Name: .rel.rodata
+ Type: SHT_REL
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_GPREL16
+
+Symbols:
+ Global:
+ - Name: T1
+ Section: .text
+ Value: 0
+ Size: 4
diff --git a/test/old-elf/Mips/rel-gprel16.test b/test/old-elf/Mips/rel-gprel16.test
new file mode 100644
index 000000000000..d7e8a1a92598
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel16.test
@@ -0,0 +1,104 @@
+# Check R_MIPS_GPREL16 relocation handling.
+#
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -e G1 -shared -o %t.so %t-obj
+# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s
+
+# SYM: Name: L1
+# SYM-NEXT: Value: 0x104
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Local (0x0)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x5)
+
+# SYM: Name: G1
+# SYM-NEXT: Value: 0x108
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x5)
+
+# SYM: Name: _gp
+# SYM-NEXT: Value: 0x8FF0
+# SYM-NEXT: Size: 0
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Object (0x1)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: Absolute (0xFFF1)
+
+# 0x6110 == 0xfffc (addend) + 0x0104 (L1) + 0xf000 (GP0) - 0x8ff0 (_gp)
+# SEC: Contents of section .rodata:
+# SEC-NEXT: 010c 10610008 00000000 00000000 00000000
+
+!ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+- Type: SHT_PROGBITS
+ Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+
+- Type: SHT_REL
+ Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0
+ Symbol: .rodata
+ Type: R_MIPS_GOT16
+ - Offset: 4
+ Symbol: .rodata
+ Type: R_MIPS_LO16
+
+- Type: SHT_PROGBITS
+ Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x04
+ Content: fcff0008000000000000000000000000
+
+- Type: SHT_REL
+ Name: .rel.rodata
+ Type: SHT_REL
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0
+ Symbol: L1
+ Type: R_MIPS_GPREL16
+
+- Type: SHT_MIPS_REGINFO
+ Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x01
+ Content: 000000000000000000000000000000000000000000f00000
+
+Symbols:
+ Local:
+ - Name: L1
+ Section: .text
+ Value: 0x00
+ Size: 0x04
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
+ Global:
+ - Name: G1
+ Section: .text
+ Value: 0x04
+ Size: 0x04
diff --git a/test/old-elf/Mips/rel-gprel32-64.test b/test/old-elf/Mips/rel-gprel32-64.test
new file mode 100644
index 000000000000..15498a693e4d
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel32-64.test
@@ -0,0 +1,84 @@
+# Check R_MIPS_GPREL32/R_MIPS_64 relocations handling.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.o
+# RUN: llvm-readobj -r %t.exe | FileCheck --check-prefix=REL-EXE %s
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+# RUN: llvm-nm %t.exe | FileCheck --check-prefix=SYM %s
+
+# REL-EXE: Relocations [
+# REL-EXE-NEXT: ]
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 1200001d0 f871ffff ffffffff f871ffff f871ffff
+# CHECK-NEXT: 1200001e0 f871ffff ffffffff 00000000 00000000
+
+# SYM: 00000001200001e8 t LT1
+# SYM: 0000000120001000 N _GLOBAL_OFFSET_TABLE_
+
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t.o
+# RUN: llvm-readobj -r %t.so | FileCheck --check-prefix=REL-SO %s
+
+# REL-SO: Relocations [
+# REL-SO-NEXT: ]
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 32
+
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 8
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: LT1
+ Type: R_MIPS_GPREL16
+ Type2: R_MIPS_64
+ Type3: R_MIPS_NONE
+ - Offset: 0x08
+ Symbol: LT1
+ Type: R_MIPS_GPREL16
+ Type2: R_MIPS_64
+ Type3: R_MIPS_NONE
+ - Offset: 0x0C
+ Symbol: LT1
+ Type: R_MIPS_GPREL32
+ Type2: R_MIPS_64
+ Type3: R_MIPS_NONE
+ - Offset: 0x10
+ Symbol: LT1
+ Type: R_MIPS_GPREL32
+ Type2: R_MIPS_64
+ Type3: R_MIPS_NONE
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: LT1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x18
+ Size: 0x8
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0
+ Size: 0x18
+...
diff --git a/test/old-elf/Mips/rel-gprel32.test b/test/old-elf/Mips/rel-gprel32.test
new file mode 100644
index 000000000000..14ec8cebcabd
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel32.test
@@ -0,0 +1,84 @@
+# Check R_MIPS_GPREL32 relocation handling.
+#
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj
+# RUN: llvm-readobj -symbols %t-exe | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t-exe | FileCheck -check-prefix=SEC %s
+
+# SYM: Name: $L1
+# SYM-NEXT: Value: 0x400160
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Local (0x0)
+# SYM-NEXT: Type: Function (0x2)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .text (0x6)
+#
+# SYM: Name: _gp
+# SYM-NEXT: Value: 0x408FF0
+# SYM-NEXT: Size: 0
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: Object (0x1)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: Absolute (0xFFF1)
+
+# 0x08ff7153 == 0x8000001 (addend) + 0x400140 ($L1) +
+# 0x1000002 (GP0) - 0x408FF0 (_gp)
+# SEC: Contents of section .rodata:
+# SEC-NEXT: 400170 7371ff08 00000000 00000000 00000000
+
+!ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+- Type: SHT_PROGBITS
+ Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: 00000000000000000000000000000000
+
+- Type: SHT_PROGBITS
+ Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x04
+ Content: 01000008000000000000000000000000
+
+- Type: SHT_REL
+ Name: .rel.rodata
+ Type: SHT_REL
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0
+ Symbol: $L1
+ Type: R_MIPS_GPREL32
+
+- Type: SHT_MIPS_REGINFO
+ Name: .reginfo
+ Type: SHT_MIPS_REGINFO
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x01
+ Content: 000000000000000000000000000000000000000002000001
+
+Symbols:
+ Local:
+ - Name: $L1
+ Section: .text
+ Value: 0x00
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
+ Global:
+ - Name: __start
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x04
+ Size: 12
+ - Name: _gp_disp
diff --git a/test/old-elf/Mips/rel-gprel7-micro-overflow.test b/test/old-elf/Mips/rel-gprel7-micro-overflow.test
new file mode 100644
index 000000000000..5609786aa04a
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel7-micro-overflow.test
@@ -0,0 +1,48 @@
+# Check R_MICROMIPS_GPREL7_S2 relocation overflow handling.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}} reference from +0 to L0+-4 of type 172 (R_MICROMIPS_GPREL7_S2)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Type: SHT_PROGBITS
+ Name: .text
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 4
+
+- Type: SHT_PROGBITS
+ Name: .rodata
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: 7f000000
+
+- Type: SHT_REL
+ Name: .rel.rodata
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: L0
+ Type: R_MICROMIPS_GPREL7_S2
+
+Symbols:
+ Local:
+ - Name: L0
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
diff --git a/test/old-elf/Mips/rel-gprel7-micro.test b/test/old-elf/Mips/rel-gprel7-micro.test
new file mode 100644
index 000000000000..b7790d9d169c
--- /dev/null
+++ b/test/old-elf/Mips/rel-gprel7-micro.test
@@ -0,0 +1,65 @@
+# Check R_MICROMIPS_GPREL7_S2 relocation handling.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-readobj -symbols %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=SEC %s
+
+# SYM: Name: L0
+# SYM-NEXT: Value: 0xF0
+# SYM-NEXT: Size: 4
+
+# SYM: Name: _gp
+# SYM-NEXT: Value: 0x8FF0
+# SYM-NEXT: Size: 0
+
+# SEC: Contents of section .rodata:
+# SEC-NEXT: 0f4 3b000000
+# ^ 0xf0 (L0) + 0x8ff0 (GP0) - 0x8ff0 (_gp) - 4 = 0xec >> 2
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+- Type: SHT_PROGBITS
+ Name: .text
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 4
+
+- Type: SHT_PROGBITS
+ Name: .rodata
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 4
+ Content: 7f000000
+
+- Type: SHT_REL
+ Name: .rel.rodata
+ Link: .symtab
+ Info: .rodata
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: L0
+ Type: R_MICROMIPS_GPREL7_S2
+
+- Type: SHT_MIPS_REGINFO
+ Name: .reginfo
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 1
+ Content: 0000000000000000000000000000000000000000f08f0000
+
+Symbols:
+ Local:
+ - Name: L0
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
diff --git a/test/old-elf/Mips/rel-hi0-lo16-micro.test b/test/old-elf/Mips/rel-hi0-lo16-micro.test
new file mode 100644
index 000000000000..82f62954b992
--- /dev/null
+++ b/test/old-elf/Mips/rel-hi0-lo16-micro.test
@@ -0,0 +1,58 @@
+# Check handling of R_MICROMIPS_HI0_LO16 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400130 00000420
+# ^ 0x402000 + 0x4 = 0x402004
+
+# CHECK: 00402000 g .data 00000004 D0
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Content: "00000400"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: D0
+ Type: R_MICROMIPS_HI0_LO16
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_WRITE ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: D0
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/rel-high-01.test b/test/old-elf/Mips/rel-high-01.test
new file mode 100644
index 000000000000..613fedbe31db
--- /dev/null
+++ b/test/old-elf/Mips/rel-high-01.test
@@ -0,0 +1,25 @@
+# REQUIRES: mips
+
+# Check handling R_MIPS_HIGHER / R_MIPS_HIGHEST relocations.
+
+# RUN: llvm-mc -arch=mips64el -filetype=obj -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: T0:
+# CHECK-NEXT: 120000250: 01 00 62 64 daddiu $2, $3, 1
+# CHECK-NEXT: 120000254: 00 00 62 64 daddiu $2, $3, 0
+#
+# CHECK: T1:
+# CHECK-NEXT: 120000258: 00 00 00 00 nop
+
+ .text
+ .globl T0
+T0:
+ daddiu $2, $3, %higher(T1)
+ daddiu $2, $3, %highest(T1)
+
+ .globl T1
+T1:
+ nop
diff --git a/test/old-elf/Mips/rel-high-02.test b/test/old-elf/Mips/rel-high-02.test
new file mode 100644
index 000000000000..7a40a617a680
--- /dev/null
+++ b/test/old-elf/Mips/rel-high-02.test
@@ -0,0 +1,25 @@
+# REQUIRES: mips
+
+# Check handling R_MICROMIPS_HIGHER / R_MICROMIPS_HIGHEST relocations.
+
+# RUN: llvm-mc -arch=mips64el -filetype=obj -o=%t.o %s
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: Disassembly of section .text:
+# CHECK-NEXT: T0:
+# CHECK-NEXT: 120000250: 01 00 62 64 daddiu $2, $3, 1
+# CHECK-NEXT: 120000254: 00 00 62 64 daddiu $2, $3, 0
+#
+# CHECK: T1:
+# CHECK-NEXT: 120000258: 00 00 00 00 nop
+
+ .text
+ .globl T0
+T0:
+ daddiu $2, $3, %higher(T1+0x0000800100000000)
+ daddiu $2, $3, %highest(T1+0x4001000000000000)
+
+ .globl T1
+T1:
+ nop
diff --git a/test/old-elf/Mips/rel-jalr-01.test b/test/old-elf/Mips/rel-jalr-01.test
new file mode 100644
index 000000000000..3c519056e1a9
--- /dev/null
+++ b/test/old-elf/Mips/rel-jalr-01.test
@@ -0,0 +1,101 @@
+# REQUIRES: mips
+
+# Check handling of the R_MIPS_JALR relocation.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -o %t.exe %t2.o %t.so
+# RUN: llvm-objdump -d %t.exe | FileCheck %s
+
+# CHECK: __start:
+# CHECK-NEXT: {{[0-9a-f]+}}: 05 00 11 04 bal 24
+# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop
+# CHECK-NEXT: {{[0-9a-f]+}}: 04 00 00 10 b 20
+# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop
+# CHECK-NEXT: {{[0-9a-f]+}}: 09 f8 20 03 jalr $25
+# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: T3
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Content: "09f8200300000000080020030000000009f82003000000000000000000000000"
+# ^ jalr T1 ^ j T2 ^ jalr T3
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_JALR
+ - Offset: 8
+ Symbol: T2
+ Type: R_MIPS_JALR
+ - Offset: 16
+ Symbol: T3
+ Type: R_MIPS_JALR
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 0
+
+Symbols:
+ Local:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 24
+ Size: 4
+ Global:
+ - Name: __start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 24
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Value: 28
+ Size: 4
+ - Name: T3
+...
diff --git a/test/old-elf/Mips/rel-jalr-02.test b/test/old-elf/Mips/rel-jalr-02.test
new file mode 100644
index 000000000000..e9c74c4c3300
--- /dev/null
+++ b/test/old-elf/Mips/rel-jalr-02.test
@@ -0,0 +1,68 @@
+# REQUIRES: mips
+
+# Check R_MIPS_JALR relocations do not affect the code
+# in case of relocatable targets.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t.o
+# RUN: llvm-objdump -d %t.so | FileCheck %s
+
+# CHECK: __start:
+# CHECK-NEXT: {{[0-9a-f]+}}: 09 f8 20 03 jalr $25
+# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop
+# CHECK-NEXT: {{[0-9a-f]+}}: 08 00 20 03 jr $25
+# CHECK-NEXT: {{[0-9a-f]+}}: 00 00 00 00 nop
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Content: "09f820030000000008002003000000000000000000000000"
+# ^ jalr ^ jr ^ T1 ^ T2
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_JALR
+ - Offset: 8
+ Symbol: T2
+ Type: R_MIPS_JALR
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 0
+
+Symbols:
+ Global:
+ - Name: __start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 16
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 16
+ Size: 4
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Value: 20
+ Size: 4
+...
diff --git a/test/old-elf/Mips/rel-lit-micro.test b/test/old-elf/Mips/rel-lit-micro.test
new file mode 100644
index 000000000000..783b24f83813
--- /dev/null
+++ b/test/old-elf/Mips/rel-lit-micro.test
@@ -0,0 +1,59 @@
+# Check handling of R_MICROMIPS_LITERAL relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400130 00000f10
+# ^ 0x402000 + 0x7fff - 0x408ff0 = 0x100f
+
+# CHECK: 00402000 g .data 00000004 D0
+# CHECK: 00408ff0 g *ABS* 00000000 _gp_disp
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32,
+ EF_MIPS_ARCH_32, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Content: "0000ff7f"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: D0
+ Type: R_MICROMIPS_LITERAL
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_WRITE ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: D0
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/rel-lit.test b/test/old-elf/Mips/rel-lit.test
new file mode 100644
index 000000000000..19aa68721691
--- /dev/null
+++ b/test/old-elf/Mips/rel-lit.test
@@ -0,0 +1,57 @@
+# Check handling of R_MIPS_LITERAL relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400130 0f100000
+# ^ 0x402000 + 0x7fff - 0x408ff0 = 0x100f
+
+# CHECK: 00402000 g .data 00000004 D0
+# CHECK: 00408ff0 g *ABS* 00000000 _gp_disp
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Content: "ff7f0000"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: D0
+ Type: R_MIPS_LITERAL
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_WRITE ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ - Name: D0
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0
+ Size: 4
+...
diff --git a/test/old-elf/Mips/rel-pc-hilo.test b/test/old-elf/Mips/rel-pc-hilo.test
new file mode 100644
index 000000000000..6791926762b2
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc-hilo.test
@@ -0,0 +1,70 @@
+# Check handling of R_MIPS_PCHI16 / R_MIPS_PCLO16 relocations.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 01000000 02000000 03000000 00000000
+# ^
+# A = 0x10000 - 1 == 0xffff
+# V = (T1 + 0xffff - T0) >> 16 =>
+# V => 0x1000b >> 16 = 1
+# ^
+# A = 0x20000 - 1 == 0x1ffff
+# V = (T1 + 0x1ffff - T0 - 4) >> 16 =>
+# V => 0x20007 >> 16 = 2
+# ^
+# A = 0xffff == -1
+# V = T1 - 1 - T0 - 8 = 3
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9a-f]+}} g F .text 0000000c T0
+# CHECK: {{[0-9a-f]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0100000002000000ffff000000000000"
+# ^ T0
+# ^ A := 0x1 == 0x10000
+# ^ A := 0x2 == 0x20000
+# ^ A := 0xffff == -1
+# ^ T1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PCHI16
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_PCHI16
+ - Offset: 8
+ Symbol: T1
+ Type: R_MIPS_PCLO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 12
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 12
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc16-align.test b/test/old-elf/Mips/rel-pc16-align.test
new file mode 100644
index 000000000000..6366a4d67e92
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc16-align.test
@@ -0,0 +1,43 @@
+# Check incorrect alignment handling for R_MIPS_PC16 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 10 (R_MIPS_PC16)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 6
+ Size: 2
diff --git a/test/old-elf/Mips/rel-pc16-overflow.test b/test/old-elf/Mips/rel-pc16-overflow.test
new file mode 100644
index 000000000000..910482ee6154
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc16-overflow.test
@@ -0,0 +1,45 @@
+# Check R_MIPS_PC16 relocation overflow handling.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to T1+131068 of type 10 (R_MIPS_PC16)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "ff7f00000000000000000000"
+# ^ T1
+# ^ T0 A := 0x7fff << 2 = 0x1fffc
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc16.test b/test/old-elf/Mips/rel-pc16.test
new file mode 100644
index 000000000000..f298afd81cd6
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc16.test
@@ -0,0 +1,53 @@
+# Check handling of R_MIPS_PC16 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} feff0000 00000000 00000000
+# ^ V
+# A = -16 =>
+# V = (T1 - 16 - T0) >> 2 = -2
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "fcff00000000000000000000"
+# ^ T1
+# ^ T0 A := 0xfffc << 2 = -16
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC16
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc18-s3-align.test b/test/old-elf/Mips/rel-pc18-s3-align.test
new file mode 100644
index 000000000000..ca2fa18ecaa0
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc18-s3-align.test
@@ -0,0 +1,44 @@
+# Check incorrect alignment handling for R_MIPS_PC18_S3 relocation target.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation not aligned in file {{.*}} reference from T1+0 to T1+0 of type 62 (R_MIPS_PC18_S3)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+# ^ T0 ^ T1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_PC18_S3
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 4
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc18-s3-micro.test b/test/old-elf/Mips/rel-pc18-s3-micro.test
new file mode 100644
index 000000000000..fc143a75e569
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc18-s3-micro.test
@@ -0,0 +1,56 @@
+# Check handling of R_MICROMIPS_PC18_S3 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 00000000 00000100 00000000 00000000
+# ^ V
+# A = -1 << 3 = -8 =>
+# V = (T1 - 8 - (T0|7)^7) >> 3 =>
+# V => 8 >> 3 = 1 (shuffled)
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000010 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "000000000300ffff000000000000000000000000"
+# ^ T1
+# ^ T0 ^ A := 0x3ffff == -1 (shuffled)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 4
+ Symbol: T1
+ Type: R_MICROMIPS_PC18_S3
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 16
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 16
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
diff --git a/test/old-elf/Mips/rel-pc18-s3.test b/test/old-elf/Mips/rel-pc18-s3.test
new file mode 100644
index 000000000000..d61427448d53
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc18-s3.test
@@ -0,0 +1,54 @@
+# Check handling of R_MIPS_PC18_S3 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 00000000 01000000 00000000 00000000
+# ^ V
+# A = -1 << 3 = -8 =>
+# V = (T1 - 8 - (T0|7)^7) >> 3 =>
+# V => 8 >> 3 = 1
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000010 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000ffff0300000000000000000000000000"
+# ^ T1
+# ^ T0 ^ A := 0x3ffff == -1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 4
+ Symbol: T1
+ Type: R_MIPS_PC18_S3
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 16
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 16
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc19-s2-align.test b/test/old-elf/Mips/rel-pc19-s2-align.test
new file mode 100644
index 000000000000..19010a445578
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc19-s2-align.test
@@ -0,0 +1,44 @@
+# Check incorrect alignment handling for R_MIPS_PC19_S2 relocation target.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 63 (R_MIPS_PC19_S2)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+# ^ T0 ^ T1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC19_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 6
+ Size: 2
diff --git a/test/old-elf/Mips/rel-pc19-s2-micro.test b/test/old-elf/Mips/rel-pc19-s2-micro.test
new file mode 100644
index 000000000000..d9a930e41d88
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc19-s2-micro.test
@@ -0,0 +1,56 @@
+# Check handling of R_MICROMIPS_PC19_S2 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 00000100 00000000 00000000
+# ^ V
+# A = -1 << 2 = -4 =>
+# V = (T1 - 4 - T0) >> 2 =>
+# V => 4 >> 2 = 1 (shuffled)
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0700ffff0000000000000000"
+# ^ T1
+# ^ T0 A := 0x7ffff == -1 (shuffled)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MICROMIPS_PC19_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
diff --git a/test/old-elf/Mips/rel-pc19-s2.test b/test/old-elf/Mips/rel-pc19-s2.test
new file mode 100644
index 000000000000..da21864a1214
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc19-s2.test
@@ -0,0 +1,54 @@
+# Check handling of R_MIPS_PC19_S2 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 01000000 00000000 00000000
+# ^ V
+# A = -1 << 2 = -4 =>
+# V = (T1 - 4 - T0) >> 2 =>
+# V => 4 >> 2 = 1
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "ffff07000000000000000000"
+# ^ T1
+# ^ T0 A := 0x7ffff == -1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC19_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc21-s2-align.test b/test/old-elf/Mips/rel-pc21-s2-align.test
new file mode 100644
index 000000000000..a79e1e2a46e0
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc21-s2-align.test
@@ -0,0 +1,44 @@
+# Check incorrect alignment handling for R_MIPS_PC21_S2 relocation target.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 60 (R_MIPS_PC21_S2)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+# ^ T0 ^ T1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC21_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 6
+ Size: 2
diff --git a/test/old-elf/Mips/rel-pc21-s2-micro.test b/test/old-elf/Mips/rel-pc21-s2-micro.test
new file mode 100644
index 000000000000..4aa0a7de9489
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc21-s2-micro.test
@@ -0,0 +1,56 @@
+# Check handling of R_MICROMIPS_PC21_S2 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 00000100 00000000 00000000
+# ^ V
+# A = -1 << 2 = -4 =>
+# V = (T1 - 4 - T0) >> 2 =>
+# V => 4 >> 2 = 1 (shuffled)
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "1f00ffff0000000000000000"
+# ^ T1
+# ^ T0 A := 0x1fffff (shuffled)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MICROMIPS_PC21_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
diff --git a/test/old-elf/Mips/rel-pc21-s2-overflow.test b/test/old-elf/Mips/rel-pc21-s2-overflow.test
new file mode 100644
index 000000000000..ad88e0c14b44
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc21-s2-overflow.test
@@ -0,0 +1,45 @@
+# Check R_MIPS_PC21_S2 relocation overflow handling.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation out of range in file {{.*}} reference from T0+0 to T1+4194300 of type 60 (R_MIPS_PC21_S2)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "ffff0f000000000000000000"
+# ^ T1
+# ^ T0 A := 0xfffff
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC21_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc21-s2.test b/test/old-elf/Mips/rel-pc21-s2.test
new file mode 100644
index 000000000000..c2b58c859af9
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc21-s2.test
@@ -0,0 +1,54 @@
+# Check handling of R_MIPS_PC21_S2 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 01000000 00000000 00000000
+# ^ V
+# A = -1 << 2 = -4 =>
+# V = (T1 - 4 - T0) >> 2 =>
+# V => 4 >> 2 = 1
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "ffff1f000000000000000000"
+# ^ T1
+# ^ T0 A := 0x1fffff
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC21_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc26-s2-align.test b/test/old-elf/Mips/rel-pc26-s2-align.test
new file mode 100644
index 000000000000..23e660848365
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc26-s2-align.test
@@ -0,0 +1,44 @@
+# Check incorrect alignment handling for R_MIPS_PC26_S2 relocation target.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: Relocation not aligned in file {{.*}} reference from T0+0 to T1+0 of type 61 (R_MIPS_PC26_S2)
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "0000000000000000"
+# ^ T0 ^ T1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC26_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 4
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 6
+ Size: 2
diff --git a/test/old-elf/Mips/rel-pc26-s2-micro.test b/test/old-elf/Mips/rel-pc26-s2-micro.test
new file mode 100644
index 000000000000..193c328be687
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc26-s2-micro.test
@@ -0,0 +1,56 @@
+# Check handling of R_MICROMIPS_PC26_S2 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 00000100 00000000 00000000
+# ^ V
+# A = -1 << 2 = -4 =>
+# V = (T1 - 4 - T0) >> 2 =>
+# V => 4 >> 2 = 1 (shuffled)
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "ff03ffff0000000000000000"
+# ^ T1
+# ^ T0 A := 0x3ffffff == -1 (shuffled)
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MICROMIPS_PC26_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ Other: [STO_MIPS_MICROMIPS]
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
+ Other: [STO_MIPS_MICROMIPS]
diff --git a/test/old-elf/Mips/rel-pc26-s2.test b/test/old-elf/Mips/rel-pc26-s2.test
new file mode 100644
index 000000000000..c500f00cb860
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc26-s2.test
@@ -0,0 +1,54 @@
+# Check handling of R_MIPS_PC26_S2 relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 01000000 00000000 00000000
+# ^ V
+# A = -1 << 2 = -4 =>
+# V = (T1 - 4 - T0) >> 2 =>
+# V => 4 >> 2 = 1
+
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g F .text 00000008 T0
+# CHECK: {{[0-9A-F]+}} g F .text 00000004 T1
+
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R6]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "ffffff030000000000000000"
+# ^ T1
+# ^ T0 A := 0x3ffffff == -1
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_PC26_S2
+
+Symbols:
+ Global:
+ - Name: T0
+ Section: .text
+ Type: STT_FUNC
+ Value: 0
+ Size: 8
+ - Name: T1
+ Section: .text
+ Type: STT_FUNC
+ Value: 8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc32.test b/test/old-elf/Mips/rel-pc32.test
new file mode 100644
index 000000000000..9faa32efec7b
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc32.test
@@ -0,0 +1,59 @@
+# Check handling of R_MIPS_PC32 relocation.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: {{[0-9A-F]+}} 00000000 05000080 fdffff7f
+# ^^ data2 + 0x80000001 - data1
+# ^^ data1 + 0x80000001 - data2
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9A-F]+}} g .data 00000004 data1
+# CHECK: {{[0-9A-F]+}} g .data 00000004 data2
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "00000000"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "000000000100008001000080"
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rel.data
+ Type: SHT_REL
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x4
+ Symbol: data2
+ Type: R_MIPS_PC32
+ - Offset: 0x8
+ Symbol: data1
+ Type: R_MIPS_PC32
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Value: 0x0
+ Size: 4
+ - Name: data1
+ Section: .data
+ Value: 0x4
+ Size: 4
+ - Name: data2
+ Section: .data
+ Value: 0x8
+ Size: 4
diff --git a/test/old-elf/Mips/rel-pc7-10-16-23.test b/test/old-elf/Mips/rel-pc7-10-16-23.test
new file mode 100644
index 000000000000..51c4c3a670f1
--- /dev/null
+++ b/test/old-elf/Mips/rel-pc7-10-16-23.test
@@ -0,0 +1,86 @@
+# Check handling of R_MICROMIPS_PC7_S1, R_MICROMIPS_PC10_S1,
+# R_MICROMIPS_PC16_S1, and R_MICROMIPS_PC23_S2 relocations.
+
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target mipsel -o %t-exe %t-obj
+# RUN: llvm-objdump -s -t %t-exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: {{[0-9A-F]+}} 00000000 80780500 a240fcff 000c03cc
+# ^^ addiu s1,$pc,20
+# ^^ bnezc v0,400114 <__start+0x4>
+# ^^ b 400126 <L1>
+# CHECK-NEXT: {{[0-9A-F]+}} 000c03ad 00000000 00000000 00000000
+# ^^ bnez v0,40012a <L2>
+# CHECK: SYMBOL TABLE:
+# CHECK: {{[0-9a-f]+}} l F .text 00000002 L0
+# CHECK: {{[0-9a-f]+}} l F .text 00000004 L1
+# CHECK: {{[0-9a-f]+}} l F .text 00000004 L2
+# CHECK: {{[0-9a-f]+}} l F .text 00000002 L3
+# CHECK: {{[0-9a-f]+}} g F .text 00000014 __start
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2,
+ EF_MIPS_MICROMIPS ]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+# v nop v nop v L0
+ Content: "0000000080780100a240f5ff000cfdcf000c7dad000000000000000000000000"
+# ^ PC23 ^ PC16 ^ PC10 ^ PC7 ^ L1 ^ L2 ^ L3
+# 7d << 1 = -6 => L3 + 2 - 6 = L2
+# 3fd << 1 = -6 => L2 + 2 - 6 = L1
+# fff5 << 1 = -22 => L1 + 2 - 22 = __start
+# 1 << 2 = 4 => L0 + 4 - 4 = L0
+ AddressAlign: 16
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+
+- Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 4
+ Symbol: L0
+ Type: R_MICROMIPS_PC23_S2
+ - Offset: 8
+ Symbol: L1
+ Type: R_MICROMIPS_PC16_S1
+ - Offset: 14
+ Symbol: L2
+ Type: R_MICROMIPS_PC10_S1
+ - Offset: 18
+ Symbol: L3
+ Type: R_MICROMIPS_PC7_S1
+
+Symbols:
+ Local:
+ - Name: L0
+ Section: .text
+ Value: 20
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: L1
+ Section: .text
+ Value: 22
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: L2
+ Section: .text
+ Value: 26
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: L3
+ Section: .text
+ Value: 30
+ Other: [ STO_MIPS_MICROMIPS ]
+ Global:
+ - Name: __start
+ Section: .text
+ Type: STT_FUNC
+ Value: 0x0
+ Size: 32
+ Other: [ STO_MIPS_MICROMIPS ]
diff --git a/test/old-elf/Mips/rel-sub-micro.test b/test/old-elf/Mips/rel-sub-micro.test
new file mode 100644
index 000000000000..831a020ce2f9
--- /dev/null
+++ b/test/old-elf/Mips/rel-sub-micro.test
@@ -0,0 +1,62 @@
+# Check handling of R_MICROMIPS_SUB relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 120002000 0020cc01 01000000 0020d001 0100ffff
+# ^^ __start - 4 = 0x1200001cc
+# ^^ __start - 0x1000000000000
+# = 0xffff0001200001d0
+# CHECK: SYMBOL TABLE:
+# CHECK: 00000001200001d0 g .rodata 00000008 __start
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64, EF_MIPS_MICROMIPS]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 8
+ AddressAlign: 16
+ Flags: [SHF_ALLOC]
+
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 16
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: __start
+ Type: R_MICROMIPS_SUB
+ Addend: 4
+ - Offset: 8
+ Symbol: __start
+ Type: R_MICROMIPS_SUB
+ Addend: 0x1000000000000
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Value: 0
+ Size: 8
+ - Name: D1
+ Section: .data
+ Value: 0
+ Size: 8
+ - Name: D2
+ Section: .data
+ Value: 8
+ Size: 8
diff --git a/test/old-elf/Mips/rel-sub.test b/test/old-elf/Mips/rel-sub.test
new file mode 100644
index 000000000000..5100406fd5d5
--- /dev/null
+++ b/test/old-elf/Mips/rel-sub.test
@@ -0,0 +1,61 @@
+# Check handling of R_MIPS_SUB relocation.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .data:
+# CHECK-NEXT: 120002000 cf010020 01000000 d0010020 0100ffff ... ....... ....
+# ^^ __start - 1 = 0x1200001cf
+# ^^ __start - 0x1000000000000
+# = 0Xffff0001200001d0
+# CHECK: SYMBOL TABLE:
+# CHECK: 00000001200001d0 g .rodata 00000008 __start
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x08
+ AddressAlign: 16
+ Flags: [SHF_ALLOC]
+- Name: .data
+ Type: SHT_PROGBITS
+ Size: 0x10
+ AddressAlign: 16
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+- Name: .rela.data
+ Type: SHT_RELA
+ Info: .data
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0x0
+ Symbol: __start
+ Type: R_MIPS_SUB
+ Addend: 1
+ - Offset: 0x8
+ Symbol: __start
+ Type: R_MIPS_SUB
+ Addend: 0x1000000000000
+
+Symbols:
+ Global:
+ - Name: __start
+ Section: .text
+ Value: 0x0
+ Size: 8
+ - Name: data1
+ Section: .data
+ Value: 0x0
+ Size: 8
+ - Name: data2
+ Section: .data
+ Value: 0x8
+ Size: 8
diff --git a/test/old-elf/Mips/rld_map.test b/test/old-elf/Mips/rld_map.test
new file mode 100644
index 000000000000..ee063be1d7fc
--- /dev/null
+++ b/test/old-elf/Mips/rld_map.test
@@ -0,0 +1,42 @@
+# REQUIRES: mips
+
+# Check definition of DT_MIPS_RLD_MAP and DT_MIPS_RLD_MAP_REL dynamic tags,
+# .rld_map section, and __RLD_MAP symbol.
+
+# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
+# RUN: lld -flavor old-gnu -target mips %t.o -o %t.exe
+# RUN: llvm-readobj -dynamic-table -s -st %t.exe \
+# RUN: | FileCheck -check-prefix=EXE-DYN %s
+
+# EXE-DYN: Name: .rld_map
+# EXE-DYN-NEXT: Type: SHT_PROGBITS
+# EXE-DYN-NEXT: Flags [
+# EXE-DYN-NEXT: SHF_ALLOC
+# EXE-DYN-NEXT: SHF_WRITE
+# EXE-DYN-NEXT: ]
+# EXE-DYN-NEXT: Address: 0x[[ADDR:[0-9A-F]+]]
+# EXE-DYN: Size: 4
+# EXE-DYN: AddressAlignment: 4
+# EXE-DYN: Symbols [
+# EXE-DYN-NEXT: Symbol {
+# EXE-DYN-NEXT: Name: __RLD_MAP
+# EXE-DYN-NEXT: Value: 0x[[ADDR]]
+# EXE-DYN-NEXT: Size: 4
+# EXE-DYN-NEXT: Binding: Global
+# EXE-DYN-NEXT: Type: Object
+#
+# EXE-DYN: 0x70000016 MIPS_RLD_MAP 0x[[ADDR]]
+# EXE-DYN: 0x70000035 MIPS_RLD_MAP_REL 0x1E48
+
+# RUN: lld -flavor old-gnu -target mips -static %t.o -o %t.exe
+# RUN: llvm-nm -just-symbol-name %t.exe | FileCheck -check-prefix=EXE-STATIC %s
+
+# EXE-STATIC-NOT: __RLD_MAP
+
+# RUN: lld -flavor old-gnu -target mips -shared %t.o -o %t.so
+# RUN: llvm-nm -just-symbol-name %t.so | FileCheck -check-prefix=DYNLIB %s
+
+# DYNLIB-NOT: __RLD_MAP
+
+ .globl __start;
+__start:
diff --git a/test/old-elf/Mips/sign-rela.test b/test/old-elf/Mips/sign-rela.test
new file mode 100644
index 000000000000..3e5341f2c230
--- /dev/null
+++ b/test/old-elf/Mips/sign-rela.test
@@ -0,0 +1,54 @@
+# Check that relocation addend read from RELA record is not sign-extended.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target mips64el -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: {{[0-9a-f]+}} 01000000 00000000 ........
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 0x20008
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0x20000
+ Symbol: __start
+ Type: R_MIPS_PC16
+ Addend: 0x20000
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 0
+
+Symbols:
+ Local:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ Global:
+ - Name: __start
+ Type: STT_FUNC
+ Section: .text
+ Value: 4
+ Size: 0x20004
+...
diff --git a/test/old-elf/Mips/st-other.test b/test/old-elf/Mips/st-other.test
new file mode 100644
index 000000000000..2bb1f8b96e07
--- /dev/null
+++ b/test/old-elf/Mips/st-other.test
@@ -0,0 +1,90 @@
+# Check STO_MICROMIPS flag handling. microMIPS symbol records in a dynamic
+# symbol table should not have STO_MICROMIPS flag but their value field
+# must be odd. microMIPS symbol records in a regular symbol table should
+# have the STO_MICROMIPS flag.
+
+# RUN: yaml2obj -format=elf %s > %t-micro.o
+
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-micro.o
+# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck -check-prefix=SO %s
+
+# RUN: lld -flavor old-gnu -target mipsel -e S0 -o %t.exe %t-micro.o
+# RUN: llvm-readobj -symbols %t.exe | FileCheck -check-prefix=EXE-SYM %s
+# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=EXE-DSYM %s
+
+# SO: Symbol {
+# SO: Name: S0@ (1)
+# SO-NEXT: Value: 0x{{[0-9A-F]+}}
+# SO-NEXT: Size: 4
+# SO-NEXT: Binding: Global (0x1)
+# SO-NEXT: Type: Function (0x2)
+# SO-NEXT: Other: 0
+# SO-NEXT: Section: .text (0x4)
+# SO-NEXT: }
+
+# SO: Symbol {
+# SO: Name: S1@ (4)
+# SO-NEXT: Value: 0x{{[0-9A-F]+}}
+# SO-NEXT: Size: 4
+# SO-NEXT: Binding: Global (0x1)
+# SO-NEXT: Type: Function (0x2)
+# SO-NEXT: Other: 0
+# SO-NEXT: Section: .text (0x4)
+# SO-NEXT: }
+
+# EXE-SYM: Symbol {
+# EXE-SYM: Name: S0 (1)
+# EXE-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# EXE-SYM-NEXT: Size: 4
+# EXE-SYM-NEXT: Binding: Global (0x1)
+# EXE-SYM-NEXT: Type: Function (0x2)
+# EXE-SYM-NEXT: Other: 0
+# EXE-SYM-NEXT: Section: .text (0x5)
+# EXE-SYM-NEXT: }
+
+# EXE-SYM: Symbol {
+# EXE-SYM: Name: S1 (4)
+# EXE-SYM-NEXT: Value: 0x{{[0-9A-F]+}}
+# EXE-SYM-NEXT: Size: 4
+# EXE-SYM-NEXT: Binding: Global (0x1)
+# EXE-SYM-NEXT: Type: Function (0x2)
+# EXE-SYM-NEXT: Other: 128
+# EXE-SYM-NEXT: Section: .text (0x5)
+# EXE-SYM-NEXT: }
+
+# EXE-DSYM-NOT: Name: S1 (4)
+
+# micro.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: S0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ Value: 0x00
+ Visibility: STV_DEFAULT
+ Other: [ ]
+
+ - Name: S1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ Value: 0x04
+ Visibility: STV_DEFAULT
+ Other: [ STO_MIPS_MICROMIPS ]
+...
diff --git a/test/old-elf/Mips/static-01.test b/test/old-elf/Mips/static-01.test
new file mode 100644
index 000000000000..77a33469df3f
--- /dev/null
+++ b/test/old-elf/Mips/static-01.test
@@ -0,0 +1,119 @@
+# Check handling relocations against _gp/__gnu_local_gp symbols
+# in case of "-static" linking.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t1.o %t2.o
+# RUN: llvm-nm %t.exe | FileCheck %s
+
+# CHECK: 00401000 N _GLOBAL_OFFSET_TABLE_
+# CHECK: 00408ff0 A __gnu_local_gp
+# CHECK: 00408ff0 A _gp
+# CHECK: 00408ff0 A _gp_disp
+
+# o1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 28
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: .data
+ Type: R_MIPS_HI16
+ - Offset: 4
+ Symbol: .data
+ Type: R_MIPS_LO16
+ - Offset: 8
+ Symbol: T1
+ Type: R_MIPS_26
+ - Offset: 12
+ Symbol: _gp
+ Type: R_MIPS_HI16
+ - Offset: 16
+ Symbol: _gp
+ Type: R_MIPS_LO16
+ - Offset: 20
+ Symbol: __gnu_local_gp
+ Type: R_MIPS_HI16
+ - Offset: 24
+ Symbol: __gnu_local_gp
+ Type: R_MIPS_LO16
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 4
+
+ - Name: .pdr
+ Type: SHT_PROGBITS
+ AddressAlign: 4
+ Size: 4
+
+ - Name: .rel.pdr
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .pdr
+ Relocations:
+ - Offset: 0
+ Symbol: T0
+ Type: R_MIPS_32
+
+Symbols:
+ Local:
+ - Type: STT_SECTION
+ Section: .text
+ - Type: STT_SECTION
+ Section: .data
+ - Type: STT_SECTION
+ Section: .pdr
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 28
+ - Name: T1
+ - Name: _gp
+ - Name: __gnu_local_gp
+
+# o2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 20
+...
diff --git a/test/old-elf/Mips/tls-1-micro.test b/test/old-elf/Mips/tls-1-micro.test
new file mode 100644
index 000000000000..f47592a5ab7d
--- /dev/null
+++ b/test/old-elf/Mips/tls-1-micro.test
@@ -0,0 +1,65 @@
+# Check handling of R_MICROMIPS_TLS_TPREL_HI16 / R_MICROMIPS_TLS_TPREL_LO16
+# relocations.
+
+# RUN: yaml2obj -format=elf -o %t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e L0 -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: {{[0-9A-F]+}} 00000000 00000100 00000380 00000480
+
+!ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Content: '00000100000002000000030000000400'
+ - Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: L1
+ Type: R_MICROMIPS_TLS_TPREL_HI16
+ - Offset: 0x04
+ Symbol: L2
+ Type: R_MICROMIPS_TLS_TPREL_HI16
+ - Offset: 0x08
+ Symbol: L2
+ Type: R_MICROMIPS_TLS_TPREL_LO16
+ - Offset: 0x0C
+ Symbol: L1
+ Type: R_MICROMIPS_TLS_TPREL_LO16
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Address: 0x1000
+ Size: 0x20000
+
+Symbols:
+ Global:
+ - Name: L0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x58
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: L1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x00
+ Size: 0x04
+ - Name: L2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x10000
+ Size: 0x04
diff --git a/test/old-elf/Mips/tls-1.test b/test/old-elf/Mips/tls-1.test
new file mode 100644
index 000000000000..c25a06c1dee9
--- /dev/null
+++ b/test/old-elf/Mips/tls-1.test
@@ -0,0 +1,63 @@
+# Check handling of R_MIPS_TLS_TPREL_HI16 / R_MIPS_TLS_TPREL_LO16 relocations.
+
+# RUN: yaml2obj -format=elf -o %t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e L0 -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK: {{[0-9A-F]+}} 00000000 01000000 03800000 04800000
+
+!ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Content: '01000000020000000300000004000000'
+ - Name: .rel.text
+ Type: SHT_REL
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: L1
+ Type: R_MIPS_TLS_TPREL_HI16
+ - Offset: 0x04
+ Symbol: L2
+ Type: R_MIPS_TLS_TPREL_HI16
+ - Offset: 0x08
+ Symbol: L2
+ Type: R_MIPS_TLS_TPREL_LO16
+ - Offset: 0x0C
+ Symbol: L1
+ Type: R_MIPS_TLS_TPREL_LO16
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Address: 0x1000
+ Size: 0x20000
+
+Symbols:
+ Global:
+ - Name: L0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x58
+ - Name: L1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x00
+ Size: 0x04
+ - Name: L2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x10000
+ Size: 0x04
diff --git a/test/old-elf/Mips/tls-2-64-static.test b/test/old-elf/Mips/tls-2-64-static.test
new file mode 100644
index 000000000000..c8c30ea06c60
--- /dev/null
+++ b/test/old-elf/Mips/tls-2-64-static.test
@@ -0,0 +1,71 @@
+# Check handling of R_MIPS_TLS_GD relocation in case of -static linking.
+
+# RUN: yaml2obj -format=elf -o %t.o %s
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -static -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 120000120 20800000 30800000
+# ^ -32736 ^ -32720
+# CHECK-NEXT: Contents of section .tdata:
+# CHECK-NEXT: 120001000 00000000 00000000
+# CHECK-NEXT: Contents of section .got:
+# CHECK-NEXT: 120002000 00000000 00000000 00000000 00000080
+# CHECK-NEXT: 120002010 01000000 00000000 0480ffff ffffffff
+# CHECK-NEXT: 120002020 01000000 00000000 0c80ffff ffffffff
+# D1 0x120001000 + 4 - (0x120001000 + 0x8000) = 0xffff8004 => 0480ffff
+# D2 0x120001040 + 8 - (0x120001000 + 0x8000) = 0xffff800c => 0c80ffff
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: D1
+ Type: R_MIPS_TLS_GD
+ Addend: 4
+ - Offset: 4
+ Symbol: D2
+ Type: R_MIPS_TLS_GD
+ Addend: 8
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 4
+ - Name: D2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 4
+ Size: 4
+...
diff --git a/test/old-elf/Mips/tls-2-64.test b/test/old-elf/Mips/tls-2-64.test
new file mode 100644
index 000000000000..3a6f6b3bedea
--- /dev/null
+++ b/test/old-elf/Mips/tls-2-64.test
@@ -0,0 +1,69 @@
+# Check handling of R_MIPS_TLS_GOTTPREL and R_MIPS_TLS_GD relocations
+# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL64,
+# R_MIPS_TLS_DTPMOD64 and R_MIPS_TLS_DTPREL64 in case of shared library.
+
+# Create a shared library with thread symbol D1.
+# RUN: yaml2obj -format=elf -o %t-so.o %s
+# RUN: lld -flavor old-gnu -target mips64el -shared -o %t.so %t-so.o
+
+# Check dynamic relocations and GOT in the shared library.
+# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s
+# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s
+# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s
+
+# REL: Section (4) .rel.dyn {
+# REL-NEXT: 0x2010 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE D1 0x0
+# REL-NEXT: 0x2018 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE D1 0x0
+# REL-NEXT: }
+
+# DYN: 0x000000007000000A MIPS_LOCAL_GOTNO 2
+# DYN: 0x0000000070000013 MIPS_GOTSYM 0x3
+
+# SYM: Name: T1@ (1)
+# SYM: Name: D1@ (4)
+
+# GOT: Contents of section .got:
+# GOT-NEXT: 2000 00000000 00000000 00000000 00000080 ................
+# GOT-NEXT: 2010 00000000 00000000 00000000 00000000 ................
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 4
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: D1
+ Type: R_MIPS_TLS_GD
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 4
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Size: 8
+...
diff --git a/test/old-elf/Mips/tls-2-micro.test b/test/old-elf/Mips/tls-2-micro.test
new file mode 100644
index 000000000000..88d8797cd06a
--- /dev/null
+++ b/test/old-elf/Mips/tls-2-micro.test
@@ -0,0 +1,70 @@
+# Check handling of R_MICROMIPS_TLS_GOTTPREL and R_MICROMIPS_TLS_GD relocations
+# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32,
+# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of shared library.
+
+# Create a shared library with thread symbol D1.
+# RUN: yaml2obj -format=elf -o %t-so.o %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Check dynamic relocations and GOT in the shared library.
+# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s
+# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s
+# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s
+
+# REL: Section (4) .rel.dyn {
+# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 D1 0x0
+# REL-NEXT: 0x200C R_MIPS_TLS_DTPREL32 D1 0x0
+# REL-NEXT: }
+
+# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2
+# DYN: 0x70000013 MIPS_GOTSYM 0x3
+
+# SYM: Name: T1@ (1)
+# SYM: Name: D1@ (4)
+
+# GOT: Contents of section .got:
+# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MICROMIPS_TLS_GD
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/tls-2-static.test b/test/old-elf/Mips/tls-2-static.test
new file mode 100644
index 000000000000..3ac2122628d6
--- /dev/null
+++ b/test/old-elf/Mips/tls-2-static.test
@@ -0,0 +1,125 @@
+# Check handling of R_MIPS_TLS_GD relocation in case of -static linking.
+
+# RUN: yaml2obj -format=elf -docnum 1 -o %t1.o %s
+# RUN: yaml2obj -format=elf -docnum 2 -o %t2.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t1.o %t2.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 4000b4 18800000 20800000 28800000 30800000
+# ^ -32744 ^ -32736 ^ -32728 ^ -32720
+# CHECK-NEXT: Contents of section .tdata:
+# CHECK-NEXT: 401000 00000000 00000000 00000000 00000000
+# CHECK-NEXT: Contents of section .got:
+# CHECK-NEXT: 402000 00000000 00000080 01000000 0480ffff
+# CHECK-NEXT: 402010 01000000 0c80ffff 01000000 0c80ffff
+# CHECK-NEXT: 402020 01000000 1480ffff
+# D1 0x401000 + 4 - (0x401000 + 0x8000) = 0xffff8004 => 0480ffff
+# D2 0x401004 + 8 - (0x401000 + 0x8000) = 0xffff800c => 0c80ffff
+# D3 0x401008 + 4 - (0x401000 + 0x8000) = 0xffff800c => 0c80ffff
+# D4 0x40100c + 8 - (0x401000 + 0x8000) = 0xffff8014 => 1480ffff
+
+# t1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Content: "0400000008000000"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: D1
+ Type: R_MIPS_TLS_GD
+ - Offset: 4
+ Symbol: D2
+ Type: R_MIPS_TLS_GD
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 4
+ - Name: D2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 4
+ Size: 4
+
+# t2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Content: "0400000008000000"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: D3
+ Type: R_MIPS_TLS_GD
+ - Offset: 4
+ Symbol: D4
+ Type: R_MIPS_TLS_GD
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+ - Name: D3
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 4
+ - Name: D4
+ Type: STT_TLS
+ Section: .tdata
+ Value: 4
+ Size: 4
+...
diff --git a/test/old-elf/Mips/tls-2.test b/test/old-elf/Mips/tls-2.test
new file mode 100644
index 000000000000..de8fc2a70861
--- /dev/null
+++ b/test/old-elf/Mips/tls-2.test
@@ -0,0 +1,69 @@
+# Check handling of R_MIPS_TLS_GOTTPREL and R_MIPS_TLS_GD relocations
+# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32,
+# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of shared library.
+
+# Create a shared library with thread symbol D1.
+# RUN: yaml2obj -format=elf -o %t-so.o %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Check dynamic relocations and GOT in the shared library.
+# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s
+# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s
+# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s
+
+# REL: Section (4) .rel.dyn {
+# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 D1 0x0
+# REL-NEXT: 0x200C R_MIPS_TLS_DTPREL32 D1 0x0
+# REL-NEXT: }
+
+# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2
+# DYN: 0x70000013 MIPS_GOTSYM 0x3
+
+# SYM: Name: T1@ (1)
+# SYM: Name: D1@ (4)
+
+# GOT: Contents of section .got:
+# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MIPS_TLS_GD
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/tls-3-64-static.test b/test/old-elf/Mips/tls-3-64-static.test
new file mode 100644
index 000000000000..2183d1fd6833
--- /dev/null
+++ b/test/old-elf/Mips/tls-3-64-static.test
@@ -0,0 +1,70 @@
+# Check handling of R_MIPS_TLS_GOTTPREL relocation in case of -static linking.
+
+# RUN: yaml2obj -format=elf -o %t.o %s
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -static -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 120000120 20800000 28800000
+# ^ -32736 ^ -32728
+# CHECK-NEXT: Contents of section .tdata:
+# CHECK-NEXT: 120001000 00000000 00000000
+# CHECK-NEXT: Contents of section .got:
+# CHECK-NEXT: 120002000 00000000 00000000 00000000 00000080
+# CHECK-NEXT: 120002010 0490ffff ffffffff 0c90ffff ffffffff
+# D1 0x120001000 + 4 - (0x120001000 + 0x7000) = 0xffff9004 => 0490ffff
+# D2 0x120001004 + 8 - (0x120001000 + 0x7000) = 0xffff900c => 0c90ffff
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_PIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: D1
+ Type: R_MIPS_TLS_GOTTPREL
+ Addend: 4
+ - Offset: 4
+ Symbol: D2
+ Type: R_MIPS_TLS_GOTTPREL
+ Addend: 8
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 4
+ - Name: D2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 4
+ Size: 4
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+...
diff --git a/test/old-elf/Mips/tls-3-micro.test b/test/old-elf/Mips/tls-3-micro.test
new file mode 100644
index 000000000000..347332e6633e
--- /dev/null
+++ b/test/old-elf/Mips/tls-3-micro.test
@@ -0,0 +1,183 @@
+# Check handling of R_MICROMIPS_TLS_GOTTPREL and R_MICROMIPS_TLS_GD relocations
+# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32,
+# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of executable linking.
+
+# Create a shared library with thread symbol D1.
+# RUN: yaml2obj -format=elf -docnum 1 -o %t-so.o %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Create executable file linked using two object files and the shared library.
+# The object files defines thread symbols D0 and D2.
+# RUN: yaml2obj -format=elf -docnum 2 -o %t-o1.o %s
+# RUN: yaml2obj -format=elf -docnum 3 -o %t-o2.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o %t.so
+
+# Check dynamic relocations and GOT in the executable file.
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s
+# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck -check-prefix=DYN %s
+# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=GOT %s
+
+# REL: Section (5) .rel.dyn {
+# REL-NEXT: 0x402008 R_MIPS_TLS_TPREL32 D1 0x0
+# REL-NEXT: 0x40200C R_MIPS_TLS_TPREL32 D2 0x0
+# REL-NEXT: }
+
+# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2
+# DYN: 0x70000013 MIPS_GOTSYM 0x3
+
+# SYM: Name: D2@ (1)
+# SYM: Name: D1@ (4)
+
+# GOT: Contents of section .got:
+# GOT-NEXT: 402000 00000000 00000080 00000000 00000000 ................
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MICROMIPS_TLS_GD
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+
+# o1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D2
+ Type: R_MICROMIPS_TLS_TPREL_HI16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MICROMIPS_TLS_TPREL_LO16
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: D2
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+
+# o2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x10
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MICROMIPS_TLS_GOTTPREL
+ Addend: 0
+ - Offset: 0x04
+ Symbol: D0
+ Type: R_MICROMIPS_TLS_TPREL_HI16
+ Addend: 0
+ - Offset: 0x08
+ Symbol: D0
+ Type: R_MICROMIPS_TLS_TPREL_LO16
+ Addend: 0
+ - Offset: 0x0C
+ Symbol: D2
+ Type: R_MICROMIPS_TLS_GOTTPREL
+ Addend: 0
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: D0
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x10
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: D1
+ Type: STT_TLS
+ - Name: D2
+ Type: STT_TLS
+...
diff --git a/test/old-elf/Mips/tls-3-static.test b/test/old-elf/Mips/tls-3-static.test
new file mode 100644
index 000000000000..5d3a7b8bfd6a
--- /dev/null
+++ b/test/old-elf/Mips/tls-3-static.test
@@ -0,0 +1,67 @@
+# Check handling of R_MIPS_TLS_GOTTPREL relocation in case of -static linking.
+
+# RUN: yaml2obj -format=elf -o %t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 4000b4 18800000 1c800000
+# ^ -32744 ^ -32740
+# CHECK-NEXT: Contents of section .tdata:
+# CHECK-NEXT: 401000 00000000 00000000
+# CHECK-NEXT: Contents of section .got:
+# CHECK-NEXT: 402000 00000000 00000080 0490ffff 0c90ffff
+# D1 0x401000 + 4 - (0x401000 + 0x7000) = 0xffff9004 => 0490ffff
+# D2 0x401004 + 8 - (0x401000 + 0x7000) = 0xffff900c => 0c90ffff
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Content: "0400000008000000"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 4
+ Relocations:
+ - Offset: 0
+ Symbol: D1
+ Type: R_MIPS_TLS_GOTTPREL
+ - Offset: 4
+ Symbol: D2
+ Type: R_MIPS_TLS_GOTTPREL
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 4
+ - Name: D2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 4
+ Size: 4
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+...
diff --git a/test/old-elf/Mips/tls-3.test b/test/old-elf/Mips/tls-3.test
new file mode 100644
index 000000000000..eb9750fee28d
--- /dev/null
+++ b/test/old-elf/Mips/tls-3.test
@@ -0,0 +1,180 @@
+# Check handling of R_MIPS_TLS_GOTTPREL and R_MIPS_TLS_GD relocations
+# and generation of corresponding dynamic relocations R_MIPS_TLS_TPREL32,
+# R_MIPS_TLS_DTPMOD32 and R_MIPS_TLS_DTPREL32 in case of executable linking.
+
+# Create a shared library with thread symbol D1.
+# RUN: yaml2obj -format=elf -docnum 1 -o %t-so.o %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so.o
+
+# Create executable file linked using two object files and the shared library.
+# The object files defines thread symbols D0 and D2.
+# RUN: yaml2obj -format=elf -docnum 2 -o %t-o1.o %s
+# RUN: yaml2obj -format=elf -docnum 3 -o %t-o2.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o1.o %t-o2.o %t.so
+
+# Check dynamic relocations and GOT in the executable file.
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s
+# RUN: llvm-readobj -dynamic-table %t.exe | FileCheck -check-prefix=DYN %s
+# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=GOT %s
+
+# REL: Section (5) .rel.dyn {
+# REL-NEXT: 0x402008 R_MIPS_TLS_TPREL32 D1 0x0
+# REL-NEXT: 0x40200C R_MIPS_TLS_TPREL32 D2 0x0
+# REL-NEXT: }
+
+# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2
+# DYN: 0x70000013 MIPS_GOTSYM 0x3
+
+# SYM: Name: D2@ (1)
+# SYM: Name: D1@ (4)
+
+# GOT: Contents of section .got:
+# GOT-NEXT: 402000 00000000 00000080 00000000 00000000 ................
+
+# so.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MIPS_TLS_GD
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ - Name: D1
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+
+# o1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D2
+ Type: R_MIPS_TLS_TPREL_HI16
+ - Offset: 0x04
+ Symbol: D2
+ Type: R_MIPS_TLS_TPREL_LO16
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: D2
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+
+# o2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x10
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ Info: .text
+ AddressAlign: 0x04
+ Relocations:
+ - Offset: 0x00
+ Symbol: D1
+ Type: R_MIPS_TLS_GOTTPREL
+ Addend: 0
+ - Offset: 0x04
+ Symbol: D0
+ Type: R_MIPS_TLS_TPREL_HI16
+ Addend: 0
+ - Offset: 0x08
+ Symbol: D0
+ Type: R_MIPS_TLS_TPREL_LO16
+ Addend: 0
+ - Offset: 0x0C
+ Symbol: D2
+ Type: R_MIPS_TLS_GOTTPREL
+ Addend: 0
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: D0
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x10
+ - Name: D1
+ Type: STT_TLS
+ - Name: D2
+ Type: STT_TLS
+...
diff --git a/test/old-elf/Mips/tls-4-64-static.test b/test/old-elf/Mips/tls-4-64-static.test
new file mode 100644
index 000000000000..3aa37046d36b
--- /dev/null
+++ b/test/old-elf/Mips/tls-4-64-static.test
@@ -0,0 +1,71 @@
+# Check handling of R_MIPS_TLS_LDM relocation in case of -static linking.
+
+# RUN: yaml2obj -format=elf -o %t.o %s
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -static -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 120000120 20800000 20800000
+# ^ -32736 ^ -32736
+# CHECK-NEXT: Contents of section .tdata:
+# CHECK-NEXT: 120001000 00000000 00000000
+# CHECK-NEXT: Contents of section .got:
+# CHECK-NEXT: 120002000 00000000 00000000 00000000 00000080
+# CHECK-NEXT: 120002010 01000000 00000000 00000000 00000000
+# ^ R_MIPS_TLS_DTPMOD64
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 8
+
+ - Name: .rel.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: L1
+ Type: R_MIPS_TLS_LDM
+ Addend: 4
+ - Offset: 4
+ Symbol: L2
+ Type: R_MIPS_TLS_LDM
+ Addend: 8
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Local:
+ - Name: L1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 4
+ - Name: L2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 4
+ Size: 4
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+...
diff --git a/test/old-elf/Mips/tls-4-micro.test b/test/old-elf/Mips/tls-4-micro.test
new file mode 100644
index 000000000000..23d8e0a1de31
--- /dev/null
+++ b/test/old-elf/Mips/tls-4-micro.test
@@ -0,0 +1,126 @@
+# Check handling of R_MICROMIPS_TLS_LDM relocation and generation
+# of corresponding dynamic relocation R_MICROMIPS_TLS_DTPMOD32.
+
+# RUN: yaml2obj -format=elf -docnum 1 -o %t-so1.o %s
+# RUN: yaml2obj -format=elf -docnum 2 -o %t-so2.o %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so1.o %t-so2.o
+
+# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s
+# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s
+# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s
+
+# REL: Section (4) .rel.dyn {
+# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 - 0x0
+# REL-NEXT: }
+
+# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2
+# DYN: 0x70000013 MIPS_GOTSYM 0x4
+
+# SYM: Name: @ (0)
+# SYM: Name: T1@ (1)
+# SYM: Name: T2@ (4)
+# SYM: Name: T3@ (7)
+
+# GOT: Contents of section .got:
+# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................
+# Two LDM entries --^--------^
+
+# so1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: L01
+ Type: R_MICROMIPS_TLS_LDM
+ - Offset: 0x04
+ Symbol: L01
+ Type: R_MICROMIPS_TLS_LDM
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Local:
+ - Name: L01
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x00
+ Size: 0x04
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x04
+ Size: 0x04
+ Other: [ STO_MIPS_MICROMIPS ]
+
+# so2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: L02
+ Type: R_MICROMIPS_TLS_LDM
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Local:
+ - Name: L02
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+ Global:
+ - Name: T3
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ Other: [ STO_MIPS_MICROMIPS ]
+...
diff --git a/test/old-elf/Mips/tls-4-static.test b/test/old-elf/Mips/tls-4-static.test
new file mode 100644
index 000000000000..5fdb11df874b
--- /dev/null
+++ b/test/old-elf/Mips/tls-4-static.test
@@ -0,0 +1,68 @@
+# Check handling of R_MIPS_TLS_LDM relocation in case of -static linking.
+
+# RUN: yaml2obj -format=elf -o %t.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -static -o %t.exe %t.o
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 4000b4 18800000 18800000
+# ^ -32744 ^ -32744
+# CHECK-NEXT: Contents of section .tdata:
+# CHECK-NEXT: 401000 00000000 00000000
+# CHECK-NEXT: Contents of section .got:
+# CHECK-NEXT: 402000 00000000 00000080 01000000 00000000
+# ^ R_MIPS_TLS_DTPMOD32
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Content: "0400000008000000"
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: L1
+ Type: R_MIPS_TLS_LDM
+ - Offset: 4
+ Symbol: L2
+ Type: R_MIPS_TLS_LDM
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Local:
+ - Name: L1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 4
+ - Name: L2
+ Type: STT_TLS
+ Section: .tdata
+ Value: 4
+ Size: 4
+
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+...
diff --git a/test/old-elf/Mips/tls-4.test b/test/old-elf/Mips/tls-4.test
new file mode 100644
index 000000000000..95df6d67151f
--- /dev/null
+++ b/test/old-elf/Mips/tls-4.test
@@ -0,0 +1,123 @@
+# Check handling of R_MIPS_TLS_LDM relocation and generation of corresponding
+# dynamic relocation R_MIPS_TLS_DTPMOD32.
+
+# RUN: yaml2obj -format=elf -docnum 1 -o %t-so1.o %s
+# RUN: yaml2obj -format=elf -docnum 2 -o %t-so2.o %s
+# RUN: lld -flavor old-gnu -target mipsel -shared -o %t.so %t-so1.o %t-so2.o
+
+# RUN: llvm-readobj -r %t.so | FileCheck -check-prefix=REL %s
+# RUN: llvm-readobj -dynamic-table %t.so | FileCheck -check-prefix=DYN %s
+# RUN: llvm-readobj -dt %t.so | FileCheck -check-prefix=SYM %s
+# RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=GOT %s
+
+# REL: Section (4) .rel.dyn {
+# REL-NEXT: 0x2008 R_MIPS_TLS_DTPMOD32 - 0x0
+# REL-NEXT: }
+
+# DYN: 0x7000000A MIPS_LOCAL_GOTNO 2
+# DYN: 0x70000013 MIPS_GOTSYM 0x4
+
+# SYM: Name: @ (0)
+# SYM: Name: T1@ (1)
+# SYM: Name: T2@ (4)
+# SYM: Name: T3@ (7)
+
+# GOT: Contents of section .got:
+# GOT-NEXT: 2000 00000000 00000080 00000000 00000000 ................
+# Two LDM entries --^--------^
+
+# so1.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: L01
+ Type: R_MIPS_TLS_LDM
+ - Offset: 0x04
+ Symbol: L01
+ Type: R_MIPS_TLS_LDM
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Local:
+ - Name: L01
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x00
+ Size: 0x04
+ - Name: T2
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x04
+ Size: 0x04
+
+# so2.o
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: L02
+ Type: R_MIPS_TLS_LDM
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Local:
+ - Name: L02
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x04
+ Global:
+ - Name: T3
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/tls-5-64.test b/test/old-elf/Mips/tls-5-64.test
new file mode 100644
index 000000000000..43e6e6c1cf30
--- /dev/null
+++ b/test/old-elf/Mips/tls-5-64.test
@@ -0,0 +1,71 @@
+# Check that in case of an executable file linking symbol referred
+# by the R_MIPS_TLS_GD relocation gets an entry in the dynamic symbol table.
+
+# RUN: yaml2obj -format=elf -o %t-o.o %s
+# RUN: lld -flavor old-gnu -target mips64el -e T0 -o %t.exe %t-o.o
+
+# Check dynamic relocations:
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s
+# Check dynamic symbol table:
+# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s
+
+# REL: Relocations [
+# REL-NEXT: Section (5) .rel.dyn {
+# REL-NEXT: 0x120002010 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE T1 0x0
+# REL-NEXT: 0x120002018 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE T1 0x0
+# REL-NEXT: }
+# REL-NEXT: ]
+
+# SYM: Symbol {
+# SYM: Name: T1@ (1)
+# SYM-NEXT: Value: 0x0
+# SYM-NEXT: Size: 8
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: TLS (0x6)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .tdata (0x7)
+# SYM-NEXT: }
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ARCH_64]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 8
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_TLS_GD
+
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 4
+ Size: 8
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+ - Name: T1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0
+ Size: 8
+...
diff --git a/test/old-elf/Mips/tls-5-micro.test b/test/old-elf/Mips/tls-5-micro.test
new file mode 100644
index 000000000000..412456417826
--- /dev/null
+++ b/test/old-elf/Mips/tls-5-micro.test
@@ -0,0 +1,70 @@
+# Check that in case of an executable file linking symbol referred by
+# the R_MICROMIPS_TLS_GD relocation gets an entry in the dynamic symbol table.
+
+# RUN: yaml2obj -format=elf -o %t-o.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o
+
+# Check dynamic relocations:
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s
+# Check dynamic symbol table:
+# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s
+
+# REL: Relocations [
+# REL-NEXT: Section (5) .rel.dyn {
+# REL-NEXT: 0x402008 R_MIPS_TLS_DTPMOD32 T1 0x0
+# REL-NEXT: 0x40200C R_MIPS_TLS_DTPREL32 T1 0x0
+# REL-NEXT: }
+# REL-NEXT: ]
+
+# SYM: Symbol {
+# SYM: Name: T1@ (1)
+# SYM-NEXT: Value: 0x0
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: TLS (0x6)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .tdata (0x7)
+# SYM-NEXT: }
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2, EF_MIPS_MICROMIPS ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MICROMIPS_TLS_GD
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ Other: [ STO_MIPS_MICROMIPS ]
+ - Name: T1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x00
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/tls-5.test b/test/old-elf/Mips/tls-5.test
new file mode 100644
index 000000000000..cb71e3ac5f9e
--- /dev/null
+++ b/test/old-elf/Mips/tls-5.test
@@ -0,0 +1,69 @@
+# Check that in case of an executable file linking symbol referred
+# by the R_MIPS_TLS_GD relocation gets an entry in the dynamic symbol table.
+
+# RUN: yaml2obj -format=elf -o %t-o.o %s
+# RUN: lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t-o.o
+
+# Check dynamic relocations:
+# RUN: llvm-readobj -r %t.exe | FileCheck -check-prefix=REL %s
+# Check dynamic symbol table:
+# RUN: llvm-readobj -dt %t.exe | FileCheck -check-prefix=SYM %s
+
+# REL: Relocations [
+# REL-NEXT: Section (5) .rel.dyn {
+# REL-NEXT: 0x402008 R_MIPS_TLS_DTPMOD32 T1 0x0
+# REL-NEXT: 0x40200C R_MIPS_TLS_DTPREL32 T1 0x0
+# REL-NEXT: }
+# REL-NEXT: ]
+
+# SYM: Symbol {
+# SYM: Name: T1@ (1)
+# SYM-NEXT: Value: 0x0
+# SYM-NEXT: Size: 4
+# SYM-NEXT: Binding: Global (0x1)
+# SYM-NEXT: Type: TLS (0x6)
+# SYM-NEXT: Other: 0
+# SYM-NEXT: Section: .tdata (0x7)
+# SYM-NEXT: }
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC,
+ EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2 ]
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x10
+ Size: 0x04
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: T1
+ Type: R_MIPS_TLS_GD
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x04
+ - Name: T1
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x00
+ Size: 0x04
+...
diff --git a/test/old-elf/Mips/validate-rel-01.test b/test/old-elf/Mips/validate-rel-01.test
new file mode 100644
index 000000000000..0b8734c5429e
--- /dev/null
+++ b/test/old-elf/Mips/validate-rel-01.test
@@ -0,0 +1,82 @@
+# Check that the linker does not accept position-dependent relocations
+# in case of shared library linking.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-hi.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t-hi.o 2>&1 \
+# RUN: | FileCheck -check-prefix=RHI %s
+
+# RHI: R_MIPS_HI16 (5) relocation cannot be used when making a shared object, recompile {{.*}}validate-rel-01.test.tmp-hi.o with -fPIC
+
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-26.o
+# RUN: not lld -flavor old-gnu -target mipsel -shared -o %t.so %t-26.o 2>&1 \
+# RUN: | FileCheck -check-prefix=R26 %s
+
+# R26: R_MIPS_26 (4) relocation cannot be used when making a shared object, recompile {{.*}}validate-rel-01.test.tmp-26.o with -fPIC
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 4
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T0
+ Type: R_MIPS_HI16
+ - Offset: 0
+ Symbol: T0
+ Type: R_MIPS_LO16
+
+Symbols:
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 4
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 4
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: T1
+ Type: R_MIPS_26
+
+Symbols:
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 4
+...
diff --git a/test/old-elf/Mips/validate-rel-03.test b/test/old-elf/Mips/validate-rel-03.test
new file mode 100644
index 000000000000..baf8516c63b0
--- /dev/null
+++ b/test/old-elf/Mips/validate-rel-03.test
@@ -0,0 +1,56 @@
+# Check that the linker does not accept R_MIPS_CALL16 relocation
+# against local symbol.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.o
+# RUN: not lld -flavor old-gnu -target mipsel -e T0 -o %t.exe %t.o 2>&1 \
+# RUN: | FileCheck %s
+
+# CHECK: R_MIPS_CALL16 (11) relocation cannot be used against local symbol L0 in file {{.*}}validate-rel-03.test.tmp.o
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 16
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 8
+ Symbol: T0
+ Type: R_MIPS_CALL16
+ - Offset: 4
+ Symbol: L0
+ Type: R_MIPS_CALL16
+
+Symbols:
+ Local:
+ - Name: L0
+ Type: STT_FUNC
+ Section: .text
+ Value: 0
+ Size: 4
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Value: 4
+ Size: 4
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Value: 8
+ Size: 8
+...
diff --git a/test/old-elf/X86_64/ExampleTarget/triple.test b/test/old-elf/X86_64/ExampleTarget/triple.test
new file mode 100644
index 000000000000..aec09eae3a30
--- /dev/null
+++ b/test/old-elf/X86_64/ExampleTarget/triple.test
@@ -0,0 +1,32 @@
+# Check that the Example Target is actually used.
+
+# RUN: yaml2obj -format=elf %s -o %t.o
+# RUN: lld -flavor old-gnu -target x86_64-example-freebsd9 %t.o -o %t.exe
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+#
+# CHECK: Type: 0xFF00
+
+# object
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000000
diff --git a/test/old-elf/X86_64/Inputs/constint.c b/test/old-elf/X86_64/Inputs/constint.c
new file mode 100644
index 000000000000..9fc0ebcf6591
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/constint.c
@@ -0,0 +1 @@
+const int b = 20;
diff --git a/test/old-elf/X86_64/Inputs/constint.o b/test/old-elf/X86_64/Inputs/constint.o
new file mode 100644
index 000000000000..8324b73014d0
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/constint.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/debug0.c b/test/old-elf/X86_64/Inputs/debug0.c
new file mode 100644
index 000000000000..1ebe50087383
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/debug0.c
@@ -0,0 +1,5 @@
+int adena();
+
+int main() {
+return adena();
+}
diff --git a/test/old-elf/X86_64/Inputs/debug0.x86-64 b/test/old-elf/X86_64/Inputs/debug0.x86-64
new file mode 100644
index 000000000000..914f5224b9a2
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/debug0.x86-64
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/debug1.c b/test/old-elf/X86_64/Inputs/debug1.c
new file mode 100644
index 000000000000..281b8a361dbb
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/debug1.c
@@ -0,0 +1,3 @@
+int adena() {
+return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/debug1.x86-64 b/test/old-elf/X86_64/Inputs/debug1.x86-64
new file mode 100644
index 000000000000..bfc81458a034
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/debug1.x86-64
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/externtls.c b/test/old-elf/X86_64/Inputs/externtls.c
new file mode 100644
index 000000000000..499a645a9217
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/externtls.c
@@ -0,0 +1,6 @@
+extern __thread int extern_tls;
+
+int main() {
+ extern_tls = 1;
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/externtls.x86-64 b/test/old-elf/X86_64/Inputs/externtls.x86-64
new file mode 100644
index 000000000000..3019aa0ca27c
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/externtls.x86-64
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/fn.c b/test/old-elf/X86_64/Inputs/fn.c
new file mode 100644
index 000000000000..54939a2426b2
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/fn.c
@@ -0,0 +1,4 @@
+int fn()
+{
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/fn.o b/test/old-elf/X86_64/Inputs/fn.o
new file mode 100644
index 000000000000..4b67d459dfdb
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/fn.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/generaltls-so.o.yaml b/test/old-elf/X86_64/Inputs/generaltls-so.o.yaml
new file mode 100644
index 000000000000..53a7fb6435e9
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/generaltls-so.o.yaml
@@ -0,0 +1,67 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E566488D3D00000000666648E8000000008B005DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: mynumber
+ Type: R_X86_64_TLSGD
+ Addend: -4
+ - Offset: 0x0000000000000010
+ Symbol: __tls_get_addr
+ Type: R_X86_64_PLT32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Content: '21000000'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .tdata
+ Type: STT_SECTION
+ Section: .tdata
+ Global:
+ - Name: getnumber
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000018
+ - Name: mynumber
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x0000000000000004
+ - Name: _GLOBAL_OFFSET_TABLE_
+ - Name: __tls_get_addr
+...
diff --git a/test/old-elf/X86_64/Inputs/group/1.c b/test/old-elf/X86_64/Inputs/group/1.c
new file mode 100644
index 000000000000..f5e618bc4a85
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/1.c
@@ -0,0 +1,8 @@
+int _start() {
+ return 0;
+}
+
+int main() {
+fn();
+return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/group/1.o b/test/old-elf/X86_64/Inputs/group/1.o
new file mode 100644
index 000000000000..743518eb0fa3
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/1.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/group/fn.c b/test/old-elf/X86_64/Inputs/group/fn.c
new file mode 100644
index 000000000000..e443c73a1ee0
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/fn.c
@@ -0,0 +1,4 @@
+int fn() {
+fn1();
+return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/group/fn.o b/test/old-elf/X86_64/Inputs/group/fn.o
new file mode 100644
index 000000000000..1134432449cd
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/fn.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/group/fn1.c b/test/old-elf/X86_64/Inputs/group/fn1.c
new file mode 100644
index 000000000000..cca0df7fd277
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/fn1.c
@@ -0,0 +1,3 @@
+int fn1() {
+fn2();
+}
diff --git a/test/old-elf/X86_64/Inputs/group/fn1.o b/test/old-elf/X86_64/Inputs/group/fn1.o
new file mode 100644
index 000000000000..2b02310003db
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/fn1.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/group/fn2.c b/test/old-elf/X86_64/Inputs/group/fn2.c
new file mode 100644
index 000000000000..a60370ed1e6b
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/fn2.c
@@ -0,0 +1,3 @@
+int fn2() {
+return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/group/fn2.o b/test/old-elf/X86_64/Inputs/group/fn2.o
new file mode 100644
index 000000000000..fabec849a775
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/fn2.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/group/group.sh b/test/old-elf/X86_64/Inputs/group/group.sh
new file mode 100755
index 000000000000..2eba1030160b
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/group.sh
@@ -0,0 +1,38 @@
+cat > 1.c << \!
+int _start() {
+ return 0;
+}
+
+int main() {
+fn();
+return 0;
+}
+!
+
+cat > fn.c << \!
+int fn() {
+fn1();
+return 0;
+}
+!
+
+cat > fn2.c << \!
+int fn2() {
+return 0;
+}
+!
+
+cat > fn1.c << \!
+int fn1() {
+fn2();
+}
+!
+
+gcc -c 1.c fn.c fn2.c fn1.c
+ar cr libfn.a fn.o fn2.o
+ar cr libfn1.a fn1.o
+lld -flavor gnu -target x86_64 -shared -o libfn2.so fn2.o
+lld -flavor gnu -target x86_64 1.o libfn.a libfn1.a -o x
+lld -flavor gnu -target x86_64 1.o --start-group libfn.a libfn1.a --end-group -o x
+lld -flavor gnu -target x86_64 1.o --start-group fn.o fn2.o fn1.o --end-group -o x
+lld -flavor gnu -target x86_64 1.o --start-group --whole-archive libfn.a --no-whole-archive libfn1.a --end-group -o x
diff --git a/test/old-elf/X86_64/Inputs/group/libfn.a b/test/old-elf/X86_64/Inputs/group/libfn.a
new file mode 100644
index 000000000000..c157c3babed9
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/libfn.a
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/group/libfn.so b/test/old-elf/X86_64/Inputs/group/libfn.so
new file mode 100755
index 000000000000..fcbd11fe5519
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/libfn.so
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/group/libfn1.a b/test/old-elf/X86_64/Inputs/group/libfn1.a
new file mode 100644
index 000000000000..69b9c75b5d16
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/libfn1.a
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/group/libfn2.so b/test/old-elf/X86_64/Inputs/group/libfn2.so
new file mode 100755
index 000000000000..7ce867373910
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/group/libfn2.so
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/initfini-option.c b/test/old-elf/X86_64/Inputs/initfini-option.c
new file mode 100644
index 000000000000..e9a6c08c12ac
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/initfini-option.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+void init() {
+ printf("%s\n", __FUNCTION__);
+}
+
+void fini() {
+ printf("%s\n", __FUNCTION__);
+}
+
+int main() {
+}
+
diff --git a/test/old-elf/X86_64/Inputs/initfini-option.o b/test/old-elf/X86_64/Inputs/initfini-option.o
new file mode 100644
index 000000000000..b1ba0557353c
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/initfini-option.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/initfini.c b/test/old-elf/X86_64/Inputs/initfini.c
new file mode 100644
index 000000000000..9427a86b6c9b
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/initfini.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+void __attribute__ ((constructor)) constructor() {
+ printf("%s\n", __FUNCTION__);
+}
+
+void __attribute__ ((destructor)) destructor() {
+ printf("%s\n", __FUNCTION__);
+}
+
+int main() {
+ return 0;
+}
+
diff --git a/test/old-elf/X86_64/Inputs/initfini.o b/test/old-elf/X86_64/Inputs/initfini.o
new file mode 100644
index 000000000000..f0e55a90b8b6
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/initfini.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/largebss.c b/test/old-elf/X86_64/Inputs/largebss.c
new file mode 100644
index 000000000000..157d01755b6a
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/largebss.c
@@ -0,0 +1,3 @@
+int largebss[1000] = { 0 };
+int largecommon[1000];
+__thread int largetbss[1000] = { 0 };
diff --git a/test/old-elf/X86_64/Inputs/largebss.o b/test/old-elf/X86_64/Inputs/largebss.o
new file mode 100644
index 000000000000..377370ec2db2
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/largebss.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/layoutpass/1.c b/test/old-elf/X86_64/Inputs/layoutpass/1.c
new file mode 100644
index 000000000000..fec984503214
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/layoutpass/1.c
@@ -0,0 +1,8 @@
+int main() {
+ a();
+ return 0;
+}
+
+int b() {
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/layoutpass/1.o b/test/old-elf/X86_64/Inputs/layoutpass/1.o
new file mode 100644
index 000000000000..848a5b3321ac
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/layoutpass/1.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/layoutpass/2.c b/test/old-elf/X86_64/Inputs/layoutpass/2.c
new file mode 100644
index 000000000000..fb9dbcc28aa6
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/layoutpass/2.c
@@ -0,0 +1,7 @@
+int a() {
+ return 0;
+}
+
+int c() {
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/layoutpass/2.o b/test/old-elf/X86_64/Inputs/layoutpass/2.o
new file mode 100644
index 000000000000..4c5ef8679581
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/layoutpass/2.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/layoutpass/3.c b/test/old-elf/X86_64/Inputs/layoutpass/3.c
new file mode 100644
index 000000000000..054029fe5cfe
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/layoutpass/3.c
@@ -0,0 +1,3 @@
+int d() {
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/layoutpass/3.o b/test/old-elf/X86_64/Inputs/layoutpass/3.o
new file mode 100644
index 000000000000..76ef76e97901
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/layoutpass/3.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/layoutpass/lib2.a b/test/old-elf/X86_64/Inputs/layoutpass/lib2.a
new file mode 100644
index 000000000000..5f076c869817
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/layoutpass/lib2.a
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/libfn.a b/test/old-elf/X86_64/Inputs/libfn.a
new file mode 100644
index 000000000000..380844b0838d
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/libfn.a
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/libfn.so b/test/old-elf/X86_64/Inputs/libfn.so
new file mode 100755
index 000000000000..dc02480aa690
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/libfn.so
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/main.c b/test/old-elf/X86_64/Inputs/main.c
new file mode 100644
index 000000000000..0280c9127076
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/main.c
@@ -0,0 +1,4 @@
+int main() {
+ fn();
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/main.o b/test/old-elf/X86_64/Inputs/main.o
new file mode 100644
index 000000000000..ec8929f4b51d
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/main.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/multi-ovrd.c b/test/old-elf/X86_64/Inputs/multi-ovrd.c
new file mode 100644
index 000000000000..cf6c0b6ac361
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/multi-ovrd.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+void f(void)
+{
+ printf("overridden f!\n");
+}
+
+void g(void)
+{
+ printf("overridden g!\n");
+}
diff --git a/test/old-elf/X86_64/Inputs/multi-ovrd.o b/test/old-elf/X86_64/Inputs/multi-ovrd.o
new file mode 100644
index 000000000000..e4c4d6037fdd
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/multi-ovrd.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/multi-weak.c b/test/old-elf/X86_64/Inputs/multi-weak.c
new file mode 100644
index 000000000000..10b9160352d9
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/multi-weak.c
@@ -0,0 +1,20 @@
+int fn()
+{
+ return 0;
+}
+
+void __attribute__((weak)) f()
+{
+ printf("original f..\n");
+}
+
+void __attribute__((weak)) g()
+{
+ printf("original f..\n");
+}
+
+int main(void)
+{
+ f();
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/multi-weak.o b/test/old-elf/X86_64/Inputs/multi-weak.o
new file mode 100644
index 000000000000..d5677b699ac4
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/multi-weak.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/multiweaksyms.o b/test/old-elf/X86_64/Inputs/multiweaksyms.o
new file mode 100644
index 000000000000..5e2e54d66b0d
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/multiweaksyms.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/nmagic.c b/test/old-elf/X86_64/Inputs/nmagic.c
new file mode 100644
index 000000000000..3ad15f0c4971
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/nmagic.c
@@ -0,0 +1,8 @@
+int a = 10;
+__thread int b = 20;
+__thread int c;
+__thread int d;
+
+int main() {
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/nmagic.o b/test/old-elf/X86_64/Inputs/nmagic.o
new file mode 100644
index 000000000000..af28e0ada8b3
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/nmagic.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/no-interp-section.c b/test/old-elf/X86_64/Inputs/no-interp-section.c
new file mode 100644
index 000000000000..3981c038ed33
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/no-interp-section.c
@@ -0,0 +1 @@
+int c = 10;
diff --git a/test/old-elf/X86_64/Inputs/no-interp-section.o b/test/old-elf/X86_64/Inputs/no-interp-section.o
new file mode 100644
index 000000000000..063eb3244f22
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/no-interp-section.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/note.o b/test/old-elf/X86_64/Inputs/note.o
new file mode 100644
index 000000000000..d86b0cf85d19
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/note.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/note.s b/test/old-elf/X86_64/Inputs/note.s
new file mode 100644
index 000000000000..0a0b03da6bb7
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/note.s
@@ -0,0 +1,11 @@
+ .section ".note.ident", "a"
+ .p2align 2
+ .long 1f - 0f # name size (not including padding)
+ .long 3f - 2f # desc size (not including padding)
+ .long 0x01234567 # type
+0: .asciz "NaMe" # name
+1: .p2align 2
+2: .long 0x76543210 # desc
+ .long 0x89abcdef
+3: .p2align 2
+
diff --git a/test/old-elf/X86_64/Inputs/note_ro_rw.o b/test/old-elf/X86_64/Inputs/note_ro_rw.o
new file mode 100644
index 000000000000..76f2486d2736
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/note_ro_rw.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/note_ro_rw.s b/test/old-elf/X86_64/Inputs/note_ro_rw.s
new file mode 100644
index 000000000000..2a0eff5dfb2b
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/note_ro_rw.s
@@ -0,0 +1,21 @@
+ .section ".note.ro", "a"
+ .p2align 2
+ .long 1f - 0f # name size (not including padding)
+ .long 3f - 2f # desc size (not including padding)
+ .long 0x01234567 # type
+0: .asciz "NaMe" # name
+1: .p2align 2
+2: .long 0x76543210 # desc
+ .long 0x89abcdef
+3: .p2align 2
+ .section ".note.rw", "aw"
+ .p2align 2
+ .long 1f - 0f # name size (not including padding)
+ .long 3f - 2f # desc size (not including padding)
+ .long 0x01234567 # type
+0: .asciz "NaMe" # name
+1: .p2align 2
+2: .long 0x76543210 # desc
+ .long 0x89abcdef
+3: .p2align 2
+
diff --git a/test/old-elf/X86_64/Inputs/ovrd.c b/test/old-elf/X86_64/Inputs/ovrd.c
new file mode 100644
index 000000000000..a3d721dac2aa
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/ovrd.c
@@ -0,0 +1,6 @@
+#include <stdio.h>
+void f(void)
+{
+ printf("overridden f!\n");
+}
+
diff --git a/test/old-elf/X86_64/Inputs/ovrd.o b/test/old-elf/X86_64/Inputs/ovrd.o
new file mode 100644
index 000000000000..ea7353d94ed9
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/ovrd.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/rodata.c b/test/old-elf/X86_64/Inputs/rodata.c
new file mode 100644
index 000000000000..01489fe550c8
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/rodata.c
@@ -0,0 +1,3 @@
+const char _nl_default_default_domain[] __attribute__ ((visibility ("hidden"))) = "messages";
+const char *_nl_current_default_domain __attribute__ ((visibility ("hidden"))) = _nl_default_default_domain;
+const char _nl_default_default_dirname[] = "/usr/local";
diff --git a/test/old-elf/X86_64/Inputs/rodata.o b/test/old-elf/X86_64/Inputs/rodata.o
new file mode 100644
index 000000000000..660606cdc9c0
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/rodata.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/rodata.s b/test/old-elf/X86_64/Inputs/rodata.s
new file mode 100644
index 000000000000..e1a2eb702736
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/rodata.s
@@ -0,0 +1,24 @@
+ .file "x.c"
+ .hidden _nl_default_default_domain
+ .globl _nl_default_default_domain
+ .section .rodata._nl_default_default_domain,"ams",@progbits,1
+ .type _nl_default_default_domain, @object
+ .size _nl_default_default_domain, 9
+_nl_default_default_domain:
+ .string "messages"
+ .hidden _nl_current_default_domain
+ .globl _nl_current_default_domain
+ .section .data._nl_current_default_domain,"aw",@progbits
+ .align 8
+ .type _nl_current_default_domain, @object
+ .size _nl_current_default_domain, 8
+_nl_current_default_domain:
+ .quad _nl_default_default_domain
+ .globl _nl_default_default_dirname
+ .section .rodata._nl_default_default_dirname,"ams",@progbits,1
+ .type _nl_default_default_dirname, @object
+ .size _nl_default_default_dirname, 11
+_nl_default_default_dirname:
+ .string "/usr/local"
+ .ident "GCC: (Ubuntu 4.8.1-2ubuntu1~10.04.1) 4.8.1"
+ .section .note.GNU-stack,"",@progbits
diff --git a/test/old-elf/X86_64/Inputs/rwint.c b/test/old-elf/X86_64/Inputs/rwint.c
new file mode 100644
index 000000000000..d1cf7d62c801
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/rwint.c
@@ -0,0 +1 @@
+int a = 10;
diff --git a/test/old-elf/X86_64/Inputs/rwint.o b/test/old-elf/X86_64/Inputs/rwint.o
new file mode 100644
index 000000000000..9fba51f07add
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/rwint.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/sectionmap.c b/test/old-elf/X86_64/Inputs/sectionmap.c
new file mode 100644
index 000000000000..c4f530148949
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/sectionmap.c
@@ -0,0 +1,4 @@
+int foo __attribute__((section(".gcc_except_table.foo"))) = 4;
+const int bar __attribute__((section(".data.rel.local"))) = 2;
+const int baz __attribute__((section(".data.rel.ro"))) = 2;
+const int bak __attribute__((section(".data.xyz"))) = 2;
diff --git a/test/old-elf/X86_64/Inputs/sectionmap.o b/test/old-elf/X86_64/Inputs/sectionmap.o
new file mode 100644
index 000000000000..599cf2cca563
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/sectionmap.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/undefcpp.c b/test/old-elf/X86_64/Inputs/undefcpp.c
new file mode 100644
index 000000000000..ce84c2a592b6
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/undefcpp.c
@@ -0,0 +1 @@
+int foo() { return _Z3fooPKc(); }
diff --git a/test/old-elf/X86_64/Inputs/undefcpp.o b/test/old-elf/X86_64/Inputs/undefcpp.o
new file mode 100644
index 000000000000..6b8ebf5b6ab0
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/undefcpp.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/weak-zero-sized.o b/test/old-elf/X86_64/Inputs/weak-zero-sized.o
new file mode 100644
index 000000000000..7c10c6a509ed
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/weak-zero-sized.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/weak.c b/test/old-elf/X86_64/Inputs/weak.c
new file mode 100644
index 000000000000..ae07ffc745d8
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/weak.c
@@ -0,0 +1,14 @@
+int fn()
+{
+ return 0;
+}
+
+void __attribute__((weak)) f()
+{
+ printf("original f..\n");
+}
+int main(void)
+{
+ f();
+ return 0;
+}
diff --git a/test/old-elf/X86_64/Inputs/weak.o b/test/old-elf/X86_64/Inputs/weak.o
new file mode 100644
index 000000000000..41cc88a0c482
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/weak.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/weak.s b/test/old-elf/X86_64/Inputs/weak.s
new file mode 100644
index 000000000000..64ce779553b6
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/weak.s
@@ -0,0 +1,21 @@
+ .file "weak.s"
+ .text
+ .p2align 4,,15
+ .globl test
+ .type test, @function
+test:
+ ret
+ .size test, .-test
+ .weak myfn2
+ .data
+ .align 8
+ .type myfn2, @object
+ .size myfn2, 8
+myfn2:
+ .quad test
+ .weak myfn1
+ .align 8
+ .type myfn1, @object
+ .size myfn1, 8
+myfn1:
+ .quad test
diff --git a/test/old-elf/X86_64/Inputs/zerosizedsection.o b/test/old-elf/X86_64/Inputs/zerosizedsection.o
new file mode 100644
index 000000000000..a0f2f13a307a
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/zerosizedsection.o
Binary files differ
diff --git a/test/old-elf/X86_64/Inputs/zerosizedsection.s b/test/old-elf/X86_64/Inputs/zerosizedsection.s
new file mode 100644
index 000000000000..651ee3aab503
--- /dev/null
+++ b/test/old-elf/X86_64/Inputs/zerosizedsection.s
@@ -0,0 +1,3 @@
+.text
+.data
+.word .text
diff --git a/test/old-elf/X86_64/alignoffset.test b/test/old-elf/X86_64/alignoffset.test
new file mode 100644
index 000000000000..53e29211af67
--- /dev/null
+++ b/test/old-elf/X86_64/alignoffset.test
@@ -0,0 +1,118 @@
+# Checks that segments are aligned as per ELF spec. The segment virtual address
+# modulo page alignment should be equal to offset modulo page alignment.
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o
+# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \
+# RUN: --no-align-segments --rosegment --noinhibit-exec
+# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s
+#
+#CHECK: Offset: 0x15C
+#CHECK: VirtualAddress: 0x40015C
+#CHECK: PhysicalAddress: 0x40015C
+#
+#
+#const int a = 0;
+#int main() {
+# foo();
+# return 0;
+#}
+#
+#int foo() { return 0; }
+
+# object
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E54883EC10C745FC00000000E81C000000B9000000008945F889C84883C4105DC36666662E0F1F840000000000554889E5B8000000005DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '00000000'
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 005562756E747520636C616E672076657273696F6E20332E352E302D73766E3231373330342D317E6578703120286272616E636865732F72656C656173655F33352920286261736564206F6E204C4C564D20332E352E302900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000002400000000410E108602430D060000001800000038000000000000000B00000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 0
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 48
+Symbols:
+ Local:
+ - Name: 1.c
+ Type: STT_FILE
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .rodata
+ Type: STT_SECTION
+ Section: .rodata
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: a
+ Type: STT_OBJECT
+ Section: .rodata
+ Size: 0x0000000000000004
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000030
+ Size: 0x000000000000000B
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000024
+...
diff --git a/test/old-elf/X86_64/debug.test b/test/old-elf/X86_64/debug.test
new file mode 100644
index 000000000000..26ba367da574
--- /dev/null
+++ b/test/old-elf/X86_64/debug.test
@@ -0,0 +1,57 @@
+# Test that debug info is assigned typeNoAlloc and that the output sections have
+# a virtual address of 0.
+RUN: lld -flavor old-gnu -target x86_64 -e main --output-filetype=yaml \
+RUN: %p/Inputs/debug0.x86-64 %p/Inputs/debug1.x86-64 -o %t
+RUN: FileCheck %s -check-prefix YAML < %t
+
+RUN: lld -flavor old-gnu -target x86_64 -e main %p/Inputs/debug0.x86-64 \
+RUN: %p/Inputs/debug1.x86-64 -o %t1
+RUN: llvm-readobj -sections %t1 | FileCheck %s -check-prefix ELF
+# Verify that non SHF_ALLOC sections are relocated correctly.
+RUN: llvm-objdump -s %t1 | FileCheck %s -check-prefix RELOC
+
+YAML: type: no-alloc
+
+ELF: Section {
+ELF: Name: .debug_info
+ELF: Type: SHT_PROGBITS (0x1)
+ELF: Flags [ (0x0)
+ELF: ]
+ELF: Address: 0x0
+ELF: }
+ELF: Section {
+ELF: Name: .debug_abbrev
+ELF: Type: SHT_PROGBITS (0x1)
+ELF: Flags [ (0x0)
+ELF: ]
+ELF: Address: 0x0
+ELF: }
+ELF: Section {
+ELF: Name: .debug_aranges
+ELF: Type: SHT_PROGBITS (0x1)
+ELF: Flags [ (0x0)
+ELF: ]
+ELF: Address: 0x0
+ELF: }
+ELF: Section {
+ELF: Name: .debug_line
+ELF: Type: SHT_PROGBITS (0x1)
+ELF: Flags [ (0x0)
+ELF: ]
+ELF: Address: 0x0
+ELF: }
+ELF: Section {
+ELF: Name: .debug_str
+ELF: Type: SHT_PROGBITS (0x1)
+ELF: Flags [ (0x0)
+ELF: ]
+ELF: Address: 0x0
+ELF: }
+
+RELOC: Contents of section .debug_info:
+RELOC: 0000 4e000000 04000000 00000801 3a000000 N...........:...
+# ^^ Relocation: ._debug_str + 0x3a
+RELOC: 0010 01780000 00000000 00dc0140 00000000 .x.........@....
+# ^^ Relocation: .debug_str + 0x78
+RELOC: 0020 00100000 00000000 00000000 00028100 ................
+# ^^ Relocation: .debug_str + 0x81
diff --git a/test/old-elf/X86_64/defsym.test b/test/old-elf/X86_64/defsym.test
new file mode 100644
index 000000000000..d98abf39d428
--- /dev/null
+++ b/test/old-elf/X86_64/defsym.test
@@ -0,0 +1,22 @@
+RUN: lld -flavor old-gnu -target x86_64 --defsym=main=fn --noinhibit-exec \
+RUN: %p/Inputs/fn.o -o %t
+RUN: llvm-readobj -symbols %t | FileCheck %s
+
+CHECK: Symbol {
+CHECK: Name: main (1)
+CHECK: Value: 0x4001E0
+CHECK: Size: 0
+CHECK: Binding: Global (0x1)
+CHECK: Type: Function (0x2)
+CHECK: Other: 0
+CHECK: Section: .text (0x5)
+CHECK: }
+CHECK: Symbol {
+CHECK: Name: fn (6)
+CHECK: Value: 0x4001E0
+CHECK: Size: 6
+CHECK: Binding: Global (0x1)
+CHECK: Type: Function (0x2)
+CHECK: Other: 0
+CHECK: Section: .text (0x5)
+CHECK: }
diff --git a/test/old-elf/X86_64/demangle.test b/test/old-elf/X86_64/demangle.test
new file mode 100644
index 000000000000..caae8256d99a
--- /dev/null
+++ b/test/old-elf/X86_64/demangle.test
@@ -0,0 +1,12 @@
+# XFAIL: win32
+#
+# Check that the linker is able to demangle strings properly.
+# Once there is a way to add undefined symbols using yaml2obj, the test will be
+# changed.
+
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/undefcpp.o --noinhibit-exec 2>&1 | FileCheck -check-prefix=DEMANGLE %s
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/undefcpp.o --noinhibit-exec --no-demangle 2>&1 | FileCheck -check-prefix=NODEMANGLE %s
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/undefcpp.o --noinhibit-exec --demangle 2>&1 | FileCheck -check-prefix=DEMANGLE %s
+
+#DEMANGLE: undefcpp.o: foo(char const*)
+#NODEMANGLE: undefcpp.o: _Z3fooPKc
diff --git a/test/old-elf/X86_64/dontignorezerosize-sections.test b/test/old-elf/X86_64/dontignorezerosize-sections.test
new file mode 100644
index 000000000000..f3042b5508fd
--- /dev/null
+++ b/test/old-elf/X86_64/dontignorezerosize-sections.test
@@ -0,0 +1,9 @@
+# This tests that lld is not ignoring zero sized sections
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/zerosizedsection.o \
+RUN: --noinhibit-exec --output-filetype=yaml -o %t
+RUN: FileCheck %s < %t
+
+CHECK: references:
+CHECK: - kind: R_X86_64_16
+CHECK: offset: 0
+CHECK: target: L000
diff --git a/test/old-elf/X86_64/dynamicvars.test b/test/old-elf/X86_64/dynamicvars.test
new file mode 100644
index 000000000000..c6f679038320
--- /dev/null
+++ b/test/old-elf/X86_64/dynamicvars.test
@@ -0,0 +1,123 @@
+# Tests that the dynamic variables created by the linker are set to the right
+# values.
+
+#RUN: yaml2obj --format elf -docnum 1 %s -o %t.o
+#RUN: lld -flavor old-gnu -target x86_64 -e main %t.o -o %t1 --noinhibit-exec
+#RUN: llvm-readobj -sections -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+
+#CHECKSYMS: Name: .dynamic
+#CHECKSYMS: Type: SHT_DYNAMIC
+#CHECKSYMS: Address: [[TARGETA:[0xa-fA-f0-9]+]]
+#CHECKSYMS: Name: .got.plt
+#CHECKSYMS: Type: SHT_PROGBITS
+#CHECKSYMS: Address: [[TARGETB:[0xa-fA-f0-9]+]]
+#CHECKSYMS: Name: _DYNAMIC
+#CHECKSYMS: Value: [[TARGETA]]
+#CHECKSYMS: Section: .dynamic
+#CHECKSYMS: Name: _GLOBAL_OFFSET_TABLE_
+#CHECKSYMS: Value: [[TARGETB]]
+#CHECKSYMS: Section: .got.plt
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E54883EC10488B0500000000C745FC00000000C7000A000000E80000000031C98945F889C84883C4105DC36690554889E531C05DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000000B
+ Symbol: a
+ Type: R_X86_64_GOTPCREL
+ Addend: -4
+ - Offset: 0x000000000000001D
+ Symbol: foo
+ Type: R_X86_64_PLT32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E362E302000
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000002E00000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 0
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 48
+Symbols:
+ Local:
+ - Name: 1.c
+ Type: STT_FILE
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: a
+ Type: STT_OBJECT
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000030
+ Size: 0x0000000000000008
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000002E
+ - Name: _GLOBAL_OFFSET_TABLE_
+...
diff --git a/test/old-elf/X86_64/dynlib-nointerp-section.test b/test/old-elf/X86_64/dynlib-nointerp-section.test
new file mode 100644
index 000000000000..c23d283d2a6d
--- /dev/null
+++ b/test/old-elf/X86_64/dynlib-nointerp-section.test
@@ -0,0 +1,4 @@
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/no-interp-section.o -o %t -shared
+RUN: llvm-objdump -section-headers %t | FileCheck %s
+
+CHECK-NOT: .interp
diff --git a/test/old-elf/X86_64/dynlib-search.test b/test/old-elf/X86_64/dynlib-search.test
new file mode 100644
index 000000000000..efd7272fb145
--- /dev/null
+++ b/test/old-elf/X86_64/dynlib-search.test
@@ -0,0 +1,6 @@
+# This tests the functionality for finding the shared library libfn.so for ELF
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/main.o -L%p/Inputs/ -lfn -o %t \
+RUN: --noinhibit-exec -t 2> %t1
+RUN: FileCheck %s < %t1
+
+CHECK: {{[\/0-9A-Za-z_]+}}libfn.so
diff --git a/test/old-elf/X86_64/dynsym-weak.test b/test/old-elf/X86_64/dynsym-weak.test
new file mode 100644
index 000000000000..8e1cc9fa8ec9
--- /dev/null
+++ b/test/old-elf/X86_64/dynsym-weak.test
@@ -0,0 +1,118 @@
+# Check that a symbol declared as a week in a shared library gets a dynamic
+# symbol table record in an executable file if this executabe file declares the
+# symbol as strong.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t.foo.o
+# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.so %t.foo.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t.main.o
+#
+# Link executable file with strong symbol. Weak symbol is in the shared lib.
+# RUN: lld -flavor old-gnu -target x86_64 -e main -o %t1.exe %t.main.o %t.so
+# RUN: llvm-readobj -dyn-symbols %t1.exe | FileCheck -check-prefix=EXE %s
+#
+# Link executable file. Strong and weak symbol come from different object files.
+# RUN: lld -flavor old-gnu -target x86_64 -e main -o %t2.exe %t.main.o %t.foo.o
+# RUN: llvm-readobj -dyn-symbols %t2.exe | FileCheck -check-prefix=OBJ %s
+#
+# Link shared library. Weak symbol is in the another shared lib.
+# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.res.so %t.main.o %t.so
+# RUN: llvm-readobj -dyn-symbols %t.res.so | FileCheck -check-prefix=SO %s
+
+# EXE: Symbol {
+# EXE: Name: flag@ ({{[0-9]+}})
+# EXE-NEXT: Value: 0x{{[0-9A-F]+}}
+# EXE-NEXT: Size: 4
+# EXE-NEXT: Binding: Global (0x1)
+# EXE-NEXT: Type: Object (0x1)
+# EXE-NEXT: Other: 0
+# EXE-NEXT: Section: .data (0x{{[0-9A-F]+}})
+# EXE-NEXT: }
+
+# OBJ-NOT: Name: flag@ ({{[0-9]+}})
+
+# SO: Symbol {
+# SO: Name: flag@ ({{[0-9]+}})
+# SO-NEXT: Value: 0x{{[0-9A-F]+}}
+# SO-NEXT: Size: 4
+# SO-NEXT: Binding: Global (0x1)
+# SO-NEXT: Type: Object (0x1)
+# SO-NEXT: Other: 0
+# SO-NEXT: Section: .data (0x{{[0-9A-F]+}})
+# SO-NEXT: }
+
+# foo.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x08
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: flag
+ Type: R_X86_64_GOTPCREL
+ Addend: -4
+
+Symbols:
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ Weak:
+ - Name: flag
+
+# main.o
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x08
+ Info: .text
+ Relocations:
+ - Offset: 0x00
+ Symbol: foo
+ Type: R_X86_64_PLT32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x04
+ Size: 0x04
+
+Symbols:
+ Global:
+ - Name: flag
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x04
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: foo
+...
diff --git a/test/old-elf/X86_64/extern-tls.test b/test/old-elf/X86_64/extern-tls.test
new file mode 100644
index 000000000000..d22b06057a9a
--- /dev/null
+++ b/test/old-elf/X86_64/extern-tls.test
@@ -0,0 +1,16 @@
+# This tests verifies that TLS variables have correct offsets
+# when variables the TLS variables are not defined in the program
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/externtls.x86-64 -static \
+RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s -check-prefix=CHECKGOT
+
+# Currently x86_64 relocation pass handles the R_X86_64_GOTTPOFF by
+# creatng R_X86_64_TPOFF64 dynamic ones. For output yaml, this is
+# not changed.
+ - name: __got_tls_extern_tls
+CHECKGOT: alignment: 4
+CHECKGOT: section-name: .text
+CHECKGOT: references:
+CHECKGOT: - kind: R_X86_64_GOTTPOFF
+CHECKGOT: offset: 7
+CHECKGOT: target: extern_tls
+CHECKGOT: addend: -4
diff --git a/test/old-elf/X86_64/general-dynamic-tls.test b/test/old-elf/X86_64/general-dynamic-tls.test
new file mode 100644
index 000000000000..12ad1071ae1e
--- /dev/null
+++ b/test/old-elf/X86_64/general-dynamic-tls.test
@@ -0,0 +1,128 @@
+# This test exercises a simple general dynamic TLS access model in X86_64.
+#
+# It is composed of two parts: a program and a shared library. The shared
+# library uses TLS, but the program does not.
+#
+# The shared library should import __tls_get_addr, since it uses the general
+# dynamic TLS access mode (see www.akkadia.org/drepper/tls.pdf). Notice that
+# once we support TLS strength reduction, this test should be updated, since
+# this can be converted into a local dynamic TLS model.
+
+# Prepare inputs
+#RUN: yaml2obj -format=elf %p/Inputs/generaltls-so.o.yaml -o=%t.o.so
+#RUN: lld -flavor old-gnu -target x86_64 -shared %t.o.so -o %T/libgeneraltls.so
+#RUN: yaml2obj -format=elf %s -o=%t.o
+
+# Link - (we supply --defsym=__tls_get_addr to avoid the need to link with
+# system libraries)
+#RUN: lld -flavor old-gnu -target x86_64 -e main %t.o -L%T -lgeneraltls -o %t1 \
+#RUN: --defsym=__tls_get_addr=0
+
+# Check
+#RUN: llvm-readobj -dyn-symbols %t1 | FileCheck -check-prefix CHECKPROG %s
+#RUN: llvm-readobj -relocations -dyn-symbols %T/libgeneraltls.so | FileCheck \
+#RUN: -check-prefix CHECKDSO %s
+
+# Test case generated with the following code:
+#
+# DSO: (file %p/Inputs/generaltls-so.o.yaml)
+#
+# __thread int mynumber=33;
+#
+# int getnumber() {
+# return mynumber;
+# }
+#
+# Program: (this file). Note: The printf() relocation was removed to simplify
+# this test and allow us to test this without libc.
+#
+# #include <stdio.h>
+# int getnumber();
+#
+# int main() {
+# printf("getnumber() = %d\n", getnumber());
+# return 0;
+# }
+#
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E54883EC10C745FC00000000B000E80000000048BF000000000000000089C6B000E80000000031F68945F889F04883C4105DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000012
+ Symbol: getnumber
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Offset: 0x0000000000000018
+ Symbol: .rodata.str1.1
+ Type: R_X86_64_64
+ Addend: 0
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .rodata.str1.1
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 6765746E756D6265722829203D2025640A00
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .rodata.str1.1
+ Type: STT_SECTION
+ Section: .rodata.str1.1
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000036
+ - Name: getnumber
+
+# Program should import the function defined in the shared library
+#CHECKPROG: getnumber@
+# Program should not import __tls_get_addr, since it does not directly use TLS
+#CHECKPROG-NOT: __tls_get_addr@
+
+# Check for the presence of X86_64 TLS relocations in the shared library
+#CHECKDSO: R_X86_64_DTPMOD64
+#CHECKDSO: R_X86_64_DTPOFF64
+#CHECKDSO: R_X86_64_JUMP_SLOT
+
+# The shared library should import __tls_get_addr, since it uses the general
+# dynamic TLS access mode.
+#CHECKDSO: Name: __tls_get_addr@
+#CHECKDSO-NEXT: Value: 0x0
+#CHECKDSO-NEXT: Size: 0
+#CHECKDSO-NEXT: Binding: Global
+#CHECKDSO-NEXT: Type: None
+#CHECKDSO-NEXT: Other: 0
+#CHECKDSO-NEXT: Section: Undefined
+
diff --git a/test/old-elf/X86_64/imagebase.test b/test/old-elf/X86_64/imagebase.test
new file mode 100644
index 000000000000..7b6f7318d72d
--- /dev/null
+++ b/test/old-elf/X86_64/imagebase.test
@@ -0,0 +1,94 @@
+# Checks that segments start at the image address specified.
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o
+# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \
+# RUN: --no-align-segments --noinhibit-exec --image-base 0x600000
+# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s
+#
+#CHECK: VirtualAddress: 0x600000
+#CHECK: PhysicalAddress: 0x600000
+#CHECK: VirtualAddress: 0x600178
+#CHECK: PhysicalAddress: 0x600178
+
+# object
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+ - Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '64000000'
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 0
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+ Size: 0x0000000000000008
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000012
+ - Name: myval
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ - Name: val
+ Type: STT_OBJECT
+ Section: .rodata
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/X86_64/initfini-order.test b/test/old-elf/X86_64/initfini-order.test
new file mode 100644
index 000000000000..e6afcf644346
--- /dev/null
+++ b/test/old-elf/X86_64/initfini-order.test
@@ -0,0 +1,10 @@
+# This tests the functionality that lld is able to emit
+# init_array/fini_array sections in the right order.
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/initfini.o \
+RUN: --noinhibit-exec -o %t
+RUN: llvm-objdump -t -section-headers %t | FileCheck %s
+
+CHECK: {{[0-9]+}} .eh_frame {{[0-9a-z]+}} {{[0-9a-z]+}} DATA
+CHECK: {{[0-9]+}} .init_array {{[0-9a-z]+}} {{[0-9a-z]+}} DATA
+CHECK: {{[0-9]+}} .fini_array {{[0-9a-z]+}} {{[0-9a-z]+}} DATA
diff --git a/test/old-elf/X86_64/initfini.test b/test/old-elf/X86_64/initfini.test
new file mode 100644
index 000000000000..09d2bc129c25
--- /dev/null
+++ b/test/old-elf/X86_64/initfini.test
@@ -0,0 +1,23 @@
+# This tests the functionality that lld is able to read
+# init_array/fini_array sections in the input ELF. This
+# corresponds to the the .init_array/.fini_array sections
+# in the output ELF.
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/initfini.o \
+RUN: --noinhibit-exec --output-filetype=yaml -o %t
+RUN: FileCheck %s < %t
+
+CHECK: - type: data
+CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECK: section-name: .init_array
+CHECK: references:
+CHECK: - kind: R_X86_64_64
+CHECK: offset: 0
+CHECK: target: constructor
+CHECK: - type: data
+CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECK: section-name: .fini_array
+CHECK: references:
+CHECK: - kind: R_X86_64_64
+CHECK: offset: 0
+CHECK: target: destructor
diff --git a/test/old-elf/X86_64/largebss.test b/test/old-elf/X86_64/largebss.test
new file mode 100644
index 000000000000..722ec1c72bf9
--- /dev/null
+++ b/test/old-elf/X86_64/largebss.test
@@ -0,0 +1,20 @@
+# This tests the functionality of handling BSS symbols
+# BSS symbols don't occupy file content and are associated with typeZeroFill
+# Any typeZeroFill content wouldn't have space reserved in the file to store
+# its content
+
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/largebss.o --output-filetype=yaml --noinhibit-exec | FileCheck %s
+
+CHECK: - name: largecommon
+CHECK: scope: global
+CHECK: type: zero-fill
+CHECK: size: 4000
+CHECK: merge: as-tentative
+CHECK: - name: largebss
+CHECK: scope: global
+CHECK: type: zero-fill
+CHECK: size: 4000
+CHECK: - name: largetbss
+CHECK: scope: global
+CHECK: type: thread-zero-fill
+CHECK: size: 4000
diff --git a/test/old-elf/X86_64/layoutpass-order.test b/test/old-elf/X86_64/layoutpass-order.test
new file mode 100644
index 000000000000..ec180c970e78
--- /dev/null
+++ b/test/old-elf/X86_64/layoutpass-order.test
@@ -0,0 +1,14 @@
+# This test checks that we follow the command line order of layouting
+# symbols in the output file
+
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/layoutpass/1.o \
+RUN: %p/Inputs/layoutpass/lib2.a %p/Inputs/layoutpass/3.o -o %t \
+RUN: --noinhibit-exec -static
+
+RUN: llvm-nm -n %t | FileCheck -check-prefix=SYMBOLSORDER %s
+
+SYMBOLSORDER: {{[A-Fa-f0-9]+}} T main
+SYMBOLSORDER: {{[A-Fa-f0-9]+}} T b
+SYMBOLSORDER: {{[A-Fa-f0-9]+}} T a
+SYMBOLSORDER: {{[A-Fa-f0-9]+}} T c
+SYMBOLSORDER: {{[A-Fa-f0-9]+}} T d
diff --git a/test/old-elf/X86_64/maxpagesize.test b/test/old-elf/X86_64/maxpagesize.test
new file mode 100644
index 000000000000..303bd86eec0b
--- /dev/null
+++ b/test/old-elf/X86_64/maxpagesize.test
@@ -0,0 +1,113 @@
+# Checks that segments are aligned as per ELF spec when the user specifies
+# max-page-size option, and the segment alignment is set to the page size
+# specified by the user.
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o
+# RUN: not lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \
+# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0
+# RUN: not lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \
+# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0xFF
+# RUN: not lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \
+# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0x1010
+# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t1.exe -static \
+# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0x100000
+# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \
+# RUN: --no-align-segments --noinhibit-exec -z max-page-size=0x10000
+# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s
+# RUN: llvm-readobj -program-headers %t1.exe | FileCheck %s -check-prefix=CHECKLARGE
+#
+#CHECK: VirtualAddress: 0x400000
+#CHECK: PhysicalAddress: 0x400000
+#CHECK: Alignment: 65536
+#CHECK: VirtualAddress: 0x400178
+#CHECK: PhysicalAddress: 0x400178
+#CHECK: Alignment: 65536
+#CHECKLARGE: VirtualAddress: 0x400000
+#CHECKLARGE: PhysicalAddress: 0x400000
+#CHECKLARGE: Alignment: 1048576
+#CHECKLARGE: VirtualAddress: 0x400178
+#CHECKLARGE: PhysicalAddress: 0x400178
+#CHECKLARGE: Alignment: 1048576
+
+# object
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+ - Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '64000000'
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 0
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+ Size: 0x0000000000000008
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000012
+ - Name: myval
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ - Name: val
+ Type: STT_OBJECT
+ Section: .rodata
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/X86_64/mergesimilarstrings.test b/test/old-elf/X86_64/mergesimilarstrings.test
new file mode 100644
index 000000000000..2b9b08faa23f
--- /dev/null
+++ b/test/old-elf/X86_64/mergesimilarstrings.test
@@ -0,0 +1,47 @@
+# Check that relocations to section that contains strings is properly handled
+# when merging strings is enabled.
+#
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target x86_64 %t.o --noinhibit-exec -o %t1.out
+# RUN: llvm-readobj -sections %t1.out | FileCheck %s
+# RUN: lld -flavor old-gnu -target x86_64 %t.o --noinhibit-exec -o %t2.out --output-filetype=yaml
+# RUN: FileCheck %s -check-prefix=CHECKRELOCS < %t2.out
+
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Content: 54889e5488d3d00000000e80000000088d3d00000000e800000000b8000000005dc3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x04
+ Info: .text
+ Relocations:
+ - Offset: 0x07
+ Symbol: .rodata
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x01
+ Content: 48656c6c6f20576f726c6400576f726c6400
+Symbols:
+ Global:
+ - Name: .rodata
+ Section: .rodata
+
+#CHECK: Name: .rodata
+#CHECK: Size: 18
+#CHECKRELOCS: references:
+#CHECKRELOCS: - kind: R_X86_64_PC32
+#CHECKRELOCS: offset: 7
+#CHECKRELOCS: target: .rodata
+#CHECKRELOCS: addend: -4
diff --git a/test/old-elf/X86_64/multi-weak-layout.test b/test/old-elf/X86_64/multi-weak-layout.test
new file mode 100644
index 000000000000..879b4b1b3052
--- /dev/null
+++ b/test/old-elf/X86_64/multi-weak-layout.test
@@ -0,0 +1,52 @@
+# Test that we are able to layout multiple weak symbols
+# properly
+
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multiweaksyms.o \
+RUN: --noinhibit-exec -static --output-filetype=yaml -o %t
+RUN: FileCheck %s -check-prefix=WEAKSYMS < %t
+
+WEAKSYMS: - type: data
+WEAKSYMS: alignment: 8
+WEAKSYMS: references:
+WEAKSYMS: - kind: layout-after
+WEAKSYMS: offset: 0
+WEAKSYMS: target: [[L001:[-a-zA-Z0-9_]+]]
+WEAKSYMS: - name: myfn2
+WEAKSYMS: scope: global
+WEAKSYMS: type: data
+WEAKSYMS: merge: as-weak
+WEAKSYMS: alignment: 8
+WEAKSYMS: references:
+WEAKSYMS: - kind: layout-after
+WEAKSYMS: offset: 0
+WEAKSYMS: target: [[L001]]
+WEAKSYMS: - ref-name: [[L001]]
+WEAKSYMS: scope: global
+WEAKSYMS: type: data
+WEAKSYMS: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+WEAKSYMS: alignment: 8
+WEAKSYMS: references:
+WEAKSYMS: - kind: R_X86_64_64
+WEAKSYMS: offset: 0
+WEAKSYMS: target: test
+WEAKSYMS: - kind: layout-after
+WEAKSYMS: offset: 0
+WEAKSYMS: target: [[L003:[-a-zA-Z0-9_]+]]
+WEAKSYMS: - name: myfn1
+WEAKSYMS: scope: global
+WEAKSYMS: type: data
+WEAKSYMS: merge: as-weak
+WEAKSYMS: alignment: 8
+WEAKSYMS: references:
+WEAKSYMS: - kind: layout-after
+WEAKSYMS: offset: 0
+WEAKSYMS: target: [[L003]]
+WEAKSYMS: - ref-name: [[L003]]
+WEAKSYMS: scope: global
+WEAKSYMS: type: data
+WEAKSYMS: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+WEAKSYMS: alignment: 8
+WEAKSYMS: references:
+WEAKSYMS: - kind: R_X86_64_64
+WEAKSYMS: offset: 0
+WEAKSYMS: target: test
diff --git a/test/old-elf/X86_64/multi-weak-override.test b/test/old-elf/X86_64/multi-weak-override.test
new file mode 100644
index 000000000000..75c86e7e405f
--- /dev/null
+++ b/test/old-elf/X86_64/multi-weak-override.test
@@ -0,0 +1,16 @@
+# Test for weak symbol getting overridden
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o \
+RUN: %p/Inputs/multi-ovrd.o -o %t -e main --noinhibit-exec
+RUN: llvm-nm -n %t | FileCheck -check-prefix=WEAKORDER %s
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o \
+RUN: %p/Inputs/multi-ovrd.o --output-filetype=yaml -o %t2 --noinhibit-exec
+RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2
+
+WEAKORDER: {{[0-9a-f]+}} T f
+WEAKORDER: {{[0-9a-f]+}} T g
+
+WEAKATOMSORDER: - ref-name: {{[A-Z0-9]+}}
+WEAKATOMSORDER: - ref-name: {{[A-Z0-9]+}}
+WEAKATOMSORDER: - name: f
+WEAKATOMSORDER: - name: g
+
diff --git a/test/old-elf/X86_64/multi-weak-syms-order.test b/test/old-elf/X86_64/multi-weak-syms-order.test
new file mode 100644
index 000000000000..a8e21e13f870
--- /dev/null
+++ b/test/old-elf/X86_64/multi-weak-syms-order.test
@@ -0,0 +1,13 @@
+# Test for weak symbol getting overridden
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o -o %t --noinhibit-exec
+RUN: llvm-nm -n %t | FileCheck -check-prefix=WEAKORDER %s
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/multi-weak.o -o %t2 --output-filetype=yaml --noinhibit-exec
+RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2
+
+WEAKORDER: {{[0-9a-f]+}} T fn
+WEAKORDER: {{[0-9a-f]+}} T f
+WEAKORDER: {{[0-9a-f]+}} T g
+WEAKORDER: {{[0-9a-f]+}} T main
+
+WEAKATOMSORDER: - name: f
+WEAKATOMSORDER: - name: g
diff --git a/test/old-elf/X86_64/nmagic.test b/test/old-elf/X86_64/nmagic.test
new file mode 100644
index 000000000000..3ed9228fa787
--- /dev/null
+++ b/test/old-elf/X86_64/nmagic.test
@@ -0,0 +1,91 @@
+# This tests verifies functionality of NMAGIC that we create only two segments,
+# PT_LOAD, PT_TLS
+# The data segment should be aligned to a page boundary
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \
+RUN: --noinhibit-exec -o %t --nmagic -static
+RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NMAGICSECTIONS %s
+RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NMAGICPROGRAMHEADERS %s
+
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Index: 0
+NMAGICSECTIONS: Name: (0)
+NMAGICSECTIONS: Type: SHT_NULL (0x0)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .text
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .eh_frame
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .tdata
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .tbss
+NMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .got.plt
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .data
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .bss
+NMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .comment
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .note.GNU-stack
+NMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .shstrtab
+NMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .symtab
+NMAGICSECTIONS: Type: SHT_SYMTAB (0x2)
+NMAGICSECTIONS: }
+NMAGICSECTIONS: Section {
+NMAGICSECTIONS: Name: .strtab
+NMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+NMAGICSECTIONS: }
+
+NMAGICPROGRAMHEADERS: ProgramHeaders [
+NMAGICPROGRAMHEADERS: ProgramHeader {
+NMAGICPROGRAMHEADERS: Type: PT_LOAD (0x1)
+NMAGICPROGRAMHEADERS: Offset: 0x0
+NMAGICPROGRAMHEADERS: VirtualAddress: 0x400000
+NMAGICPROGRAMHEADERS: PhysicalAddress: 0x400000
+NMAGICPROGRAMHEADERS: FileSize: 4108
+NMAGICPROGRAMHEADERS: MemSize: 4108
+NMAGICPROGRAMHEADERS: Flags [ (0x7)
+NMAGICPROGRAMHEADERS: PF_R (0x4)
+NMAGICPROGRAMHEADERS: PF_W (0x2)
+NMAGICPROGRAMHEADERS: PF_X (0x1)
+NMAGICPROGRAMHEADERS: ]
+NMAGICPROGRAMHEADERS: Alignment: 8
+NMAGICPROGRAMHEADERS: }
+NMAGICPROGRAMHEADERS: ProgramHeader {
+NMAGICPROGRAMHEADERS: Type: PT_TLS (0x7)
+NMAGICPROGRAMHEADERS: Offset: 0x1000
+NMAGICPROGRAMHEADERS: VirtualAddress: 0x401000
+NMAGICPROGRAMHEADERS: PhysicalAddress: 0x401000
+NMAGICPROGRAMHEADERS: FileSize: 4
+NMAGICPROGRAMHEADERS: MemSize: 12
+NMAGICPROGRAMHEADERS: Flags [ (0x6)
+NMAGICPROGRAMHEADERS: PF_R (0x4)
+NMAGICPROGRAMHEADERS: PF_W (0x2)
+NMAGICPROGRAMHEADERS: ]
+NMAGICPROGRAMHEADERS: Alignment: 4
+NMAGICPROGRAMHEADERS: }
+NMAGICPROGRAMHEADERS: ]
diff --git a/test/old-elf/X86_64/noalignsegments.test b/test/old-elf/X86_64/noalignsegments.test
new file mode 100644
index 000000000000..4963575b674b
--- /dev/null
+++ b/test/old-elf/X86_64/noalignsegments.test
@@ -0,0 +1,95 @@
+# Checks that segments are aligned as per ELF spec than aligning each
+# segment fileoffset / virtual address to a page.
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o
+# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t.exe -static \
+# RUN: --no-align-segments --noinhibit-exec
+# RUN: llvm-readobj -program-headers %t.exe | FileCheck %s
+#
+#CHECK: VirtualAddress: 0x400000
+#CHECK: PhysicalAddress: 0x400000
+#CHECK: VirtualAddress: 0x400178
+#CHECK: PhysicalAddress: 0x400178
+
+# object
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5B864000000C745FC000000005DC366666666662E0F1F840000000000554889E531C05DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+ - Name: .rodata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: '64000000'
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000800000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 0
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+ Size: 0x0000000000000008
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000012
+ - Name: myval
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ - Name: val
+ Type: STT_OBJECT
+ Section: .rodata
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/X86_64/note-sections-ro_plus_rw.test b/test/old-elf/X86_64/note-sections-ro_plus_rw.test
new file mode 100644
index 000000000000..b4eafaf277c4
--- /dev/null
+++ b/test/old-elf/X86_64/note-sections-ro_plus_rw.test
@@ -0,0 +1,42 @@
+# This tests the functionality that lld is able to recreate the note sections
+# if they appear in the input, it looks like we need to differentiate RO note
+# sections from RW note sections, and each creating a segment of its own
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/note_ro_rw.o \
+RUN: --noinhibit-exec -o %t -static
+RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NOTESECTIONS %s
+RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NOTESEGMENT %s
+
+NOTESECTIONS: Section {
+NOTESECTIONS: Name: .note.ro (1)
+NOTESECTIONS: Type: SHT_NOTE (0x7)
+NOTESECTIONS: Flags [ (0x2)
+NOTESECTIONS: SHF_ALLOC (0x2)
+NOTESECTIONS: ]
+NOTESECTIONS: AddressAlignment: 4
+NOTESECTIONS: }
+NOTESECTIONS: Section {
+NOTESECTIONS: Name: .note.rw (31)
+NOTESECTIONS: Type: SHT_NOTE (0x7)
+NOTESECTIONS: Flags [ (0x3)
+NOTESECTIONS: SHF_ALLOC (0x2)
+NOTESECTIONS: SHF_WRITE (0x1)
+NOTESECTIONS: ]
+NOTESECTIONS: Size: 28
+NOTESECTIONS: AddressAlignment: 4
+NOTESECTIONS: }
+NOTESEGMENT: ProgramHeader {
+NOTESEGMENT: Type: PT_NOTE (0x4)
+NOTESEGMENT: Flags [ (0x4)
+NOTESEGMENT: PF_R (0x4)
+NOTESEGMENT: ]
+NOTESEGMENT: Alignment: 4
+NOTESEGMENT: }
+NOTESEGMENT: ProgramHeader {
+NOTESEGMENT: Type: PT_NOTE (0x4)
+NOTESEGMENT: Flags [ (0x6)
+NOTESEGMENT: PF_R (0x4)
+NOTESEGMENT: PF_W (0x2)
+NOTESEGMENT: ]
+NOTESEGMENT: Alignment: 4
+NOTESEGMENT: }
diff --git a/test/old-elf/X86_64/note-sections.test b/test/old-elf/X86_64/note-sections.test
new file mode 100644
index 000000000000..b831e7e192b4
--- /dev/null
+++ b/test/old-elf/X86_64/note-sections.test
@@ -0,0 +1,23 @@
+# This tests the functionality that lld is able to recreate the note sections
+# if they appear in the input
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/note.o \
+RUN: --noinhibit-exec -o %t -static
+RUN: llvm-readobj -sections %t | FileCheck -check-prefix=NOTESECTIONS %s
+RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=NOTESEGMENT %s
+
+
+NOTESECTIONS: Section {
+NOTESECTIONS: Index: 1
+NOTESECTIONS: Name: .note.ident (1)
+NOTESECTIONS: Type: SHT_NOTE (0x7)
+NOTESECTIONS: Size: 28
+NOTESECTIONS: AddressAlignment: 4
+NOTESECTIONS: }
+
+NOTESEGMENT: ProgramHeader {
+NOTESEGMENT: Type: PT_NOTE (0x4)
+NOTESEGMENT: FileSize: 28
+NOTESEGMENT: MemSize: 28
+NOTESEGMENT: Alignment: 4
+NOTESEGMENT: }
diff --git a/test/old-elf/X86_64/omagic.test b/test/old-elf/X86_64/omagic.test
new file mode 100644
index 000000000000..fe2633e67a95
--- /dev/null
+++ b/test/old-elf/X86_64/omagic.test
@@ -0,0 +1,237 @@
+# This tests verifies functionality of omagic that we create only two segments,
+# PT_LOAD, PT_TLS
+# The data segment should not be aligned to a page boundary
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \
+RUN: --noinhibit-exec -o %t --omagic -static
+RUN: llvm-readobj -sections %t | FileCheck -check-prefix=OMAGICSECTIONS %s
+RUN: llvm-readobj -program-headers %t | FileCheck -check-prefix=OMAGICPROGRAMHEADERS %s
+
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: (0)
+OMAGICSECTIONS: Type: SHT_NULL (0x0)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x0
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 0
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .text
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x6)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_EXECINSTR (0x4)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x4000E8
+OMAGICSECTIONS: Offset: 0xE8
+OMAGICSECTIONS: Size: 11
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .eh_frame
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x2)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x4000F8
+OMAGICSECTIONS: Offset: 0xF8
+OMAGICSECTIONS: Size: 56
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 8
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .eh_frame_hdr
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x2)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400130
+OMAGICSECTIONS: Offset: 0x130
+OMAGICSECTIONS: Size: 8
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 8
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .tdata
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x403)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_TLS (0x400)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400138
+OMAGICSECTIONS: Offset: 0x138
+OMAGICSECTIONS: Size: 4
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .tbss
+OMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+OMAGICSECTIONS: Flags [ (0x403)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_TLS (0x400)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x40013C
+OMAGICSECTIONS: Offset: 0x13C
+OMAGICSECTIONS: Size: 8
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .got.plt
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x3)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400140
+OMAGICSECTIONS: Offset: 0x140
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 8
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .data
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x3)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400140
+OMAGICSECTIONS: Offset: 0x140
+OMAGICSECTIONS: Size: 4
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .bss
+OMAGICSECTIONS: Type: SHT_NOBITS (0x8)
+OMAGICSECTIONS: Flags [ (0x3)
+OMAGICSECTIONS: SHF_ALLOC (0x2)
+OMAGICSECTIONS: SHF_WRITE (0x1)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x400144
+OMAGICSECTIONS: Offset: 0x144
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 4
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .comment
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x144
+OMAGICSECTIONS: Size: 43
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .note.GNU-stack
+OMAGICSECTIONS: Type: SHT_PROGBITS (0x1)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x16F
+OMAGICSECTIONS: Size: 0
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .shstrtab
+OMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x16F
+OMAGICSECTIONS: Size: 115
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .symtab
+OMAGICSECTIONS: Type: SHT_SYMTAB (0x2)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x1E8
+OMAGICSECTIONS: Size: 504
+OMAGICSECTIONS: Link: 13
+OMAGICSECTIONS: Info: 8
+OMAGICSECTIONS: AddressAlignment: 8
+OMAGICSECTIONS: EntrySize: 24
+OMAGICSECTIONS: }
+OMAGICSECTIONS: Section {
+OMAGICSECTIONS: Name: .strtab
+OMAGICSECTIONS: Type: SHT_STRTAB (0x3)
+OMAGICSECTIONS: Flags [ (0x0)
+OMAGICSECTIONS: ]
+OMAGICSECTIONS: Address: 0x0
+OMAGICSECTIONS: Offset: 0x3E0
+OMAGICSECTIONS: Size: 231
+OMAGICSECTIONS: Link: 0
+OMAGICSECTIONS: Info: 0
+OMAGICSECTIONS: AddressAlignment: 1
+OMAGICSECTIONS: EntrySize: 0
+OMAGICSECTIONS: }
+OMAGICSECTIONS: ]
+
+OMAGICPROGRAMHEADERS: ProgramHeaders [
+OMAGICPROGRAMHEADERS: ProgramHeader {
+OMAGICPROGRAMHEADERS: Type: PT_LOAD (0x1)
+OMAGICPROGRAMHEADERS: Offset: 0x0
+OMAGICPROGRAMHEADERS: VirtualAddress: 0x400000
+OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400000
+OMAGICPROGRAMHEADERS: FileSize: 324
+OMAGICPROGRAMHEADERS: MemSize: 324
+OMAGICPROGRAMHEADERS: Flags [ (0x7)
+OMAGICPROGRAMHEADERS: PF_R (0x4)
+OMAGICPROGRAMHEADERS: PF_W (0x2)
+OMAGICPROGRAMHEADERS: PF_X (0x1)
+OMAGICPROGRAMHEADERS: ]
+OMAGICPROGRAMHEADERS: Alignment: 8
+OMAGICPROGRAMHEADERS: }
+OMAGICPROGRAMHEADERS: ProgramHeader {
+OMAGICPROGRAMHEADERS: Type: PT_TLS (0x7)
+OMAGICPROGRAMHEADERS: Offset: 0x138
+OMAGICPROGRAMHEADERS: VirtualAddress: 0x400138
+OMAGICPROGRAMHEADERS: PhysicalAddress: 0x400138
+OMAGICPROGRAMHEADERS: FileSize: 4
+OMAGICPROGRAMHEADERS: MemSize: 12
+OMAGICPROGRAMHEADERS: Flags [ (0x6)
+OMAGICPROGRAMHEADERS: PF_R (0x4)
+OMAGICPROGRAMHEADERS: PF_W (0x2)
+OMAGICPROGRAMHEADERS: ]
+OMAGICPROGRAMHEADERS: Alignment: 4
+OMAGICPROGRAMHEADERS: }
+OMAGICPROGRAMHEADERS: ]
diff --git a/test/old-elf/X86_64/outputsegments.test b/test/old-elf/X86_64/outputsegments.test
new file mode 100644
index 000000000000..1c76b6eb855c
--- /dev/null
+++ b/test/old-elf/X86_64/outputsegments.test
@@ -0,0 +1,188 @@
+# Tests that lld does not create separate segment if the input sections are part
+# of the same output section
+
+# Build executable
+# RUN: yaml2obj -format=elf -docnum 1 %s -o %t.o
+# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t1.exe -static \
+# RUN: --no-align-segments --noinhibit-exec
+# RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t2.exe -static \
+# RUN: --noinhibit-exec
+# RUN: llvm-readobj -program-headers %t1.exe | FileCheck %s -check-prefix=SEGMENTS
+# RUN: llvm-readobj -program-headers %t2.exe | FileCheck %s -check-prefix=SEGMENTS
+#
+#SEGMENTS: VirtualAddress: 0x400000
+#SEGMENTS: PhysicalAddress: 0x400000
+#SEGMENTS: FileSize: 288
+#SEGMENTS: MemSize: 288
+#SEGMENTS: VirtualAddress: 0x404000
+#SEGMENTS: PhysicalAddress: 0x404000
+#SEGMENTS: FileSize: 16608
+#SEGMENTS: MemSize: 16608
+#SEGMENTS: Alignment: 16384
+#
+# object
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .text.foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000002000
+ Content: 554889E54883EC1048BF0000000000000000B000E800000000B9000000008945FC89C84883C4105DC3
+ - Name: .rela.text.foo
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text.foo
+ Relocations:
+ - Offset: 0x000000000000000A
+ Symbol: .rodata.str1.1
+ Type: R_X86_64_64
+ Addend: 0
+ - Offset: 0x0000000000000015
+ Symbol: printf
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .text.bar
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000004000
+ Content: 554889E54883EC1048BF0000000000000000B000E800000000B9000000008945FC89C84883C4105DC3
+ - Name: .rela.text.bar
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text.bar
+ Relocations:
+ - Offset: 0x000000000000000A
+ Symbol: .rodata.str1.1
+ Type: R_X86_64_64
+ Addend: 7
+ - Offset: 0x0000000000000015
+ Symbol: printf
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .text.main
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E54883EC10C745FC00000000E8000000008945F8E8000000008B4DF801C189C84883C4105DC3
+ - Name: .rela.text.main
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text.main
+ Relocations:
+ - Offset: 0x0000000000000010
+ Symbol: foo
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Offset: 0x0000000000000018
+ Symbol: bar
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .rodata.str1.1
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 48656C6C6F0A00576F726C640A00
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 005562756E747520636C616E672076657273696F6E20332E352E302D73766E3231373330342D317E6578703120286272616E636865732F72656C656173655F33352920286261736564206F6E204C4C564D20332E352E302900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000180000001C000000000000002900000000410E108602430D060000001800000038000000000000002900000000410E108602430D060000001C00000054000000000000002900000000410E108602430D0600000000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text.foo
+ Type: R_X86_64_PC32
+ Addend: 0
+ - Offset: 0x000000000000003C
+ Symbol: .text.bar
+ Type: R_X86_64_PC32
+ Addend: 0
+ - Offset: 0x0000000000000058
+ Symbol: .text.main
+ Type: R_X86_64_PC32
+ Addend: 0
+Symbols:
+ Local:
+ - Name: 1.c
+ Type: STT_FILE
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .text.foo
+ Type: STT_SECTION
+ Section: .text.foo
+ - Name: .text.bar
+ Type: STT_SECTION
+ Section: .text.bar
+ - Name: .text.main
+ Type: STT_SECTION
+ Section: .text.main
+ - Name: .rodata.str1.1
+ Type: STT_SECTION
+ Section: .rodata.str1.1
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: bar
+ Type: STT_FUNC
+ Section: .text.bar
+ Size: 0x0000000000000029
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text.foo
+ Size: 0x0000000000000029
+ - Name: main
+ Type: STT_FUNC
+ Section: .text.main
+ Size: 0x0000000000000029
+ - Name: printf
+...
diff --git a/test/old-elf/X86_64/reloc_r_x86_64_16.test b/test/old-elf/X86_64/reloc_r_x86_64_16.test
new file mode 100644
index 000000000000..093fbeb4f137
--- /dev/null
+++ b/test/old-elf/X86_64/reloc_r_x86_64_16.test
@@ -0,0 +1,59 @@
+# Tests that lld can handle relocations of type R_X86_64_16
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t1.o
+#RUN: lld -flavor old-gnu -target x86_64 %t1.o --noinhibit-exec -o %t2.out -static
+#RUN: llvm-objdump -s %t2.out | FileCheck %s
+#CHECK: Contents of section .data:
+#CHECK: 401000 0210
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: '0000'
+ - Name: .rela.data
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .data
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: foo
+ Type: R_X86_64_16
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: bar
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x0000000000000008
+ - Name: foo
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x0000000000000002
+ Size: 0x0000000000000002
+...
diff --git a/test/old-elf/X86_64/reloc_r_x86_64_pc16.test b/test/old-elf/X86_64/reloc_r_x86_64_pc16.test
new file mode 100644
index 000000000000..c6e53ad636e8
--- /dev/null
+++ b/test/old-elf/X86_64/reloc_r_x86_64_pc16.test
@@ -0,0 +1,60 @@
+# Tests that lld can handle relocations of type R_X86_64_PC16
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t1.o
+#RUN: lld -flavor old-gnu -target x86_64 %t1.o --noinhibit-exec -o %t2.out -static
+#RUN: llvm-objdump -s %t2.out | FileCheck %s
+#CHECK: Contents of section .data:
+#CHECK: 401000 0700
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: '0000'
+ - Name: .rela.data
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .data
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: foo
+ Type: R_X86_64_PC16
+ Addend: 5
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: bar
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x0000000000000008
+ - Name: foo
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x0000000000000002
+ Size: 0x0000000000000002
+...
diff --git a/test/old-elf/X86_64/reloc_r_x86_64_pc64.test b/test/old-elf/X86_64/reloc_r_x86_64_pc64.test
new file mode 100644
index 000000000000..a7c5e88965c5
--- /dev/null
+++ b/test/old-elf/X86_64/reloc_r_x86_64_pc64.test
@@ -0,0 +1,60 @@
+# Tests that lld can handle relocations of type R_X86_64_PC64
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t1.o
+#RUN: lld -flavor old-gnu -target x86_64 %t1.o --noinhibit-exec -o %t2.out -static
+#RUN: llvm-objdump -s %t2.out | FileCheck %s
+#CHECK: Contents of section .data:
+#CHECK: 401000 0a00
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: '0000'
+ - Name: .rela.data
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .data
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: foo
+ Type: R_X86_64_PC64
+ Addend: 8
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: bar
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x0000000000000008
+ - Name: foo
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x0000000000000002
+ Size: 0x0000000000000002
+...
diff --git a/test/old-elf/X86_64/rodata.test b/test/old-elf/X86_64/rodata.test
new file mode 100644
index 000000000000..6f85ac0423fd
--- /dev/null
+++ b/test/old-elf/X86_64/rodata.test
@@ -0,0 +1,9 @@
+# This tests that the ordinals for all merge atoms and defined atoms have been
+# set properly
+
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/rodata.o --noinhibit-exec \
+RUN: --merge-strings -static -o %t1
+RUN: llvm-nm -n %t1 | FileCheck %s
+
+CHECK: {{[0-9a-f]+}} R _nl_default_default_domain
+CHECK: {{[0-9a-f]+}} R _nl_default_default_dirname
diff --git a/test/old-elf/X86_64/sectionchoice.test b/test/old-elf/X86_64/sectionchoice.test
new file mode 100644
index 000000000000..7ff838fed98d
--- /dev/null
+++ b/test/old-elf/X86_64/sectionchoice.test
@@ -0,0 +1,7 @@
+# This tests that we are able to properly set the sectionChoice for DefinedAtoms
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/zerosizedsection.o \
+RUN: --noinhibit-exec -o %t --output-filetype=yaml
+RUN: FileCheck %s < %t
+
+CHECK-NOT: section-choice: sectionCustomRequired
+
diff --git a/test/old-elf/X86_64/sectionmap.test b/test/old-elf/X86_64/sectionmap.test
new file mode 100644
index 000000000000..5fa04bd87051
--- /dev/null
+++ b/test/old-elf/X86_64/sectionmap.test
@@ -0,0 +1,22 @@
+# This tests that we are able to merge the section .gcc_except_table,
+# .data.rel.local, .data.rel.ro, any other sections that belong to .data
+# into appropriate output sections
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/sectionmap.o \
+RUN: --noinhibit-exec -o %t
+RUN: llvm-readobj -sections %t | FileCheck %s -check-prefix=VERIFYSECTIONHEADERS
+
+VERIFYSECTIONHEADERS: Section {
+VERIFYSECTIONHEADERS: Name: .data
+VERIFYSECTIONHEADERS: }
+VERIFYSECTIONHEADERS: Section {
+VERIFYSECTIONHEADERS: Name: .gcc_except_table
+VERIFYSECTIONHEADERS: }
+VERIFYSECTIONHEADERS: Section {
+VERIFYSECTIONHEADERS: Name: .data.rel.local
+VERIFYSECTIONHEADERS: }
+VERIFYSECTIONHEADERS: Section {
+VERIFYSECTIONHEADERS: Name: .data.rel.ro
+VERIFYSECTIONHEADERS: }
+VERIFYSECTIONHEADERS: Section {
+VERIFYSECTIONHEADERS: Name: .bss
+VERIFYSECTIONHEADERS: }
diff --git a/test/old-elf/X86_64/startGroupEndGroup.test b/test/old-elf/X86_64/startGroupEndGroup.test
new file mode 100644
index 000000000000..e79e436a6513
--- /dev/null
+++ b/test/old-elf/X86_64/startGroupEndGroup.test
@@ -0,0 +1,48 @@
+# This tests functionality of --start-group, --end-group
+
+# This link should fail with unresolve symbol
+RUN: not lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o \
+RUN: %p/Inputs/group/libfn.a %p/Inputs/group/libfn1.a -o x 2> %t.err
+
+# Test group
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \
+RUN: %p/Inputs/group/libfn.a %p/Inputs/group/libfn1.a --end-group -o %t1
+
+# Mix object files in group
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \
+RUN: %p/Inputs/group/fn.o %p/Inputs/group/fn2.o \
+RUN: %p/Inputs/group/fn1.o --end-group -o %t2
+
+# Mix Whole archive input, the group should not iterate the file libfn.a
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \
+RUN: --whole-archive %p/Inputs/group/libfn.a --no-whole-archive \
+RUN: %p/Inputs/group/libfn1.a --end-group -o %t3
+
+# Defined symbols in a shared library.
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \
+RUN: %p/Inputs/group/libfn2.so %p/Inputs/group/fn1.o %p/Inputs/group/fn.o \
+RUN: --end-group -o %t4
+
+# Test alias options too, as they are more widely used
+# Test group
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o '-(' \
+RUN: %p/Inputs/group/libfn.a %p/Inputs/group/libfn1.a '-)' -o %t1.alias
+
+# Mix object files in group
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o '-(' \
+RUN: %p/Inputs/group/fn.o %p/Inputs/group/fn2.o \
+RUN: %p/Inputs/group/fn1.o '-)' -o %t2.alias
+
+# Mix Whole archive input, the group should not iterate the file libfn.a
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o '-(' \
+RUN: --whole-archive %p/Inputs/group/libfn.a --no-whole-archive \
+RUN: %p/Inputs/group/libfn1.a '-)' -o %t3.alias
+
+RUN: llvm-nm %t1 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+RUN: llvm-nm %t2 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+RUN: llvm-nm %t3 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+RUN: llvm-nm %t1.alias | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+RUN: llvm-nm %t2.alias | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+RUN: llvm-nm %t3.alias | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+
+RESOLVEDEXTERNAL: {{[0-9a-z]+}} T fn2
diff --git a/test/old-elf/X86_64/startGroupEndGroupWithDynlib.test b/test/old-elf/X86_64/startGroupEndGroupWithDynlib.test
new file mode 100644
index 000000000000..30bfe1530f8e
--- /dev/null
+++ b/test/old-elf/X86_64/startGroupEndGroupWithDynlib.test
@@ -0,0 +1,10 @@
+# This tests functionality of --start-group, --end-group with a dynamic library
+
+# Mix dynamic libraries/object files in group
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/group/1.o --start-group \
+RUN: %p/Inputs/group/libfn.so %p/Inputs/group/fn2.o \
+RUN: %p/Inputs/group/fn1.o --end-group -o %t1
+
+RUN: llvm-nm %t1 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+
+RESOLVEDEXTERNAL: {{[0-9a-z]+}} T fn2
diff --git a/test/old-elf/X86_64/staticlib-search.test b/test/old-elf/X86_64/staticlib-search.test
new file mode 100644
index 000000000000..b84bd299f385
--- /dev/null
+++ b/test/old-elf/X86_64/staticlib-search.test
@@ -0,0 +1,6 @@
+# This tests the functionality for finding the static library libfn.a for ELF
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/main.o -L%p/Inputs/ -lfn -o %t \
+RUN: --noinhibit-exec -static -t 2> %t1
+RUN: FileCheck %s < %t1
+
+CHECK: {{[\/0-9A-Za-z_]+}}libfn.a
diff --git a/test/old-elf/X86_64/undef.test b/test/old-elf/X86_64/undef.test
new file mode 100644
index 000000000000..f948286a339b
--- /dev/null
+++ b/test/old-elf/X86_64/undef.test
@@ -0,0 +1,18 @@
+# This tests the functionality that an undefined symbol thats defined in the
+# commmand line pulls in the required object file from the archive library
+# which is usually the usecase for it
+RUN: lld -flavor old-gnu -target x86_64 -u fn %p/Inputs/libfn.a -o %t --noinhibit-exec
+RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=SYMFROMARCHIVE %s
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/libfn.a -o %t --noinhibit-exec
+RUN: llvm-readobj -symbols %t | FileCheck %s
+
+SYMFROMARCHIVE: Symbol {
+SYMFROMARCHIVE: Name: fn ({{[0-9]+}}
+SYMFROMARCHIVE: Size: 11
+SYMFROMARCHIVE: Binding: Global (0x1)
+SYMFROMARCHIVE: Type: Function (0x2)
+SYMFROMARCHIVE: Other: 0
+SYMFROMARCHIVE: Section: .text
+SYMFROMARCHIVE: }
+
+CHECK-NOT: Name: fn
diff --git a/test/old-elf/X86_64/underscore-end.test b/test/old-elf/X86_64/underscore-end.test
new file mode 100644
index 000000000000..4ca0c94013ea
--- /dev/null
+++ b/test/old-elf/X86_64/underscore-end.test
@@ -0,0 +1,81 @@
+# This tests verifies that the value of _end symbol is point to the right value
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \
+RUN: --noinhibit-exec -o %t --nmagic
+RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=NMAGICABSSYMBOLS %s
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/nmagic.o \
+RUN: --noinhibit-exec -o %t --omagic
+RUN: llvm-readobj -symbols %t | FileCheck -check-prefix=OMAGICABSSYMBOLS %s
+
+NMAGICABSSYMBOLS: Symbol {
+NMAGICABSSYMBOLS: Name: __bss_start ({{[0-9]+}}
+NMAGICABSSYMBOLS: Value: 0x40100C
+NMAGICABSSYMBOLS: Size: 0
+NMAGICABSSYMBOLS: Binding: Global (0x1)
+NMAGICABSSYMBOLS: Type: Object (0x1)
+NMAGICABSSYMBOLS: Other: 0
+NMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+NMAGICABSSYMBOLS: }
+NMAGICABSSYMBOLS: Symbol {
+NMAGICABSSYMBOLS: Name: __bss_end ({{[0-9]+}}
+NMAGICABSSYMBOLS: Value: 0x40100C
+NMAGICABSSYMBOLS: Size: 0
+NMAGICABSSYMBOLS: Binding: Global (0x1)
+NMAGICABSSYMBOLS: Type: Object (0x1)
+NMAGICABSSYMBOLS: Other: 0
+NMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+NMAGICABSSYMBOLS: }
+NMAGICABSSYMBOLS: Symbol {
+NMAGICABSSYMBOLS: Name: _end ({{[0-9]+}}
+NMAGICABSSYMBOLS: Value: 0x40100C
+NMAGICABSSYMBOLS: Size: 0
+NMAGICABSSYMBOLS: Binding: Global (0x1)
+NMAGICABSSYMBOLS: Type: Object (0x1)
+NMAGICABSSYMBOLS: Other: 0
+NMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+NMAGICABSSYMBOLS: }
+NMAGICABSSYMBOLS: Symbol {
+NMAGICABSSYMBOLS: Name: end ({{[0-9]+}}
+NMAGICABSSYMBOLS: Value: 0x40100C
+NMAGICABSSYMBOLS: Size: 0
+NMAGICABSSYMBOLS: Binding: Global (0x1)
+NMAGICABSSYMBOLS: Type: Object (0x1)
+NMAGICABSSYMBOLS: Other: 0
+NMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+NMAGICABSSYMBOLS: }
+
+OMAGICABSSYMBOLS: Symbol {
+OMAGICABSSYMBOLS: Name: __bss_start ({{[0-9]+}})
+OMAGICABSSYMBOLS: Value: 0x400144
+OMAGICABSSYMBOLS: Size: 0
+OMAGICABSSYMBOLS: Binding: Global (0x1)
+OMAGICABSSYMBOLS: Type: Object (0x1)
+OMAGICABSSYMBOLS: Other: 0
+OMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+OMAGICABSSYMBOLS: }
+OMAGICABSSYMBOLS: Symbol {
+OMAGICABSSYMBOLS: Name: __bss_end ({{[0-9]+}}
+OMAGICABSSYMBOLS: Value: 0x400144
+OMAGICABSSYMBOLS: Size: 0
+OMAGICABSSYMBOLS: Binding: Global (0x1)
+OMAGICABSSYMBOLS: Type: Object (0x1)
+OMAGICABSSYMBOLS: Other: 0
+OMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+OMAGICABSSYMBOLS: }
+OMAGICABSSYMBOLS: Symbol {
+OMAGICABSSYMBOLS: Name: _end ({{[0-9]+}}
+OMAGICABSSYMBOLS: Value: 0x400144
+OMAGICABSSYMBOLS: Size: 0
+OMAGICABSSYMBOLS: Binding: Global (0x1)
+OMAGICABSSYMBOLS: Type: Object (0x1)
+OMAGICABSSYMBOLS: Other: 0
+OMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+OMAGICABSSYMBOLS: }
+OMAGICABSSYMBOLS: Symbol {
+OMAGICABSSYMBOLS: Name: end ({{[0-9]+}}
+OMAGICABSSYMBOLS: Value: 0x400144
+OMAGICABSSYMBOLS: Size: 0
+OMAGICABSSYMBOLS: Binding: Global (0x1)
+OMAGICABSSYMBOLS: Type: Object (0x1)
+OMAGICABSSYMBOLS: Other: 0
+OMAGICABSSYMBOLS: Section: Absolute (0xFFF1)
+OMAGICABSSYMBOLS: }
diff --git a/test/old-elf/X86_64/weak-override.test b/test/old-elf/X86_64/weak-override.test
new file mode 100644
index 000000000000..25cb9d5d687f
--- /dev/null
+++ b/test/old-elf/X86_64/weak-override.test
@@ -0,0 +1,45 @@
+# Test for weak symbol getting overridden
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak.o %p/Inputs/ovrd.o \
+RUN: -o %t --noinhibit-exec
+RUN: llvm-nm %t | FileCheck -check-prefix=WEAKORDER %s
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak.o \
+RUN: %p/Inputs/ovrd.o -o %t2 --output-filetype=yaml --noinhibit-exec
+RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2
+
+WEAKORDER: {{[0-9a-c]+}} T f
+
+WEAKATOMSORDER: references:
+WEAKATOMSORDER: - kind: layout-after
+WEAKATOMSORDER: offset: 0
+WEAKATOMSORDER: target: fn
+WEAKATOMSORDER: - name: fn
+WEAKATOMSORDER: references:
+WEAKATOMSORDER: - kind: layout-after
+WEAKATOMSORDER: offset: 0
+WEAKATOMSORDER: target: [[CONSTSTRA:[-a-zA-Z0-9_]+]]
+WEAKATOMSORDER: - ref-name: [[CONSTSTRA]]
+WEAKATOMSORDER: scope: global
+WEAKATOMSORDER: content: [ 55, 48, 89, E5, BF, 00, 00, 00, 00, E8, 00, 00,
+WEAKATOMSORDER: 00, 00, 5D, C3 ]
+WEAKATOMSORDER: references:
+WEAKATOMSORDER: - kind: layout-after
+WEAKATOMSORDER: offset: 0
+WEAKATOMSORDER: target: main
+WEAKATOMSORDER: - name: main
+WEAKATOMSORDER: scope: global
+WEAKATOMSORDER: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, E8, 00, 00,
+WEAKATOMSORDER: 00, 00, B8, 00, 00, 00, 00, 5D, C3 ]
+WEAKATOMSORDER: references:
+WEAKATOMSORDER: - kind: R_X86_64_PC32
+WEAKATOMSORDER: offset: 10
+WEAKATOMSORDER: target: f
+WEAKATOMSORDER: addend: -4
+WEAKATOMSORDER: - ref-name: {{[0-9A-Z]+}}
+WEAKATOMSORDER: references:
+WEAKATOMSORDER: - kind: layout-after
+WEAKATOMSORDER: offset: 0
+WEAKATOMSORDER: target: f
+WEAKATOMSORDER: - name: f
+WEAKATOMSORDER: scope: global
+WEAKATOMSORDER: content: [ 55, 48, 89, E5, BF, 00, 00, 00, 00, E8, 00, 00,
+WEAKATOMSORDER: 00, 00, 5D, C3 ]
diff --git a/test/old-elf/X86_64/weak-zero-sized.test b/test/old-elf/X86_64/weak-zero-sized.test
new file mode 100644
index 000000000000..93e27a355d64
--- /dev/null
+++ b/test/old-elf/X86_64/weak-zero-sized.test
@@ -0,0 +1,26 @@
+# Test for zero sized weak atoms, there is only a single weak atom
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak-zero-sized.o -o %t \
+RUN: --noinhibit-exec
+RUN: llvm-nm %t | FileCheck -check-prefix=WEAKORDER %s
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/weak-zero-sized.o \
+RUN: --output-filetype=yaml -o %t2 --noinhibit-exec
+RUN: FileCheck -check-prefix=WEAKATOMSORDER %s < %t2
+
+WEAKORDER: 004001a4 T _start
+
+WEAKATOMSORDER: alignment: 4
+WEAKATOMSORDER: - kind: layout-after
+WEAKATOMSORDER: offset: 0
+WEAKATOMSORDER: target: [[TARGETC:[-a-zA-Z0-9_]+]]
+WEAKATOMSORDER: - name: [[TARGETA:[-a-zA-Z0-9_]+]]
+WEAKATOMSORDER: scope: global
+WEAKATOMSORDER: merge: as-weak
+WEAKATOMSORDER: alignment: 4
+WEAKATOMSORDER: references:
+WEAKATOMSORDER: - kind: layout-after
+WEAKATOMSORDER: offset: 0
+WEAKATOMSORDER: target: [[TARGETC]]
+WEAKATOMSORDER: - ref-name: [[TARGETC]]
+WEAKATOMSORDER: scope: global
+WEAKATOMSORDER: content: [ C3 ]
+WEAKATOMSORDER: alignment: 4
diff --git a/test/old-elf/X86_64/weaksym.test b/test/old-elf/X86_64/weaksym.test
new file mode 100644
index 000000000000..9e4f2da9bdba
--- /dev/null
+++ b/test/old-elf/X86_64/weaksym.test
@@ -0,0 +1,77 @@
+# Tests that an executable with a weak undefine will put this symbol in the
+# dynamic symbol table if the executable has a dynamic relocation against this
+# symbol.
+
+#RUN: yaml2obj --format elf %s -o %t.o
+#RUN: lld -flavor old-gnu -target x86_64 -e main %t.o -o %t1
+#RUN: llvm-readobj -dt %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+#CHECKSYMS: Name: x@
+#CHECKSYMS-NEXT: Value: 0x0
+#CHECKSYMS-NEXT: Size: 0
+#CHECKSYMS-NEXT: Binding: Weak (0x2)
+#CHECKSYMS-NEXT: Type: None (0x0)
+#CHECKSYMS-NEXT: Other: 0
+#CHECKSYMS-NEXT: Section: Undefined (0x0)
+
+# The object file above corresponds to the following C program compiled with
+# -fPIC:
+# extern int *x __attribute__((weak));
+#
+# int main() {
+# if (x)
+# return 1;
+# return 0;
+# }
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5488B0500000000C745FC00000000488138000000000F840C000000C745FC01000000E907000000C745FC000000008B45FC5DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000007
+ Symbol: x
+ Type: R_X86_64_GOTPCREL
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000037
+ - Name: _GLOBAL_OFFSET_TABLE_
+ Weak:
+ - Name: x
diff --git a/test/old-elf/X86_64/yamlinput.test b/test/old-elf/X86_64/yamlinput.test
new file mode 100644
index 000000000000..1c51811eec95
--- /dev/null
+++ b/test/old-elf/X86_64/yamlinput.test
@@ -0,0 +1,166 @@
+# This tests the functionality that lld is able to read
+# an input YAML from a previous link
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/initfini.o \
+RUN: --noinhibit-exec --output-filetype=yaml -o %t.objtxt
+RUN: lld -flavor old-gnu -target x86_64-linux %t.objtxt \
+RUN: --noinhibit-exec -o %t1
+RUN: llvm-readobj -sections %t1 | FileCheck %s -check-prefix=SECTIONS
+
+SECTIONS: Section {
+SECTIONS: Index: 0
+SECTIONS: Name: (0)
+SECTIONS: Type: SHT_NULL (0x0)
+SECTIONS: Flags [ (0x0)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 1
+SECTIONS: Name: .interp
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x2)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 2
+SECTIONS: Name: .hash
+SECTIONS: Type: SHT_HASH (0x5)
+SECTIONS: Flags [ (0x2)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 3
+SECTIONS: Name: .dynsym
+SECTIONS: Type: SHT_DYNSYM (0xB)
+SECTIONS: Flags [ (0x2)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 4
+SECTIONS: Name: .dynstr
+SECTIONS: Type: SHT_STRTAB (0x3)
+SECTIONS: Flags [ (0x2)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 5
+SECTIONS: Name: .text
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x6)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: SHF_EXECINSTR (0x4)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 6
+SECTIONS: Name: .rodata
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x2)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 7
+SECTIONS: Name: .eh_frame
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x2)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 8
+SECTIONS: Name: .eh_frame_hdr
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 9
+SECTIONS: Name: .init_array
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x3)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: SHF_WRITE (0x1)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 10
+SECTIONS: Name: .fini_array
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x3)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: SHF_WRITE (0x1)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 11
+SECTIONS: Name: .dynamic
+SECTIONS: Type: SHT_DYNAMIC (0x6)
+SECTIONS: Flags [ (0x3)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: SHF_WRITE (0x1)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 12
+SECTIONS: Name: .got.plt
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x3)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: SHF_WRITE (0x1)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 13
+SECTIONS: Name: .data
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x3)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: SHF_WRITE (0x1)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 14
+SECTIONS: Name: .bss
+SECTIONS: Type: SHT_NOBITS (0x8)
+SECTIONS: Flags [ (0x3)
+SECTIONS: SHF_ALLOC (0x2)
+SECTIONS: SHF_WRITE (0x1)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 15
+SECTIONS: Name: .comment
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x0)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 16
+SECTIONS: Name: .note.GNU-stack
+SECTIONS: Type: SHT_PROGBITS (0x1)
+SECTIONS: Flags [ (0x0)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 17
+SECTIONS: Name: .shstrtab
+SECTIONS: Type: SHT_STRTAB (0x3)
+SECTIONS: Flags [ (0x0)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 18
+SECTIONS: Name: .symtab
+SECTIONS: Type: SHT_SYMTAB (0x2)
+SECTIONS: Flags [ (0x0)
+SECTIONS: ]
+SECTIONS: }
+SECTIONS: Section {
+SECTIONS: Index: 19
+SECTIONS: Name: .strtab
+SECTIONS: Type: SHT_STRTAB (0x3)
+SECTIONS: Flags [ (0x0)
+SECTIONS: ]
+SECTIONS: }
diff --git a/test/old-elf/abs-dup.objtxt b/test/old-elf/abs-dup.objtxt
new file mode 100644
index 000000000000..c662c9b44b4a
--- /dev/null
+++ b/test/old-elf/abs-dup.objtxt
@@ -0,0 +1,19 @@
+# Tests handling an absolute symbol with no name
+# RUN: lld -flavor old-gnu -target x86_64 -r %s \
+# RUN: --output-filetype=yaml | FileCheck %s
+
+absolute-atoms:
+ - name: abs
+ scope: static
+ value: 0x10
+ - name: ''
+ scope: static
+ value: 0x15
+
+# CHECK: absolute-atoms:
+# CHECK: - name: abs
+# CHECK: scope: static
+# CHECK: value: 0x0000000000000010
+# CHECK: - name: ''
+# CHECK: scope: static
+# CHECK: value: 0x0000000000000015
diff --git a/test/old-elf/abs.test b/test/old-elf/abs.test
new file mode 100644
index 000000000000..f542582bfa85
--- /dev/null
+++ b/test/old-elf/abs.test
@@ -0,0 +1,19 @@
+#
+# Source File:
+# .local absGlobalSymbol
+# .set absLocalSymbol,0xC0000
+# .type absLocalSymbol, @object
+# .globl absGlobalSymbol
+# .set absGlobalSymbol,0xD0000
+# .type absGlobalSymbol, @object
+
+# built using: "gcc -m32"
+#
+RUN: lld -flavor old-gnu -target i386 --output-filetype=yaml -r %p/Inputs/abs-test.i386 | FileCheck -check-prefix=YAML %s
+
+YAML: absolute-atoms:
+YAML: - name: absLocalSymbol
+YAML: value: {{0x[0]+C0000}}
+YAML: - name: absGlobalSymbol
+YAML: scope: global
+YAML: value: {{0x[0]+D0000}}
diff --git a/test/old-elf/allowduplicates.objtxt b/test/old-elf/allowduplicates.objtxt
new file mode 100644
index 000000000000..b2f263148b60
--- /dev/null
+++ b/test/old-elf/allowduplicates.objtxt
@@ -0,0 +1,41 @@
+# RUN: lld -flavor old-gnu -target x86_64 --allow-multiple-definition %s \
+# RUN: %p/Inputs/allowduplicates.objtxt \
+# RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s
+#
+# RUN: not lld -flavor old-gnu -target x86_64 %s %p/Inputs/allowduplicates.objtxt \
+# RUN: --output-filetype=yaml \
+# RUN: --noinhibit-exec 2>&1 | FileCheck -check-prefix=ERROR %s
+#
+# RUN: lld -flavor old-gnu -target x86_64 -z muldefs %s \
+# RUN: %p/Inputs/allowduplicates.objtxt \
+# RUN: --noinhibit-exec --output-filetype=yaml | FileCheck %s
+
+---
+defined-atoms:
+ - name: .text
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
+ 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+---
+
+# CHECK: defined-atoms:
+# CHECK: - name: .text
+# CHECK: alignment: 16
+# CHECK: section-choice: custom-required
+# CHECK: section-name: .text
+# CHECK: - name: main
+# CHECK: scope: global
+# CHECK: content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
+# CHECK: 00, C3 ]
+# CHECK: alignment: 16
+# CHECK: section-choice: custom-required
+# CHECK: section-name: .text
+
+# ERROR: duplicate symbol error
diff --git a/test/old-elf/archive-elf-forceload.test b/test/old-elf/archive-elf-forceload.test
new file mode 100644
index 000000000000..db5ba6cdfaa2
--- /dev/null
+++ b/test/old-elf/archive-elf-forceload.test
@@ -0,0 +1,43 @@
+# Tests the functionality of archive libraries reading
+# and resolution
+# Note: The binary files would not be required once we have support to generate
+# binary archives from textual(yaml) input
+#
+# Tests generated using the source files below
+# main file
+# int main()
+# {
+# fn();
+# return 0;
+# }
+#
+# archive file
+# int fn()
+# {
+# return 0;
+# }
+#
+# int fn1()
+# {
+# return 0;
+# }
+# gcc -c main.c fn.c fn1.c
+
+RUN: lld -flavor old-gnu -target x86_64-linux -e main %p/Inputs/mainobj.x86_64 \
+RUN: --whole-archive %p/Inputs/libfnarchive.a --no-whole-archive --output-filetype=yaml \
+RUN: | FileCheck -check-prefix FORCELOAD %s
+
+FORCELOAD: defined-atoms:
+FORCELOAD: - name: fn1
+FORCELOAD: scope: global
+FORCELOAD: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, 5D, C3 ]
+FORCELOAD: - name: fn
+FORCELOAD: scope: global
+FORCELOAD: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, 5D, C3 ]
+FORCELOAD: absolute-atoms:
+FORCELOAD: - name: main.c
+FORCELOAD: value: 0x0
+FORCELOAD: - name: fn1.c
+FORCELOAD: value: 0x0
+FORCELOAD: - name: fn.c
+FORCELOAD: value: 0x0
diff --git a/test/old-elf/archive-elf.test b/test/old-elf/archive-elf.test
new file mode 100644
index 000000000000..7784eb9279dc
--- /dev/null
+++ b/test/old-elf/archive-elf.test
@@ -0,0 +1,38 @@
+# Tests the functionality of archive libraries reading
+# and resolution
+# Note: The binary files would not be required once we have support to generate
+# binary archives from textual(yaml) input
+#
+# Tests generated using the source files below
+# main file
+# int main()
+# {
+# fn();
+# return 0;
+# }
+#
+# archive file
+# int fn()
+# {
+# return 0;
+# }
+#
+# int fn1()
+# {
+# return 0;
+# }
+# gcc -c main.c fn.c fn1.c
+
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml -r \
+RUN: %p/Inputs/mainobj.x86_64 %p/Inputs/libfnarchive.a | \
+RUN: FileCheck -check-prefix NOFORCELOAD %s
+
+NOFORCELOAD: defined-atoms:
+NOFORCELOAD: - name: fn
+NOFORCELOAD: scope: global
+NOFORCELOAD: content: [ 55, 48, 89, E5, B8, 00, 00, 00, 00, 5D, C3 ]
+NOFORCELOAD: absolute-atoms:
+NOFORCELOAD: - name: main.c
+NOFORCELOAD: value: 0x0
+NOFORCELOAD: - name: fn.c
+NOFORCELOAD: value: 0x0
diff --git a/test/old-elf/as-needed.test b/test/old-elf/as-needed.test
new file mode 100644
index 000000000000..bcebfbac2f24
--- /dev/null
+++ b/test/old-elf/as-needed.test
@@ -0,0 +1,15 @@
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \
+RUN: --as-needed %p/Inputs/shared.so-x86-64 %p/Inputs/libifunc.x86-64.so \
+RUN: -o %t1 -e main --allow-shlib-undefined
+RUN: llvm-readobj -dynamic-table %t1 | FileCheck %s -check-prefix AS_NEEDED
+
+AS_NEEDED: NEEDED SharedLibrary (shared.so-x86-64)
+AS_NEEDED-NOT: NEEDED SharedLibrary (libifunc.x86-64.so)
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 %p/Inputs/libifunc.x86-64.so \
+RUN: -o %t2 -e main --allow-shlib-undefined
+RUN: llvm-readobj -dynamic-table %t2 | FileCheck %s -check-prefix NO_AS_NEEDED
+
+NO_AS_NEEDED: NEEDED SharedLibrary (shared.so-x86-64)
+NO_AS_NEEDED: NEEDED SharedLibrary (libifunc.x86-64.so)
diff --git a/test/old-elf/branch.test b/test/old-elf/branch.test
new file mode 100644
index 000000000000..116fd0f07c5e
--- /dev/null
+++ b/test/old-elf/branch.test
@@ -0,0 +1,34 @@
+RUN: lld -flavor old-gnu -target hexagon -static --output-filetype=yaml \
+RUN: %p/Inputs/branch-test.hexagon %p/Inputs/target-test.hexagon --noinhibit-exec | FileCheck %s -check-prefix hexagon-yaml
+RUN: lld -flavor old-gnu -target hexagon -e target -o %t1 \
+RUN: %p/Inputs/branch-test.hexagon %p/Inputs/target-test.hexagon --noinhibit-exec
+RUN: llvm-readobj -h %t1 | FileCheck -check-prefix=hexagon-readobj %s
+
+hexagon-yaml: - name: back
+hexagon-yaml: scope: global
+hexagon-yaml: content: [ 00, C0, 00, 7F, 00, C0, 00, 5A, 00, 00, 00, 00,
+hexagon-yaml: 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ]
+hexagon-yaml: references:
+hexagon-yaml: - kind:
+hexagon-yaml: offset: 4
+hexagon-yaml: target: target
+
+hexagon-yaml: - name: target
+hexagon-yaml: scope: global
+hexagon-yaml: content: [ 00, C0, 00, 5A ]
+hexagon-yaml: references:
+hexagon-yaml: - kind:
+hexagon-yaml: offset: 0
+hexagon-yaml: target: back
+
+
+hexagon-readobj: ElfHeader {
+hexagon-readobj: Ident {
+hexagon-readobj: Class: 32-bit (0x1)
+hexagon-readobj: DataEncoding: LittleEndian (0x1)
+hexagon-readobj: FileVersion: 1
+hexagon-readobj: OS/ABI: SystemV (0x0)
+hexagon-readobj: ABIVersion: 0
+hexagon-readobj: }
+hexagon-readobj: Type: Executable (0x2)
+hexagon-readobj: Machine: EM_HEXAGON (0xA4)
diff --git a/test/old-elf/check.test b/test/old-elf/check.test
new file mode 100644
index 000000000000..3fc11728e12d
--- /dev/null
+++ b/test/old-elf/check.test
@@ -0,0 +1,39 @@
+# This tests the basic functionality of ordering data and functions as they
+# appear in the inputs
+RUN: lld -flavor old-gnu -target i386 -e global_func --noinhibit-exec --output-filetype=yaml \
+RUN: %p/Inputs/object-test.elf-i386 -o %t
+RUN: FileCheck %s -check-prefix ELF-i386 < %t
+RUN: lld -flavor old-gnu -target hexagon -e global_func --noinhibit-exec --output-filetype=yaml \
+RUN: %p/Inputs/object-test.elf-hexagon -o %t1
+RUN: FileCheck %s -check-prefix ELF-hexagon < %t1
+
+ELF-i386: defined-atoms:
+ELF-i386: - name: global_func
+ELF-i386: - name: static_func
+ELF-i386: - name: weak_func
+ELF-i386: - name: hidden_func
+ELF-i386: - name: no_dead_strip
+ELF-i386: - name: no_special_section_func
+ELF-i386: - name: global_variable
+ELF-i386: - name: uninitialized_static_variable
+ELF-i386: - name: special_section_func
+ELF-i386: undefined-atoms:
+ELF-i386: - name: puts
+ELF-i386: absolute-atoms:
+ELF-i386: - name: sample.c
+
+ELF-hexagon: - name: global_func
+ELF-hexagon: - name: static_func
+ELF-hexagon: - name: weak_func
+ELF-hexagon: - name: hidden_func
+ELF-hexagon: - name: no_dead_strip
+ELF-hexagon: - name: no_special_section_func
+ELF-hexagon: - name: global_variable
+ELF-hexagon: - name: uninitialized_static_variable
+ELF-hexagon: - name: special_section_func
+ELF-hexagon: undefined-atoms:
+ELF-hexagon: - name: puts
+ELF-hexagon: absolute-atoms:
+ELF-hexagon: - name: sample.c
+ELF-hexagon: scope: static
+ELF-hexagon: value: 0x0000000000000000
diff --git a/test/old-elf/checkrodata.test b/test/old-elf/checkrodata.test
new file mode 100644
index 000000000000..71304a443b8b
--- /dev/null
+++ b/test/old-elf/checkrodata.test
@@ -0,0 +1,9 @@
+
+RUN: lld -flavor old-gnu -target i386 -o %t1 %p/Inputs/rodata-test.i386 --noinhibit-exec
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix=i386 %s
+RUN: lld -flavor old-gnu -target hexagon -o %t2 %p/Inputs/rodata-test.hexagon --noinhibit-exec
+RUN: llvm-objdump -section-headers %t2 | FileCheck -check-prefix=hexagon %s
+
+i386: .rodata 00000004 0000000000000114 DATA
+
+hexagon: .rodata 00000004 0000000000000114 DATA
diff --git a/test/old-elf/common.test b/test/old-elf/common.test
new file mode 100644
index 000000000000..e337ac399140
--- /dev/null
+++ b/test/old-elf/common.test
@@ -0,0 +1,10 @@
+RUN: lld -flavor old-gnu -target x86_64-linux -o %t %p/Inputs/relocs.x86-64 \
+RUN: -e _start -static
+RUN: llvm-readobj -t %t | FileCheck %s
+
+CHECK: Symbol {
+CHECK: Name: i
+CHECK-NEXT: Value:
+CHECK-NEXT: Size:
+CHECK-NEXT: Binding:
+CHECK-NEXT: Type: Object
diff --git a/test/old-elf/consecutive-weak-sym-defs.test b/test/old-elf/consecutive-weak-sym-defs.test
new file mode 100644
index 000000000000..0120aa126551
--- /dev/null
+++ b/test/old-elf/consecutive-weak-sym-defs.test
@@ -0,0 +1,81 @@
+#Tests that multiple consecutive weak symbol definitions do not confuse the
+#ELF reader. For example:
+#
+# my_weak_func1:
+# my_weak_func2:
+# my_weak_func3:
+# code
+#
+#If my_weak_func2 is merged to other definition, this should not disturb the
+#definition my_weak_func1 to "code".
+#
+#
+#RUN: yaml2obj -format=elf %p/Inputs/consecutive-weak-defs.o.yaml -o=%t1.o
+#RUN: yaml2obj -format=elf %p/Inputs/main-with-global-def.o.yaml -o=%t2.o
+#RUN: lld -flavor old-gnu -target x86_64 %t1.o %t2.o -e=main -o %t1
+#RUN: obj2yaml %t1 | FileCheck -check-prefix CHECKLAYOUT %s
+#
+# Check that the layout has not been changed:
+#
+#CHECKLAYOUT: Name: .text
+#CHECKLAYOUT-NEXT: Type:
+#CHECKLAYOUT-NEXT: Flags:
+#CHECKLAYOUT-NEXT: Address:
+#CHECKLAYOUT-NEXT: AddressAlign:
+#CHECKLAYOUT-NEXT: Content: 554889E5E8020000005DC3554889E5B8640000005DC3
+# ^~~> my_func ^~~> my_weak_func
+#
+#
+#
+#Our two input files were produced by the following code:
+#
+#Inputs/consecutive-weak-defs.o.yaml (this one is in assembly to allow us to
+# easily define multiple labels)
+#
+# .text
+# .globl my_func
+# .type my_func,@function
+# my_func:
+# pushq %rbp
+# movq %rsp, %rbp
+# callq my_weak_func
+# popq %rbp
+# retq
+# .Ltmp0:
+# .size my_func, .Ltmp0-my_func
+#
+# .text
+# .weak my_weak_func
+# .type my_weak_func,@function
+# .weak my_weak_func2
+# .type my_weak_func2,@function
+# .weak my_weak_func3
+# .type my_weak_func3,@function
+# my_weak_func:
+# my_weak_func2:
+# my_weak_func3:
+# pushq %rbp
+# movq %rsp, %rbp
+# movl $100, %eax
+# popq %rbp
+# retq
+# .Ltmp1:
+# .size my_weak_func, .Ltmp1-my_weak_func
+# .size my_weak_func2, .Ltmp1-my_weak_func2
+# .size my_weak_func3, .Ltmp1-my_weak_func3
+#
+#Inputs/main-with-global-def.o.yaml:
+#
+# int my_func();
+#
+# int my_weak_func2() {
+# return 200;
+# }
+#
+# int main() {
+# return my_func();
+# }
+#
+#-------------------------------------------------------------------------------
+# The net effect is that this program should return 100.
+
diff --git a/test/old-elf/defsym.objtxt b/test/old-elf/defsym.objtxt
new file mode 100644
index 000000000000..7fdc20d4dd93
--- /dev/null
+++ b/test/old-elf/defsym.objtxt
@@ -0,0 +1,31 @@
+# RUN: lld -flavor old-gnu -target x86_64 --defsym=foo=0x1234 -r %s \
+# RUN: --output-filetype=yaml | FileCheck -check-prefix=ABS %s
+
+# RUN: lld -flavor old-gnu -target x86_64 --defsym=foo=main -r %s \
+# RUN: --output-filetype=yaml | FileCheck -check-prefix=ALIAS %s
+
+# RUN: lld -flavor old-gnu -target x86_64 --defsym foo=main -r %s \
+# RUN: --output-filetype=yaml | FileCheck -check-prefix=ALIAS %s
+
+defined-atoms:
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+
+# ABS: absolute-atoms:
+# ABS: - name: foo
+# ABS: scope: global
+# ABS: value: 0x0000000000001234
+
+# ALIAS: defined-atoms:
+# ALIAS: - name: foo
+# ALIAS: scope: global
+# ALIAS: section-choice: custom-required
+# ALIAS: section-name: .text
+# ALIAS: references:
+# ALIAS: - kind: layout-after
+# ALIAS: offset: 0
+# ALIAS: target: main
diff --git a/test/old-elf/discard-all.test b/test/old-elf/discard-all.test
new file mode 100644
index 000000000000..7fca435008ab
--- /dev/null
+++ b/test/old-elf/discard-all.test
@@ -0,0 +1,88 @@
+# Test that -x/--discard all works.
+#
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.o -e=main -x -o %t1
+#RUN: llvm-objdump -t %t1 | FileCheck %s
+
+#CHECK-NOT: 0000000000400210 l F .text 00000009 local
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E54883EC10C745FC00000000E81C000000B9000000008945F889C84883C4105DC36666662E0F1F840000000000554889E58B45FC5DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000002400000000410E108602430D060000001800000038000000000000000900000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 48
+Symbols:
+ Local:
+ - Name: local
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000030
+ Size: 0x0000000000000009
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000024
+...
diff --git a/test/old-elf/discard-locals.test b/test/old-elf/discard-locals.test
new file mode 100644
index 000000000000..d1a0918949ad
--- /dev/null
+++ b/test/old-elf/discard-locals.test
@@ -0,0 +1,65 @@
+# Test that -X/--discard-locals works.
+#
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.o -shared -X -o %t1
+#RUN: llvm-objdump -t %t1 | FileCheck %s
+
+#CHECK-NOT: 0000000000400121 l .rodata 00000000 .Lsym8
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: 00000000F20F100D00000000C3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .rodata.str1.1
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000008
+ Symbol: .Lsym8
+ Type: R_X86_64_PC32
+ Addend: -4
+Symbols:
+ Local:
+ - Name: .Lsym8
+ Section: .rodata.str1.1
+ - Name: test
+ Section: .text
+ Value: 0x000000000000000C
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .rodata.str1.1
+ Type: STT_SECTION
+ Section: .rodata.str1.1
+...
diff --git a/test/old-elf/dynamic-segorder.test b/test/old-elf/dynamic-segorder.test
new file mode 100644
index 000000000000..e9143d83f0f6
--- /dev/null
+++ b/test/old-elf/dynamic-segorder.test
@@ -0,0 +1,17 @@
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --allow-shlib-undefined \
+RUN: --defsym=__tls_get_addr=0
+RUN: llvm-objdump -p %t | FileCheck %s
+
+CHECK: PHDR
+CHECK: flags r-x
+CHECK: INTERP
+CHECK: flags r--
+CHECK: LOAD
+CHECK: flags r-x
+CHECK: LOAD
+CHECK: flags rw-
+CHECK: DYNAMIC
+CHECK: flags rw-
+CHECK: TLS
+CHECK: flags rw-
diff --git a/test/old-elf/dynamic-undef.test b/test/old-elf/dynamic-undef.test
new file mode 100644
index 000000000000..fc661684b19b
--- /dev/null
+++ b/test/old-elf/dynamic-undef.test
@@ -0,0 +1,38 @@
+#
+# This test creates a executable and tests the options that are used to
+# to create an executable and a shared library
+#
+# This test will fail because there are unresolved symbols from the shared
+# library and we are passing --no-allow-shlib-undefined
+RUN: not lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --no-allow-shlib-undefined 2> %t1
+RUN: FileCheck -check-prefix=EXEC %s < %t1
+# This test will pass because of --allow-shlib-undefined
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --allow-shlib-undefined \
+RUN: --defsym=__tls_get_addr=0
+# This test will pass becase --allow-shlib-undefined is the default.
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 -o %t -e main \
+RUN: --defsym=__tls_get_addr=0
+# Building shared libraries should not fail when there is a undefined symbol.
+# Test creation of shared library, this should pass because we are using
+# shared option and by default, dynamic library wouldn't create undefined atoms
+# from the input shared library
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 -o %t.usenoundefines -e main -shared
+RUN: llvm-readobj -symbols %t.usenoundefines | FileCheck %s -check-prefix=SHLIB-NOUNDEF
+# Test creation of shared library, this should fail because we are using
+# shared option setting the options to use the shared library undefines to
+# create undefined atoms from the input shared library
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 -o %t.useundefines -e main -shared \
+RUN: --use-shlib-undefines --no-allow-shlib-undefined 2> %t2
+RUN: llvm-readobj -symbols %t.useundefines | FileCheck -check-prefix=SHLIB-UNDEF-SYMBOLS %s
+
+EXEC: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: puts
+SHLIB: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: puts
+EXEC-NOT: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: weakfoo
+SHLIB-NOT: Undefined symbol: {{.+[\\/]}}shared.so-x86-64: weakfoo
+SHLIB-NOUNDEF-NOT: Name: puts
+SHLIB-UNDEF-SYMBOLS: Name: puts
diff --git a/test/old-elf/dynamic.test b/test/old-elf/dynamic.test
new file mode 100644
index 000000000000..2b548a7aaf5e
--- /dev/null
+++ b/test/old-elf/dynamic.test
@@ -0,0 +1,80 @@
+# Checks functionality of dynamic executables
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 -o %t -e main --allow-shlib-undefined \
+RUN: -rpath /l1:/l2 -rpath /l3
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml -o %t2 --allow-shlib-undefined \
+RUN: --noinhibit-exec
+RUN: llvm-objdump -p %t >> %t2
+RUN: llvm-readobj -s -dyn-symbols -dynamic-table %t >> %t2
+RUN: FileCheck %s < %t2
+
+CHECK: name: main
+CHECK: kind: R_X86_64_PC32
+CHECK: offset: 18
+CHECK: target: [[PLTNAME:[-a-zA-Z0-9_]+]]
+
+CHECK: name: [[PLTNAME]]
+CHECK: type: stub
+
+CHECK: type: got
+CHECK: references:
+CHECK: kind: R_X86_64_JUMP_SLOT
+
+CHECK: shared-library-atoms:
+CHECK: name: foo
+CHECK: load-name: shared.so-x86-64
+
+CHECK: PHDR off 0x{{0+}}40
+CHECK: INTERP
+CHECK: flags r--
+
+CHECK: Section {
+CHECK: Name: .hash
+CHECK-NEXT: Type: SHT_HASH
+CHECK-NEXT: Flags [
+CHECK-NEXT: SHF_ALLOC
+CHECK-NEXT: ]
+CHECK-NEXT: Address:
+CHECK-NEXT: Offset:
+CHECK-NEXT: Size: 32
+CHECK-NEXT: Link:
+CHECK-NEXT: Info:
+CHECK-NEXT: AddressAlignment: 8
+CHECK-NEXT: EntrySize:
+CHECK-NEXT: }
+
+CHECK: DynamicSymbols [
+CHECK: Symbol {
+CHECK: Name: foo
+CHECK-NEXT: Value: 0
+CHECK-NEXT: Size:
+CHECK-NEXT: Binding: Global
+CHECK-NEXT: Type: Function
+CHECK: }
+CHECK: Symbol {
+CHECK: Name: i
+CHECK-NEXT: Value: 0
+CHECK-NEXT: Size:
+CHECK-NEXT: Binding: Global
+CHECK-NEXT: Type: Object
+CHECK: }
+
+CHECK: DynamicSection [ (15 entries)
+CHECK: Tag Type Name/Value
+CHECK: 0x0000000000000004 HASH
+CHECK: 0x0000000000000005 STRTAB
+CHECK: 0x0000000000000006 SYMTAB
+CHECK: 0x000000000000000A STRSZ
+CHECK: 0x000000000000000B SYMENT 24
+CHECK: 0x0000000000000007 RELA
+CHECK: 0x0000000000000008 RELASZ 24
+CHECK: 0x0000000000000009 RELAENT 24
+CHECK: 0x0000000000000002 PLTRELSZ 24
+CHECK: 0x0000000000000003 PLTGOT
+CHECK: 0x0000000000000014 PLTREL RELA
+CHECK: 0x0000000000000017 JMPREL
+CHECK: 0x0000000000000001 NEEDED SharedLibrary (shared.so-x86-64)
+CHECK: 0x000000000000000F RPATH /l1:/l2:/l3
+CHECK: 0x0000000000000000 NULL 0x0
+CHECK: ]
diff --git a/test/old-elf/eh_frame_hdr.test b/test/old-elf/eh_frame_hdr.test
new file mode 100644
index 000000000000..74383b8dbc5b
--- /dev/null
+++ b/test/old-elf/eh_frame_hdr.test
@@ -0,0 +1,30 @@
+#RUN: yaml2obj -format=elf %s > %t
+#RUN: lld -flavor old-gnu -target x86_64-linux %t --noinhibit-exec \
+#RUN: -o %t1
+#RUN: llvm-objdump -s %t1 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+- Name: .eh_frame
+ Type: SHT_PROGBITS
+ Content: "00"
+ AddressAlign: 8
+ Flags: [SHF_ALLOC]
+
+Symbols:
+ Local:
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+
+# CHECK: Contents of section .eh_frame:
+# CHECK-NEXT: 4001e0 00
+# CHECK-NEXT: Contents of section .eh_frame_hdr:
+# CHECK-NEXT: 4001e8 011bffff f4ffffff
+# ^ 0x4001e0 - 0x4001e8 - 4 = 0xfffffff4
diff --git a/test/old-elf/entry.objtxt b/test/old-elf/entry.objtxt
new file mode 100644
index 000000000000..6590d139c417
--- /dev/null
+++ b/test/old-elf/entry.objtxt
@@ -0,0 +1,58 @@
+# Tests entry point handling
+#
+# Test generated using the source file below:
+#
+# int main()
+# {
+# return 0;
+# }
+#
+
+# RUN: lld -flavor old-gnu -target x86_64 %s -e _entrypoint --noinhibit-exec -o %t1
+# RUN: llvm-nm -n %t1 | FileCheck %s
+#
+# CHECK: U _entrypoint
+# CHECK: 004001e0 T main
+# CHECK: 00401000 D _DYNAMIC
+# CHECK: 00401060 A _end
+# CHECK: 00401060 A end
+
+defined-atoms:
+ - name: .text
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
+ 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+ - name: .data
+ type: data
+ alignment: 4
+ section-choice: custom-required
+ section-name: .data
+ - name: .bss
+ type: zero-fill
+ alignment: 4
+ section-choice: custom-required
+ section-name: .bss
+ - name: .note.GNU-stack
+ section-choice: custom-required
+ section-name: .note.GNU-stack
+ permissions: r--
+ - name: .eh_frame
+ content: [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00,
+ 01, 78, 10, 01, 1B, 0C, 07, 08, 90, 01, 00, 00,
+ 14, 00, 00, 00, 1C, 00, 00, 00, 00, 00, 00, 00,
+ 0E, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 ]
+ alignment: 8
+ section-choice: custom-required
+ section-name: .eh_frame
+ permissions: r--
+ references:
+ - kind: R_X86_64_PC32
+ offset: 32
+ target: .text
diff --git a/test/old-elf/export-dynamic.test b/test/old-elf/export-dynamic.test
new file mode 100644
index 000000000000..b88961597ea0
--- /dev/null
+++ b/test/old-elf/export-dynamic.test
@@ -0,0 +1,98 @@
+# Tests the --export-dynamic (-E) flag. When creating a dynamic executable and
+# receiving this flag, the linker should export all globally visible symbols in
+# its dynamic symbol table.
+
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor old-gnu -target x86_64 -E %t.o -e=main -o %t1
+#RUN: llvm-readobj -dt %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+#CHECKSYMS: myfunc1@
+#CHECKSYMS: main@
+#CHECKSYMS: myvar1@
+
+# The object file below was generated with the following code:
+#
+# (command line clang -c prog.c -o prog.o)
+#
+# int myvar1 = 22;
+#
+# static int mysecretvar = 11;
+#
+# int myfunc1() {
+# return 23;
+# }
+#
+# static int mysecretfunc() {
+# return 42;
+# }
+#
+# int main() {
+# return mysecretfunc() + mysecretvar;
+# }
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5B8170000005DC30F1F440000554889E54883EC10C745FC00000000E81C000000030425000000004883C4105DC36666666666662E0F1F840000000000554889E5B82A0000005DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000027
+ Symbol: .data
+ Type: R_X86_64_32S
+ Addend: 4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: 160000000B000000
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: mysecretfunc
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000040
+ Size: 0x000000000000000B
+ - Name: mysecretvar
+ Type: STT_OBJECT
+ Section: .data
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000010
+ Size: 0x0000000000000021
+ - Name: myfunc1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000000B
+ - Name: myvar1
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x0000000000000004
diff --git a/test/old-elf/filenotfound.test b/test/old-elf/filenotfound.test
new file mode 100644
index 000000000000..5020e9cf9b74
--- /dev/null
+++ b/test/old-elf/filenotfound.test
@@ -0,0 +1,3 @@
+# Check that a file that cannot be found results in a proper error message
+RUN: not lld -flavor old-gnu -target x86_64 %p/Inputs/nofile.o 2>&1 | FileCheck %s
+#CHECK: lld: cannot find file {{.+[\\/]}}nofile.o
diff --git a/test/old-elf/gnulinkonce/gnulinkonce-report-discarded-reference.test b/test/old-elf/gnulinkonce/gnulinkonce-report-discarded-reference.test
new file mode 100644
index 000000000000..c05a06fab32b
--- /dev/null
+++ b/test/old-elf/gnulinkonce/gnulinkonce-report-discarded-reference.test
@@ -0,0 +1,145 @@
+# Tests that the linker is able to read .gnu.linkonce sections and link them
+# appropriately. The testcase has been created by using the following source
+# code.
+# TODO: This test should produce a discarded reference error message which it
+# does not currently.
+# linkoncea.s
+# .section .gnu.linkonce.d.dummy,"aw"
+#bar:
+# .long 0
+# linkonceb.s
+# .section .gnu.linkonce.d.dummy,"aw"
+#foo:
+# .long 0
+# .section .blah, "aw"
+# .long foo
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.linkonce1a.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.linkonce1b.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \
+#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml
+#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \
+#RUN: --noinhibit-exec -o %t2.out
+#RUN: FileCheck %s -check-prefix=CHECKGNULINKONCE < %t2.out.yaml
+#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGNULINKONCESECTIONS
+#CHECKGNULINKONCE: - name: .gnu.linkonce.d.dummy
+#CHECKGNULINKONCE: scope: global
+#CHECKGNULINKONCE: type: gnu-linkonce
+#CHECKGNULINKONCE: section-choice: custom-required
+#CHECKGNULINKONCE: section-name: .gnu.linkonce.d.dummy
+#CHECKGNULINKONCE: permissions: rw-
+#CHECKGNULINKONCE: references:
+#CHECKGNULINKONCE: - kind: group-child
+#CHECKGNULINKONCE: offset: 0
+#CHECKGNULINKONCE: target: bar
+#CHECKGNULINKONCESECTIONS: Section {
+#CHECKGNULINKONCESECTIONS: Name: .gnu.linkonce.d.dummy
+#CHECKGNULINKONCESECTIONS: Type: SHT_PROGBITS
+#CHECKGNULINKONCESECTIONS: Flags [ (0x3)
+#CHECKGNULINKONCESECTIONS: SHF_ALLOC (0x2)
+#CHECKGNULINKONCESECTIONS: SHF_WRITE (0x1)
+#CHECKGNULINKONCESECTIONS: ]
+#CHECKGNULINKONCESECTIONS: Size: 4
+#CHECKGNULINKONCESECTIONS: }
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .gnu.linkonce.d.dummy
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .gnu.linkonce.d.dummy
+ Type: STT_SECTION
+ Section: .gnu.linkonce.d.dummy
+ - Name: bar
+ Section: .gnu.linkonce.d.dummy
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .gnu.linkonce.d.dummy
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+ - Name: .blah
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+ - Name: .rela.blah
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .blah
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: foo
+ Type: R_X86_64_32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .gnu.linkonce.d.dummy
+ Type: STT_SECTION
+ Section: .gnu.linkonce.d.dummy
+ - Name: foo
+ Section: .gnu.linkonce.d.dummy
+ - Name: .blah
+ Type: STT_SECTION
+ Section: .blah
+...
diff --git a/test/old-elf/gnulinkonce/gnulinkonce-report-undef.test b/test/old-elf/gnulinkonce/gnulinkonce-report-undef.test
new file mode 100644
index 000000000000..f91123f0efad
--- /dev/null
+++ b/test/old-elf/gnulinkonce/gnulinkonce-report-undef.test
@@ -0,0 +1,127 @@
+# Tests that the linker is able to read .gnu.linkonce sections and link them
+# appropriately. The testcase has been created by using the following source
+# code. This test checks that the linker produces an undefined error.
+# linkoncea.s
+# .section .gnu.linkonce.d.dummy,"aw"
+#bar:
+# .long 0
+# linkonceb.s
+# .section .gnu.linkonce.d.dummy,"aw"
+# .global foo
+#foo:
+# .long 0
+# .section .blah, "aw"
+# .long foo
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.linkonce1a.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.linkonce1b.o
+#RUN: not lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \
+#RUN: --output-filetype=yaml -o %t2.out.yaml 2>&1 | FileCheck \
+#RUN: -check-prefix=UNDEFS %s
+#RUN: not lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \
+#RUN: -o %t2.out 2>&1 | FileCheck -check-prefix=UNDEFS %s
+#UNDEFS: Undefined symbol: {{.*}} foo
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .gnu.linkonce.d.dummy
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .gnu.linkonce.d.dummy
+ Type: STT_SECTION
+ Section: .gnu.linkonce.d.dummy
+ - Name: bar
+ Section: .gnu.linkonce.d.dummy
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .gnu.linkonce.d.dummy
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+ - Name: .blah
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+ - Name: .rela.blah
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .blah
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: foo
+ Type: R_X86_64_32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .gnu.linkonce.d.dummy
+ Type: STT_SECTION
+ Section: .gnu.linkonce.d.dummy
+ - Name: .blah
+ Type: STT_SECTION
+ Section: .blah
+ Global:
+ - Name: foo
+ Section: .gnu.linkonce.d.dummy
+...
diff --git a/test/old-elf/gnulinkonce/gnulinkonce.test b/test/old-elf/gnulinkonce/gnulinkonce.test
new file mode 100644
index 000000000000..eacd41d6ded5
--- /dev/null
+++ b/test/old-elf/gnulinkonce/gnulinkonce.test
@@ -0,0 +1,149 @@
+# Tests that the linker is able to read .gnu.linkonce sections and link them
+# appropriately. The testcase has been created by using the following source
+# code
+# linkonce1a.s
+# ------------
+# .section .gnu.linkonce.d.dummy,"aw"
+#bar:
+# .long 0
+# linkonce1b.s
+# ------------
+# .globl main
+# .globl start
+# .globl _start
+# .globl __start
+# .text
+#main:
+#start:
+#_start:
+#__start:
+# .long 0
+#
+# .section .gnu.linkonce.d.dummy,"aw"
+#foo:
+# .long 0
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.linkonce1a.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.linkonce1b.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \
+#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml
+#RUN: lld -flavor old-gnu -target x86_64 %t.linkonce1a.o %t.linkonce1b.o \
+#RUN: --noinhibit-exec -o %t2.out
+#RUN: FileCheck %s -check-prefix=CHECKGNULINKONCE < %t2.out.yaml
+#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGNULINKONCESECTIONS
+#CHECKGNULINKONCE: - name: .gnu.linkonce.d.dummy
+#CHECKGNULINKONCE: scope: global
+#CHECKGNULINKONCE: type: gnu-linkonce
+#CHECKGNULINKONCE: section-choice: custom-required
+#CHECKGNULINKONCE: section-name: .gnu.linkonce.d.dummy
+#CHECKGNULINKONCE: permissions: rw-
+#CHECKGNULINKONCE: references:
+#CHECKGNULINKONCE: - kind: group-child
+#CHECKGNULINKONCE: offset: 0
+#CHECKGNULINKONCE: target: bar
+#CHECKGNULINKONCE: - kind: group-child
+#CHECKGNULINKONCE: offset: 0
+#CHECKGNULINKONCESECTIONS: Section {
+#CHECKGNULINKONCESECTIONS: Name: .gnu.linkonce.d.dummy
+#CHECKGNULINKONCESECTIONS: Type: SHT_PROGBITS
+#CHECKGNULINKONCESECTIONS: Flags [ (0x3)
+#CHECKGNULINKONCESECTIONS: SHF_ALLOC (0x2)
+#CHECKGNULINKONCESECTIONS: SHF_WRITE (0x1)
+#CHECKGNULINKONCESECTIONS: ]
+#CHECKGNULINKONCESECTIONS: Size: 4
+#CHECKGNULINKONCESECTIONS: }
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .gnu.linkonce.d.dummy
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+Symbols:
+ Local:
+ - Name: bar
+ Section: .gnu.linkonce.d.dummy
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .gnu.linkonce.d.dummy
+ Type: STT_SECTION
+ Section: .gnu.linkonce.d.dummy
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: '00000000'
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .gnu.linkonce.d.dummy
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: '00000000'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .gnu.linkonce.d.dummy
+ Type: STT_SECTION
+ Section: .gnu.linkonce.d.dummy
+ - Name: foo
+ Section: .gnu.linkonce.d.dummy
+ Global:
+ - Name: main
+ Section: .text
+ - Name: start
+ Section: .text
+ - Name: _start
+ Section: .text
+ - Name: __start
+ Section: .text
+...
diff --git a/test/old-elf/gotpcrel.test b/test/old-elf/gotpcrel.test
new file mode 100644
index 000000000000..b8695f1aedfb
--- /dev/null
+++ b/test/old-elf/gotpcrel.test
@@ -0,0 +1,21 @@
+# This test checks that GOTPCREL entries are being handled properly
+RUN: lld -flavor old-gnu -target x86_64-linux -static -e main --output-filetype=yaml \
+RUN: --noinhibit-exec %p/Inputs/gotpcrel.x86-64 \
+RUN: | FileCheck %s -check-prefix=YAML
+
+YAML: name: main
+YAML: references:
+YAML: kind: R_X86_64_GOTPCREL
+YAML: offset: 3
+YAML: target: [[NULLGOT:[a-zA-Z0-9_]+]]
+YAML: kind: R_X86_64_GOTPCREL
+YAML: offset: 10
+YAML: target: [[MAINGOT:[a-zA-Z0-9_]+]]
+
+YAML: name: [[NULLGOT]]
+YAML: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+YAML-NOT: references:
+
+YAML: name: [[MAINGOT]]
+YAML: kind: R_X86_64_64
+YAML: target: main
diff --git a/test/old-elf/gottpoff.test b/test/old-elf/gottpoff.test
new file mode 100644
index 000000000000..969874e538a5
--- /dev/null
+++ b/test/old-elf/gottpoff.test
@@ -0,0 +1,119 @@
+# Test that GOTTPOFF reloc generates an outstanding R_X86_64_TPOFF64
+# to be processed at startup time.
+# Reference: Ulrich Drepper's "ELF Handling for Thread-Local storage"
+
+#RUN: yaml2obj -format=elf %s -o %t.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t -e=main --defsym=__tls_get_addr=0
+#RUN: llvm-readobj -r %t | FileCheck %s
+#
+#CHECK: Section (5) .rela.dyn {
+#CHECK: 0x401098 R_X86_64_TPOFF64 tls2 0x0
+#CHECK: }
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: E819000000640304250000000064030425000000006403042500000000C3488B0500000000648B00C3488D3D00000000E800000000488D8000000000C3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000009
+ Symbol: tls1
+ Type: R_X86_64_TPOFF32
+ - Offset: 0x0000000000000011
+ Symbol: tls0
+ Type: R_X86_64_TPOFF32
+ - Offset: 0x0000000000000019
+ Symbol: tls2
+ Type: R_X86_64_TPOFF32
+ - Offset: 0x0000000000000021
+ Symbol: tls2
+ Type: R_X86_64_GOTTPOFF
+ Addend: -4
+ - Offset: 0x000000000000002C
+ Symbol: tls0
+ Type: R_X86_64_TLSLD
+ Addend: -4
+ - Offset: 0x0000000000000031
+ Symbol: __tls_get_addr
+ Type: R_X86_64_PLT32
+ Addend: -4
+ - Offset: 0x0000000000000038
+ Symbol: tls0
+ Type: R_X86_64_DTPOFF32
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 8
+ - Name: .tbss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Content: '01000000'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .tbss
+ Type: STT_SECTION
+ Section: .tbss
+ - Name: .tdata
+ Type: STT_SECTION
+ Section: .tdata
+ Global:
+ - Name: GOTTPOFF
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x000000000000001E
+ - Name: TLSLD
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000029
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ - Name: tls0
+ Type: STT_TLS
+ Section: .tbss
+ Size: 0x0000000000000004
+ - Name: tls1
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: tls2
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x0000000000000004
+ - Name: _GLOBAL_OFFSET_TABLE_
+ - Name: __tls_get_addr
+...
diff --git a/test/old-elf/group-cmd-search.test b/test/old-elf/group-cmd-search.test
new file mode 100644
index 000000000000..1d7f5ee43367
--- /dev/null
+++ b/test/old-elf/group-cmd-search.test
@@ -0,0 +1,134 @@
+/*
+ XFAIL: win32
+
+ This test does not pass on Windows because a path starting with
+ "/" is not considered as an absolute path. (It needs a drive
+ letter.)
+*/
+
+/*
+ In general the linker scripts's GROUP command works like a pair
+ of command line options --start-group/--end-group. But there is
+ a difference in the files look up algorithm.
+
+ The --start-group/--end-group commands use a trivial approach:
+ a) If the path has '-l' prefix, add 'lib' prefix and '.a'/'.so'
+ suffix and search the path through library search directories.
+ b) Otherwise, use the path 'as-is'.
+
+ The GROUP command implements more compicated approach:
+ a) If the path has '-l' prefix, add 'lib' prefix and '.a'/'.so'
+ suffix and search the path through library search directories.
+ b) If the path does not have '-l' prefix, and sysroot is configured,
+ and the path starts with the / character, and the script being
+ processed is located inside the sysroot, search the path under
+ the sysroot. Otherwise, try to open the path in the current
+ directory. If it is not found, search through library search
+ directories.
+*/
+
+/*
+ This link should finish successfully. The --start-group/--end-group
+ contains an existing absolute path to the file.
+
+RUN: lld -flavor old-gnu -target x86_64 -shared \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: --start-group %p/Inputs/shared.so-x86-64 --end-group -o %t1
+*/
+
+/*
+ This link should fail with unknown input file format error.
+ There is no shared.so-x86-64 file in the current directory.
+
+RUN: not \
+RUN: lld -flavor old-gnu -target x86_64 -shared \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: --start-group shared.so-x86-64 --end-group -o %t2
+*/
+
+/*
+ This link should fail with unknown input file format error.
+ The absolute path /shared.so-x86-64 does not exist and the linker
+ should not attempt to search it under the sysroot directory.
+
+RUN: not \
+RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: --start-group /shared.so-x86-64 --end-group -o %t3
+*/
+
+/*
+ This link should finish successfully. The group-cmd-search-1.ls
+ script contains "GROUP ( shared.so-x86-64 )" command and the linker
+ has to search shared.so-x86-64 through the library search paths.
+
+RUN: lld -flavor old-gnu -target x86_64 -shared \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/group-cmd-search-1.ls -o %t4
+*/
+
+/*
+ This link should fail with unknown input file format error.
+ The group-cmd-search-2.ls script contains GROUP command with
+ a non-existing absolute path but there is no --sysroot argument.
+
+RUN: not \
+RUN: lld -flavor old-gnu -target x86_64 -shared \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/group-cmd-search-2.ls -o %t5
+*/
+
+/*
+ This link should finish successfully. The group-cmd-search-2.ls
+ script contains GROUP command with an absolute path and the sysroot
+ directory is provided. The linker has to search the absolute path
+ under the sysroot directory.
+
+RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/group-cmd-search-2.ls -o %t6
+*/
+
+/*
+ This link should finish successfully. The group-cmd-search-2.ls
+ script contains GROUP command with an absolute path and the sysroot
+ directory is provided. The linker has to search the absolute path
+ under the sysroot directory.
+
+RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs/../Inputs \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/group-cmd-search-2.ls -o %t6
+*/
+
+/*
+ This link should finish successfully. The group-cmd-search-3.ls
+ script contains GROUP command with two elements. The first one
+ has a -l:<path> form and should be found by iterating through
+ lib dirs and searching the 'path' name exactly. The second element
+ has a -l<lib name> form and should be found by constructing a full
+ library name lib<lib name>.a and iterating through lib dirs.
+
+RUN: lld -flavor old-gnu -target x86_64 -shared \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/group-cmd-search-3.ls -o %t8
+*/
+
+/*
+ This link should fail with unknown input file format error.
+ The linker script from this file contains GROUP with an absolute
+ path which can be found under provided sysroot directory.
+ But the linker script itself is not under the sysroot.
+
+RUN: not \
+RUN: lld -flavor old-gnu -target x86_64 -shared --sysroot=%p/Inputs \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: %s -o %t7
+*/
+
+/*
+RUN: lld -flavor old-gnu -target x86_64 -shared \
+RUN: -L%p/Inputs %p/Inputs/use-shared.x86-64 \
+RUN: -l:group-cmd-search-1.ls -o %t9
+*/
+
+GROUP ( /shared.so-x86-64 )
diff --git a/test/old-elf/hexagon-quickdata-sort.test b/test/old-elf/hexagon-quickdata-sort.test
new file mode 100644
index 000000000000..98488b75ceb7
--- /dev/null
+++ b/test/old-elf/hexagon-quickdata-sort.test
@@ -0,0 +1,12 @@
+RUN: lld -flavor old-gnu -target hexagon %p/Inputs/quickdata-sort-test.o.elf-hexagon -o %t1 --noinhibit-exec
+RUN: llvm-nm -n %t1 | FileCheck %s -check-prefix=quickdataSort
+
+quickdataSort: 00002000 D A1
+quickdataSort: 00002001 D AA1
+quickdataSort: 00002002 D B1
+quickdataSort: 00002004 D BB1
+quickdataSort: 00002008 D C1
+quickdataSort: 0000200c D CC1
+quickdataSort: 00002010 D D1
+quickdataSort: 00002018 D DD1
+
diff --git a/test/old-elf/hexagon-quickdata-sortcommon.test b/test/old-elf/hexagon-quickdata-sortcommon.test
new file mode 100644
index 000000000000..d4d7d6a617e6
--- /dev/null
+++ b/test/old-elf/hexagon-quickdata-sortcommon.test
@@ -0,0 +1,16 @@
+RUN: lld -flavor old-gnu -target hexagon -o %t1 --noinhibit-exec \
+RUN: %p/Inputs/quickdata-sortcommon-test.o.elf-hexagon
+RUN: llvm-nm -n %t1 | FileCheck %s -check-prefix=quickdataSortCommon
+
+quickdataSortCommon: 00002000 D A1
+quickdataSortCommon: 00002001 D AA1
+quickdataSortCommon: 00002002 D AAA1
+quickdataSortCommon: 00002004 D B1
+quickdataSortCommon: 00002006 D BB1
+quickdataSortCommon: 00002008 D BBB1
+quickdataSortCommon: 0000200c D C1
+quickdataSortCommon: 00002010 D CC1
+quickdataSortCommon: 00002014 D CCC1
+quickdataSortCommon: 00002018 D D1
+quickdataSortCommon: 00002020 D DD1
+quickdataSortCommon: 00002028 D DDD1
diff --git a/test/old-elf/ifunc.test b/test/old-elf/ifunc.test
new file mode 100644
index 000000000000..0aa317a24e6f
--- /dev/null
+++ b/test/old-elf/ifunc.test
@@ -0,0 +1,69 @@
+# REQUIRES: x86
+
+# This test checks that IRELATIVE relocations are created for symbols that
+# need relocation even for static links.
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml -r \
+RUN: %p/Inputs/ifunc.x86-64 | FileCheck %s
+
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml --noinhibit-exec \
+RUN: %p/Inputs/ifunc.x86-64 %p/Inputs/ifunc.cpp.x86-64 \
+RUN: | FileCheck %s --check-prefix=PLT
+
+RUN: lld -flavor old-gnu -target x86_64-linux -o %t %p/Inputs/ifunc.x86-64 \
+RUN: -e main -static %p/Inputs/ifunc.cpp.x86-64
+RUN: llvm-objdump -d -s %t| FileCheck %s --check-prefix=BIN
+RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELATIVEADDEND
+
+# Test that STT_GNU_IFUNC symbols have type Code in SharedLibraryAtom.
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml \
+RUN: --noinhibit-exec %p/Inputs/ifunc.cpp.x86-64 -L%p/Inputs -lifunc.x86-64 \
+RUN: | FileCheck %s --check-prefix=SHARED
+
+PLT: defined-atoms:
+
+PLT: name: plt
+PLT: scope: global
+PLT: references:
+PLT: kind: R_X86_64_PC32
+PLT: target: [[PLTNAME:[-a-zA-Z0-9_]+]]
+
+PLT: name: main
+PLT: scope: global
+PLT: references:
+PLT: kind: R_X86_64_PC32
+PLT: target: [[PLTNAME]]
+
+// Make sure the target of main's relocation is a stub with a PC32 relocation.
+// This relocation is to the got atom, but you can't really write that check in
+// FileCheck.
+PLT: name:
+PLT: type: stub
+PLT: references
+PLT: kind: R_X86_64_PC32
+
+// Make sure there's a got entry with a IRELATIVE relocation.
+PLT: type: got
+PLT: references:
+PLT: kind: R_X86_64_IRELATIVE
+PLT: target: hey
+
+CHECK: name: hey
+CHECK: scope: global
+CHECK: type: resolver
+
+
+// This is a horribly brittle test. We need a way to do arithmetic on captured
+// variables.
+BIN: {{[0-9a-f]+}}: ff 25 {{[0-9a-f]+}} {{[0-9a-f]+}} 00 00 jmpq *{{[0-9]+}}(%rip)
+BIN: .got.plt:
+BIN-NEXT: {{[0-9a-f]+}} 00000000 00000000
+
+RELATIVEADDEND: Relocations [
+RELATIVEADDEND-NEXT: Section (1) .rela.plt {
+RELATIVEADDEND-NEXT: 0x401000 R_X86_64_IRELATIVE - 0x400110
+RELATIVEADDEND-NEXT: }
+RELATIVEADDEND-NEXT: ]
+
+SHARED: shared-library-atoms
+SHARED: name: hey
+SHARED-NOT: data
diff --git a/test/old-elf/ignore-unknownoption.test b/test/old-elf/ignore-unknownoption.test
new file mode 100644
index 000000000000..aa03a2eb4e73
--- /dev/null
+++ b/test/old-elf/ignore-unknownoption.test
@@ -0,0 +1,5 @@
+# This test tests that lld is able to print unknown options that are not
+# recognized.
+RUN: not lld -flavor old-gnu -target x86_64 --gc-sections 2> %t
+RUN: FileCheck %s < %t
+CHECK: warning: ignoring unknown argument: --gc-sections
diff --git a/test/old-elf/init_array-order.test b/test/old-elf/init_array-order.test
new file mode 100644
index 000000000000..2b8bcb65c3e4
--- /dev/null
+++ b/test/old-elf/init_array-order.test
@@ -0,0 +1,67 @@
+#RUN: yaml2obj -format=elf %s > %t
+#RUN: lld -flavor old-gnu -target x86_64-linux %t --noinhibit-exec \
+#RUN: -o %t1.out
+#RUN: llvm-objdump -s %t1.out | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: "1100000000000000"
+ AddressAlign: 8
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .init_array.2
+ Type: SHT_INIT_ARRAY
+ Content: "0200000000000000"
+ AddressAlign: 8
+ Flags: [SHF_ALLOC]
+- Name: .init_array.3
+ Type: SHT_INIT_ARRAY
+ Content: "0300000000000000"
+ AddressAlign: 8
+ Flags: [SHF_ALLOC]
+- Name: .init_array
+ Type: SHT_INIT_ARRAY
+ Content: "9900000000000000"
+ AddressAlign: 8
+ Flags: [SHF_ALLOC]
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: "2200000000000000"
+ AddressAlign: 8
+ Flags: [SHF_ALLOC, SHF_WRITE]
+- Name: .init_array.1
+ Type: SHT_INIT_ARRAY
+ Content: "0100000000000000"
+ AddressAlign: 8
+ Flags: [SHF_ALLOC]
+
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .init_array.3
+ Type: STT_SECTION
+ Section: .init_array.3
+ - Name: .init_array.2
+ Type: STT_SECTION
+ Section: .init_array.2
+ - Name: .init_array.1
+ Type: STT_SECTION
+ Section: .init_array.1
+ - Name: .init_array
+ Type: STT_SECTION
+ Section: .init_array
+
+#CHECK: {{[0xa-f0-9]+}} 01000000 00000000 02000000 00000000
+#CHECK: {{[0xa-f0-9]+}} 03000000 00000000 99000000 00000000
diff --git a/test/old-elf/init_array.test b/test/old-elf/init_array.test
new file mode 100644
index 000000000000..f7f48445621e
--- /dev/null
+++ b/test/old-elf/init_array.test
@@ -0,0 +1,127 @@
+# Test .init_array.
+# Generated from the following C code:
+#
+# static void
+# init () {}
+#
+# static void (*const init_array []) ()
+# __attribute__ ((used, section (".init_array"), aligned (sizeof (void *))))
+# = { init };
+#
+# int
+# main() { return (0); }
+#
+# Note: both STT_OBJECT and STT_SECTION for .init_array are commented in yaml
+# declaration to check if lld correct adds the object's .init_array when the
+# section has no symbol (some compilers may create object with this behavior,
+# specially for C++ global constructors).
+
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.o -o %t -e=main
+#RUN: llvm-objdump -t -section-headers %t | FileCheck %s
+
+#CHECK: .init_array {{[0-9]+}} [[ADDR:[0-9]+]]
+#CHECK: [[ADDR]] l *ABS* {{[0-9]+}} .hidden __init_array_start
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5B800000000C745FC000000005DC366666666662E0F1F840000000000554889E55DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .init_array
+ Type: SHT_INIT_ARRAY
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: '0000000000000000'
+ - Name: .rela.init_array
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .init_array
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: .text
+ Type: R_X86_64_64
+ Addend: 32
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000001200000000410E108602430D060000001800000038000000000000000600000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 32
+Symbols:
+ Local:
+ - Name: init
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+ Size: 0x0000000000000006
+# - Name: init_array
+# Type: STT_OBJECT
+# Section: .init_array
+# Size: 0x0000000000000008
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+# - Name: .init_array
+# Type: STT_SECTION
+# Section: .init_array
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000012
+...
diff --git a/test/old-elf/initfini-options.test-1.test b/test/old-elf/initfini-options.test-1.test
new file mode 100644
index 000000000000..f8571a637197
--- /dev/null
+++ b/test/old-elf/initfini-options.test-1.test
@@ -0,0 +1,33 @@
+# Check that if there are no -init/-fini options and _init/_fini symbols
+# are undefined the linker does not emit DT_INIT/DT_FINI tags.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target x86_64 -shared --noinhibit-exec -o %t.so %t.o
+# RUN: llvm-readobj -dynamic-table %t.so | FileCheck %s
+
+# CHECK-NOT: 0x000000000000000C INIT 0x{{[0-9A-F]+}}
+# CHECK-NOT: 0x000000000000000D FINI 0x{{[0-9A-F]+}}
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x08
+
+Symbols:
+ Global:
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x08
+ - Name: _init
+ - Name: _fini
+...
diff --git a/test/old-elf/initfini-options.test-2.test b/test/old-elf/initfini-options.test-2.test
new file mode 100644
index 000000000000..35361c76d973
--- /dev/null
+++ b/test/old-elf/initfini-options.test-2.test
@@ -0,0 +1,47 @@
+# Check that if _init/_fini symbols are defined the linker emits
+# DT_INIT/DT_FINI tags point to these symbols.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.so %t.o
+# RUN: llvm-readobj -symbols -dynamic-table %t.so | FileCheck %s
+
+# CHECK: Name: _init (8)
+# CHECK-NEXT: Value: {{[0x0-9a-f]+}}
+# CHECK: Name: _fini (14)
+# CHECK-NEXT: Value: {{[0x0-9a-f]+}}
+#
+# CHECK: 0x000000000000000C INIT {{[0x0-9a-f]+}}
+# CHECK: 0x000000000000000D FINI {{[0x0-9a-f]+}}
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x18
+
+Symbols:
+ Global:
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0
+ Size: 0x8
+ - Name: _init
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x8
+ Size: 0x8
+ - Name: _fini
+ Type: STT_FUNC
+ Section: .text
+ Value: 0xF
+ Size: 0x8
+...
diff --git a/test/old-elf/initfini-options.test-3.test b/test/old-elf/initfini-options.test-3.test
new file mode 100644
index 000000000000..2c9ab3cceb94
--- /dev/null
+++ b/test/old-elf/initfini-options.test-3.test
@@ -0,0 +1,53 @@
+# Check that -init/-fini command line options override default function names
+# and the linker uses these name to search symbols and setup DT_INIT/DT_FINI.
+
+# RUN: yaml2obj -format=elf %s > %t.o
+# RUN: lld -flavor old-gnu -target x86_64 -shared -o %t.so %t.o \
+# RUN: -init _init -init _start -fini _fini -fini _stop
+# RUN: llvm-readobj -symbols -dynamic-table %t.so | FileCheck %s
+
+# CHECK: Name: _start (1)
+# CHECK-NEXT: Value: {{[0x0-9a-f]+}}
+# CHECK: Name: _stop (8)
+# CHECK-NEXT: Value: {{[0x0-9a-f]+}}
+#
+# CHECK: 0x000000000000000C INIT {{[0x0-9a-f]+}}
+# CHECK: 0x000000000000000D FINI {{[0x0-9a-f]+}}
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x04
+ Size: 0x20
+
+Symbols:
+ Global:
+ - Name: _start
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0
+ Size: 0x8
+ - Name: _stop
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x8
+ Size: 0x8
+ - Name: _init
+ Type: STT_FUNC
+ Section: .text
+ Value: 0xF
+ Size: 0x8
+ - Name: _fini
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x18
+ Size: 0x8
+...
diff --git a/test/old-elf/librarynotfound.test b/test/old-elf/librarynotfound.test
new file mode 100644
index 000000000000..9b1b8f2cffc4
--- /dev/null
+++ b/test/old-elf/librarynotfound.test
@@ -0,0 +1,5 @@
+# Tests the functionality of library not found
+RUN: not lld -flavor old-gnu -lfn 2> %t1
+RUN: FileCheck %s < %t1
+
+CHECK: Unable to find library -lfn
diff --git a/test/old-elf/linker-as-ld.test b/test/old-elf/linker-as-ld.test
new file mode 100644
index 000000000000..8b07ae9d1a71
--- /dev/null
+++ b/test/old-elf/linker-as-ld.test
@@ -0,0 +1,16 @@
+REQUIRES: system-linker-elf
+
+RUN: mkdir -p %t.dir && cp `which lld` %t.dir/ld
+RUN: %t.dir/ld -o %t %p/Inputs/relocs.x86-64 \
+RUN: -e _start -static
+RUN: llvm-readobj -t %t | FileCheck %s
+
+# Test linker run as "ld" on elf based system works like gnu linker.
+
+
+CHECK: Symbol {
+CHECK: Name: i
+CHECK-NEXT: Value:
+CHECK-NEXT: Size:
+CHECK-NEXT: Binding:
+CHECK-NEXT: Type: Object
diff --git a/test/old-elf/linkerscript/Inputs/externs.ls b/test/old-elf/linkerscript/Inputs/externs.ls
new file mode 100644
index 000000000000..20fdc0c3f980
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/externs.ls
@@ -0,0 +1,3 @@
+/* A simple valid linker script used for testing the EXTERN command.
+ */
+EXTERN(_foo bar __baz)
diff --git a/test/old-elf/linkerscript/Inputs/invalid.ls b/test/old-elf/linkerscript/Inputs/invalid.ls
new file mode 100644
index 000000000000..894d4bef2732
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/invalid.ls
@@ -0,0 +1 @@
+GROUP(
diff --git a/test/old-elf/linkerscript/Inputs/prog1.o.yaml b/test/old-elf/linkerscript/Inputs/prog1.o.yaml
new file mode 100644
index 000000000000..f450048ab37b
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/prog1.o.yaml
@@ -0,0 +1,87 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E5B000E800000000BF01000000BA0E0000004889C6E80000000031C05DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000007
+ Symbol: prog2
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Offset: 0x0000000000000019
+ Symbol: write
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742036336134646334616430343938646139623934386330383263623735336430353735323938346638292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623838363135326664656538376564653738613565643965616638663664313839343033616266312900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000002100000000410E108602430D0600000000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000021
+ - Name: prog2
+ - Name: write
+...
diff --git a/test/old-elf/linkerscript/Inputs/prog2.o.yaml b/test/old-elf/linkerscript/Inputs/prog2.o.yaml
new file mode 100644
index 000000000000..4d1bbd5754ea
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/prog2.o.yaml
@@ -0,0 +1,88 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E548B800000000000000005DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000006
+ Symbol: .rodata.str1.1
+ Type: R_X86_64_64
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .rodata.str1.1
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 48656C6C6F2C20776F726C64210A00
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E302028687474703A2F2F6C6C766D2E6F72672F6769742F636C616E672E6769742036336134646334616430343938646139623934386330383263623735336430353735323938346638292028687474703A2F2F6C6C766D2E6F72672F6769742F6C6C766D2E67697420623838363135326664656538376564653738613565643965616638663664313839343033616266312900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000001000000000410E108602430D0600000000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .rodata.str1.1
+ Type: STT_SECTION
+ Section: .rodata.str1.1
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: prog2
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000010
+...
diff --git a/test/old-elf/linkerscript/Inputs/prog3.o.yaml b/test/old-elf/linkerscript/Inputs/prog3.o.yaml
new file mode 100644
index 000000000000..2402be4d42b6
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/prog3.o.yaml
@@ -0,0 +1,51 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: B8010000000F05C3E800000000B83C0000000F05C3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000009
+ Symbol: main
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0000000000000008
+ - Name: write
+ Section: .text
+ - Name: main
+...
diff --git a/test/old-elf/linkerscript/Inputs/simple-pic.o.yaml b/test/old-elf/linkerscript/Inputs/simple-pic.o.yaml
new file mode 100644
index 000000000000..f826034053c3
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/simple-pic.o.yaml
@@ -0,0 +1,32 @@
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 4
+ Size: 16
+
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 4
+ Size: 16
+
+Symbols:
+ Local:
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Size: 16
diff --git a/test/old-elf/linkerscript/Inputs/simple.o.yaml b/test/old-elf/linkerscript/Inputs/simple.o.yaml
new file mode 100644
index 000000000000..fc9cd4c5f67d
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/simple.o.yaml
@@ -0,0 +1,51 @@
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: B80100000048C7C70100000048C7C60000000048C7C20E0000000F05C3E8DEFFFFFFB83C0000000F05C3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x000000000000000F
+ Symbol: .data
+ Type: R_X86_64_32S
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: 48656C6C6F2C20576F726C64210A00
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+Symbols:
+ Local:
+ - Name: main
+ Section: .text
+ - Name: msg
+ Section: .data
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x000000000000001D
+...
diff --git a/test/old-elf/linkerscript/Inputs/valid.ls b/test/old-elf/linkerscript/Inputs/valid.ls
new file mode 100644
index 000000000000..43593602d3fb
--- /dev/null
+++ b/test/old-elf/linkerscript/Inputs/valid.ls
@@ -0,0 +1,6 @@
+/* A simple valid linker script used for testing the -T/--script options.
+ *
+ * An unresolved symbol named '_entry_point' can be scanned for by the tests
+ * to determine that the linker script was processed.
+ */
+ENTRY(_entry_point)
diff --git a/test/old-elf/linkerscript/externs.objtxt b/test/old-elf/linkerscript/externs.objtxt
new file mode 100644
index 000000000000..d79c56a142c9
--- /dev/null
+++ b/test/old-elf/linkerscript/externs.objtxt
@@ -0,0 +1,21 @@
+# Check symbols defined with the EXTERN command are added as undefined
+# symbols.
+
+# RUN: lld -flavor old-gnu -target x86_64 -T %p/Inputs/externs.ls -r %s \
+# RUN: --output-filetype=yaml | FileCheck %s
+
+defined-atoms:
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+
+# CHECK: undefined-atoms:
+# CHECK: - name: _foo
+# CHECK: can-be-null: at-buildtime
+# CHECK: - name: bar
+# CHECK: can-be-null: at-buildtime
+# CHECK: - name: __baz
+# CHECK: can-be-null: at-buildtime
diff --git a/test/old-elf/linkerscript/filename-with-wildcards.test b/test/old-elf/linkerscript/filename-with-wildcards.test
new file mode 100644
index 000000000000..9376d5a5cfb4
--- /dev/null
+++ b/test/old-elf/linkerscript/filename-with-wildcards.test
@@ -0,0 +1,49 @@
+/*
+Tests a linker script that uses the SECTIONS command with rules containing
+wildcards that matching input object files.
+*/
+
+ENTRY(_start)
+
+SECTIONS
+{
+ . = 0x500000;
+ .foo : { *p1-wc.o(.text .rodata*) }
+ .bar : { *(.text .rodata*) }
+}
+
+/*
+RUN: mkdir -p %T
+RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/p1-wc.o
+RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/p2-wc.o
+RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/p3-wc.o
+RUN: cd %T
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s p1-wc.o p2-wc.o p3-wc.o \
+RUN: -static -o %t1
+RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s
+
+CHECKSECTIONS: Index: 1
+CHECKSECTIONS: Name: .foo
+CHECKSECTIONS: Address: 0x500000
+CHECKSECTIONS: Size: 33
+
+CHECKSECTIONS: Index: 2
+CHECKSECTIONS: Name: .bar
+CHECKSECTIONS: Address: 0x500030
+CHECKSECTIONS: Size: 52
+
+RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+CHECKSYMS: Name: main
+CHECKSYMS-NEXT: Value: 0x500000
+
+CHECKSYMS: Name: prog2
+CHECKSYMS-NEXT: Value: 0x500030
+
+CHECKSYMS: Name: write
+CHECKSYMS-NEXT: Value: 0x500040
+
+CHECKSYMS: Name: _start
+CHECKSYMS-NEXT: Value: 0x500048
+*/
diff --git a/test/old-elf/linkerscript/invalid-script-cli-1.test b/test/old-elf/linkerscript/invalid-script-cli-1.test
new file mode 100644
index 000000000000..72d2edebb4d5
--- /dev/null
+++ b/test/old-elf/linkerscript/invalid-script-cli-1.test
@@ -0,0 +1,10 @@
+# Check that the -T/--script options issue an error when passed
+# filenames for files that do not exist.
+
+RUN: not lld -flavor old-gnu -target x86_64 -T idonotexist.ls 2> %t.err
+RUN: FileCheck %s < %t.err
+
+RUN: not lld -flavor old-gnu -target x86_64 --script=idonotexist.ls 2> %t.err
+RUN: FileCheck %s < %t.err
+
+CHECK: {{.*}}lld: cannot find file {{.*}}idonotexist.ls
diff --git a/test/old-elf/linkerscript/invalid-script-cli-2.test b/test/old-elf/linkerscript/invalid-script-cli-2.test
new file mode 100644
index 000000000000..cc76f0e55a81
--- /dev/null
+++ b/test/old-elf/linkerscript/invalid-script-cli-2.test
@@ -0,0 +1,6 @@
+# Check that linker script are *not* picked up with -lscript.ls.
+
+RUN: not lld -flavor old-gnu -target x86_64 -L%p/Inputs/ -lvalid.ls 2> %t.err
+RUN: FileCheck %s < %t.err
+
+CHECK: {{.*}}: Unable to find library -lvalid.ls
diff --git a/test/old-elf/linkerscript/invalid.test b/test/old-elf/linkerscript/invalid.test
new file mode 100644
index 000000000000..a00a200225dc
--- /dev/null
+++ b/test/old-elf/linkerscript/invalid.test
@@ -0,0 +1,5 @@
+# Check for errors from invalid linker scripts
+RUN: not lld -flavor old-gnu -target x86_64 %p/Inputs/invalid.ls 2> %t.err
+RUN: FileCheck %s < %t.err
+
+CHECK: {{.*}}invalid.ls: Error parsing linker script
diff --git a/test/old-elf/linkerscript/phdrs-all-none.test b/test/old-elf/linkerscript/phdrs-all-none.test
new file mode 100644
index 000000000000..45baf188d8d8
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-all-none.test
@@ -0,0 +1,26 @@
+/*
+Test when all segments are marked as NONE.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix NONE-ALL-PHDRS %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :NONE
+ .data : { *(.data) }
+}
+
+/*
+NONE-ALL-PHDRS: .text {{[0-9a-f]+}} 0000000000000000
+NONE-ALL-PHDRS: .data {{[0-9a-f]+}} 000000000000002c
+*/
diff --git a/test/old-elf/linkerscript/phdrs-custom-none.test b/test/old-elf/linkerscript/phdrs-custom-none.test
new file mode 100644
index 000000000000..e3672cf8fd30
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-custom-none.test
@@ -0,0 +1,36 @@
+/*
+Test when PHDRS contains custom NONE segment.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix CUSTOM-NONE-SECS %s
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix CUSTOM-NONE-HDRS %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ NONE PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :NONE
+ .data : { *(.data) }
+}
+
+/*
+CUSTOM-NONE-SECS: .text {{[0-9a-f]+}} 00000000004000b0
+CUSTOM-NONE-SECS: .data {{[0-9a-f]+}} 00000000004000dc
+
+CUSTOM-NONE-HDRS: ProgramHeader {
+CUSTOM-NONE-HDRS: Type: PT_LOAD (0x1)
+CUSTOM-NONE-HDRS: VirtualAddress: 0x400000
+CUSTOM-NONE-HDRS: Flags [ (0x5)
+CUSTOM-NONE-HDRS: PF_R (0x4)
+CUSTOM-NONE-HDRS: PF_X (0x1)
+CUSTOM-NONE-HDRS: ]
+CUSTOM-NONE-HDRS: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-default.test b/test/old-elf/linkerscript/phdrs-default.test
new file mode 100644
index 000000000000..8c493d020504
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-default.test
@@ -0,0 +1,82 @@
+/*
+This group of tests checks usage of default headers during linking,
+when PHDRS command is not defined or defined empty in linker scripts.
+
+This test uses a single X86-64 input object, simple.o, created with the
+following X86-64 assembly code:
+
+*** simple.S:
+
+(command line clang -c simple.S -o simple.o)
+
+ .text
+ main:
+ mov $1, %eax
+ movq $1, %rdi
+ movq $msg, %rsi
+ movq $14, %rdx
+ syscall
+ ret
+
+ .globl _start
+ _start:
+ call main
+ mov $60, %eax
+ syscall
+ ret
+
+ .data
+ msg: .asciz "Hello, World!\n"
+*/
+
+/*
+Prepare the object file to test on.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+*/
+
+/*
+Test when no linker script passed.
+
+RUN: lld -flavor old-gnu -target x86_64 %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix SECTIONS %s
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix HEADERS %s
+
+SECTIONS: .text {{[0-9a-f]+}} 00000000004000b0
+SECTIONS: .data {{[0-9a-f]+}} 0000000000401000
+
+HEADERS: ProgramHeader {
+HEADERS: Type: PT_LOAD (0x1)
+HEADERS: VirtualAddress: 0x400000
+HEADERS: }
+HEADERS: ProgramHeader {
+HEADERS: Type: PT_LOAD (0x1)
+HEADERS: VirtualAddress: 0x401000
+HEADERS: }
+*/
+
+/*
+Test when linker script doesn't contain PHDRS and sections are not assigned to any segments.
+
+RUN: lld -flavor old-gnu -target x86_64 -T %p/phdrs/sections-no-phdrs.script %t.o -static -o %t2
+RUN: llvm-objdump -section-headers %t2 | FileCheck -check-prefix SECTIONS %s
+RUN: llvm-readobj -program-headers %t2 | FileCheck -check-prefix HEADERS %s
+*/
+
+/*
+Test when linker script contains empty PHDRS and sections are not assigned to any segments.
+
+RUN: lld -flavor old-gnu -target x86_64 -T %p/phdrs/sections-empty-phdrs.script %t.o -static -o %t3
+RUN: llvm-objdump -section-headers %t3 | FileCheck -check-prefix SECTIONS %s
+RUN: llvm-readobj -program-headers %t3 | FileCheck -check-prefix HEADERS %s
+*/
+
+/*
+Test when linker script contains empty PHDRS and sections are only assigned to NONE segments
+or not assigned at all.
+NOTE: Segments with the name NONE are ignored in such a case.
+
+RUN: lld -flavor old-gnu -target x86_64 -T %p/phdrs/sections-none-phdrs.script %t.o -static -o %t4
+RUN: llvm-objdump -section-headers %t4 | FileCheck -check-prefix SECTIONS %s
+RUN: llvm-readobj -program-headers %t4 | FileCheck -check-prefix HEADERS %s
+*/
diff --git a/test/old-elf/linkerscript/phdrs-different.test b/test/old-elf/linkerscript/phdrs-different.test
new file mode 100644
index 000000000000..7fe14dd543d1
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-different.test
@@ -0,0 +1,45 @@
+/*
+Test sections put to different segments.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix DIFF-PHDRS-SECS %s
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix DIFF-PHDRS-HDRS %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD;
+ data PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) } :data
+}
+
+/*
+DIFF-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000e8
+DIFF-PHDRS-SECS: .data {{[0-9a-f]+}} 0000000000401000
+
+DIFF-PHDRS-HDRS: ProgramHeader {
+DIFF-PHDRS-HDRS: Type: PT_LOAD (0x1)
+DIFF-PHDRS-HDRS: VirtualAddress: 0x400000
+DIFF-PHDRS-HDRS: Flags [ (0x5)
+DIFF-PHDRS-HDRS: PF_R (0x4)
+DIFF-PHDRS-HDRS: PF_X (0x1)
+DIFF-PHDRS-HDRS: ]
+DIFF-PHDRS-HDRS: }
+DIFF-PHDRS-HDRS: ProgramHeader {
+DIFF-PHDRS-HDRS: Type: PT_LOAD (0x1)
+DIFF-PHDRS-HDRS: VirtualAddress: 0x401000
+DIFF-PHDRS-HDRS: Flags [ (0x6)
+DIFF-PHDRS-HDRS: PF_R (0x4)
+DIFF-PHDRS-HDRS: PF_W (0x2)
+DIFF-PHDRS-HDRS: ]
+DIFF-PHDRS-HDRS: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-extra-program.test b/test/old-elf/linkerscript/phdrs-extra-program.test
new file mode 100644
index 000000000000..3bf27dcb1f5a
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-extra-program.test
@@ -0,0 +1,27 @@
+/*
+Test extra program header generates error.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error
+RUN: FileCheck -check-prefix EXTRA-PROGRAM-PHDR %s < %t1-error
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ header PT_PHDR PHDRS;
+ header2 PT_PHDR PHDRS;
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :NONE
+ .data : { *(.data) }
+}
+
+/*
+EXTRA-PROGRAM-PHDR: Extra program header is found
+*/
diff --git a/test/old-elf/linkerscript/phdrs-flags.test b/test/old-elf/linkerscript/phdrs-flags.test
new file mode 100644
index 000000000000..0fac53e75302
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-flags.test
@@ -0,0 +1,46 @@
+/*
+Test sections put to different segments with FLAGS attribute set.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-SECS %s
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-HDRS %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD FLAGS(0x5);
+ data PT_LOAD FLAGS(0x7);
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) } :data
+}
+
+/*
+FLAGS-PHDRS-SECS: .text {{[0-9a-f]+}} 0000000000401000
+FLAGS-PHDRS-SECS: .data {{[0-9a-f]+}} 00000000004000e8
+
+FLAGS-PHDRS-HDRS: ProgramHeader {
+FLAGS-PHDRS-HDRS: Type: PT_LOAD (0x1)
+FLAGS-PHDRS-HDRS: VirtualAddress: 0x400000
+FLAGS-PHDRS-HDRS: Flags [ (0x7)
+FLAGS-PHDRS-HDRS: PF_R (0x4)
+FLAGS-PHDRS-HDRS: PF_W (0x2)
+FLAGS-PHDRS-HDRS: PF_X (0x1)
+FLAGS-PHDRS-HDRS: ]
+FLAGS-PHDRS-HDRS: }
+FLAGS-PHDRS-HDRS: ProgramHeader {
+FLAGS-PHDRS-HDRS: Type: PT_LOAD (0x1)
+FLAGS-PHDRS-HDRS: VirtualAddress: 0x401000
+FLAGS-PHDRS-HDRS: Flags [ (0x5)
+FLAGS-PHDRS-HDRS: PF_R (0x4)
+FLAGS-PHDRS-HDRS: PF_X (0x1)
+FLAGS-PHDRS-HDRS: ]
+FLAGS-PHDRS-HDRS: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-has-program.test b/test/old-elf/linkerscript/phdrs-has-program.test
new file mode 100644
index 000000000000..83fe94c70614
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-has-program.test
@@ -0,0 +1,33 @@
+/*
+Test when program segment is set it's generated.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-PHDR %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ header PT_PHDR FILEHDR PHDRS;
+ text PT_LOAD PHDRS;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+PROGRAM-PHDR: ProgramHeader {
+PROGRAM-PHDR: Type: PT_PHDR (0x6)
+PROGRAM-PHDR: VirtualAddress: 0x400040
+PROGRAM-PHDR: Flags [ (0x5)
+PROGRAM-PHDR: PF_R (0x4)
+PROGRAM-PHDR: PF_X (0x1)
+PROGRAM-PHDR: ]
+PROGRAM-PHDR: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-invalid.test b/test/old-elf/linkerscript/phdrs-invalid.test
new file mode 100644
index 000000000000..c1426e8ffa5f
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-invalid.test
@@ -0,0 +1,63 @@
+/*
+This group of tests checks invalid cases of defining and using PHDRS
+command in linker scripts.
+
+This test uses a single X86-64 input object, simple.o, created with the
+following X86-64 assembly code:
+
+*** simple.S:
+
+(command line clang -c simple.S -o simple.o)
+
+ .text
+ main:
+ mov $1, %eax
+ movq $1, %rdi
+ movq $msg, %rsi
+ movq $14, %rdx
+ syscall
+ ret
+
+ .globl _start
+ _start:
+ call main
+ mov $60, %eax
+ syscall
+ ret
+
+ .data
+ msg: .asciz "Hello, World!\n"
+*/
+
+/*
+Prepare the object file to test on.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+*/
+
+/*
+Test undefined header used when no PHDRS defined.
+
+RUN: not lld -flavor old-gnu -target x86_64 -T %p/phdrs/undef-no-phdrs.script %t.o -static -o %t1 &> %t1-error
+RUN: FileCheck -check-prefix UNDEF-NO-PHDRS %s < %t1-error
+
+UNDEF-NO-PHDRS: Unknown header identifiers (missing in PHDRS command) are used
+*/
+
+/*
+Test undefined header used when PHDRS is empty.
+
+RUN: not lld -flavor old-gnu -target x86_64 -T %p/phdrs/undef-empty-phdrs.script %t.o -static -o %t2 &> %t2-error
+RUN: FileCheck -check-prefix UNDEF-EMPTY-PHDRS %s < %t2-error
+
+UNDEF-EMPTY-PHDRS: Unknown header identifiers (missing in PHDRS command) are used
+*/
+
+/*
+Test undefined header used when PHDRS contains definitions.
+
+RUN: not lld -flavor old-gnu -target x86_64 -T %p/phdrs/undef-id-phdrs.script %t.o -static -o %t3 &> %t3-error
+RUN: FileCheck -check-prefix UNDEF-ID-PHDRS %s < %t3-error
+
+UNDEF-ID-PHDRS: Unknown header identifiers (missing in PHDRS command) are used
+*/
diff --git a/test/old-elf/linkerscript/phdrs-misplaced-program.test b/test/old-elf/linkerscript/phdrs-misplaced-program.test
new file mode 100644
index 000000000000..0fb669d818c4
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-misplaced-program.test
@@ -0,0 +1,26 @@
+/*
+Test misplaced program header generates error.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error
+RUN: FileCheck -check-prefix MISPLACED-PROGRAM-PHDR %s < %t1-error
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD;
+ header PT_PHDR PHDRS;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :NONE
+ .data : { *(.data) }
+}
+
+/*
+MISPLACED-PROGRAM-PHDR: Program header must precede load segments
+*/
diff --git a/test/old-elf/linkerscript/phdrs-no-program.test b/test/old-elf/linkerscript/phdrs-no-program.test
new file mode 100644
index 000000000000..e461d5061019
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-no-program.test
@@ -0,0 +1,25 @@
+/*
+Test when no program segment set it's not generated.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-PHDR %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+PROGRAM-PHDR-NOT: Type: PT_PHDR (0x6)
+*/
diff --git a/test/old-elf/linkerscript/phdrs-one-none.test b/test/old-elf/linkerscript/phdrs-one-none.test
new file mode 100644
index 000000000000..a1c84e59fc60
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-one-none.test
@@ -0,0 +1,36 @@
+/*
+Test when one segment is marked as NONE.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix NONE-PHDRS-SECS %s
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix NONE-PHDRS-HDRS %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) } :NONE
+}
+
+/*
+NONE-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000b0
+NONE-PHDRS-SECS: .data {{[0-9a-f]+}} 0000000000000000
+
+NONE-PHDRS-HDRS: ProgramHeader {
+NONE-PHDRS-HDRS: Type: PT_LOAD (0x1)
+NONE-PHDRS-HDRS: VirtualAddress: 0x400000
+NONE-PHDRS-HDRS: Flags [ (0x5)
+NONE-PHDRS-HDRS: PF_R (0x4)
+NONE-PHDRS-HDRS: PF_X (0x1)
+NONE-PHDRS-HDRS: ]
+NONE-PHDRS-HDRS: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-program-flags.test b/test/old-elf/linkerscript/phdrs-program-flags.test
new file mode 100644
index 000000000000..2a719a6cb296
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-program-flags.test
@@ -0,0 +1,33 @@
+/*
+Test when program segment contains only FLAGS attribute.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-FLAGS-PHDR %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ header PT_PHDR PHDRS FLAGS(0x7);
+ text PT_LOAD FILEHDR PHDRS;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+PROGRAM-FLAGS-PHDR: ProgramHeader {
+PROGRAM-FLAGS-PHDR: Type: PT_PHDR (0x6)
+PROGRAM-FLAGS-PHDR: Flags [ (0x7)
+PROGRAM-FLAGS-PHDR: PF_R (0x4)
+PROGRAM-FLAGS-PHDR: PF_W (0x2)
+PROGRAM-FLAGS-PHDR: PF_X (0x1)
+PROGRAM-FLAGS-PHDR: ]
+PROGRAM-FLAGS-PHDR: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-program-good-phdrs.test b/test/old-elf/linkerscript/phdrs-program-good-phdrs.test
new file mode 100644
index 000000000000..373facc380ba
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-program-good-phdrs.test
@@ -0,0 +1,34 @@
+/*
+Test when program segment contains only PHDRS attribute.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix PROGRAM-PHDRS-PHDR %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ header PT_PHDR PHDRS;
+ text PT_LOAD PHDRS;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+PROGRAM-PHDRS-PHDR: ProgramHeader {
+PROGRAM-PHDRS-PHDR: Type: PT_PHDR (0x6)
+PROGRAM-PHDRS-PHDR: VirtualAddress: 0x400040
+PROGRAM-PHDRS-PHDR: MemSize: 168
+PROGRAM-PHDRS-PHDR: Flags [ (0x5)
+PROGRAM-PHDRS-PHDR: PF_R (0x4)
+PROGRAM-PHDRS-PHDR: PF_X (0x1)
+PROGRAM-PHDRS-PHDR: ]
+PROGRAM-PHDRS-PHDR: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-program-no-phdrs.test b/test/old-elf/linkerscript/phdrs-program-no-phdrs.test
new file mode 100644
index 000000000000..3e639bdb0f43
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-program-no-phdrs.test
@@ -0,0 +1,26 @@
+/*
+Test when program segment doesn't contain PHDRS attribute.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error
+RUN: FileCheck -check-prefix PROGRAM-PHDR-NO-PHDRS %s < %t1-error
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ header PT_PHDR;
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+PROGRAM-PHDR-NO-PHDRS: Program header has invalid PHDRS attribute
+*/
diff --git a/test/old-elf/linkerscript/phdrs-program-wrong-phdrs.test b/test/old-elf/linkerscript/phdrs-program-wrong-phdrs.test
new file mode 100644
index 000000000000..c27b23d85876
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-program-wrong-phdrs.test
@@ -0,0 +1,26 @@
+/*
+Test when program segment contains PHDRS attribute not mapped to load segment.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: not lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1 &> %t1-error
+RUN: FileCheck -check-prefix PROGRAM-PHDR-WRONG-PHDRS %s < %t1-error
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ header PT_PHDR PHDRS;
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+PROGRAM-PHDR-WRONG-PHDRS: Program header has invalid PHDRS attribute
+*/
diff --git a/test/old-elf/linkerscript/phdrs-same-flags.test b/test/old-elf/linkerscript/phdrs-same-flags.test
new file mode 100644
index 000000000000..e39f61881033
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-same-flags.test
@@ -0,0 +1,35 @@
+/*
+Test sections put to same segment with FLAGS attribute set.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-SECS %s
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix FLAGS-PHDRS-HDRS %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD FLAGS(0x4);
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+FLAGS-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000b0
+FLAGS-PHDRS-SECS: .data {{[0-9a-f]+}} 00000000004000dc
+
+FLAGS-PHDRS-HDRS: ProgramHeader {
+FLAGS-PHDRS-HDRS: Type: PT_LOAD (0x1)
+FLAGS-PHDRS-HDRS: VirtualAddress: 0x400000
+FLAGS-PHDRS-HDRS: Flags [ (0x4)
+FLAGS-PHDRS-HDRS: PF_R (0x4)
+FLAGS-PHDRS-HDRS: ]
+FLAGS-PHDRS-HDRS: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs-same.test b/test/old-elf/linkerscript/phdrs-same.test
new file mode 100644
index 000000000000..92b3ad3909c3
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs-same.test
@@ -0,0 +1,36 @@
+/*
+Test sections put to same segment.
+
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %t.o -static -o %t1
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix SAME-PHDRS-SECS %s
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix SAME-PHDRS-HDRS %s
+*/
+
+ENTRY(_start)
+
+PHDRS
+{
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :text
+ .data : { *(.data) }
+}
+
+/*
+SAME-PHDRS-SECS: .text {{[0-9a-f]+}} 00000000004000b0
+SAME-PHDRS-SECS: .data {{[0-9a-f]+}} 00000000004000dc
+
+SAME-PHDRS-HDRS: ProgramHeader {
+SAME-PHDRS-HDRS: Type: PT_LOAD (0x1)
+SAME-PHDRS-HDRS: VirtualAddress: 0x400000
+SAME-PHDRS-HDRS: Flags [ (0x5)
+SAME-PHDRS-HDRS: PF_R (0x4)
+SAME-PHDRS-HDRS: PF_X (0x1)
+SAME-PHDRS-HDRS: ]
+SAME-PHDRS-HDRS: }
+*/
diff --git a/test/old-elf/linkerscript/phdrs/sections-empty-phdrs.script b/test/old-elf/linkerscript/phdrs/sections-empty-phdrs.script
new file mode 100644
index 000000000000..ac30df78d5e1
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs/sections-empty-phdrs.script
@@ -0,0 +1,11 @@
+ENTRY(_start)
+
+PHDRS
+{
+}
+
+SECTIONS
+{
+ .text : { *(.text) }
+ .data : { *(.data) }
+}
diff --git a/test/old-elf/linkerscript/phdrs/sections-no-phdrs.script b/test/old-elf/linkerscript/phdrs/sections-no-phdrs.script
new file mode 100644
index 000000000000..b8848cd3ab0d
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs/sections-no-phdrs.script
@@ -0,0 +1,7 @@
+ENTRY(_start)
+
+SECTIONS
+{
+ .text : { *(.text) }
+ .data : { *(.data) }
+}
diff --git a/test/old-elf/linkerscript/phdrs/sections-none-phdrs.script b/test/old-elf/linkerscript/phdrs/sections-none-phdrs.script
new file mode 100644
index 000000000000..4b240245d2b2
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs/sections-none-phdrs.script
@@ -0,0 +1,11 @@
+ENTRY(_start)
+
+PHDRS
+{
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :NONE
+ .data : { *(.data) }
+}
diff --git a/test/old-elf/linkerscript/phdrs/undef-empty-phdrs.script b/test/old-elf/linkerscript/phdrs/undef-empty-phdrs.script
new file mode 100644
index 000000000000..f92b452d2346
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs/undef-empty-phdrs.script
@@ -0,0 +1,11 @@
+ENTRY(_start)
+
+PHDRS
+{
+}
+
+SECTIONS
+{
+ .text : { *(.text) }
+ .data : { *(.data) } :phdr
+}
diff --git a/test/old-elf/linkerscript/phdrs/undef-id-phdrs.script b/test/old-elf/linkerscript/phdrs/undef-id-phdrs.script
new file mode 100644
index 000000000000..8ac56695f00a
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs/undef-id-phdrs.script
@@ -0,0 +1,12 @@
+ENTRY(_start)
+
+PHDRS
+{
+ phdr PT_LOAD;
+}
+
+SECTIONS
+{
+ .text : { *(.text) } :phdr_wrong
+ .data : { *(.data) }
+}
diff --git a/test/old-elf/linkerscript/phdrs/undef-no-phdrs.script b/test/old-elf/linkerscript/phdrs/undef-no-phdrs.script
new file mode 100644
index 000000000000..d3ee5bdebe41
--- /dev/null
+++ b/test/old-elf/linkerscript/phdrs/undef-no-phdrs.script
@@ -0,0 +1,7 @@
+ENTRY(_start)
+
+SECTIONS
+{
+ .text : { *(.text) } :phdr
+ .data : { *(.data) }
+}
diff --git a/test/old-elf/linkerscript/sections-order.test b/test/old-elf/linkerscript/sections-order.test
new file mode 100644
index 000000000000..4d23f5eb9d54
--- /dev/null
+++ b/test/old-elf/linkerscript/sections-order.test
@@ -0,0 +1,113 @@
+/*
+Tests a simple linker script that changes the order of output sections and
+also changes the address of output sections by using simple expressions.
+
+This test uses three X86-64 input objects, prog1.o, prog2.o and prog3.o,
+which were created with the following C or assembly code:
+
+*** prog1.o:
+
+(command line clang -c prog1.c -o prog1.o)
+
+const char *prog2();
+void write(int, const char *, int);
+
+int main() {
+ write(1, prog2(), 14);
+}
+
+*** prog2.o:
+
+(command line clang -c prog2.c -o prog2.o)
+
+const char *prog2() {
+ return "Hello, world!\n";
+}
+
+*** prog3.o:
+
+(command line clang -c prog3.S -o prog3.o)
+
+ .globl write
+write:
+ mov $1, %eax
+ syscall
+ ret
+
+ .globl _start
+_start:
+ call main
+ mov $60, %eax
+ syscall
+ ret
+
+We use the following linker script for this test:
+*/
+
+ENTRY(_start)
+
+SECTIONS
+{
+ . = 0x500000;
+ .text : { prog1.o(.text) }
+ .mystring : { prog2.o(.rodata.str1.1) }
+ . = . + 0x6000;
+ .text.2 : {prog3.o(.text) prog2.o(.text) }
+}
+
+/*
+RUN: mkdir -p %T
+RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/prog1.o
+RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/prog2.o
+RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/prog3.o
+RUN: cd %T
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s prog1.o prog2.o prog3.o \
+RUN: -static -o %t1
+RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s
+
+CHECKSECTIONS: Index: 1
+CHECKSECTIONS: Name: .text
+CHECKSECTIONS: Address: 0x500000
+CHECKSECTIONS: Size: 33
+
+CHECKSECTIONS: Index: 2
+CHECKSECTIONS: Name: .mystring
+CHECKSECTIONS: Address: 0x500021
+CHECKSECTIONS: Size: 15
+
+CHECKSECTIONS: Index: 3
+CHECKSECTIONS: Name: .text.2
+CHECKSECTIONS: Address: 0x506030
+CHECKSECTIONS: Size: 48
+
+RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+CHECKSYMS: Name: main
+CHECKSYMS-NEXT: Value: 0x500000
+
+CHECKSYMS: Name: write
+CHECKSYMS-NEXT: Value: 0x506030
+
+CHECKSYMS: Name: _start
+CHECKSYMS-NEXT: Value: 0x506038
+
+CHECKSYMS: Name: prog2
+CHECKSYMS-NEXT: Value: 0x506050
+
+RUN: llvm-readobj -program-headers %t1 | FileCheck -check-prefix CHECKPHDRS %s
+
+CHECKPHDRS: Type: PT_LOAD (0x1)
+CHECKPHDRS: Offset: 0x1000
+CHECKPHDRS-NEXT: VirtualAddress: 0x500000
+CHECKPHDRS-NEXT: PhysicalAddress: 0x500000
+CHECKPHDRS-NEXT: FileSize: 48
+CHECKPHDRS-NEXT: MemSize: 48
+
+CHECKPHDRS: Type: PT_LOAD (0x1)
+CHECKPHDRS: Offset: 0x2030
+CHECKPHDRS-NEXT: VirtualAddress: 0x506030
+CHECKPHDRS-NEXT: PhysicalAddress: 0x506030
+CHECKPHDRS-NEXT: FileSize: 168
+CHECKPHDRS-NEXT: MemSize: 168
+*/
diff --git a/test/old-elf/linkerscript/sections-with-wildcards.test b/test/old-elf/linkerscript/sections-with-wildcards.test
new file mode 100644
index 000000000000..a390a2b2d36a
--- /dev/null
+++ b/test/old-elf/linkerscript/sections-with-wildcards.test
@@ -0,0 +1,88 @@
+/*
+Tests a linker script that uses the SECTIONS command with rules containing
+wildcards and simple SORT directives. It also tests that the linker script
+evaluates the expressions in the same order as the one written in the script
+file.
+
+This test uses three X86-64 input objects, prog1.o, prog2.o and prog3.o,
+which were created with the following C or assembly code:
+
+*** prog1.o:
+
+(command line clang -c prog1.c -o prog1.o)
+
+const char *prog2();
+void write(int, const char *, int);
+
+int main() {
+ write(1, prog2(), 14);
+}
+
+*** prog2.o:
+
+(command line clang -c prog2.c -o prog2.o)
+
+const char *prog2() {
+ return "Hello, world!\n";
+}
+
+*** prog3.o:
+
+(command line clang -c prog3.S -o prog3.o)
+
+ .globl write
+write:
+ mov $1, %eax
+ syscall
+ ret
+
+ .globl _start
+_start:
+ call main
+ mov $60, %eax
+ syscall
+ ret
+
+We use the following linker script for this test:
+*/
+
+ENTRY(_start)
+
+SECTIONS
+{
+ my_start_addr = 0x500000;
+ my_symbol = my_start_addr;
+ . = my_symbol;
+ .foo : { SORT(*)(.text .rodata*) }
+}
+
+/*
+RUN: mkdir -p %T
+RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/p1.o
+RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/p2.o
+RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/p3.o
+RUN: cd %T
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s p1.o p2.o p3.o \
+RUN: -static -o %t1
+RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s
+
+CHECKSECTIONS: Index: 1
+CHECKSECTIONS: Name: .foo
+CHECKSECTIONS: Address: 0x500000
+CHECKSECTIONS: Size: 101
+
+RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+CHECKSYMS: Name: main
+CHECKSYMS-NEXT: Value: 0x500000
+
+CHECKSYMS: Name: prog2
+CHECKSYMS-NEXT: Value: 0x500030
+
+CHECKSYMS: Name: write
+CHECKSYMS-NEXT: Value: 0x500050
+
+CHECKSYMS: Name: _start
+CHECKSYMS-NEXT: Value: 0x500058
+*/
diff --git a/test/old-elf/linkerscript/symbol-definition-so.test b/test/old-elf/linkerscript/symbol-definition-so.test
new file mode 100644
index 000000000000..15b22f6f581f
--- /dev/null
+++ b/test/old-elf/linkerscript/symbol-definition-so.test
@@ -0,0 +1,32 @@
+/*
+We test whether we can define symbols in a linker script and have them exported
+to the output file symbol table. This test is the same as symbol-definition.test
+but make checking in case of shared library linking.
+
+We use the following linker script for this test:
+*/
+
+SECTIONS
+{
+ .text : { *(.text) }
+ MYSTRING = .;
+ .data : { *(.data) }
+}
+
+/*
+RUN: yaml2obj -format=elf %p/Inputs/simple-pic.o.yaml -o=%t.o
+
+RUN: lld -flavor old-gnu -target x86_64 -shared -T %s %t.o -o %t.so
+RUN: llvm-readobj -s -symbols %t.so | FileCheck -check-prefix CHECKSYMS %s
+
+CHECKSYMS: Name: .data
+CHECKSYMS-NEXT: Type: SHT_PROGBITS
+CHECKSYMS-NEXT: Flags [
+CHECKSYMS-NEXT: SHF_ALLOC
+CHECKSYMS-NEXT: SHF_WRITE
+CHECKSYMS-NEXT: ]
+CHECKSYMS-NEXT: Address: 0x401060
+
+CHECKSYMS: Name: MYSTRING
+CHECKSYMS-NEXT: Value: 0x401060
+*/
diff --git a/test/old-elf/linkerscript/symbol-definition.test b/test/old-elf/linkerscript/symbol-definition.test
new file mode 100644
index 000000000000..daa3b17e9965
--- /dev/null
+++ b/test/old-elf/linkerscript/symbol-definition.test
@@ -0,0 +1,54 @@
+/*
+We test whether we can define symbols in a linker script and have them exported
+to the output file symbol table.
+
+This test uses a single X86-64 input object, simple.o, created with the
+following X86-64 assembly code:
+
+*** simple.S:
+
+(command line clang -c simple.S -o simple.o)
+
+ .text
+ main:
+ mov $1, %eax
+ movq $1, %rdi
+ movq $msg, %rsi
+ movq $14, %rdx
+ syscall
+ ret
+
+ .globl _start
+ _start:
+ call main
+ mov $60, %eax
+ syscall
+ ret
+
+ .data
+ msg: .asciz "Hello, World!\n"
+
+
+We use the following linker script for this test:
+*/
+
+ENTRY(_start)
+
+SECTIONS
+{
+ . = 0x500000;
+ .text : { *(.text) }
+ MYSTRING = .;
+ .data : { *(.data) }
+}
+
+/*
+RUN: mkdir -p %T
+RUN: yaml2obj -format=elf %p/Inputs/simple.o.yaml -o=%T/simple.o
+
+RUN: lld -flavor old-gnu -target x86_64 -T %s %T/simple.o -static -o %t1
+RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+CHECKSYMS: Name: MYSTRING
+CHECKSYMS-NEXT: Value: 0x501000
+*/
diff --git a/test/old-elf/linkerscript/valid-script-cli.objtxt b/test/old-elf/linkerscript/valid-script-cli.objtxt
new file mode 100644
index 000000000000..a7342c41f529
--- /dev/null
+++ b/test/old-elf/linkerscript/valid-script-cli.objtxt
@@ -0,0 +1,23 @@
+# Check that the linker script inputs are accepted properly.
+
+# RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/valid.ls -r %s \
+# RUN: --output-filetype=yaml | FileCheck %s
+
+# RUN: lld -flavor old-gnu -target x86_64 -T %p/Inputs/valid.ls -r %s \
+# RUN: --output-filetype=yaml | FileCheck %s
+
+# RUN: lld -flavor old-gnu -target x86_64 --script=%p/Inputs/valid.ls -r %s \
+# RUN: --output-filetype=yaml | FileCheck %s
+
+# RUN: lld -flavor old-gnu -target x86_64 -L%p/Inputs/ -l:valid.ls -r %s \
+# RUN: --output-filetype=yaml | FileCheck %s
+
+defined-atoms:
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00, 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+
+# CHECK: _entry_point
diff --git a/test/old-elf/loginputfiles.test b/test/old-elf/loginputfiles.test
new file mode 100644
index 000000000000..f1b78558e9c5
--- /dev/null
+++ b/test/old-elf/loginputfiles.test
@@ -0,0 +1,28 @@
+# Tests functionality of -t
+#
+# Tests generated using the source files below
+# main file
+# int main()
+# {
+# fn();
+# return 0;
+# }
+#
+# archive file
+# int fn()
+# {
+# return 0;
+# }
+#
+# int fn1()
+# {
+# return 0;
+# }
+# gcc -c main.c fn.c fn1.c
+
+RUN: lld -flavor old-gnu -target x86_64-linux \
+RUN: %p/Inputs/mainobj.x86_64 %p/Inputs/libfnarchive.a -t --noinhibit-exec 2>&1 | \
+RUN: FileCheck -check-prefix INPUTFILES %s
+
+#INPUTFILES: mainobj.x86_64
+#INPUTFILES: libfnarchive.a(fn.o)
diff --git a/test/old-elf/mergeatoms.test b/test/old-elf/mergeatoms.test
new file mode 100644
index 000000000000..ec83ac2b8849
--- /dev/null
+++ b/test/old-elf/mergeatoms.test
@@ -0,0 +1,6 @@
+# Tests that atoms are merged by testing it with --merge-strings option
+RUN: lld -flavor old-gnu -target x86_64-linux --merge-strings -o %t1 \
+RUN: %p/Inputs/foo.o.x86-64 %p/Inputs/bar.o.x86-64 -e bar1
+RUN: llvm-objdump -s %t1 | FileCheck -check-prefix=mergeAtoms %s
+
+mergeAtoms: 62617200 666f6f00 bar.foo.
diff --git a/test/old-elf/mergeconstants.test b/test/old-elf/mergeconstants.test
new file mode 100644
index 000000000000..719ae8a8b24e
--- /dev/null
+++ b/test/old-elf/mergeconstants.test
@@ -0,0 +1,20 @@
+# The test checks for mergeable strings that appear in the object file
+RUN: lld -flavor old-gnu --merge-strings --output-filetype=yaml -target x86_64 \
+RUN: %p/Inputs/constants-merge.x86-64 --noinhibit-exec \
+RUN: | FileCheck -check-prefix=mergeAtoms %s
+
+mergeAtoms: - ref-name: [[CONSTANT:[-a-zA-Z0-9_]+]]
+mergeAtoms: type: constant
+mergeAtoms: content: [ 62, 61, 72, 66, 6F, 6F, 00 ]
+mergeAtoms: merge: by-content
+mergeAtoms: section-choice: custom-required
+mergeAtoms: section-name: .rodata.str1.1
+mergeAtoms: - name: foo
+mergeAtoms: scope: global
+mergeAtoms: type: data
+mergeAtoms: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+mergeAtoms: alignment: 8
+mergeAtoms: references:
+mergeAtoms: - kind: R_X86_64_64
+mergeAtoms: offset: 3
+mergeAtoms: target: [[CONSTANT]]
diff --git a/test/old-elf/mergeglobalatoms.test b/test/old-elf/mergeglobalatoms.test
new file mode 100644
index 000000000000..bf8dbf7593f0
--- /dev/null
+++ b/test/old-elf/mergeglobalatoms.test
@@ -0,0 +1,11 @@
+# ELF files can have mergeable strings which are global!, treat them as global
+# defined atoms
+RUN: lld -flavor old-gnu --output-filetype=yaml %p/Inputs/globalconst.o.x86-64 \
+RUN: --noinhibit-exec -target x86_64 | FileCheck -check-prefix=globalatoms %s
+
+globalatoms: - name: mystr
+globalatoms: scope: global
+globalatoms: type: constant
+globalatoms: content: [ 66, 6F, 6F, 62, 61, 72, 00 ]
+globalatoms: section-choice: custom-required
+globalatoms: section-name: .rodata.str1.1
diff --git a/test/old-elf/no-unique-section-names.test b/test/old-elf/no-unique-section-names.test
new file mode 100644
index 000000000000..4c5f79588dbe
--- /dev/null
+++ b/test/old-elf/no-unique-section-names.test
@@ -0,0 +1,19 @@
+# Check handling object files with non-unique named sections.
+
+RUN: lld -flavor old-gnu -target x86_64-linux -shared -o %t \
+RUN: %p/Inputs/no-unique-section-names.x86-64
+RUN: llvm-objdump -s %p/Inputs/no-unique-section-names.x86-64 %t \
+RUN: | FileCheck %s
+
+CHECK: Contents of section .group:
+CHECK-NEXT: 0000 01000000 08000000
+CHECK-NEXT: Contents of section .text:
+CHECK-NEXT: 0000 [[A1:[0-9a-f]+]] [[A2:[0-9a-f]+]] [[A3:[0-9a-f]+]]
+CHECK-NEXT: Contents of section .group:
+CHECK-NEXT: 0000 01000000 0a000000
+CHECK-NEXT: Contents of section .text:
+CHECK-NEXT: 0000 [[B1:[0-9a-f]+]] [[B2:[0-9a-f]+]] [[B3:[0-9a-f]+]]
+
+CHECK: Contents of section .text:
+CHECK: {{[0-9a-f]+}} [[A1]] [[A2]] [[A3]]
+CHECK-NEXT: {{[0-9a-f]+}} [[B1]] [[B2]] [[B3]]
diff --git a/test/old-elf/note.test b/test/old-elf/note.test
new file mode 100644
index 000000000000..aff01c3e5b2a
--- /dev/null
+++ b/test/old-elf/note.test
@@ -0,0 +1,50 @@
+# Check that the linker is not ignoring input sections.
+# RUN: yaml2obj -format=elf %s > %t.obj
+# RUN: lld -flavor old-gnu -target x86_64 %t.obj -o %t.exe --noinhibit-exec
+# RUN: llvm-readobj -s %t.exe | FileCheck %s
+
+# CHECK: Section {
+# CHECK: Name: .note
+# CHECK-NEXT: Type: SHT_NOTE
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .note
+ Type: SHT_NOTE
+ AddressAlign: 0x0000000000000001
+ Content: '00'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .note
+ Type: STT_SECTION
+ Section: .note
+...
diff --git a/test/old-elf/options/dynamic-linker.test b/test/old-elf/options/dynamic-linker.test
new file mode 100644
index 000000000000..6b56f17c677d
--- /dev/null
+++ b/test/old-elf/options/dynamic-linker.test
@@ -0,0 +1,17 @@
+# This tests the functionality of specifying dynamic-linker argument in the
+# command line
+RUN: lld -flavor old-gnu -target x86_64 --dynamic-linker="/xyz.so" \
+RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t
+RUN: llvm-objdump -s %t | FileCheck -check-prefix=DYNAMICINTERP1 %s
+RUN: lld -flavor old-gnu -target x86_64 --dynamic-linker="" \
+RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t1
+RUN: llvm-objdump -s %t1 | FileCheck -check-prefix=DYNAMICINTERP2 %s
+RUN: lld -flavor old-gnu -target x86_64 -dynamic-linker /xyz.so \
+RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t2
+RUN: llvm-objdump -s %t2 | FileCheck -check-prefix=DYNAMICINTERP1 %s
+
+DYNAMICINTERP1:Contents of section .interp:
+DYNAMICINTERP1: 400158 2f78797a 2e736f00 /xyz.so.
+DYNAMICINTERP2:Contents of section .interp:
+DYNAMICINTERP2: 400158 00
+
diff --git a/test/old-elf/options/target-specific-args.test b/test/old-elf/options/target-specific-args.test
new file mode 100644
index 000000000000..ec5edf0ad62e
--- /dev/null
+++ b/test/old-elf/options/target-specific-args.test
@@ -0,0 +1,5 @@
+# Test of target specific options
+# RUN: lld -flavor old-gnu -target x86_64 --target1-rel \
+# RUN: %p/../Inputs/foo.o.x86-64 --noinhibit-exec -o %t 2>&1 | FileCheck %s
+
+# CHECK: warning: ignoring unsupported ARM/ELF specific argument: --target1-rel
diff --git a/test/old-elf/phdr.test b/test/old-elf/phdr.test
new file mode 100644
index 000000000000..c8b3664d025f
--- /dev/null
+++ b/test/old-elf/phdr.test
@@ -0,0 +1,99 @@
+# This test checks emission for program header for ELF binaries
+RUN: lld -flavor old-gnu -target i386-linux -o %t1 -e main %p/Inputs/phdr.i386 \
+RUN: && llvm-readobj -program-headers %t1 | FileCheck -check-prefix=I386 %s
+RUN: lld -flavor old-gnu -target x86_64-linux -o %t1 -e _start %p/Inputs/relocs.x86-64 -static \
+RUN: && llvm-objdump -p %t1 | FileCheck %s -check-prefix=X86_64
+
+
+I386: ProgramHeaders [
+I386-NEXT: ProgramHeader {
+I386-NEXT: Type: PT_PHDR (0x6)
+I386-NEXT: Offset: 0x34
+I386-NEXT: VirtualAddress: 0x34
+I386-NEXT: PhysicalAddress: 0x34
+I386-NEXT: FileSize: 224
+I386-NEXT: MemSize: 224
+I386-NEXT: Flags [ (0x5)
+I386-NEXT: PF_R (0x4)
+I386-NEXT: PF_X (0x1)
+I386-NEXT: ]
+I386-NEXT: Alignment: 8
+I386-NEXT: }
+I386-NEXT: ProgramHeader {
+I386-NEXT: Type: PT_INTERP (0x3)
+I386-NEXT: Offset: 0x114
+I386-NEXT: VirtualAddress: 0x114
+I386-NEXT: PhysicalAddress: 0x114
+I386-NEXT: FileSize: 28
+I386-NEXT: MemSize: 28
+I386-NEXT: Flags [ (0x4)
+I386-NEXT: PF_R (0x4)
+I386-NEXT: ]
+I386-NEXT: Alignment: 1
+I386-NEXT: }
+I386-NEXT: ProgramHeader {
+I386-NEXT: Type: PT_LOAD (0x1)
+I386-NEXT: Offset: 0x0
+I386-NEXT: VirtualAddress: 0x0
+I386-NEXT: PhysicalAddress: 0x0
+I386-NEXT: FileSize: 556
+I386-NEXT: MemSize: 556
+I386-NEXT: Flags [ (0x5)
+I386-NEXT: PF_R (0x4)
+I386-NEXT: PF_X (0x1)
+I386-NEXT: ]
+I386-NEXT: Alignment: 4096
+I386-NEXT: }
+I386-NEXT: ProgramHeader {
+I386-NEXT: Type: PT_LOAD (0x1)
+I386-NEXT: Offset: 0x1000
+I386-NEXT: VirtualAddress: 0x1000
+I386-NEXT: PhysicalAddress: 0x1000
+I386-NEXT: FileSize: 260
+I386-NEXT: MemSize: 260
+I386-NEXT: Flags [ (0x6)
+I386-NEXT: PF_R (0x4)
+I386-NEXT: PF_W (0x2)
+I386-NEXT: ]
+I386-NEXT: Alignment: 4096
+I386-NEXT: }
+I386-NEXT: ProgramHeader {
+I386-NEXT: Type: PT_LOAD (0x1)
+I386-NEXT: Offset: 0x4000
+I386-NEXT: VirtualAddress: 0x4000
+I386-NEXT: PhysicalAddress: 0x4000
+I386-NEXT: FileSize: 4
+I386-NEXT: MemSize: 8
+I386-NEXT: Flags [ (0x6)
+I386-NEXT: PF_R (0x4)
+I386-NEXT: PF_W (0x2)
+I386-NEXT: ]
+I386-NEXT: Alignment: 16384
+I386-NEXT: }
+I386-NEXT: ProgramHeader {
+I386-NEXT: Type: PT_DYNAMIC (0x2)
+I386-NEXT: Offset: 0x1FC
+I386-NEXT: VirtualAddress: 0x1FC
+I386-NEXT: PhysicalAddress: 0x1FC
+I386-NEXT: FileSize: 48
+I386-NEXT: MemSize: 48
+I386-NEXT: Flags [ (0x4)
+I386-NEXT: PF_R (0x4)
+I386-NEXT: ]
+I386-NEXT: Alignment: 4
+I386-NEXT: }
+I386-NEXT: ProgramHeader {
+I386-NEXT: Type: PT_GNU_EH_FRAME (0x6474E550)
+I386-NEXT: Offset: 0x1F4
+I386-NEXT: VirtualAddress: 0x1F4
+I386-NEXT: PhysicalAddress: 0x1F4
+I386-NEXT: FileSize: 8
+I386-NEXT: MemSize: 8
+I386-NEXT: Flags [ (0x4)
+I386-NEXT: PF_R (0x4)
+I386-NEXT: ]
+I386-NEXT: Alignment: 4
+I386-NEXT: }
+
+X86_64: LOAD off 0x0000000000000000
+X86_64: LOAD off 0x0000000000001000
diff --git a/test/old-elf/quickdata.test b/test/old-elf/quickdata.test
new file mode 100644
index 000000000000..85ad23d0b8e9
--- /dev/null
+++ b/test/old-elf/quickdata.test
@@ -0,0 +1,15 @@
+RUN: lld -flavor old-gnu -target hexagon --output-filetype=yaml %p/Inputs/quickdata-test.elf-hexagon \
+RUN: --noinhibit-exec | FileCheck %s -check-prefix hexagon
+
+hexagon: - name: ac1
+hexagon: scope: global
+hexagon: type: zero-fill-quick
+hexagon: size: 1
+hexagon: merge: as-tentative
+hexagon: - name: init
+hexagon: scope: global
+hexagon: type: quick-data
+hexagon: - name: bss1
+hexagon: scope: global
+hexagon: type: zero-fill-quick
+
diff --git a/test/old-elf/reloc.test b/test/old-elf/reloc.test
new file mode 100644
index 000000000000..f8cb056e03da
--- /dev/null
+++ b/test/old-elf/reloc.test
@@ -0,0 +1,38 @@
+RUN: lld -flavor old-gnu -target i386 --merge-strings -r --output-filetype=yaml \
+RUN: %p/Inputs/reloc-test.elf-i386 | FileCheck %s -check-prefix ELF-i386
+
+ELF-i386: defined-atoms:
+ELF-i386: - ref-name: [[STRNAMEA:[-a-zA-Z0-9_]+]]
+ELF-i386: type: constant
+ELF-i386: content: [ 68, 65, 6C, 6C, 6F, 20, 77, 6F, 72, 6C, 64, 00 ]
+ELF-i386: merge: by-content
+ELF-i386: - ref-name: [[STRNAMEB:[-a-zA-Z0-9_]+]]
+ELF-i386: alignment: 16
+ELF-i386: section-choice: custom-required
+ELF-i386: section-name: .text.startup
+ELF-i386: references:
+ELF-i386: - kind: layout-after
+ELF-i386: offset: 0
+ELF-i386: target: main
+ELF-i386: - name: main
+ELF-i386: scope: global
+ELF-i386: content: [ 55, 89, E5, 83, E4, F0, 83, EC, 10, C7, 04, 24,
+ELF-i386: 00, 00, 00, 00, E8, FC, FF, FF, FF, 31, C0, C9,
+ELF-i386: C3 ]
+ELF-i386: alignment: 16
+ELF-i386: section-choice: custom-required
+ELF-i386: section-name: .text.startup
+ELF-i386: references:
+ELF-i386: - kind: R_386_32
+ELF-i386: offset: 12
+ELF-i386: target: [[STRNAMEA]]
+ELF-i386: - kind: R_386_PC32
+ELF-i386: offset: 17
+ELF-i386: target: puts
+ELF-i386: addend: 252
+ELF-i386: undefined-atoms:
+ELF-i386: - name: puts
+ELF-i386: absolute-atoms:
+ELF-i386: - name: test.c
+ELF-i386: scope: static
+ELF-i386: value: 0x0000000000000000
diff --git a/test/old-elf/responsefile.test b/test/old-elf/responsefile.test
new file mode 100644
index 000000000000..89e9ffd015bd
--- /dev/null
+++ b/test/old-elf/responsefile.test
@@ -0,0 +1,6 @@
+# RUN: not lld -flavor old-gnu --abc @%p/Inputs/responsefile --baz >& %t.log
+# RUN: FileCheck %s < %t.log
+
+CHECK: warning: ignoring unknown argument: --abc
+CHECK: warning: ignoring unknown argument: --inresponsefile
+CHECK: warning: ignoring unknown argument: --baz
diff --git a/test/old-elf/rodata.test b/test/old-elf/rodata.test
new file mode 100644
index 000000000000..12d9abb2a194
--- /dev/null
+++ b/test/old-elf/rodata.test
@@ -0,0 +1,5 @@
+RUN: lld -flavor old-gnu -target x86_64-linux -o %t %p/Inputs/constdata.x86-64 \
+RUN: -static -e _start
+RUN: llvm-objdump -s %t | FileCheck %s
+
+CHECK: Hellooooooooo
diff --git a/test/old-elf/rosegment.test b/test/old-elf/rosegment.test
new file mode 100644
index 000000000000..675dc3861867
--- /dev/null
+++ b/test/old-elf/rosegment.test
@@ -0,0 +1,26 @@
+# Tests that the option --rosegment produces an output file with a separate
+# segment created for read only data.
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/rodata.o -o %t1.elf \
+RUN: --noinhibit-exec
+RUN: lld -flavor old-gnu -target x86_64 %p/Inputs/rodata.o --rosegment -o %t2.elf \
+RUN: --noinhibit-exec
+RUN: llvm-readobj -program-headers %t1.elf | FileCheck %s -check-prefix=NORO-SEGMENT
+RUN: llvm-readobj -program-headers %t2.elf | FileCheck %s -check-prefix=RO-SEGMENT
+
+#NORO-SEGMENT: Type: PT_PHDR
+#NORO-SEGMENT: Type: PT_INTERP
+#NORO-SEGMENT: Type: PT_LOAD
+#NORO-SEGMENT: Type: PT_LOAD
+#NORO-SEGMENT: Type: PT_DYNAMIC
+#NORO-SEGMENT: Type: PT_GNU_EH_FRAME
+
+#RO-SEGMENT: Type: PT_PHDR
+#RO-SEGMENT: Type: PT_INTERP
+#RO-SEGMENT: Type: PT_LOAD
+#RO-SEGMENT: Type: PT_LOAD
+#RO-SEGMENT: Flags [
+#RO-SEGMENT: PF_R (0x4)
+#RO-SEGMENT: ]
+#RO-SEGMENT: Type: PT_LOAD
+#RO-SEGMENT: Type: PT_DYNAMIC
+#RO-SEGMENT: Type: PT_GNU_EH_FRAME
diff --git a/test/old-elf/sectionGroups/sectiongroup-new-members.test b/test/old-elf/sectionGroups/sectiongroup-new-members.test
new file mode 100644
index 000000000000..dff1a96b07ee
--- /dev/null
+++ b/test/old-elf/sectionGroups/sectiongroup-new-members.test
@@ -0,0 +1,151 @@
+# Checks that the linker picks the first group in the output file when the file
+# have some members dont appear in the first group.
+# 1a.s
+# ------
+#
+# .section .text,"axG",%progbits,foo_group,comdat
+# .weak foo
+#foo:
+# .word 0
+# 1b.s
+# -----
+# .section .text,"axG",%progbits,foo_group,comdat
+# .global foo
+# .global bar
+#foo:
+# .word 0
+#bar:
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \
+#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml
+#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \
+#RUN: --noinhibit-exec -o %t2.out
+#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml
+#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS
+#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS
+#CHECKGROUP: - name: foo
+#CHECKGROUP: scope: global
+#CHECKGROUP: merge: as-weak
+#CHECKGROUP: section-name: .text
+#CHECKGROUP: - name: foo_group
+#CHECKGROUP: scope: global
+#CHECKGROUP: type: group-comdat
+#CHECKGROUP: section-choice: custom-required
+#CHECKGROUP: section-name: .group
+#CHECKGROUP: permissions: ---
+#CHECKGROUP: references:
+#CHECKGROUP: - kind: group-child
+#CHECKGROUP: offset: 0
+#CHECKGROUP: target: foo
+#CHECKGROUPSECTIONS: Section {
+#CHECKGROUPSECTIONS: Name: .text
+#CHECKGROUPSECTIONS: Type: SHT_PROGBITS
+#CHECKGROUPSECTIONS: Flags [ (0x6)
+#CHECKGROUPSECTIONS: SHF_ALLOC (0x2)
+#CHECKGROUPSECTIONS: SHF_EXECINSTR (0x4)
+#CHECKGROUPSECTIONS: ]
+#CHECKGROUPSECTIONS: Size: 2
+#CHECKGROUPSECTIONS: AddressAlignment: 1
+#CHECKGROUPSECTIONS: }
+#CHECKSYMBOLS: Name: foo
+#CHECKSYMBOLS: Type: Function
+#CHECKSYMBOLS: Section: .text
+#CHECKSYMBOLS-NOT: Name: bar
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: foo_group
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '0000'
+Symbols:
+ Local:
+ - Name: foo_group
+ Section: .group
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Weak:
+ - Name: foo
+ Section: .text
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: foo_group
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '0000'
+Symbols:
+ Local:
+ - Name: foo_group
+ Section: .group
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: bar
+ Section: .text
+ Value: 0x0000000000000002
+ - Name: foo
+ Section: .text
+...
diff --git a/test/old-elf/sectionGroups/sectiongroup-simple.test b/test/old-elf/sectionGroups/sectiongroup-simple.test
new file mode 100644
index 000000000000..57707f84475e
--- /dev/null
+++ b/test/old-elf/sectionGroups/sectiongroup-simple.test
@@ -0,0 +1,144 @@
+# Checks that the linker picks the first group in the output file when the file
+# have some members dont appear in the first group.
+# 1a.s
+# ------
+# .section .text,"axG",%progbits,foo_group,comdat
+# .weak foo
+#foo:
+# .word 0
+# 1b.s
+# -----
+# .section .text,"axG",%progbits,foo_group,comdat
+# .global bar
+#bar:
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \
+#RUN: --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml
+#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \
+#RUN: --noinhibit-exec -o %t2.out
+#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml
+#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS
+#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS
+#CHECKGROUP: - name: foo
+#CHECKGROUP: scope: global
+#CHECKGROUP: merge: as-weak
+#CHECKGROUP: section-name: .text
+#CHECKGROUP: - name: foo_group
+#CHECKGROUP: scope: global
+#CHECKGROUP: type: group-comdat
+#CHECKGROUP: section-choice: custom-required
+#CHECKGROUP: section-name: .group
+#CHECKGROUP: permissions: ---
+#CHECKGROUP: references:
+#CHECKGROUP: - kind: group-child
+#CHECKGROUP: offset: 0
+#CHECKGROUP: target: foo
+#CHECKGROUPSECTIONS: Section {
+#CHECKGROUPSECTIONS: Name: .text
+#CHECKGROUPSECTIONS: Type: SHT_PROGBITS
+#CHECKGROUPSECTIONS: Flags [ (0x6)
+#CHECKGROUPSECTIONS: SHF_ALLOC (0x2)
+#CHECKGROUPSECTIONS: SHF_EXECINSTR (0x4)
+#CHECKGROUPSECTIONS: ]
+#CHECKGROUPSECTIONS: Size: 2
+#CHECKGROUPSECTIONS: AddressAlignment: 1
+#CHECKGROUPSECTIONS: }
+#CHECKSYMBOLS: Name: foo
+#CHECKSYMBOLS: Type: Function
+#CHECKSYMBOLS: Section: .text
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: foo_group
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '0000'
+Symbols:
+ Local:
+ - Name: foo_group
+ Section: .group
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Weak:
+ - Name: foo
+ Section: .text
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: foo_group
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: foo_group
+ Section: .group
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: bar
+ Section: .text
+...
diff --git a/test/old-elf/sectionGroups/sectiongroup-undef-member-other.test b/test/old-elf/sectionGroups/sectiongroup-undef-member-other.test
new file mode 100644
index 000000000000..56595e59d8d6
--- /dev/null
+++ b/test/old-elf/sectionGroups/sectiongroup-undef-member-other.test
@@ -0,0 +1,156 @@
+# Tests that linker throws an error for an undefined symbol in the section
+# group, which is the same as the signature in the next input file.
+# comdat1.s
+# ------------
+# .section .foo,"axG",@progbits,g1,comdat
+# .word g1
+#comdat2.s
+#-----------
+# .global g1
+# .section .bar,"axG",@progbits,g1,comdat
+#g2:
+# nop
+# .section .car,"axG",@progbits,g1,comdat
+#g3:
+# nop
+#
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \
+#RUN: --noinhibit-exec -o %t2.out 2>&1 | FileCheck %s
+#CHECK: Undefined symbol: {{.*}} g1
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - SectionOrType: .rela.foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '0000'
+ - Name: .rela.foo
+ Type: SHT_RELA
+ Flags: [ SHF_GROUP ]
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .foo
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: g1
+ Type: R_X86_64_16
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ - Name: .group
+ Type: STT_SECTION
+ Section: .group
+ Global:
+ - Name: g1
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .bar
+ - SectionOrType: .car
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .bar
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '90'
+ - Name: .car
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '90'
+Symbols:
+ Local:
+ - Name: g2
+ Section: .bar
+ - Name: g3
+ Section: .car
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .bar
+ Type: STT_SECTION
+ Section: .bar
+ - Name: .car
+ Type: STT_SECTION
+ Section: .car
+ - Name: .group
+ Type: STT_SECTION
+ Section: .group
+ Global:
+ - Name: g1
+ Section: .group
+...
diff --git a/test/old-elf/sectionGroups/sectiongroup-undef-member.test b/test/old-elf/sectionGroups/sectiongroup-undef-member.test
new file mode 100644
index 000000000000..65e9ec7632bf
--- /dev/null
+++ b/test/old-elf/sectionGroups/sectiongroup-undef-member.test
@@ -0,0 +1,142 @@
+# Tests that linker throws an error for an undefined symbol in the section
+# group.
+#
+#comdata.s
+#------------
+# .section .foo,"axG",@progbits,g1,comdat
+# .word g1
+#
+#comdatb.s
+#------------
+# .global g1
+# .section .foo,"axG",@progbits,g1,comdat
+#g1:
+# nop
+#
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.group1a.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.group1b.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.group1a.o %t.group1b.o \
+#RUN: --noinhibit-exec -o %t2.out 2>&1 | FileCheck %s
+#CHECK: Undefined symbol: {{.*}} g1
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - SectionOrType: .rela.foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '0000'
+ - Name: .rela.foo
+ Type: SHT_RELA
+ Flags: [ SHF_GROUP ]
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .foo
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: g1
+ Type: R_X86_64_16
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ - Name: .group
+ Type: STT_SECTION
+ Section: .group
+ Global:
+ - Name: g1
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '90'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ - Name: .group
+ Type: STT_SECTION
+ Section: .group
+ Global:
+ - Name: g1
+ Section: .foo
+...
diff --git a/test/old-elf/sectionGroups/sectiongroup-with-globalsymbols.test b/test/old-elf/sectionGroups/sectiongroup-with-globalsymbols.test
new file mode 100644
index 000000000000..9f8f80c23605
--- /dev/null
+++ b/test/old-elf/sectionGroups/sectiongroup-with-globalsymbols.test
@@ -0,0 +1,250 @@
+# This tests that comdat weak symbol can be overridden by a global symbol.
+# comdat1.s
+#------------------------
+# .weak g1
+# .section .foo,"axG",@progbits,g1,comdat
+#g1:
+# nop
+# .global g2
+#g2:
+# nop
+#!
+#
+#comdat2.s << \!
+#-----------------
+# .global g1
+# .section .foo,"axG",@progbits,g1,comdat
+#g1:
+# nop
+# .global g2
+#g2:
+# nop
+#
+#cat > g1.c << \!
+#int g1() {
+# return 0;
+#}
+#
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.comdat1.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.comdat2.o
+#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.g1.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \
+#RUN: %t.g1.o --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml
+#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \
+#RUN: %t.g1.o --noinhibit-exec -o %t2.out
+#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml
+#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS
+#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS
+#CHECKGROUP: - name: g2
+#CHECKGROUP: content: [ 90 ]
+#CHECKGROUP: section-choice: custom-required
+#CHECKGROUP: section-name: .foo
+#CHECKGROUP: - name: g1
+#CHECKGROUP: scope: global
+#CHECKGROUP: content: [ 55, 48, 89, E5, 31, C0, 5D, C3 ]
+#CHECKGROUP: alignment: 16
+#CHECKGROUP: section-name: .text
+#CHECKGROUPSECTIONS: Name: .text
+#CHECKGROUPSECTIONS: Type: SHT_PROGBITS
+#CHECKGROUPSECTIONS: Flags [
+#CHECKGROUPSECTIONS: SHF_ALLOC
+#CHECKGROUPSECTIONS: SHF_EXECINSTR
+#CHECKGROUPSECTIONS: ]
+#CHECKGROUPSECTIONS: Size: 8
+#CHECKGROUPSECTIONS: Name: .foo
+#CHECKGROUPSECTIONS: Type: SHT_PROGBITS
+#CHECKGROUPSECTIONS: Flags [
+#CHECKGROUPSECTIONS: SHF_ALLOC
+#CHECKGROUPSECTIONS: SHF_EXECINSTR
+#CHECKGROUPSECTIONS: ]
+#CHECKGROUPSECTIONS: Size: 2
+#CHECKSYMBOLS: Name: g2
+#CHECKSYMBOLS: Section: .foo
+#CHECKSYMBOLS: Name: g1
+#CHECKSYMBOLS: Section: .text
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '9090'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ Global:
+ - Name: g2
+ Section: .foo
+ Value: 0x0000000000000001
+ Weak:
+ - Name: g1
+ Section: .foo
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '9090'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ Global:
+ - Name: g1
+ Section: .foo
+ - Name: g2
+ Section: .foo
+ Value: 0x0000000000000001
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E531C05DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232393535372920286C6C766D2F7472756E6B203232393536332900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000000800000000410E108602430D0600000000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+Symbols:
+ Local:
+ - Name: g1.c
+ Type: STT_FILE
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: g1
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000008
+...
diff --git a/test/old-elf/sectionGroups/sectiongroup-with-undef-external-reference.test b/test/old-elf/sectionGroups/sectiongroup-with-undef-external-reference.test
new file mode 100644
index 000000000000..0c5d65ad544f
--- /dev/null
+++ b/test/old-elf/sectionGroups/sectiongroup-with-undef-external-reference.test
@@ -0,0 +1,236 @@
+# This tests that comdat undef symbol is overridden by a global symbol.
+# comdat1.s
+#------------------------
+# .global g1
+# .section .foo,"axG",@progbits,g1,comdat
+#g1:
+# .word 5
+#
+#comdat2.s << \!
+#-----------------
+# .global g1
+# .section .foo,"axG",@progbits,g1,comdat
+#g1:
+# nop
+#
+#g1.c
+#-----------
+#extern int g1;
+#int fn() { return g1;}
+#
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.comdat1.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.comdat2.o
+#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.g1.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \
+#RUN: %t.g1.o --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml
+#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \
+#RUN: %t.g1.o --noinhibit-exec -o %t2.out
+#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml
+#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS
+#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS
+#CHECKGROUP: - name: g1
+#CHECKGROUP: scope: global
+#CHECKGROUP: content: [ 05, 00 ]
+#CHECKGROUP: section-name: .foo
+#CHECKGROUPSECTIONS: Section {
+#CHECKGROUPSECTIONS: Name: .foo
+#CHECKGROUPSECTIONS: Type: SHT_PROGBITS
+#CHECKGROUPSECTIONS: Flags [
+#CHECKGROUPSECTIONS: SHF_ALLOC
+#CHECKGROUPSECTIONS: SHF_EXECINSTR
+#CHECKGROUPSECTIONS: ]
+#CHECKGROUPSECTIONS: Size: 2
+#CHECKGROUPSECTIONS: }
+#CHECKSYMBOLS: Name: g1
+#CHECKSYMBOLS: Section: .foo
+#CHECKSYMBOLS: Name: fn
+#CHECKSYMBOLS: Section: .text
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '0500'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ Global:
+ - Name: g1
+ Section: .foo
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '90'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ Global:
+ - Name: g1
+ Section: .foo
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E58B0425000000005DC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000007
+ Symbol: g1
+ Type: R_X86_64_32S
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232393535372920286C6C766D2F7472756E6B203232393536332900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C0708900100001C0000001C000000000000000D00000000410E108602430D0600000000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+Symbols:
+ Local:
+ - Name: global-g1.c
+ Type: STT_FILE
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: fn
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000000D
+ - Name: g1
+...
diff --git a/test/old-elf/sectionGroups/sectiongroup-with-undef-signature.test b/test/old-elf/sectionGroups/sectiongroup-with-undef-signature.test
new file mode 100644
index 000000000000..83a69a3828b2
--- /dev/null
+++ b/test/old-elf/sectionGroups/sectiongroup-with-undef-signature.test
@@ -0,0 +1,219 @@
+# This tests that comdat undef symbol is overridden by a global symbol.
+# comdat1.s
+#------------------------
+# .section .foo,"axG",@progbits,g1,comdat
+# word g1
+#
+#comdat2.s << \!
+#-----------------
+# .global g1
+# .section .foo,"axG",@progbits,g1,comdat
+#g1:
+# nop
+#
+#global-g1.c
+#-----------
+#int g1=10;
+#
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.comdat1.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.comdat2.o
+#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.g1.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \
+#RUN: %t.g1.o --noinhibit-exec --output-filetype=yaml -o %t2.out.yaml
+#RUN: lld -flavor old-gnu -target x86_64 %t.comdat1.o %t.comdat2.o \
+#RUN: %t.g1.o --noinhibit-exec -o %t2.out
+#RUN: FileCheck %s -check-prefix=CHECKGROUP < %t2.out.yaml
+#RUN: llvm-readobj -sections %t2.out | FileCheck %s -check-prefix=CHECKGROUPSECTIONS
+#RUN: llvm-readobj -symbols %t2.out | FileCheck %s -check-prefix=CHECKSYMBOLS
+#CHECKGROUP: - name: g1
+#CHECKGROUP: scope: global
+#CHECKGROUP: content: [ 0A, 00, 00, 00 ]
+#CHECKGROUP: section-name: .data
+#CHECKGROUPSECTIONS: Name: .foo
+#CHECKGROUPSECTIONS: Type: SHT_PROGBITS
+#CHECKGROUPSECTIONS: Flags [
+#CHECKGROUPSECTIONS: SHF_ALLOC
+#CHECKGROUPSECTIONS: SHF_EXECINSTR
+#CHECKGROUPSECTIONS: ]
+#CHECKGROUPSECTIONS: Size: 2
+#CHECKGROUPSECTIONS: Name: .data
+#CHECKGROUPSECTIONS: Type: SHT_PROGBITS
+#CHECKGROUPSECTIONS: Flags [
+#CHECKGROUPSECTIONS: SHF_ALLOC
+#CHECKGROUPSECTIONS: SHF_WRITE
+#CHECKGROUPSECTIONS: ]
+#CHECKGROUPSECTIONS: Size: 4
+#CHECKSYMBOLS: Name: g1
+#CHECKSYMBOLS: Section: .data
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - SectionOrType: .rela.foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '0000'
+ - Name: .rela.foo
+ Type: SHT_RELA
+ Flags: [ SHF_GROUP ]
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .foo
+ Relocations:
+ - Offset: 0x0000000000000000
+ Symbol: g1
+ Type: R_X86_64_16
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ Global:
+ - Name: g1
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ AddressAlign: 0x0000000000000004
+ Info: g1
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .foo
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ AddressAlign: 0x0000000000000001
+ Content: '90'
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .foo
+ Type: STT_SECTION
+ Section: .foo
+ Global:
+ - Name: g1
+ Section: .foo
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: 0A000000
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232393535372920286C6C766D2F7472756E6B203232393536332900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+Symbols:
+ Local:
+ - Name: global-g1.c
+ Type: STT_FILE
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ Global:
+ - Name: g1
+ Type: STT_OBJECT
+ Section: .data
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/sections.test b/test/old-elf/sections.test
new file mode 100644
index 000000000000..f36cad619186
--- /dev/null
+++ b/test/old-elf/sections.test
@@ -0,0 +1,142 @@
+# This test checks if sections are created properly in the output that appear in
+# the input
+RUN: lld -flavor old-gnu -target i386 -o %t1 %p/Inputs/section-test.i386 \
+RUN: -static -e baz
+RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix=OBJDUMP %s
+RUN: llvm-readobj -h -s -t %t1 | FileCheck -check-prefix=READOBJ %s
+
+OBJDUMP: 0 00000000 0000000000000000
+OBJDUMP: 1 .text 0000000a 0000000000000074 TEXT DATA
+OBJDUMP: 2 .data 00000004 0000000000001000 DATA
+OBJDUMP: 3 .special 00000004 0000000000001004 DATA
+OBJDUMP: 4 .anotherspecial 00000004 0000000000001008 DATA
+OBJDUMP: 5 .bss 00000004 000000000000100c BSS
+OBJDUMP: 6 .shstrtab {{[0-9a-f]+}} 0000000000000000
+OBJDUMP: 7 .symtab {{[0-9a-f]+}} 0000000000000000
+OBJDUMP: 8 .strtab {{[0-9a-f]+}} 0000000000000000
+
+READOBJ: Format: ELF32-i386
+READOBJ: Arch: i386
+READOBJ: AddressSize: 32bit
+READOBJ: ElfHeader {
+READOBJ: Ident {
+READOBJ: DataEncoding: LittleEndian (0x1)
+READOBJ: }
+READOBJ: Machine: EM_386
+READOBJ: }
+
+READOBJ: Sections [
+READOBJ: Section {
+READOBJ: Index: 0
+READOBJ: Name: (0)
+READOBJ: Type: SHT_NULL
+READOBJ: Flags [ (0x0)
+READOBJ: ]
+READOBJ: Address: 0x0
+READOBJ: Size: 0
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 1
+READOBJ: Name: .text
+READOBJ: Type: SHT_PROGBITS
+READOBJ: Flags [ (0x6)
+READOBJ: SHF_ALLOC
+READOBJ: SHF_EXECINSTR
+READOBJ: ]
+READOBJ: Address: 0x74
+READOBJ: Size: 10
+READOBJ: AddressAlignment: 4
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 2
+READOBJ: Name: .data
+READOBJ: Type: SHT_PROGBITS
+READOBJ: Flags [ (0x3)
+READOBJ: SHF_ALLOC
+READOBJ: SHF_WRITE
+READOBJ: ]
+READOBJ: Address: 0x1000
+READOBJ: Size: 4
+READOBJ: AddressAlignment: 4
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 3
+READOBJ: Name: .special
+READOBJ: Type: SHT_PROGBITS
+READOBJ: Flags [ (0x3)
+READOBJ: SHF_ALLOC
+READOBJ: SHF_WRITE
+READOBJ: ]
+READOBJ: Address: 0x1004
+READOBJ: Size: 4
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 4
+READOBJ: Name: .anotherspecial
+READOBJ: Type: SHT_PROGBITS
+READOBJ: Flags [ (0x3)
+READOBJ: SHF_ALLOC
+READOBJ: SHF_WRITE
+READOBJ: ]
+READOBJ: Address: 0x1008
+READOBJ: Size: 4
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 5
+READOBJ: Name: .bss
+READOBJ: Type: SHT_NOBITS
+READOBJ: Flags [ (0x3)
+READOBJ: SHF_ALLOC
+READOBJ: SHF_WRITE
+READOBJ: ]
+READOBJ: Address: 0x100C
+READOBJ: Size: 4
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 6
+READOBJ: Name: .shstrtab
+READOBJ: Type: SHT_STRTAB
+READOBJ: Flags [ (0x0)
+READOBJ: ]
+READOBJ: Address: 0x0
+READOBJ: Link: 0
+READOBJ: AddressAlignment: 1
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 7
+READOBJ: Name: .symtab
+READOBJ: Type: SHT_SYMTAB
+READOBJ: Flags [ (0x0)
+READOBJ: ]
+READOBJ: Address: 0x0
+READOBJ: Link: 8
+READOBJ: AddressAlignment: 4
+READOBJ: EntrySize: 16
+READOBJ: }
+READOBJ: Section {
+READOBJ: Index: 8
+READOBJ: Name: .strtab
+READOBJ: Type: SHT_STRTAB
+READOBJ: Flags [ (0x0)
+READOBJ: ]
+READOBJ: Address: 0x0
+READOBJ: }
+READOBJ: ]
+
+READOBJ: Symbols [
+READOBJ: Symbol {
+READOBJ: Name: baz
+READOBJ: Value: 0x74
+READOBJ: Size: 10
+READOBJ: Binding: Global
+READOBJ: Type: Function
+READOBJ: Section: .text
+READOBJ: }
+READOBJ: Symbol {
+READOBJ: Name: y
+READOBJ: Value: 0x1004
+READOBJ: Size: 4
+READOBJ: Binding: Global
+READOBJ: Type: Object
+READOBJ: Section: .special
+READOBJ: }
diff --git a/test/old-elf/sh_addralign.test b/test/old-elf/sh_addralign.test
new file mode 100644
index 000000000000..97ddd5f1030a
--- /dev/null
+++ b/test/old-elf/sh_addralign.test
@@ -0,0 +1,37 @@
+# Check handling of section alignment.
+# RUN: yaml2obj -format=elf %s > %t-obj
+# RUN: lld -flavor old-gnu -target arm64 -o %t-exe %t-obj
+# RUN: llvm-objdump -h %t-exe | FileCheck %s
+
+# CHECK: 8 .data 00000000 0000000000402000 DATA
+
+!ELF
+FileHeader: !FileHeader
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_AARCH64
+
+Sections:
+- Name: .text
+ Type: SHT_PROGBITS
+ Content: ''
+ AddressAlign: 0
+ Flags: [SHF_ALLOC, SHF_EXECINSTR]
+- Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 1
+ Size: 0x1000
+- Name: .data
+ Type: SHT_PROGBITS
+ Content: ''
+ AddressAlign: 4096
+ Flags: [SHF_ALLOC, SHF_WRITE]
+
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Value: 0x0
+ Size: 4
diff --git a/test/old-elf/shndx.test b/test/old-elf/shndx.test
new file mode 100644
index 000000000000..c86fa3349b5f
--- /dev/null
+++ b/test/old-elf/shndx.test
@@ -0,0 +1,18 @@
+Test that we can handle shndx. The test file has a shndx despite having only
+a few sections. One might consider it invalid, but it has a clear interpretation
+and avoids needing 65K sections to test the corresponding code path.
+
+RUN: lld -target x86_64-pc-linux -flavor old-gnu %p/Inputs/shndx.o-x86_64 -o %t.so -shared
+RUN: llvm-readobj -s -t %t.so | FileCheck %s
+
+CHECK: Name: .text
+CHECK-NEXT: Type: SHT_PROGBITS (0x1)
+CHECK-NEXT: Flags [ (0x6)
+CHECK-NEXT: SHF_ALLOC (0x2)
+CHECK-NEXT: SHF_EXECINSTR (0x4)
+CHECK-NEXT: ]
+CHECK-NEXT: Address: [[ADDR:.*]]
+
+// CHECK: Symbol {
+// CHECK: Name: foo
+// CHECK-NEXT: Value: [[ADDR]]
diff --git a/test/old-elf/soname.test b/test/old-elf/soname.test
new file mode 100644
index 000000000000..b4dce9746d48
--- /dev/null
+++ b/test/old-elf/soname.test
@@ -0,0 +1,6 @@
+RUN: lld -flavor old-gnu -shared -target i386 -e main %p/Inputs/writersyms.o \
+RUN: -o %t -soname libtest.so
+RUN: llvm-readobj -dynamic-table %t | FileCheck %s
+
+CHECK: LoadName: libtest.so
+CHECK: 0x0000000E SONAME LibrarySoname (libtest.so)
diff --git a/test/old-elf/start-stop-sym.test b/test/old-elf/start-stop-sym.test
new file mode 100644
index 000000000000..62c16a91ee69
--- /dev/null
+++ b/test/old-elf/start-stop-sym.test
@@ -0,0 +1,108 @@
+# Check __start_XXX and __stop_XXX symbols handling where XXX
+# is a section name which can be represented as a C identifier.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor old-gnu -target mipsel -static -e T0 -o %t.exe %t1.o %t2.o
+# RUN: llvm-objdump -s -t %t.exe | FileCheck %s
+
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 400080 a0004000 b4004000 00000000 00000000
+# ^ start of _csec section
+# ^ end of _csec section
+# CHECK-NEXT: 400090 a0004000 b4004000
+# CHECK-NEXT: Contents of section _csec:
+# CHECK-NEXT: 4000a0 00000000 00000000 00000000 00000000
+# CHECK-NEXT: 4000b0 00000000
+
+# CHECK: 004000a0 g *ABS* 00000000 __start__csec
+# CHECK: 004000b4 g *ABS* 00000000 __stop__csec
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 8
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: __start__csec
+ Type: R_MIPS_32
+ - Offset: 4
+ Symbol: __stop__csec
+ Type: R_MIPS_32
+
+ - Name: _csec
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Weak:
+ - Name: __start__csec
+ - Name: __stop__csec
+ Global:
+ - Name: T0
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+
+---
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_MIPS
+ Flags: [EF_MIPS_CPIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32]
+
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 16
+ Size: 8
+
+ - Name: .rel.text
+ Type: SHT_REL
+ Link: .symtab
+ AddressAlign: 4
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Symbol: __start__csec
+ Type: R_MIPS_32
+ - Offset: 4
+ Symbol: __stop__csec
+ Type: R_MIPS_32
+
+ - Name: _csec
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 16
+ Size: 4
+
+Symbols:
+ Weak:
+ - Name: __start__csec
+ - Name: __stop__csec
+ Global:
+ - Name: T1
+ Type: STT_FUNC
+ Section: .text
+ Size: 8
+...
diff --git a/test/old-elf/strip-all.test b/test/old-elf/strip-all.test
new file mode 100644
index 000000000000..faf30349ec84
--- /dev/null
+++ b/test/old-elf/strip-all.test
@@ -0,0 +1,108 @@
+# Tests the --strip-all (-s) flag.
+# We expect that .symtab and .strtab are stripped from the final executable.
+#
+# The following code was used to generate the object.
+# $ clang -c blah.c -o blah
+#
+# void
+# callMeMaybe(int *v)
+# {
+# *v += 1;
+# }
+#
+# int
+# main(void)
+# {
+#
+# int blah = 42;
+# callMeMaybe(&blah);
+# }
+
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.o -e=main --strip-all -o %t1
+#RUN: llvm-objdump -section-headers %t1 | FileCheck %s
+
+#CHECK: 14 .shstrtab 0000007d 0000000000000000
+#CHECK-NOT: 15 .symtab 00000198 0000000000000000
+#CHECK-NOT: 16 .strtab 000000e4 0000000000000000
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E548897DF8488B7DF88B07050100000089075DC3660F1F840000000000554889E54883EC10488D7DFCC745FC2A000000E8C8FFFFFFB8000000004883C4105DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000001700000000410E108602430D060000001800000038000000000000002300000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: callMeMaybe
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000017
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000020
+ Size: 0x0000000000000023
+...
diff --git a/test/old-elf/stripped-empty.test b/test/old-elf/stripped-empty.test
new file mode 100644
index 000000000000..ddf3b3899d10
--- /dev/null
+++ b/test/old-elf/stripped-empty.test
@@ -0,0 +1,4 @@
+RUN: lld -flavor old-gnu -shared -o test.so \
+RUN: -target x86_64 %p/Inputs/stripped-empty.x86_64
+
+test that we handle files without a symbol table.
diff --git a/test/old-elf/symbols.test b/test/old-elf/symbols.test
new file mode 100644
index 000000000000..bcf399e86eb8
--- /dev/null
+++ b/test/old-elf/symbols.test
@@ -0,0 +1,33 @@
+# Tests the functionality of archive libraries reading
+# and resolution
+# Note: The binary files would not be required once we have support to generate
+# binary archives from textual(yaml) input
+#
+# Tests generated using the source files below
+# main file
+#
+#extern int __bss_start __attribute__ ((weak));
+#int a;
+#int main()
+#{
+# return 0;
+#}
+#
+
+RUN: lld -flavor old-gnu -target i386 -e main %p/Inputs/writersyms.o -o %t1
+RUN: llvm-nm -n %t1 | FileCheck -check-prefix CHECKSYMS %s
+RUN: lld -flavor old-gnu -shared -target i386 -e main %p/Inputs/writersyms.o -o %t1
+RUN: llvm-nm -n %t1 | FileCheck -check-prefix CHECKSHAREDSYMS %s
+
+CHECKSYMS: {{[0-9a-f]+}} a 1.c
+CHECKSYMS: {{[0-9a-f]+}} T main
+CHECKSYMS: {{[0-9a-f]+}} A __bss_start
+CHECKSYMS: {{[0-9a-f]+}} B a
+CHECKSYMS: {{[0-9a-f]+}} A __bss_end
+CHECKSYMS: {{[0-9a-f]+}} A _end
+CHECKSYMS: {{[0-9a-f]+}} A end
+
+CHECKSHAREDSYMS: {{[0-9a-f]+}} a 1.c
+CHECKSHAREDSYMS: {{[0-9a-f]+}} T main
+CHECKSHAREDSYMS: {{[0-9a-f]+}} B a
+CHECKSHAREDSYMS: {{[0-9a-f]+}} A _end
diff --git a/test/old-elf/tls-tbss-size.test b/test/old-elf/tls-tbss-size.test
new file mode 100644
index 000000000000..a7fd86cb7b43
--- /dev/null
+++ b/test/old-elf/tls-tbss-size.test
@@ -0,0 +1,176 @@
+# This test verify if external TLS non initialized variables (tbss) are
+# accounted in TBSS segment size
+
+# The input file 'test/elf/Inputs/tls-tbss-size.yaml' declares:
+#
+# __thread int t0;
+# __thread int t1;
+# __thread int t2;
+# __thread int t3;
+#
+# And the 'test/elf/tls-tbss-size.test' defines:
+#
+# __thread int t4;
+# __thread int t5;
+# __thread int t6;
+# __thread int t7;
+#
+# __thread int t8 = 3;
+# __thread int t9 = 4;
+# __thread int t10 = 5;
+# __thread int t11 = 6;
+
+#RUN: yaml2obj -format=elf -o=%t-t1.o %p/Inputs/tls-tbss-size.yaml
+#RUN: yaml2obj -format=elf -o=%t-t0.o %s
+#RUN: lld -flavor old-gnu -target x86_64-linux --noinhibit-exec -o %t.exe %t-t0.o %t-t1.o
+#RUN: llvm-readobj --sections %t.exe | FileCheck %s
+
+#CHECK: Sections [
+#CHECK: Section {
+#CHECK: Index: 9
+#CHECK: Name: .tdata (71)
+#CHECK: Size: 16
+#CHECK: }
+#CHECK: Section {
+#CHECK: Index: 10
+#CHECK: Name: .tbss (78)
+#CHECK: Size: 32
+#CHECK: }
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 488B050000000064C70001000000488B050000000064C70002000000488B050000000064C70003000000488B050000000064C7000400000064C70425000000000500000064C70425000000000600000064C70425000000000700000064C70425000000000800000031C0C3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000003
+ Symbol: t0
+ Type: R_X86_64_GOTTPOFF
+ Addend: -4
+ - Offset: 0x0000000000000011
+ Symbol: t1
+ Type: R_X86_64_GOTTPOFF
+ Addend: -4
+ - Offset: 0x000000000000001F
+ Symbol: t2
+ Type: R_X86_64_GOTTPOFF
+ Addend: -4
+ - Offset: 0x000000000000002D
+ Symbol: t3
+ Type: R_X86_64_GOTTPOFF
+ Addend: -4
+ - Offset: 0x000000000000003C
+ Symbol: t4
+ Type: R_X86_64_TPOFF32
+ - Offset: 0x0000000000000048
+ Symbol: t5
+ Type: R_X86_64_TPOFF32
+ - Offset: 0x0000000000000054
+ Symbol: t6
+ Type: R_X86_64_TPOFF32
+ - Offset: 0x0000000000000060
+ Symbol: t7
+ Type: R_X86_64_TPOFF32
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .tdata
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Content: '03000000040000000500000006000000'
+ - Name: .tbss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC, SHF_TLS ]
+ AddressAlign: 0x0000000000000004
+ Size: 16
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000017A5200017810011B0C070890010000140000001C000000000000006B0000000000000000000000
+Symbols:
+ Local:
+ - Name: .tbss
+ Type: STT_TLS
+ Section: .tbss
+ - Name: .tdata
+ Type: STT_TLS
+ Section: .tdata
+ - Type: STT_SECTION
+ Section: .text
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000006B
+ - Name: t0
+ Type: STT_TLS
+ - Name: t1
+ Type: STT_TLS
+ - Name: t10
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x0000000000000008
+ Size: 0x0000000000000004
+ - Name: t11
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x000000000000000C
+ Size: 0x0000000000000004
+ - Name: t2
+ Type: STT_TLS
+ - Name: t3
+ Type: STT_TLS
+ - Name: t4
+ Type: STT_TLS
+ Section: .tbss
+ Size: 0x0000000000000004
+ - Name: t5
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+ - Name: t6
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x0000000000000008
+ Size: 0x0000000000000004
+ - Name: t7
+ Type: STT_TLS
+ Section: .tbss
+ Value: 0x000000000000000C
+ Size: 0x0000000000000004
+ - Name: t8
+ Type: STT_TLS
+ Section: .tdata
+ Size: 0x0000000000000004
+ - Name: t9
+ Type: STT_TLS
+ Section: .tdata
+ Value: 0x0000000000000004
+ Size: 0x0000000000000004
+...
diff --git a/test/old-elf/tls.test b/test/old-elf/tls.test
new file mode 100644
index 000000000000..6fb33941a88c
--- /dev/null
+++ b/test/old-elf/tls.test
@@ -0,0 +1,43 @@
+# REQUIRES: x86
+
+# This tests verifies that TLS variables have correct offsets
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 -static \
+RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s -check-prefix=YAML
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tls.x86-64 -o %t \
+RUN: --noinhibit-exec -e main -static && llvm-objdump -d %t | FileCheck %s
+
+// Verify that the TLS accesses have the correct offsets.
+
+YAML: name: main
+YAML: references:
+YAML: kind: R_X86_64_TPOFF32
+YAML: offset: 9
+YAML: target: tls1
+YAML: kind: R_X86_64_TPOFF32
+YAML: offset: 17
+YAML: target: tls0
+YAML: kind: R_X86_64_TPOFF32
+YAML: offset: 25
+YAML: target: tls2
+
+YAML: name: GOTTPOFF
+YAML: kind: R_X86_64_GOTTPOFF
+YAML: target: [[GOTNAME:[a-zA-Z0-9_]+]]
+
+YAML: type: got
+YAML: references:
+YAML: kind: R_X86_64_TPOFF64
+YAML: target: tls2
+
+// main
+CHECK: addl %fs:-4
+CHECK: addl %fs:-8
+CHECK: addl %fs:-12
+
+// GOTTPOFF
+CHECK: movq {{[0-9]+}}(%rip)
+
+// TLSLD
+CHECK: movq %fs:0, %rax
+CHECK: leaq -8(%rax), %rax
diff --git a/test/old-elf/tlsAddr.test b/test/old-elf/tlsAddr.test
new file mode 100644
index 000000000000..bcb089c504ed
--- /dev/null
+++ b/test/old-elf/tlsAddr.test
@@ -0,0 +1,7 @@
+# This tests verifies that TLS variables have correct offsets
+# and that TBSS doesn't occupy memory
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/tlsAddr.x86-64 -static \
+RUN: -o %t --noinhibit-exec
+RUN: llvm-objdump -section-headers %t | FileCheck -check-prefix=CHECKADDR %s
+
+CHECKADDR: {{[0-9]+}} .data 00000000 0000000000401008 DATA
diff --git a/test/old-elf/undef-from-dso-to-main.test b/test/old-elf/undef-from-dso-to-main.test
new file mode 100644
index 000000000000..c19a0197061e
--- /dev/null
+++ b/test/old-elf/undef-from-dso-to-main.test
@@ -0,0 +1,52 @@
+# Tests that a reference from a DSO to a regular object
+# forces the final executable to export the symbol.
+
+#RUN: yaml2obj -format=elf %p/Inputs/undef2-so.o.yaml -o=%t.o.so
+#RUN: lld -flavor old-gnu -target x86_64 -shared %t.o.so -o %T/libundef2.so
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.o -L%T -lundef2 -o %t1
+#RUN: llvm-readobj -dyn-symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000001
+ Content: C3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Size: 4
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ Global:
+ - Name: myexportedsymbol
+ Type: STT_OBJECT
+ Section: .bss
+ Size: 0x0000000000000004
+ - Name: _start
+ Section: .text
+ Size: 0x0000000000000001
+
+#CHECKSYMS: myexportedsymbol
diff --git a/test/old-elf/undef-from-main-dso.test b/test/old-elf/undef-from-main-dso.test
new file mode 100644
index 000000000000..8722a55f672c
--- /dev/null
+++ b/test/old-elf/undef-from-main-dso.test
@@ -0,0 +1,43 @@
+RUN: lld -flavor old-gnu -target x86_64 -e main -o %t -L%p/Inputs \
+RUN: %p/Inputs/undef.o -lundef
+RUN: llvm-readobj -relocations -symbols -dyn-symbols %t | FileCheck %s
+
+RUN: lld -flavor old-gnu -target x86_64 -e main -o %t -L%p/Inputs \
+RUN: %p/Inputs/undef-pc32.o -lundef
+RUN: llvm-readobj -relocations -symbols -dyn-symbols %t | FileCheck %s
+
+# DSO source code:
+# int x[2] = { 1, 2 };
+#
+# Main binary source code:
+#
+# extern int x[2];
+#
+# int main(void)
+# {
+# x[0] = 2;
+# }
+#
+
+CHECK: Relocations [
+CHECK-NEXT: Section ({{[0-9]+}}) .rela.dyn {
+CHECK-NEXT: 0x{{[1-9A-F][0-9A-F]*}} R_X86_64_COPY x 0x0
+CHECK-NEXT: }
+CHECK-NEXT: ]
+
+CHECK: Name: x ({{[0-9]+}}
+CHECK-NEXT: Value: 0x{{[1-9A-F][0-9A-F]*}}
+CHECK-NEXT: Size: 8
+CHECK-NEXT: Binding: Global (0x1)
+CHECK-NEXT: Type: Object (0x1)
+CHECK-NEXT: Other: 0
+CHECK-NEXT: Section: .bss
+
+CHECK: Name: x@ ({{[0-9]+}}
+CHECK-NEXT: Value: 0x{{[1-9A-F][0-9A-F]*}}
+CHECK-NEXT: Size: 8
+CHECK-NEXT: Binding: Global (0x1)
+CHECK-NEXT: Type: Object (0x1)
+CHECK-NEXT: Other: 0
+CHECK-NEXT: Section: .bss
+
diff --git a/test/old-elf/weaksym.test b/test/old-elf/weaksym.test
new file mode 100644
index 000000000000..59d997edc64c
--- /dev/null
+++ b/test/old-elf/weaksym.test
@@ -0,0 +1,7 @@
+# Tests that a weak reference remains a weak reference,
+# even if a shared library defines the symbol weak as well.
+
+RUN: lld -flavor old-gnu -target x86_64 -shared %p/Inputs/weaksym.o -L%p/Inputs -lweaksym -o %t1
+RUN: llvm-nm -n %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+CHECKSYMS: w weaksym
diff --git a/test/old-elf/wrap.test b/test/old-elf/wrap.test
new file mode 100644
index 000000000000..427764970be8
--- /dev/null
+++ b/test/old-elf/wrap.test
@@ -0,0 +1,276 @@
+# This tests the functionality of using the --wrap option.
+# The test case is extracted by compiling and linking the following code.
+#
+#cat > main.c << \!
+#int main() {
+# foo();
+# return 0;
+#}
+#!
+#
+#cat > wrapfoo.c << \!
+#int __wrap_foo() {
+# __real_foo();
+# return 0;
+#}
+#!
+#
+#cat > realfoo.c << \!
+#int foo() {
+# return 0;
+#}
+#!
+#
+#clang main.c wrapfoo.c realfoo.c -Xlinker --wrap -Xlinker foo
+#RUN: yaml2obj -format=elf -docnum 1 %s -o %t.main.o
+#RUN: yaml2obj -format=elf -docnum 2 %s -o %t.wrapfoo.o
+#RUN: yaml2obj -format=elf -docnum 3 %s -o %t.realfoo.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.main.o %t.wrapfoo.o %t.realfoo.o \
+#RUN: --wrap foo --wrap foo --noinhibit-exec --output-filetype=yaml -o %t2.out
+#RUN: lld -flavor old-gnu -target x86_64 %t.main.o %t.wrapfoo.o \
+#RUN: --wrap foo --wrap foo --noinhibit-exec --output-filetype=yaml -o %t2.out.undef 2>&1 | \
+#RUN: FileCheck %s -check-prefix=CHECKUNDEF
+#CHECKWRAP: - name: main
+#CHECKWRAP: references:
+#CHECKWRAP: - kind: R_X86_64_PC32
+#CHECKWRAP: target: __wrap_foo
+#CHECKWRAP: - name: __wrap_foo
+#CHECKWRAP: references:
+#CHECKWRAP: - kind: R_X86_64_PC32
+#CHECKWRAP: target: foo
+#CHECKUNDEF: Undefined symbol: {{.*}}main.o: foo
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 5031C0E80000000031C05AC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: foo
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232383733392920286C6C766D2F7472756E6B203232383734382900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000140000001C000000000000000C00000000410E1000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000000C
+ - Name: foo
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 5031C0E80000000031C05AC3
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .text
+ Relocations:
+ - Offset: 0x0000000000000004
+ Symbol: __real_foo
+ Type: R_X86_64_PC32
+ Addend: -4
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232383733392920286C6C766D2F7472756E6B203232383734382900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000140000001C000000000000000C00000000410E1000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: __wrap_foo
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x000000000000000C
+ - Name: __real_foo
+...
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_GNU
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 31C0C3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 00636C616E672076657273696F6E20332E372E3020287472756E6B203232383733392920286C6C766D2F7472756E6B203232383734382900
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000037A5200017810011B0C070890010000140000001C00000000000000030000000000000000000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+Symbols:
+ Local:
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: foo
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000003
+...
diff --git a/test/old-elf/x86-64-dynamic-relocs.test b/test/old-elf/x86-64-dynamic-relocs.test
new file mode 100644
index 000000000000..c5572d0aa3a3
--- /dev/null
+++ b/test/old-elf/x86-64-dynamic-relocs.test
@@ -0,0 +1,26 @@
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/relocs-dynamic.x86-64 \
+RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s
+
+path: <linker-internal>
+defined-atoms:
+ - name: main
+ scope: global
+ content: [ E8, 00, 00, 00, 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+ references:
+ - kind: R_X86_64_PLT32
+ offset: 1
+ target: foo
+ addend: -4
+ - name: foo
+ scope: global
+ content: [ C3 ]
+ alignment: 6 mod 16
+ section-choice: custom-required
+ section-name: .text
+
+# Don't generate a PLT/GOT entry for a PLT32 relocation to a non-shared symbol.
+CHECK-NOT: got
+CHECK-NOT: stub
diff --git a/test/old-elf/x86-64-dynamic.test b/test/old-elf/x86-64-dynamic.test
new file mode 100644
index 000000000000..d957e6ee85ee
--- /dev/null
+++ b/test/old-elf/x86-64-dynamic.test
@@ -0,0 +1,79 @@
+# Checks that linking an object file with a shared object creates the necessary
+# PLT/GOT Entries
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml -o %t1 --noinhibit-exec
+RUN: FileCheck %s < %t1
+
+RUN: lld -flavor old-gnu -target x86_64-linux %p/Inputs/use-shared-32s.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml --noinhibit-exec \
+RUN: | FileCheck %s --check-prefix=32S
+
+CHECK: - name: main
+CHECK: scope: global
+CHECK: references:
+CHECK: - kind: R_X86_64_PC32
+CHECK: offset: 18
+CHECK: target: [[PLTNAME:[-a-zA-Z0-9_]+]]
+CHECK: addend: -4
+CHECK: - kind: R_X86_64_GOTPCREL
+CHECK: offset: 25
+CHECK: target: [[GOTNAME:[-a-zA-Z0-9_]+]]
+CHECK: addend: -4
+
+ - name: .PLT0
+CHECK: type: stub
+CHECK: content: [ FF, 35, 00, 00, 00, 00, FF, 25, 00, 00, 00, 00,
+CHECK: 90, 90, 90, 90 ]
+CHECK: alignment: 16
+CHECK: section-choice: custom-required
+CHECK: section-name: .plt
+CHECK: references:
+CHECK: - kind: R_X86_64_PC32
+CHECK: offset: 2
+ target: __got0
+CHECK: addend: -4
+CHECK: - kind: R_X86_64_PC32
+CHECK: offset: 8
+ target: __got1
+CHECK: addend: -4
+ - name: [[PLTNAME]]
+CHECK: type: stub
+CHECK: content: [ FF, 25, 00, 00, 00, 00, 68, 00, 00, 00, 00, E9,
+CHECK: 00, 00, 00, 00 ]
+CHECK: alignment: 16
+CHECK: section-choice: custom-required
+CHECK: section-name: .plt
+CHECK: references:
+CHECK: - kind: R_X86_64_PC32
+CHECK: offset: 2
+ target: __got_foo
+CHECK: addend: -4
+CHECK: - kind: LLD_R_X86_64_GOTRELINDEX
+CHECK: offset: 7
+ target: __got_foo
+CHECK: - kind: R_X86_64_PC32
+CHECK: offset: 12
+ target: .PLT0
+CHECK: addend: -4
+
+// Don't check the GOT and PLT names as they are only present in assert builds.
+CHECK: type: got
+CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECK: section-choice: custom-required
+CHECK: section-name: .got
+CHECK: permissions: rw-
+CHECK: references:
+CHECK: - kind: R_X86_64_GLOB_DAT
+CHECK: offset: 0
+CHECK: target: i
+
+CHECK:shared-library-atoms:
+CHECK: - name: foo
+CHECK: load-name: shared.so-x86-64
+
+32S: name: main
+32S: kind: R_X86_64_PC32
+32S: target: func
+32S: kind: R_X86_64_32S
+32S: kind: R_X86_64_PC32
+32S: type: stub
diff --git a/test/old-elf/x86.test b/test/old-elf/x86.test
new file mode 100644
index 000000000000..3bc4a6963a50
--- /dev/null
+++ b/test/old-elf/x86.test
@@ -0,0 +1,38 @@
+# Source for input file: reloc-xb.x86
+# xb.S:
+# .section .text, "ax", @progbits
+# .align 0x4
+# .globl _start
+# _start:
+# .globl back
+# back:
+# call target
+#
+# Source for input file: reloc-xt.x86
+# xt.S:
+# .section .text, "ax", @progbits
+#
+# .globl target
+# target:
+# call back
+#
+# Assembled with: "as --32"
+
+RUN: lld -flavor old-gnu -target i386 -e back --output-filetype=yaml %p/Inputs/reloc-xb.x86 %p/Inputs/reloc-xt.x86 | FileCheck %s -check-prefix x86-yaml
+
+x86-yaml: - name: back
+x86-yaml: scope: global
+x86-yaml: content: [ E8, FC, FF, FF, FF ]
+x86-yaml: references:
+x86-yaml: - kind: R_386_PC32
+x86-yaml: offset: 1
+x86-yaml: target: target
+
+x86-yaml: - name: target
+x86-yaml: scope: global
+x86-yaml: content: [ E8, FC, FF, FF, FF ]
+x86-yaml: references:
+x86-yaml: - kind: R_386_PC32
+x86-yaml: offset: 1
+x86-yaml: target: back
+
diff --git a/test/old-elf/x86_64-kinds.test b/test/old-elf/x86_64-kinds.test
new file mode 100644
index 000000000000..111cea53bf0c
--- /dev/null
+++ b/test/old-elf/x86_64-kinds.test
@@ -0,0 +1,23 @@
+REQUIRES: x86
+
+RUN: lld -flavor old-gnu -target x86_64-linux -o %t1 %p/Inputs/relocs.x86-64 \
+RUN: -e _start -static
+RUN: llvm-objdump -d %t1 | FileCheck %s -check-prefix=RELOCS
+
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml -e _start -static \
+RUN: %p/Inputs/relocs.x86-64 | FileCheck %s -check-prefix=X86_64
+
+RELOCS: ELF64-x86-64
+
+// R_X86_64_32S
+RELOCS: c7 04 25
+RELOCS-NOT: 00 00 00 00
+RELOCS: 05 00 00 00 movl
+
+// R_X86_64_PC32
+RELOCS: e8
+RELOCS-NOT: 00 00 00 00
+RELOCS: callq
+
+X86_64: R_X86_64_32S
+X86_64: R_X86_64_PC32
diff --git a/test/old-elf/zoption_dtflags.test b/test/old-elf/zoption_dtflags.test
new file mode 100644
index 000000000000..274981bb1360
--- /dev/null
+++ b/test/old-elf/zoption_dtflags.test
@@ -0,0 +1,89 @@
+# Test that -z {origin, now} options work.
+#
+#RUN: yaml2obj -format=elf %s -o=%t.o
+#RUN: lld -flavor old-gnu -target x86_64 %t.o -e=main -z now -z origin -o %t1
+#RUN: llvm-readobj -dynamic-table %t1 | FileCheck %s
+#
+#CHECK: 0x000000000000001E FLAGS ORIGIN BIND_NOW
+#CHECK: 0x000000006FFFFFFB FLAGS_1 NOW ORIGIN
+
+---
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ OSABI: ELFOSABI_FREEBSD
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ AddressAlign: 0x0000000000000010
+ Content: 554889E54883EC10C745FC00000000E81C000000B9000000008945F889C84883C4105DC36666662E0F1F840000000000554889E58B45FC5DC3
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ Content: ''
+ - Name: .bss
+ Type: SHT_NOBITS
+ Flags: [ SHF_WRITE, SHF_ALLOC ]
+ AddressAlign: 0x0000000000000004
+ - Name: .comment
+ Type: SHT_PROGBITS
+ Flags: [ SHF_MERGE, SHF_STRINGS ]
+ AddressAlign: 0x0000000000000001
+ Content: 004672656542534420636C616E672076657273696F6E20332E342E312028746167732F52454C454153455F33342F646F74312D66696E616C203230383033322920323031343035313200
+ - Name: .note.GNU-stack
+ Type: SHT_PROGBITS
+ AddressAlign: 0x0000000000000001
+ Content: ''
+ - Name: .eh_frame
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x0000000000000008
+ Content: 1400000000000000017A5200017810011B0C070890010000180000001C000000000000002400000000410E108602430D060000001800000038000000000000000900000000410E108602430D06000000
+ - Name: .rela.eh_frame
+ Type: SHT_RELA
+ Link: .symtab
+ AddressAlign: 0x0000000000000008
+ Info: .eh_frame
+ Relocations:
+ - Offset: 0x0000000000000020
+ Symbol: .text
+ Type: R_X86_64_PC32
+ - Offset: 0x000000000000003C
+ Symbol: .text
+ Type: R_X86_64_PC32
+ Addend: 48
+Symbols:
+ Local:
+ - Name: local
+ Type: STT_FUNC
+ Section: .text
+ Value: 0x0000000000000030
+ Size: 0x0000000000000009
+ - Name: .text
+ Type: STT_SECTION
+ Section: .text
+ - Name: .data
+ Type: STT_SECTION
+ Section: .data
+ - Name: .bss
+ Type: STT_SECTION
+ Section: .bss
+ - Name: .comment
+ Type: STT_SECTION
+ Section: .comment
+ - Name: .note.GNU-stack
+ Type: STT_SECTION
+ Section: .note.GNU-stack
+ - Name: .eh_frame
+ Type: STT_SECTION
+ Section: .eh_frame
+ Global:
+ - Name: main
+ Type: STT_FUNC
+ Section: .text
+ Size: 0x0000000000000024
+...