| # REQUIRES: x86 |
| # RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t.o |
| # RUN: ld.lld %t.o -T %s -o %t |
| # RUN: llvm-nm -p %t | FileCheck %s |
| |
| SECTIONS { |
| _start = .; |
| plus = 1 + 2 + 3; |
| minus = 5 - 1; |
| div = 6 / 2; |
| mod = 20 % 7; |
| mul = 1 + 2 * 3; |
| nospace = 1+2*6/3; |
| braces = 1 + (2 + 3) * 4; |
| and = 0xbb & 0xee; |
| ternary1 = 1 ? 1 : 2; |
| ternary2 = 0 ? 1 : 2; |
| less = 1 < 0 ? 1 : 2; |
| lesseq = 1 <= 1 ? 1 : 2; |
| greater = 0 > 1 ? 1 : 2; |
| greatereq = 1 >= 1 ? 1 : 2; |
| eq = 1 == 1 ? 1 : 2; |
| neq = 1 != 1 ? 1 : 2; |
| plusassign = 1; |
| plusassign += 2; |
| unary = -1 + 3; |
| lshift = 1 << 5; |
| rshift = 0xff >> 3; |
| precedence1 = 1 | 0xff & 1 << 1 + 1 * 2; |
| precedence2 = (1 | (0xff & (1 << (1 + (1 * 2))))); |
| maxpagesize = CONSTANT (MAXPAGESIZE); |
| commonpagesize = CONSTANT (COMMONPAGESIZE); |
| . = 0xfff0; |
| datasegmentalign = DATA_SEGMENT_ALIGN (0xffff, 0); |
| datasegmentalign2 = DATA_SEGMENT_ALIGN (0, 0); |
| _end = .; |
| minus_rel = _end - 0x10; |
| minus_abs = _end - _start; |
| max = MAX(11, 22); |
| min = MIN(11, 22); |
| log2ceil0 = LOG2CEIL(0); |
| log2ceil1 = LOG2CEIL(1); |
| log2ceil2 = LOG2CEIL(2); |
| log2ceil3 = LOG2CEIL(3); |
| log2ceil4 = LOG2CEIL(4); |
| log2ceil100000000 = LOG2CEIL(0x100000000); |
| log2ceil100000001 = LOG2CEIL(0x100000001); |
| log2ceilmax = LOG2CEIL(0xffffffffffffffff); |
| logicaland1 = 0 && 0; |
| logicaland2 = 0 && 1; |
| logicaland3 = 1 && 0; |
| logicaland4 = 1 && 1; |
| logicalor1 = 0 || 0; |
| logicalor2 = 0 || 1; |
| logicalor3 = 1 || 0; |
| logicalor4 = 1 || 1; |
| } |
| |
| # CHECK: 00000000000006 A plus |
| # CHECK-NEXT: 00000000000004 A minus |
| # CHECK-NEXT: 00000000000003 A div |
| # CHECK-NEXT: 00000000000006 A mod |
| # CHECK-NEXT: 00000000000007 A mul |
| # CHECK-NEXT: 00000000000005 A nospace |
| # CHECK-NEXT: 00000000000015 A braces |
| # CHECK-NEXT: 000000000000aa A and |
| # CHECK-NEXT: 00000000000001 A ternary1 |
| # CHECK-NEXT: 00000000000002 A ternary2 |
| # CHECK-NEXT: 00000000000002 A less |
| # CHECK-NEXT: 00000000000001 A lesseq |
| # CHECK-NEXT: 00000000000002 A greater |
| # CHECK-NEXT: 00000000000001 A greatereq |
| # CHECK-NEXT: 00000000000001 A eq |
| # CHECK-NEXT: 00000000000002 A neq |
| # CHECK-NEXT: 00000000000003 A plusassign |
| # CHECK-NEXT: 00000000000002 A unary |
| # CHECK-NEXT: 00000000000020 A lshift |
| # CHECK-NEXT: 0000000000001f A rshift |
| # CHECK-NEXT: 00000000000009 A precedence1 |
| # CHECK-NEXT: 00000000000009 A precedence2 |
| # CHECK-NEXT: 00000000001000 A maxpagesize |
| # CHECK-NEXT: 00000000001000 A commonpagesize |
| # CHECK-NEXT: 0000000000ffff A datasegmentalign |
| # CHECK-NEXT: 0000000000fff0 A datasegmentalign2 |
| # CHECK-NEXT: 0000000000ffe0 T minus_rel |
| # CHECK-NEXT: 0000000000fff0 A minus_abs |
| # CHECK-NEXT: 00000000000016 A max |
| # CHECK-NEXT: 0000000000000b A min |
| # CHECK-NEXT: 0000000000000000 A log2ceil0 |
| # CHECK-NEXT: 0000000000000000 A log2ceil1 |
| # CHECK-NEXT: 0000000000000001 A log2ceil2 |
| # CHECK-NEXT: 0000000000000002 A log2ceil3 |
| # CHECK-NEXT: 0000000000000002 A log2ceil4 |
| # CHECK-NEXT: 0000000000000020 A log2ceil100000000 |
| # CHECK-NEXT: 0000000000000021 A log2ceil100000001 |
| # CHECK-NEXT: 0000000000000040 A log2ceilmax |
| # CHECK-NEXT: 00000000000000 A logicaland1 |
| # CHECK-NEXT: 00000000000000 A logicaland2 |
| # CHECK-NEXT: 00000000000000 A logicaland3 |
| # CHECK-NEXT: 00000000000001 A logicaland4 |
| # CHECK-NEXT: 00000000000000 A logicalor1 |
| # CHECK-NEXT: 00000000000001 A logicalor2 |
| # CHECK-NEXT: 00000000000001 A logicalor3 |
| # CHECK-NEXT: 00000000000001 A logicalor4 |
| |
| ## Mailformed number error. |
| # RUN: echo "SECTIONS { . = 0x12Q41; }" > %t.script |
| # RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ |
| # RUN: FileCheck --check-prefix=NUMERR %s |
| # NUMERR: malformed number: 0x12Q41 |
| |
| ## Missing closing bracket. |
| # RUN: echo "SECTIONS { . = (1; }" > %t.script |
| # RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ |
| # RUN: FileCheck --check-prefix=BRACKETERR %s |
| # BRACKETERR: ) expected, but got ; |
| |
| ## Missing opening bracket. |
| # RUN: echo "SECTIONS { . = 1); }" > %t.script |
| # RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ |
| # RUN: FileCheck --check-prefix=BRACKETERR2 %s |
| # BRACKETERR2: ; expected, but got ) |
| |
| ## Empty expression. |
| # RUN: echo "SECTIONS { . = ; }" > %t.script |
| # RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ |
| # RUN: FileCheck --check-prefix=ERREXPR %s |
| # ERREXPR: malformed number: ; |
| |
| ## Div by zero error. |
| # RUN: echo "SECTIONS { . = 1 / 0; }" > %t.script |
| # RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ |
| # RUN: FileCheck --check-prefix=DIVZERO %s |
| # DIVZERO: {{.*}}.script:1: division by zero |
| |
| ## Mod by zero error. |
| # RUN: echo "SECTIONS { . = 1 % 0; }" > %t.script |
| # RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ |
| # RUN: FileCheck --check-prefix=MODZERO %s |
| # MODZERO: {{.*}}.script:1: modulo by zero |
| |
| ## Broken ternary operator expression. |
| # RUN: echo "SECTIONS { . = 1 ? 2; }" > %t.script |
| # RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ |
| # RUN: FileCheck --check-prefix=TERNERR %s |
| # TERNERR: : expected, but got ; |