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 unary =!0 + !0; # Test space can be omitted between = and ! 9 negate =-1 - 1; 10 not =~0xffff + 4; 11 not_negate = -~5 + 1; 12 multiplicative = 20 / 2 % 7; 13 additive = 1 - 2 + -3 * -2; 14 shift = 2 << 5 >> 1 << 2; 15 less = 1 < 0 ? 1 : 2; 16 lesseq = 1<<0 <= 1>>0 ? 1 : 2; 17 greater = 0 > 1 ? 1 : 2; 18 greatereq = 1 >= 1 ? 1 : 2; 19 eq = 1 == 1 ? 1 : 2; 20 neq = 1 != 1 <= 1 ? 1 : 2; 21 and = 3 & 4 > 0; 22 or = 0xbb & 0xee | 1; 23 logicaland = (0 && 0) + (0&&1)*2 + (1&& 0)*4 + (1 &&1) *8; 24 logicaland2 = 1 & 0 && 1 | 1; 25 logicalor = (0 || 0) + (0||1)*2 + (1|| 0)*4 + (1 ||1) *8; 26 logicalor2 = 0 && 0 || 1 && 1; 27 ternary1 = 0 ? 1 : 2 & 6; 28 ternary2 = 1 ? 2?3:4 : 5?6 :7; 29 30 mulassign =2; 31 mulassign *=2; # Test space can be omitted after *= 32 divassign = 8; 33 divassign /=2; 34 plusassign =1; 35 plusassign += 2; 36 minusassign = 3; 37 minusassign -= 1; 38 lshiftassign = 1; 39 lshiftassign <<= 2; 40 rshiftassign = 5; 41 rshiftassign >>= 1; 42 andassign = 6; 43 andassign &= 4; 44 orassign = 4; 45 orassign |= 1; 46 braces = 1 + (2 + 3) * 4; 47 precedence1 = 1|0xff&1/1<<1+1*2; 48 precedence2 = (1 | (0xff & (1 << (1 + (1 * 2))))); 49 maxpagesize = CONSTANT (MAXPAGESIZE); 50 commonpagesize = CONSTANT (COMMONPAGESIZE); 51 . = 0xfff0; 52 datasegmentalign = DATA_SEGMENT_ALIGN (0xffff, 0); 53 datasegmentalign2 = DATA_SEGMENT_ALIGN (0, 0); 54 _end = .; 55 minus_rel = _end - 0x10; 56 minus_abs = _end - _start; 57 max = MAX(11, 22); 58 min = MIN(11, 22); 59 log2ceil0 = LOG2CEIL(0); 60 log2ceil1 = LOG2CEIL(1); 61 log2ceil2 = LOG2CEIL(2); 62 log2ceil3 = LOG2CEIL(3); 63 log2ceil4 = LOG2CEIL(4); 64 log2ceil100000000 = LOG2CEIL(0x100000000); 65 log2ceil100000001 = LOG2CEIL(0x100000001); 66 log2ceilmax = LOG2CEIL(0xffffffffffffffff); 67} 68 69# CHECK: 0000000000000002 A unary 70# CHECK-NEXT: fffffffffffffffe A negate 71# CHECK-NEXT: ffffffffffff0004 A not 72# CHECK-NEXT: 0000000000000007 A not_negate 73# CHECK-NEXT: 0000000000000003 A multiplicative 74# CHECK-NEXT: 0000000000000005 A additive 75# CHECK-NEXT: 0000000000000080 A shift 76# CHECK-NEXT: 0000000000000002 A less 77# CHECK-NEXT: 0000000000000001 A lesseq 78# CHECK-NEXT: 0000000000000002 A greater 79# CHECK-NEXT: 0000000000000001 A greatereq 80# CHECK-NEXT: 0000000000000001 A eq 81# CHECK-NEXT: 0000000000000002 A neq 82# CHECK-NEXT: 0000000000000001 A and 83# CHECK-NEXT: 00000000000000ab A or 84# CHECK-NEXT: 0000000000000008 A logicaland 85# CHECK-NEXT: 0000000000000000 A logicaland2 86# CHECK-NEXT: 000000000000000e A logicalor 87# CHECK-NEXT: 0000000000000001 A logicalor2 88# CHECK-NEXT: 0000000000000002 A ternary1 89# CHECK-NEXT: 0000000000000003 A ternary2 90# CHECK-NEXT: 0000000000000004 A mulassign 91# CHECK-NEXT: 0000000000000004 A divassign 92# CHECK-NEXT: 0000000000000003 A plusassign 93# CHECK-NEXT: 0000000000000002 A minusassign 94# CHECK-NEXT: 0000000000000004 A lshiftassign 95# CHECK-NEXT: 0000000000000002 A rshiftassign 96# CHECK-NEXT: 0000000000000004 A andassign 97# CHECK-NEXT: 0000000000000005 A orassign 98# CHECK-NEXT: 0000000000000015 A braces 99# CHECK-NEXT: 0000000000000009 A precedence1 100# CHECK-NEXT: 0000000000000009 A precedence2 101# CHECK-NEXT: 0000000000001000 A maxpagesize 102# CHECK-NEXT: 0000000000001000 A commonpagesize 103# CHECK-NEXT: 0000000000010000 A datasegmentalign 104# CHECK-NEXT: 000000000000fff0 A datasegmentalign2 105# CHECK-NEXT: 000000000000ffe0 T minus_rel 106# CHECK-NEXT: 000000000000fff0 A minus_abs 107# CHECK-NEXT: 0000000000000016 A max 108# CHECK-NEXT: 000000000000000b A min 109# CHECK-NEXT: 0000000000000000 A log2ceil0 110# CHECK-NEXT: 0000000000000000 A log2ceil1 111# CHECK-NEXT: 0000000000000001 A log2ceil2 112# CHECK-NEXT: 0000000000000002 A log2ceil3 113# CHECK-NEXT: 0000000000000002 A log2ceil4 114# CHECK-NEXT: 0000000000000020 A log2ceil100000000 115# CHECK-NEXT: 0000000000000021 A log2ceil100000001 116# CHECK-NEXT: 0000000000000040 A log2ceilmax 117 118## Mailformed number error. 119# RUN: echo "SECTIONS { . = 0x12Q41; }" > %t.script 120# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ 121# RUN: FileCheck --check-prefix=NUMERR %s 122# NUMERR: malformed number: 0x12Q41 123 124## Missing closing bracket. 125# RUN: echo "SECTIONS { . = (1; }" > %t.script 126# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ 127# RUN: FileCheck --check-prefix=BRACKETERR %s 128# BRACKETERR: ) expected, but got ; 129 130## Missing opening bracket. 131# RUN: echo "SECTIONS { . = 1); }" > %t.script 132# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ 133# RUN: FileCheck --check-prefix=BRACKETERR2 %s 134# BRACKETERR2: ; expected, but got ) 135 136## Empty expression. 137# RUN: echo "SECTIONS { . = ; }" > %t.script 138# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ 139# RUN: FileCheck --check-prefix=ERREXPR %s 140# ERREXPR: malformed number: ; 141 142## Div by zero error. 143# RUN: echo "SECTIONS { . = 1 / 0; }" > %t.script 144# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ 145# RUN: FileCheck --check-prefix=DIVZERO %s 146# DIVZERO: {{.*}}.script:1: division by zero 147 148## Mod by zero error. 149# RUN: echo "SECTIONS { . = 1 % 0; }" > %t.script 150# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ 151# RUN: FileCheck --check-prefix=MODZERO %s 152# MODZERO: {{.*}}.script:1: modulo by zero 153 154## Broken ternary operator expression. 155# RUN: echo "SECTIONS { . = 1 ? 2; }" > %t.script 156# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \ 157# RUN: FileCheck --check-prefix=TERNERR %s 158# TERNERR: : expected, but got ; 159 160## Div by zero error. 161# RUN: echo 'a = 1; a /= 0;' > %t.script 162# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | FileCheck --check-prefix=DIVZERO %s 163 164## GNU ld does not support %= or ^=. 165# RUN: echo 'a = 1; a %= 0;' > %t.script 166# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | FileCheck --check-prefix=UNKNOWN %s 167# RUN: echo 'a = 1; a ^= 0;' > %t.script 168# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | FileCheck --check-prefix=UNKNOWN %s 169 170# UNKNOWN: error: {{.*}}:1: unknown directive: a 171