Page MenuHomePhabricator

[lld][test] Fix use of escape character in an lld test on Windows
ClosedPublic

Authored by rupprecht on Oct 16 2019, 4:48 PM.

Details

Summary

Glob support was improved to accept \ as an escape character in r375051, but reverted as r375052 due to a failure in this test on Windows.

The reason this failure seems Windows specific is because the path separator \ is currently being relied on to be interpreted literally instead of as an escape character. Per documentation on linker input section wildcard patterns, this seems to be a bug in lld accepting \ as a literal instead of an escape character.

For example:

SECTIONS{ .foo :{ /path/to/foo.o(.foo) }} # OK: standard UNIX path
SECTIONS{ .foo :{ C:/path/to/foo.o(.foo) }} # OK: windows accepts slashes in either direction
SECTIONS{ .foo :{ C:\\path\\to\\foo.o(.foo) }} # OK: escape character used to match a literal \
SECTIONS{ .foo :{ C:\path\to\foo.o(.foo) }} # BAD: this actually matches the path C:pathtofoo.o(.foo)

This avoids the problem in the test by using %/T in place of %T to normalize the path separator to /, which windows should also accept.

This patch just fixes the test, and glob support will be be relanded separately.

For a sample buildbot error, see: http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/11578/steps/stage%201%20check/logs/stdio

Diff Detail

Event Timeline

rupprecht created this revision.Oct 16 2019, 4:48 PM
MaskRay accepted this revision.Oct 16 2019, 7:13 PM
This revision is now accepted and ready to land.Oct 16 2019, 7:13 PM
ruiu accepted this revision.Oct 16 2019, 8:08 PM

LGTM

This revision was automatically updated to reflect the committed changes.

I don't fully understand the failure, but I've committed r375131. If it doesn't work, I'll revert both.

I have a suspicion that there's a bug in the filename matching (e.g. "foo/bar.txt" and "foo\bar.txt" should be equivalent in all places on windows), but I'm not enough of a linkerscript expert to do much about it. r375131 just tries to make it consistently "foo/bar.txt".

Drive-by comment, mostly as an FYI: I'm pretty sure %T has been deprecated because it can cause race conditions (multiple tests can have the same %T) and users should change to create a directory using %t and work inside there.

Drive-by comment, mostly as an FYI: I'm pretty sure %T has been deprecated because it can cause race conditions (multiple tests can have the same %T) and users should change to create a directory using %t and work inside there.

Thanks for pointing this out! %T is used a lot in lld tests. I just created a patch D69572 to fix lld/test/ELF tests.