[PATCH] D29445: LTO: add a code-model flag

Martell Malone via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 20 03:52:06 PST 2017


martell added a comment.

In https://reviews.llvm.org/D29445#675329, @pcc wrote:

> It looks like you could adapt the test case `llvm/test/CodeGen/X86/codemodel.ll`.


I created a test case based on `llvm/test/CodeGen/X86/codemodel.ll`

  ; REQUIRES: x86
  ; RUN: llvm-as %s -o %t.o
  ; RUN: ld.lld -m elf_x86_64 %t.o -o %ts.so -mllvm -code-model=small -shared
  ; RUN: ld.lld -m elf_x86_64 %t.o -o %tk.so -mllvm -code-model=kernel -shared
  ; RUN: llvm-objdump -d %ts.so -o - | FileCheck %s --check-prefix=SMALL
  ; RUN: llvm-objdump -d %tk.so -o - | FileCheck %s --check-prefix=KERNEL
  
  target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
  target triple = "x86_64-unknown-linux-gnu"
  @data = external global [0 x i32] ; <[0 x i32]*> [#uses=5]
  
  define i32 @foo() nounwind readonly {
  entry:
  ; CHECK-SMALL-LABEL:  foo:
  ; CHECK-SMALL:   movl 4233(%rip), %eax
  ; CHECK-KERNEL-LABEL: foo:
  ; CHECK-KERNEL:  movl 4233, %eax
      %0 = load i32, i32* getelementptr ([0 x i32], [0 x i32]* @data, i64 0, i64 0), align 4 ; <i32> [#uses=1]
      ret i32 %0
  }

This is the result I am getting from the `llvm-objdump` stage

  codemodels.so:  file format ELF64-x86-64
  Disassembly of section .text:
  foo:
      1000:       48 8b 05 89 10 00 00    movq    4233(%rip), %rax
      1007:       8b 00   movl    (%rax), %eax
      1009:       c3      retq
  
  codemodelk.so:  file format ELF64-x86-64
  Disassembly of section .text:
  foo:
      1000:       48 8b 05 89 10 00 00    movq    4233(%rip), %rax
      1007:       8b 00   movl    (%rax), %eax
      1009:       c3      retq

The assumption I am making is that `llvm-as` only converts `llvm-ir` in a text format to a binary format.
So as a result I should be able to use the code model passed after `-mllvm` to decide what is generated.
I also tried changing the target to `i686` or `i386` with no joy.

Just for a test I did pass `-code-model=large` and I get errors
`ld.lld: error: ld-temp.o:(function foo): can't create dynamic relocation R_X86_64_64 against symbol 'data' defined in codemodel.o`
this makes sense because of `@data = external global [0 x i32] ; <[0 x i32]*> [#uses=5]`


Repository:
  rL LLVM

https://reviews.llvm.org/D29445





More information about the llvm-commits mailing list