402 lines · plain
1# RUN: llvm-mc -triple=powerpc64le -filetype=obj %s | \2# RUN: llvm-objdump -dr --mcpu=pwr10 - | FileCheck %s3# RUN: llvm-mc -triple=powerpc64 -filetype=obj %s | \4# RUN: llvm-objdump -dr --mcpu=pwr10 - | FileCheck %s5 6 7##8# This section of tests contains the MCBinaryExpr as the first parameter of the9# .reloc relocation.10##11 .text12 .abiversion 213 .globl Minimal14 .p2align 415 .type Minimal,@function16Minimal:17.LMinimal$local:18 pld 3, vec@got@pcrel(0), 119.Lpcrel1:20 .reloc .Lpcrel1-8,R_PPC64_PCREL_OPT,.-(.Lpcrel1-8)21 lwa 3, 4(3)22 blr23 .long 024 .quad 025# CHECK-LABEL: Minimal26# CHECK: pld 3, 0(0), 127# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec28# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x829# CHECK-NEXT: lwa 3, 4(3)30# CHECK-NEXT: blr31 32 .globl SingleInsnBetween33 .p2align 434 .type SingleInsnBetween,@function35SingleInsnBetween:36.LSingleInsnBetween$local:37 pld 3, vec@got@pcrel(0), 138.Lpcrel2:39 addi 3, 3, 4240 .reloc .Lpcrel2-8,R_PPC64_PCREL_OPT,.-(.Lpcrel2-8)41 lwa 3, 4(3)42 blr43 .long 044 .quad 045# CHECK-LABEL: SingleInsnBetween46# CHECK: pld 3, 0(0), 147# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec48# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0xc49# CHECK-NEXT: addi 3, 3, 4250# CHECK-NEXT: lwa 3, 4(3)51# CHECK-NEXT: blr52 53 54 .globl MultiInsnBetween # -- Begin function55 .p2align 456 .type MultiInsnBetween,@function57MultiInsnBetween:58.LMultiInsnBetween$local:59 pld 3, vec@got@pcrel(0), 160.Lpcrel3:61 addi 3, 3, 4262 addi 3, 3, 4263 addi 3, 3, 4264 addi 3, 3, 4265 addi 3, 3, 4266 .reloc .Lpcrel3-8,R_PPC64_PCREL_OPT,.-(.Lpcrel3-8)67 lwa 3, 4(3)68 blr69 .long 070 .quad 071# CHECK-LABEL: MultiInsnBetween72# CHECK: pld 3, 0(0), 173# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec74# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x1c75# CHECK-NEXT: addi 3, 3, 4276# CHECK-NEXT: addi 3, 3, 4277# CHECK-NEXT: addi 3, 3, 4278# CHECK-NEXT: addi 3, 3, 4279# CHECK-NEXT: addi 3, 3, 4280# CHECK-NEXT: lwa 3, 4(3)81# CHECK-NEXT: blr82 83 .globl PrefixInsnBetween84 .p2align 685 .type PrefixInsnBetween,@function86 .space 48 # Add a space to force an alignment of a paddi.87PrefixInsnBetween:88.LPrefixInsnBetween$local:89 pld 3, vec@got@pcrel(0), 190.Lpcrel4:91 addi 3, 3, 4292 paddi 3, 3, 42, 093 addi 3, 3, 4294 paddi 3, 3, 42, 095 addi 3, 3, 4296 .reloc .Lpcrel4-8,R_PPC64_PCREL_OPT,.-(.Lpcrel4-8)97 lwa 3, 4(3)98 blr99 .long 0100 .quad 0101# CHECK-LABEL: PrefixInsnBetween102# CHECK: pld 3, 0(0), 1103# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec104# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x28105# CHECK-NEXT: addi 3, 3, 42106# CHECK-NEXT: nop107# CHECK-NEXT: paddi 3, 3, 42, 0108# CHECK-NEXT: addi 3, 3, 42109# CHECK-NEXT: paddi 3, 3, 42, 0110# CHECK-NEXT: addi 3, 3, 42111# CHECK-NEXT: lwa 3, 4(3)112# CHECK-NEXT: blr113 114 115 .globl SpaceBetween # -- Begin function116 .p2align 4117 .type SpaceBetween,@function118SpaceBetween:119.LSpaceBetween$local:120 pld 3, vec@got@pcrel(0), 1121.Lpcrel5:122 addi 3, 3, 42123 paddi 3, 3, 42, 0124 addi 3, 3, 42125 .space 40, 0126 paddi 3, 3, 42, 0127 addi 3, 3, 42128 .reloc .Lpcrel5-8,R_PPC64_PCREL_OPT,.-(.Lpcrel5-8)129 lwa 3, 4(3)130 blr131 .long 0132 .quad 0133# CHECK-LABEL: SpaceBetween134# CHECK: pld 3, 0(0), 1135# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec136# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x50137# CHECK-NEXT: addi 3, 3, 42138# CHECK-NEXT: nop139# CHECK-NEXT: paddi 3, 3, 42, 0140# CHECK-NEXT: addi 3, 3, 42141# CHECK: paddi 3, 3, 42, 0142# CHECK-NEXT: addi 3, 3, 42143# CHECK-NEXT: lwa 3, 4(3)144# CHECK-NEXT: blr145 146 147 .globl Plus148 .p2align 4149 .type Plus,@function150Plus:151.LPlus$local:152.Lpcrel6:153 addi 3, 3, 42154 addi 3, 3, 42155 pld 3, vec@got@pcrel(0), 1156 .reloc .Lpcrel6+8,R_PPC64_PCREL_OPT,.-(.Lpcrel6+8)157 lwa 3, 4(3)158 blr159 .long 0160 .quad 0161# CHECK-LABEL: Plus162# CHECK: pld 3, 0(0), 1163# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8164# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec165# CHECK-NEXT: lwa 3, 4(3)166# CHECK-NEXT: blr167 168##169# This section of tests contains the variable MCSymbol as part of the170# MCSymbolRefExpr for the first parameter of the .reloc relocation.171##172 .globl VarLabelMinimal # -- Begin function173 .p2align 4174 .type VarLabelMinimal,@function175VarLabelMinimal:176.LVarLabelMinimal$local:177 pld 3, vec@got@pcrel(0), 1178.Lpcrel101=.-8179 .reloc .Lpcrel101,R_PPC64_PCREL_OPT,.-.Lpcrel101180 lwa 3, 4(3)181 blr182 .long 0183 .quad 0184# CHECK-LABEL: VarLabelMinimal185# CHECK: pld 3, 0(0), 1186# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec187# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8188# CHECK-NEXT: lwa 3, 4(3)189# CHECK-NEXT: blr190 191 192 .globl VarLabelSingleInsnBetween193 .p2align 4194 .type VarLabelSingleInsnBetween,@function195VarLabelSingleInsnBetween:196.LVarLabelSingleInsnBetween$local:197 pld 3, vec@got@pcrel(0), 1198.Lpcrel102=.-8199 addi 3, 3, 42200 .reloc .Lpcrel102,R_PPC64_PCREL_OPT,.-.Lpcrel102201 lwa 3, 4(3)202 blr203 .long 0204 .quad 0205# CHECK-LABEL: VarLabelSingleInsnBetween206# CHECK: pld 3, 0(0), 1207# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec208# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0xc209# CHECK-NEXT: addi 3, 3, 42210# CHECK-NEXT: lwa 3, 4(3)211# CHECK-NEXT: blr212 213 .globl VarLabelMultiInsnBetween # -- Begin function214 .p2align 4215 .type VarLabelMultiInsnBetween,@function216VarLabelMultiInsnBetween:217.LVarLabelMultiInsnBetween$local:218 pld 3, vec@got@pcrel(0), 1219.Lpcrel103=.-8220 addi 3, 3, 42221 addi 3, 3, 42222 addi 3, 3, 42223 addi 3, 3, 42224 addi 3, 3, 42225 .reloc .Lpcrel103,R_PPC64_PCREL_OPT,.-.Lpcrel103226 lwa 3, 4(3)227 blr228 .long 0229 .quad 0230# CHECK-LABEL: VarLabelMultiInsnBetween231# CHECK: pld 3, 0(0), 1232# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec233# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x1c234# CHECK-NEXT: addi 3, 3, 42235# CHECK-NEXT: addi 3, 3, 42236# CHECK-NEXT: addi 3, 3, 42237# CHECK-NEXT: addi 3, 3, 42238# CHECK-NEXT: addi 3, 3, 42239# CHECK-NEXT: lwa 3, 4(3)240# CHECK-NEXT: blr241 242 243 .globl VarLabelPrefixInsnBetween # -- Begin function244 .p2align 4245 .type VarLabelPrefixInsnBetween,@function246VarLabelPrefixInsnBetween:247.LVarLabelPrefixInsnBetween$local:248 pld 3, vec@got@pcrel(0), 1249.Lpcrel104=.-8250 addi 3, 3, 42251 paddi 3, 3, 42, 0252 addi 3, 3, 42253 paddi 3, 3, 42, 0254 addi 3, 3, 42255 .reloc .Lpcrel104,R_PPC64_PCREL_OPT,.-.Lpcrel104256 lwa 3, 4(3)257 blr258 .long 0259 .quad 0260# CHECK-LABEL: VarLabelPrefixInsnBetween261# CHECK: pld 3, 0(0), 1262# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec263# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x24264# CHECK-NEXT: addi 3, 3, 42265# CHECK-NEXT: paddi 3, 3, 42, 0266# CHECK-NEXT: addi 3, 3, 42267# CHECK-NEXT: paddi 3, 3, 42, 0268# CHECK-NEXT: addi 3, 3, 42269# CHECK-NEXT: lwa 3, 4(3)270# CHECK-NEXT: blr271 272 273 .globl VarLabelSpaceBetween # -- Begin function274 .p2align 4275 .type VarLabelSpaceBetween,@function276VarLabelSpaceBetween:277.LVarLabelSpaceBetween$local:278 pld 3, vec@got@pcrel(0), 1279.Lpcrel105=.-8280 addi 3, 3, 42281 paddi 3, 3, 42, 0282 addi 3, 3, 42283 .space 40, 0284 paddi 3, 3, 42, 0285 addi 3, 3, 42286 .reloc .Lpcrel105,R_PPC64_PCREL_OPT,.-.Lpcrel105287 lwa 3, 4(3)288 blr289 .long 0290 .quad 0291# CHECK-LABEL: VarLabelSpaceBetween292# CHECK: pld 3, 0(0), 1293# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec294# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x4c295# CHECK-NEXT: addi 3, 3, 42296# CHECK-NEXT: paddi 3, 3, 42, 0297# CHECK-NEXT: addi 3, 3, 42298# CHECK: paddi 3, 3, 42, 0299# CHECK-NEXT: addi 3, 3, 42300# CHECK-NEXT: lwa 3, 4(3)301# CHECK-NEXT: blr302 303 304 .globl VarLabelPlus305 .p2align 4306 .type VarLabelPlus,@function307VarLabelPlus:308.LVarLabelPlus$local:309.Lpcrel106:310 addi 3, 3, 42311 addi 3, 3, 42312 pld 3, vec@got@pcrel(0), 1313 .reloc .Lpcrel106+8,R_PPC64_PCREL_OPT,.-(.Lpcrel106+8)314 lwa 3, 4(3)315 blr316 .long 0317 .quad 0318# CHECK-LABEL: VarLabelPlus319# CHECK: pld 3, 0(0), 1320# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8321# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec322# CHECK-NEXT: lwa 3, 4(3)323# CHECK-NEXT: blr324 325# Check the situation where the PLD requires an alignment nop.326 .globl AlignPLD327 .p2align 6328 .type AlignPLD,@function329 .space 60 # Force the pld to require an alignment nop.330AlignPLD:331.LAlignPLD$local:332 pld 3, vec@got@pcrel(0), 1333.Lpcrel201:334 .reloc .Lpcrel201-8,R_PPC64_PCREL_OPT,.-(.Lpcrel201-8)335 lwa 3, 4(3)336 blr337# CHECK-LABEL: AlignPLD338# CHECK: nop339# CHECK-NEXT: pld 3, 0(0), 1340# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec341# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8342# CHECK-NEXT: lwa 3, 4(3)343# CHECK-NEXT: blr344 345# The label and the pld are on the same line and so the nop is inserted before346# the label and the relocation should work.347 .globl AlignPLDSameLine348 .p2align 6349 .type AlignPLDSameLine,@function350 .space 60 # Force the pld to require an alignment nop.351AlignPLDSameLine:352.LAlignPLDSameLine$local:353.Lpcrel202: pld 3, vec@got@pcrel(0), 1354 .reloc .Lpcrel202,R_PPC64_PCREL_OPT,.-.Lpcrel202355 lwa 3, 4(3)356 blr357# CHECK-LABEL: AlignPLDSameLine358# CHECK: nop359# CHECK-NEXT: pld 3, 0(0), 1360# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec361# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8362# CHECK-NEXT: lwa 3, 4(3)363# CHECK-NEXT: blr364 365 .globl AlignPLDLabelBefore366 .p2align 6367 .type AlignPLDLabelBefore,@function368 .space 60 # Force the pld to require an alignment nop.369AlignPLDLabelBefore:370.LAlignPLDLabelBefore$local:371.Label:372 pld 3, vec@got@pcrel(0), 1373.Lpcrel203:374 .reloc .Lpcrel203-8,R_PPC64_PCREL_OPT,.-(.Lpcrel203-8)375 lwa 3, 4(3)376 blr377# CHECK-LABEL: AlignPLDLabelBefore378# CHECK: nop379# CHECK-NEXT: pld 3, 0(0), 1380# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec381# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8382# CHECK-NEXT: lwa 3, 4(3)383# CHECK-NEXT: blr384 385 .globl AlignPLDLabelSameLine386 .p2align 6387 .type AlignPLDLabelSameLine,@function388 .space 60 # Force the pld to require an alignment nop.389AlignPLDLabelSameLine:390.Label2: pld 3, vec@got@pcrel(0), 1391.Lpcrel204:392 .reloc .Lpcrel204-8,R_PPC64_PCREL_OPT,.-(.Lpcrel204-8)393 lwa 3, 4(3)394 blr395# CHECK-LABEL: AlignPLDLabelSameLine396# CHECK: nop397# CHECK-NEXT: pld 3, 0(0), 1398# CHECK-NEXT: R_PPC64_GOT_PCREL34 vec399# CHECK-NEXT: R_PPC64_PCREL_OPT *ABS*+0x8400# CHECK-NEXT: lwa 3, 4(3)401# CHECK-NEXT: blr402