1# REQUIRES: x86
2# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t.o
3# RUN: ld.lld %t.o -T %s -o %t
4# RUN: llvm-nm -p %t | FileCheck %s
5
6SECTIONS {
7  _start = .;
8  plus = 1 + 2 + 3;
9  minus = 5 - 1;
10  div = 6 / 2;
11  mod = 20 % 7;
12  mul = 1 + 2 * 3;
13  nospace = 1+2*6/3;
14  braces = 1 + (2 + 3) * 4;
15  and = 0xbb & 0xee;
16  ternary1 = 1 ? 1 : 2;
17  ternary2 = 0 ? 1 : 2;
18  less = 1 < 0 ? 1 : 2;
19  lesseq = 1 <= 1 ? 1 : 2;
20  greater = 0 > 1 ? 1 : 2;
21  greatereq = 1 >= 1 ? 1 : 2;
22  eq = 1 == 1 ? 1 : 2;
23  neq = 1 != 1 ? 1 : 2;
24  plusassign = 1;
25  plusassign += 2;
26  unary = -1 + 3;
27  lshift = 1 << 5;
28  rshift = 0xff >> 3;
29  precedence1 = 1 | 0xff & 1 << 1 + 1 * 2;
30  precedence2 = (1 | (0xff & (1 << (1 + (1 * 2)))));
31  maxpagesize = CONSTANT (MAXPAGESIZE);
32  commonpagesize = CONSTANT (COMMONPAGESIZE);
33  . = 0xfff0;
34  datasegmentalign = DATA_SEGMENT_ALIGN (0xffff, 0);
35  datasegmentalign2 = DATA_SEGMENT_ALIGN (0, 0);
36  _end = .;
37  minus_rel = _end - 0x10;
38  minus_abs = _end - _start;
39  max = MAX(11, 22);
40  min = MIN(11, 22);
41  logicaland1 = 0 && 0;
42  logicaland2 = 0 && 1;
43  logicaland3 = 1 && 0;
44  logicaland4 = 1 && 1;
45  logicalor1 = 0 || 0;
46  logicalor2 = 0 || 1;
47  logicalor3 = 1 || 0;
48  logicalor4 = 1 || 1;
49}
50
51# CHECK:      00000000000006 A plus
52# CHECK-NEXT: 00000000000004 A minus
53# CHECK-NEXT: 00000000000003 A div
54# CHECK-NEXT: 00000000000006 A mod
55# CHECK-NEXT: 00000000000007 A mul
56# CHECK-NEXT: 00000000000005 A nospace
57# CHECK-NEXT: 00000000000015 A braces
58# CHECK-NEXT: 000000000000aa A and
59# CHECK-NEXT: 00000000000001 A ternary1
60# CHECK-NEXT: 00000000000002 A ternary2
61# CHECK-NEXT: 00000000000002 A less
62# CHECK-NEXT: 00000000000001 A lesseq
63# CHECK-NEXT: 00000000000002 A greater
64# CHECK-NEXT: 00000000000001 A greatereq
65# CHECK-NEXT: 00000000000001 A eq
66# CHECK-NEXT: 00000000000002 A neq
67# CHECK-NEXT: 00000000000003 A plusassign
68# CHECK-NEXT: 00000000000002 A unary
69# CHECK-NEXT: 00000000000020 A lshift
70# CHECK-NEXT: 0000000000001f A rshift
71# CHECK-NEXT: 00000000000009 A precedence1
72# CHECK-NEXT: 00000000000009 A precedence2
73# CHECK-NEXT: 00000000001000 A maxpagesize
74# CHECK-NEXT: 00000000001000 A commonpagesize
75# CHECK-NEXT: 0000000000ffff A datasegmentalign
76# CHECK-NEXT: 0000000000fff0 A datasegmentalign2
77# CHECK-NEXT: 0000000000ffe0 T minus_rel
78# CHECK-NEXT: 0000000000fff0 A minus_abs
79# CHECK-NEXT: 00000000000016 A max
80# CHECK-NEXT: 0000000000000b A min
81# CHECK-NEXT: 00000000000000 A logicaland1
82# CHECK-NEXT: 00000000000000 A logicaland2
83# CHECK-NEXT: 00000000000000 A logicaland3
84# CHECK-NEXT: 00000000000001 A logicaland4
85# CHECK-NEXT: 00000000000000 A logicalor1
86# CHECK-NEXT: 00000000000001 A logicalor2
87# CHECK-NEXT: 00000000000001 A logicalor3
88# CHECK-NEXT: 00000000000001 A logicalor4
89
90## Mailformed number error.
91# RUN: echo "SECTIONS { . = 0x12Q41; }" > %t.script
92# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \
93# RUN:  FileCheck --check-prefix=NUMERR %s
94# NUMERR: malformed number: 0x12Q41
95
96## Missing closing bracket.
97# RUN: echo "SECTIONS { . = (1; }" > %t.script
98# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \
99# RUN:  FileCheck --check-prefix=BRACKETERR %s
100# BRACKETERR: ) expected, but got ;
101
102## Missing opening bracket.
103# RUN: echo "SECTIONS { . = 1); }" > %t.script
104# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \
105# RUN:  FileCheck --check-prefix=BRACKETERR2 %s
106# BRACKETERR2: ; expected, but got )
107
108## Empty expression.
109# RUN: echo "SECTIONS { . = ; }" > %t.script
110# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \
111# RUN:  FileCheck --check-prefix=ERREXPR %s
112# ERREXPR: malformed number: ;
113
114## Div by zero error.
115# RUN: echo "SECTIONS { . = 1 / 0; }" > %t.script
116# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \
117# RUN:  FileCheck --check-prefix=DIVZERO %s
118# DIVZERO: {{.*}}.script:1: division by zero
119
120## Mod by zero error.
121# RUN: echo "SECTIONS { . = 1 % 0; }" > %t.script
122# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \
123# RUN:  FileCheck --check-prefix=MODZERO %s
124# MODZERO: {{.*}}.script:1: modulo by zero
125
126## Broken ternary operator expression.
127# RUN: echo "SECTIONS { . = 1 ? 2; }" > %t.script
128# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \
129# RUN:  FileCheck --check-prefix=TERNERR %s
130# TERNERR: : expected, but got ;
131