Index: ELF/ScriptParser.cpp =================================================================== --- ELF/ScriptParser.cpp +++ ELF/ScriptParser.cpp @@ -884,6 +884,10 @@ Expr E = readPrimary(); return [=] { return ~E().getValue(); }; } + if (consume("!")) { + Expr E = readPrimary(); + return [=] { return !E().getValue(); }; + } if (consume("-")) { Expr E = readPrimary(); return [=] { return -E().getValue(); }; Index: test/ELF/linkerscript/assert.s =================================================================== --- test/ELF/linkerscript/assert.s +++ test/ELF/linkerscript/assert.s @@ -35,5 +35,20 @@ # RUN: FileCheck %s -check-prefix=CHECK-SEMI < %t.log # CHECK-SEMI: error: {{.*}}.script:1: ; expected, but got } +## Test assert with ! operator +# RUN: echo "SECTIONS { ASSERT(!(0), fail) }" > %t8.script +# RUN: ld.lld -shared -o %t8 --script %t8.script %t1.o +# RUN: llvm-readobj %t8 > /dev/null + +# RUN: echo "SECTIONS { ASSERT(!(1), fail) }" > %t9.script +# RUN: not ld.lld -shared -o %t9 --script %t9.script %t1.o > %t.log 2>&1 +# RUN: FileCheck %s -check-prefix=FAIL1 < %t.log +# FAIL1: fail + +# RUN: echo "SECTIONS { .foo : { *(.foo) } }" > %t10.script +# RUN: echo "ASSERT(!(SIZEOF(.foo) == 0), fail);" >> %t10.script +# RUN: ld.lld -shared -o %t10 --script %t10.script %t1.o +# RUN: llvm-readobj %t10 > /dev/null + .section .foo, "a" .quad 0 Index: test/ELF/linkerscript/symbol-assignexpr.s =================================================================== --- test/ELF/linkerscript/symbol-assignexpr.s +++ test/ELF/linkerscript/symbol-assignexpr.s @@ -15,6 +15,7 @@ # RUN: symbol11 = ((0x28000 + 0x1fff) & ~(0x1000 + -1)); \ # RUN: symbol12 = 0x1234; \ # RUN: symbol12 += 1; \ +# RUN: symbol13 = ! symbol; \ # RUN: bar = 0x5678; \ # RUN: baz = 0x9abc; \ # RUN: }" > %t.script @@ -39,6 +40,7 @@ # CHECK-NEXT: fedcba9876543210 *ABS* 00000000 symbol10 # CHECK-NEXT: 0000000000029000 *ABS* 00000000 symbol11 # CHECK-NEXT: 0000000000001235 *ABS* 00000000 symbol12 +# CHECK-NEXT: 0000000000000000 *ABS* 00000000 symbol13 # RUN: echo "SECTIONS { symbol2 = symbol; }" > %t2.script # RUN: not ld.lld -o %t2 --script %t2.script %t 2>&1 \