| # RUN: llvm-mc -triple riscv32 -mattr=-relax -riscv-no-aliases < %s \ |
| # RUN: | FileCheck -check-prefix=CHECK-INST %s |
| # RUN: llvm-mc -filetype=obj -triple riscv32 < %s \ |
| # RUN: | llvm-readobj -r - | FileCheck -check-prefix=CHECK-RELOC %s |
| # RUN: llvm-mc -triple riscv32 -filetype=obj < %s \ |
| # RUN: | llvm-objdump --triple=riscv32 --mattr=+c -d - \ |
| # RUN: | FileCheck -check-prefixes=CHECK-BYTES,CHECK-ALIAS %s |
| |
| # RUN: llvm-mc -triple riscv64 -mattr=-relax -riscv-no-aliases < %s \ |
| # RUN: | FileCheck -check-prefix=CHECK-INST %s |
| # RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ |
| # RUN: | llvm-readobj -r - | FileCheck -check-prefix=CHECK-RELOC %s |
| # RUN: llvm-mc -triple riscv64 -filetype=obj < %s \ |
| # RUN: | llvm-objdump --triple=riscv64 --mattr=+c -d - \ |
| # RUN: | FileCheck -check-prefixes=CHECK-BYTES,CHECK-ALIAS %s |
| |
| # Test the operation of the push and pop assembler directives when |
| # using .option relax and .option rvc. Checks that using .option pop |
| # correctly restores all target features to their state at the point |
| # where .option pop was last used. |
| |
| # CHECK-INST: call foo |
| # CHECK-RELOC: R_RISCV_CALL foo 0x0 |
| # CHECK-RELOC-NOT: R_RISCV_RELAX - 0x0 |
| call foo |
| |
| # CHECK-INST: addi s0, sp, 1020 |
| # CHECK-BYTES: 13 04 c1 3f |
| # CHECK-ALIAS: addi s0, sp, 1020 |
| addi s0, sp, 1020 |
| |
| .option push # Push relax=false, rvc=false |
| # CHECK-INST: .option push |
| |
| .option relax |
| # CHECK-INST: .option relax |
| # CHECK-INST: call bar |
| # CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0 |
| # CHECK-RELOC-NEXT: R_RISCV_RELAX - 0x0 |
| call bar |
| |
| .option push # Push relax=true, rvc=false |
| # CHECK-INST: .option push |
| |
| .option rvc |
| # CHECK-INST: .option rvc |
| # CHECK-INST: c.addi4spn s0, sp, 1020 |
| # CHECK-BYTES: e0 1f |
| # CHECK-ALIAS: addi s0, sp, 1020 |
| addi s0, sp, 1020 |
| |
| .option pop # Pop relax=true, rvc=false |
| # CHECK-INST: .option pop |
| # CHECK-INST: addi s0, sp, 1020 |
| # CHECK-BYTES: 13 04 c1 3f |
| # CHECK-ALIAS: addi s0, sp, 1020 |
| addi s0, sp, 1020 |
| |
| # CHECK-INST: call bar |
| # CHECK-RELOC-NEXT: R_RISCV_CALL bar 0x0 |
| # CHECK-RELOC-NEXT: R_RISCV_RELAX - 0x0 |
| call bar |
| |
| .option pop # Pop relax=false, rvc=false |
| # CHECK-INST: .option pop |
| # CHECK-INST: call baz |
| # CHECK-RELOC: R_RISCV_CALL baz 0x0 |
| # CHECK-RELOC-NOT: R_RISCV_RELAX - 0x0 |
| call baz |
| |
| # CHECK-INST: addi s0, sp, 1020 |
| # CHECK-BYTES: 13 04 c1 3f |
| # CHECK-ALIAS: addi s0, sp, 1020 |
| addi s0, sp, 1020 |
| |
| .option push # Push pic=false |
| # CHECK-INST: .option push |
| |
| .option pic |
| # CHECK-INST: .option pic |
| |
| la s0, symbol |
| # CHECK-INST: auipc s0, %got_pcrel_hi(symbol) |
| # CHECK-INST: l{{[wd]}} s0, %pcrel_lo(.Lpcrel_hi0)(s0) |
| # CHECK-RELOC: R_RISCV_GOT_HI20 symbol 0x0 |
| # CHECK-RELOC: R_RISCV_PCREL_LO12_I .Lpcrel_hi0 0x0 |
| |
| .option push # Push pic=true |
| # CHECK-INST: .option push |
| |
| .option nopic |
| # CHECK-INST: .option nopic |
| |
| la s0, symbol |
| # CHECK-INST: auipc s0, %pcrel_hi(symbol) |
| # CHECK-INST: addi s0, s0, %pcrel_lo(.Lpcrel_hi1) |
| # CHECK-RELOC: R_RISCV_PCREL_HI20 symbol 0x0 |
| # CHECK-RELOC: R_RISCV_PCREL_LO12_I .Lpcrel_hi1 0x0 |
| |
| .option pop # Push pic=true |
| # CHECK-INST: .option pop |
| |
| la s0, symbol |
| # CHECK-INST: auipc s0, %got_pcrel_hi(symbol) |
| # CHECK-INST: l{{[wd]}} s0, %pcrel_lo(.Lpcrel_hi2)(s0) |
| # CHECK-RELOC: R_RISCV_GOT_HI20 symbol 0x0 |
| # CHECK-RELOC: R_RISCV_PCREL_LO12_I .Lpcrel_hi2 0x0 |
| |
| .option pop # Push pic=false |
| # CHECK-INST: .option pop |
| |
| la s0, symbol |
| # CHECK-INST: auipc s0, %pcrel_hi(symbol) |
| # CHECK-INST: addi s0, s0, %pcrel_lo(.Lpcrel_hi3) |
| # CHECK-RELOC: R_RISCV_PCREL_HI20 symbol 0x0 |
| # CHECK-RELOC: R_RISCV_PCREL_LO12_I .Lpcrel_hi3 0x0 |