189 lines · plain
1# REQUIRES: x862# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t.o3# RUN: ld.lld %t.o -T %s -o %t4# RUN: llvm-nm -p %t | FileCheck %s5 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 shift2 = 2 << 69 >> 65;16 less = 1 < 0 ? 1 : 2;17 lesseq = 1<<0 <= 1>>0 ? 1 : 2;18 greater = 0 > 1 ? 1 : 2;19 greatereq = 1 >= 1 ? 1 : 2;20 eq = 1 == 1 ? 1 : 2;21 neq = 1 != 1 <= 1 ? 1 : 2;22 and = 3 & 4 > 0;23 or = 0xbb & 0xee | 1;24 xor = 3&3^5|1;25 logicaland = (0 && 0) + (0&&1)*2 + (1&& 0)*4 + (1 &&1) *8;26 logicaland2 = 1 & 0 && 1 | 1;27 logicalor = (0 || 0) + (0||1)*2 + (1|| 0)*4 + (1 ||1) *8;28 logicalor2 = 0 && 0 || 1 && 1;29 ternary1 = 0 ? 1 : 2 & 6;30 ternary2 = 1 ? 2?3:4 : 5?6 :7;31 32 mulassign =2;33 mulassign *=2; # Test space can be omitted after *=34 divassign = 8;35 divassign /=2;36 plusassign =1;37 plusassign += 2;38 minusassign = 3;39 minusassign -= 1;40 lshiftassign = 1;41 lshiftassign <<= 1;42 lshiftassign <<= 65; # arbitrarily reduced to 143 rshiftassign = 24;44 rshiftassign >>= 1;45 rshiftassign >>= 130; # arbitrarily reduced to 246 andassign = 6;47 andassign &= 4;48 andassign&=4;49 xorassign = 6;50 xorassign ^= 3;51 xorassign ^=0;52 orassign = 4;53 orassign |= 1;54 orassign|=1;55 braces = 1 + (2 + 3) * 4;56 precedence1 = 1|0xff&1/1<<1+1*2;57 precedence2 = (1 | (0xff & (1 << (1 + (1 * 2)))));58 maxpagesize = CONSTANT (MAXPAGESIZE);59 commonpagesize = CONSTANT (COMMONPAGESIZE);60 . = 0xfff0;61 datasegmentalign = DATA_SEGMENT_ALIGN (0xffff, 0);62 datasegmentalign2 = DATA_SEGMENT_ALIGN (0, 0);63 _end = .;64 minus_rel = _end - 0x10;65 minus_abs = _end - _start;66 max = MAX(11, 22);67 min = MIN(11, 22);68 log2ceil0 = LOG2CEIL(0);69 log2ceil1 = LOG2CEIL(1);70 log2ceil2 = LOG2CEIL(2);71 log2ceil3 = LOG2CEIL(3);72 log2ceil4 = LOG2CEIL(4);73 log2ceil100000000 = LOG2CEIL(0x100000000);74 log2ceil100000001 = LOG2CEIL(0x100000001);75 log2ceilmax = LOG2CEIL(0xffffffffffffffff);76 unaryadd = +3 + ++5;77 unaryadd_and_unaryminus = 15 + +-5 + -+7;78}79 80# CHECK: 0000000000000002 A unary81# CHECK-NEXT: fffffffffffffffe A negate82# CHECK-NEXT: ffffffffffff0004 A not83# CHECK-NEXT: 0000000000000007 A not_negate84# CHECK-NEXT: 0000000000000003 A multiplicative85# CHECK-NEXT: 0000000000000005 A additive86# CHECK-NEXT: 0000000000000080 A shift87# CHECK-NEXT: 0000000000000020 A shift88# CHECK-NEXT: 0000000000000002 A less89# CHECK-NEXT: 0000000000000001 A lesseq90# CHECK-NEXT: 0000000000000002 A greater91# CHECK-NEXT: 0000000000000001 A greatereq92# CHECK-NEXT: 0000000000000001 A eq93# CHECK-NEXT: 0000000000000002 A neq94# CHECK-NEXT: 0000000000000001 A and95# CHECK-NEXT: 00000000000000ab A or96# CHECK-NEXT: 0000000000000007 A xor97# CHECK-NEXT: 0000000000000008 A logicaland98# CHECK-NEXT: 0000000000000000 A logicaland299# CHECK-NEXT: 000000000000000e A logicalor100# CHECK-NEXT: 0000000000000001 A logicalor2101# CHECK-NEXT: 0000000000000002 A ternary1102# CHECK-NEXT: 0000000000000003 A ternary2103# CHECK-NEXT: 0000000000000004 A mulassign104# CHECK-NEXT: 0000000000000004 A divassign105# CHECK-NEXT: 0000000000000003 A plusassign106# CHECK-NEXT: 0000000000000002 A minusassign107# CHECK-NEXT: 0000000000000004 A lshiftassign108# CHECK-NEXT: 0000000000000003 A rshiftassign109# CHECK-NEXT: 0000000000000004 A andassign110# CHECK-NEXT: 0000000000000005 A xorassign111# CHECK-NEXT: 0000000000000005 A orassign112# CHECK-NEXT: 0000000000000015 A braces113# CHECK-NEXT: 0000000000000009 A precedence1114# CHECK-NEXT: 0000000000000009 A precedence2115# CHECK-NEXT: 0000000000001000 A maxpagesize116# CHECK-NEXT: 0000000000001000 A commonpagesize117# CHECK-NEXT: 0000000000010000 A datasegmentalign118# CHECK-NEXT: 000000000000fff0 A datasegmentalign2119# CHECK-NEXT: 000000000000ffe0 T minus_rel120# CHECK-NEXT: 000000000000fff0 A minus_abs121# CHECK-NEXT: 0000000000000016 A max122# CHECK-NEXT: 000000000000000b A min123# CHECK-NEXT: 0000000000000000 A log2ceil0124# CHECK-NEXT: 0000000000000000 A log2ceil1125# CHECK-NEXT: 0000000000000001 A log2ceil2126# CHECK-NEXT: 0000000000000002 A log2ceil3127# CHECK-NEXT: 0000000000000002 A log2ceil4128# CHECK-NEXT: 0000000000000020 A log2ceil100000000129# CHECK-NEXT: 0000000000000021 A log2ceil100000001130# CHECK-NEXT: 0000000000000040 A log2ceilmax131# CHECK-NEXT: 0000000000000008 A unaryadd132# CHECK-NEXT: 0000000000000003 A unaryadd_and_unaryminus133 134## Mailformed number error.135# RUN: echo "SECTIONS { . = 0x12Q41; }" > %t.script136# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \137# RUN: FileCheck --check-prefix=NUMERR %s138# NUMERR: malformed number: 0x12Q41139 140## Missing closing bracket.141# RUN: echo "SECTIONS { . = (1; }" > %t.script142# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \143# RUN: FileCheck --check-prefix=BRACKETERR %s144# BRACKETERR: ) expected, but got ;145 146## Missing opening bracket.147# RUN: echo "SECTIONS { . = 1); }" > %t.script148# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \149# RUN: FileCheck --check-prefix=BRACKETERR2 %s150# BRACKETERR2: ; expected, but got )151 152## Empty expression.153# RUN: echo "SECTIONS { . = ; }" > %t.script154# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \155# RUN: FileCheck --check-prefix=ERREXPR %s156# ERREXPR: malformed number: ;157 158## Div by zero error.159# RUN: echo "SECTIONS { . = 1 / 0; }" > %t.script160# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \161# RUN: FileCheck --check-prefix=DIVZERO %s162# DIVZERO: {{.*}}.script:1: division by zero163 164## Mod by zero error.165# RUN: echo "SECTIONS { . = 1 % 0; }" > %t.script166# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \167# RUN: FileCheck --check-prefix=MODZERO %s168# MODZERO: {{.*}}.script:1: modulo by zero169 170## Broken ternary operator expression.171# RUN: echo "SECTIONS { . = 1 ? 2; }" > %t.script172# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | \173# RUN: FileCheck --check-prefix=TERNERR %s174# TERNERR: : expected, but got ;175 176## Div by zero error.177# RUN: echo 'a = 1; a /= 0;' > %t.script178# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | FileCheck --check-prefix=DIVZERO %s179 180## GNU ld does not support %=.181# RUN: echo 'a = 1; a %= 0;' > %t.script182# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | FileCheck --check-prefix=UNKNOWN1 %s183## For now, we don't support ^= without a preceding space.184# RUN: echo 'a = 1; a^=0;' > %t.script185# RUN: not ld.lld %t.o -T %t.script -o /dev/null 2>&1 | FileCheck --check-prefix=UNKNOWN2 %s186 187# UNKNOWN1: error: {{.*}}:1: unknown directive: a{{$}}188# UNKNOWN2: error: {{.*}}:1: unknown directive: a^=0{{$}}189