This patch does *not* implement any semantic actions, but it is a first step to teach LLD how to read complete linker scripts. The additional linker scripts statements whose parsing is now supported are: * SEARCH_DIR directive * SECTIONS directive * Symbol definitions inside SECTIONS including PROVIDE and PROVIDE_HIDDEN * C-like expressions used in many places in linker scripts * Input to output sections mapping The goal of this commit was guided towards completely parsing a default GNU ld linker script and the linker script used to link the FreeBSD kernel. Thus, it also adds a test case based on the default linker script used in GNU ld for x86_64 ELF targets. I tested SPEC userland programs linked by GNU ld, using the linker script dump'ed by this parser, and everything went fine. I then tested linking the FreeBSD kernel with a dump'ed linker script, installed the new kernel and booted it, everything went fine. Directives that still need to be implemented: * MEMORY * PHDRS Reviewers: silvas, shankarke and ruiu http://reviews.llvm.org/D5852 llvm-svn: 221126
35 lines
593 B
Plaintext
35 lines
593 B
Plaintext
/*
|
|
RUN: linker-script-test %s | FileCheck %s
|
|
*/
|
|
SECTIONS {
|
|
. = foo >= bar + 1 ? bar : 1- - - -1;
|
|
}
|
|
|
|
/*
|
|
CHECK: kw_sections: SECTIONS
|
|
CHECK: l_brace: {
|
|
CHECK: identifier: .
|
|
CHECK: equal: =
|
|
CHECK: identifier: foo
|
|
CHECK: greaterequal: >=
|
|
CHECK: identifier: bar
|
|
CHECK: plus: +
|
|
CHECK: number: 1
|
|
CHECK: question: ?
|
|
CHECK: identifier: bar
|
|
CHECK: colon: :
|
|
CHECK: number: 1
|
|
CHECK: minus: -
|
|
CHECK: minus: -
|
|
CHECK: minus: -
|
|
CHECK: minus: -
|
|
CHECK: number: 1
|
|
CHECK: semicolon: ;
|
|
CHECK: r_brace: }
|
|
CHECK: eof:
|
|
CHECK: SECTIONS
|
|
CHECK: {
|
|
CHECK: . = (foo >= (bar + 1)) ? bar : (1 - (-(-(-1))))
|
|
CHECK: }
|
|
*/
|