[llvm-dev] Question about the example of link time optimization

Enna1 via llvm-dev llvm-dev at lists.llvm.org
Sat Oct 10 03:39:10 PDT 2020


Hi all!

I played around with the LLVM LTO
example(https://llvm.org/docs/LinkTimeOptimization.html#example-of-link-time-optimization),
but got some questions.

As the document says, the function foo4 should be removed. However,
under my test, function foo4 is not removed.
I have tried both gnu ld with LLVMgold.so and lld, neither of them
removes function foo4.

I compile and run the example as instructed:
% clang -flto -c a.c -o a.o        # <-- a.o is LLVM bitcode file
% clang -c main.c -o main.o        # <-- main.o is native object file
% clang -flto a.o main.o -o main   # <-- standard link command with -flto
% readelf -sW ./main | awk '$4 == "FUNC"'
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND
printf at GLIBC_2.2.5 (2)
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND
__libc_start_main at GLIBC_2.2.5 (2)
    27: 0000000000400440     0 FUNC    LOCAL  DEFAULT   13 deregister_tm_clones
    28: 0000000000400470     0 FUNC    LOCAL  DEFAULT   13 register_tm_clones
    29: 00000000004004b0     0 FUNC    LOCAL  DEFAULT   13 __do_global_dtors_aux
    32: 00000000004004e0     0 FUNC    LOCAL  DEFAULT   13 frame_dummy
    43: 00000000004005c0     2 FUNC    GLOBAL DEFAULT   13 __libc_csu_fini
    46: 00000000004005c4     0 FUNC    GLOBAL DEFAULT   14 _fini
    47: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.2.5
    48: 0000000000400510    23 FUNC    GLOBAL DEFAULT   13 foo4
    49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND
__libc_start_main@@GLIBC_2.2.5
    54: 0000000000400550   101 FUNC    GLOBAL DEFAULT   13 __libc_csu_init
    56: 0000000000400430     2 FUNC    GLOBAL HIDDEN    13
_dl_relocate_static_pie
    57: 0000000000400400    43 FUNC    GLOBAL DEFAULT   13 _start
    59: 0000000000400530    26 FUNC    GLOBAL DEFAULT   13 main
    60: 00000000004004f0    25 FUNC    GLOBAL DEFAULT   13 foo1
    62: 00000000004003c8     0 FUNC    GLOBAL DEFAULT   11 _init


Is there something that I'm doing wrong?

Here is the source code of a.c and main.c:
--- a.h ---
extern int foo1(void);
extern void foo2(void);
extern void foo4(void);

--- a.c ---
#include "a.h"

static signed int i = 0;

void foo2(void) {
  i = -1;
}

static int foo3() {
  foo4();
  return 10;
}

int foo1(void) {
  int data = 0;

  if (i < 0)
    data = foo3();

  data = data + 42;
  return data;
}

--- main.c ---
#include <stdio.h>
#include "a.h"

void foo4(void) {
  printf("Hi\n");
}

int main() {
  return foo1();
}


Thanks!
Xu Mingjie


More information about the llvm-dev mailing list