-
Notifications
You must be signed in to change notification settings - Fork 11.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[IRSymTab] Set FB_used on llvm.compiler.used symbols
IR symbol table does not parse inline asm. A symbol only referenced by inline asm is not in the IR symbol table, so LTO does not know that the definition (in another translation unit) is referenced and may internalize it, even if that definition has `__attribute__((used))` (which lowers to `llvm.compiler.used` on ELF targets since D97446). ``` // cabac.c __attribute__((used)) const uint8_t ff_h264_cabac_tables[...] = {...}; // h264_cabac.c asm("lea ff_h264_cabac_tables(%rip), %0" : ...); ``` `__attribute__((used))` is the recommended way to tell the compiler there may be inline asm references, so the usage is perfectly fine. This patch conservatively sets the `FB_used` bit on `llvm.compiler.used` symbols to work around the IR symbol table limitation. Note: before D97446, Clang never emitted symbols in the `llvm.compiler.used` list, so this change does not punish any Clang emitted global object. Without the patch, `ff_h264_cabac_tables` may be assigned to a non-external partition and get internalized. Then we will get a linker error because the `cabac.c` definition is not exposed. Differential Revision: https://reviews.llvm.org/D97755
- Loading branch information
Showing
5 changed files
with
88 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
// REQUIRES: x86-registered-target | ||
|
||
// RUN: split-file %s %t | ||
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -flto=thin -emit-llvm-bc %t/a.c -o %t/a.bc | ||
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -flto=thin -emit-llvm-bc %t/b.c -o %t/b.bc | ||
// RUN: llvm-nm %t/a.bc | FileCheck %s --check-prefix=NM | ||
|
||
// RUN: llvm-lto2 run %t/a.bc %t/b.bc -o %t/out -save-temps -r=%t/a.bc,ref,plx -r=%t/b.bc,ff_h264_cabac_tables,pl | ||
// RUN: llvm-dis < %t/out.2.2.internalize.bc | FileCheck %s | ||
|
||
//--- a.c | ||
/// IR symtab does not track inline asm symbols, so we don't know | ||
/// ff_h264_cabac_tables is undefined. | ||
// NM-NOT: {{.}} | ||
// NM: ---------------- T ref | ||
// NM-NOT: {{.}} | ||
const char *ref() { | ||
const char *ret; | ||
asm("lea ff_h264_cabac_tables(%%rip), %0" : "=r"(ret)); | ||
return ret; | ||
} | ||
|
||
//--- b.c | ||
/// ff_h264_cabac_tables has __attribute__((used)) in the source code, which means | ||
/// its definition must be retained because there can be references the compiler | ||
/// cannot see (inline asm reference). Test we don't internalize it. | ||
// CHECK: @ff_h264_cabac_tables = dso_local constant [1 x i8] c"\09" | ||
__attribute__((used)) | ||
const char ff_h264_cabac_tables[1] = "\x09"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
; RUN: split-file %s %t | ||
; RUN: opt -module-summary %t/a.s -o %t/a.bc | ||
; RUN: opt -module-summary %t/b.s -o %t/b.bc | ||
; RUN: llvm-nm %t/a.bc | FileCheck %s --check-prefix=NM | ||
|
||
; RUN: llvm-lto2 run %t/a.bc %t/b.bc -o %t/out -save-temps -r=%t/a.bc,ref,plx -r=%t/b.bc,ff_h264_cabac_tables,pl | ||
; RUN: llvm-dis < %t/out.2.2.internalize.bc | FileCheck %s | ||
|
||
;--- a.s | ||
;; IR symtab does not track inline asm symbols, so we don't know | ||
;; ff_h264_cabac_tables is undefined. | ||
; NM-NOT: {{.}} | ||
; NM: ---------------- T ref | ||
; NM-NOT: {{.}} | ||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
define i8* @ref() { | ||
entry: | ||
%0 = tail call i8* asm sideeffect "lea ff_h264_cabac_tables(%rip), $0", "=&r,~{dirflag},~{fpsr},~{flags}"() | ||
ret i8* %0 | ||
} | ||
|
||
;--- b.s | ||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
;; ff_h264_cabac_tables has __attribute__((used)) in the source code, which means | ||
;; its definition must be retained because there can be references the compiler | ||
;; cannot see (inline asm reference). Test we don't internalize it. | ||
; CHECK: @ff_h264_cabac_tables = dso_local constant [1 x i8] c"\09" | ||
@ff_h264_cabac_tables = dso_local constant [1 x i8] c"\09" | ||
|
||
@llvm.compiler.used = appending global [1 x i8*] [i8* bitcast ([1 x i8]* @ff_h264_cabac_tables to i8*)], section "llvm.metadata" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters