Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -655,6 +655,8 @@ StringRef Tok = next(); if (Handler Fn = Cmd.lookup(Tok)) (this->*Fn)(); + else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok)) + Opt.Commands.emplace_back(Cmd); else setError("unknown directive: " + Tok); } Index: lld/trunk/test/ELF/invalid-linkerscript.test =================================================================== --- lld/trunk/test/ELF/invalid-linkerscript.test +++ lld/trunk/test/ELF/invalid-linkerscript.test @@ -15,7 +15,7 @@ # RUN: echo foobar > %t1 # RUN: not ld.lld %t1 no-such-file 2>&1 | FileCheck -check-prefix=ERR1 %s -# ERR1: unknown directive: foobar +# ERR1: unexpected EOF # ERR1: cannot open no-such-file: # RUN: echo "foo \"bar" > %t2 Index: lld/trunk/test/ELF/linkerscript/linkerscript-symbols.s =================================================================== --- lld/trunk/test/ELF/linkerscript/linkerscript-symbols.s +++ lld/trunk/test/ELF/linkerscript/linkerscript-symbols.s @@ -41,6 +41,32 @@ # RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=HIDDEN3 %s # HIDDEN3: 0000000000000001 *ABS* 00000000 .hidden newsym +# The symbol is not referenced. Don't provide it. +# RUN: echo "PROVIDE(newsym = 1);" > %t.script +# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=PROVIDE4 %s +# PROVIDE4-NOT: 0000000000000001 *ABS* 00000000 newsym + +# The symbol is not referenced. Don't provide it. +# RUN: echo "PROVIDE_HIDDEN(newsym = 1);" > %t.script +# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=HIDDEN4 %s +# HIDDEN4-NOT: 0000000000000001 *ABS* 00000000 .hidden newsym + +# Provide existing symbol. The value should be 0, even though we +# have value of 1 in PROVIDE() +# RUN: echo "PROVIDE(somesym = 1);" > %t.script +# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=PROVIDE5 %s +# PROVIDE5: 0000000000000000 *ABS* 00000000 somesym + +# Provide existing symbol. The value should be 0, even though we +# have value of 1 in PROVIDE_HIDDEN(). Visibility should not change +# RUN: echo "PROVIDE_HIDDEN(somesym = 1);" > %t.script +# RUN: ld.lld -o %t1 --script %t.script %t +# RUN: llvm-objdump -t %t1 | FileCheck --check-prefix=HIDDEN5 %s +# HIDDEN5: 0000000000000000 *ABS* 00000000 somesym + .global _start _start: nop