In Linux PIC model, there are 4 cases about value/label addressing: Case 1: Function call or Label jmp inside the module. Case 2: Data access (such as global variable, static variable) inside the module. Case 3: Function call or Label jmp outside the module. Case 4: Data access (such as global variable) outside the module. Due to current llvm inline asm architecture designed to not "recognize" the asm code, there are quite troubles for us to treat mem addressing differently for same value/adress used in different instuctions. For example, in pic model, call a func may in plt way or direclty pc-related, but lea/mov a function adress may use got. This patch fix/refine the case 1 and case 2 in inline asm. Due to currently inline asm didn't support jmp the outsider lable, this patch mainly focus on fix the function call addressing bugs in inline asm. Reviewed By: Pengfei, RKSimon Differential Revision: https://reviews.llvm.org/D133914
18 lines
654 B
LLVM
18 lines
654 B
LLVM
; RUN: llc -mtriple=x86_64-unknown-unknown -no-integrated-as < %s 2>&1 | FileCheck %s
|
|
|
|
define ptr @foo(ptr %Ptr) {
|
|
; CHECK-LABEL: foo:
|
|
; asm {mov rax, Pointer; lea rax, Pointer}
|
|
; LEA: Computes the effective address of the second operand and stores it in the first operand
|
|
%Ptr.addr = alloca ptr, align 8
|
|
store ptr %Ptr, ptr %Ptr.addr, align 8
|
|
; CHECK: movq %rdi, -8(%rsp)
|
|
%1 = tail call ptr asm "mov $1, $0\0A\09lea $2, $0", "=r,p,*m,~{dirflag},~{fpsr},~{flags}"(ptr %Ptr, ptr elementtype(ptr) %Ptr.addr)
|
|
; CHECK-NEXT: #APP
|
|
; CHECK-NEXT: mov (%rdi), %rax
|
|
; CHECK-NEXT: lea -8(%rsp), %rax
|
|
; CHECK-NEXT: #NO_APP
|
|
ret ptr %1
|
|
; CHECK-NEXT: retq
|
|
}
|