Previously we didn't call the hook on a file in an archive, which
let the PE/COFF port fail to link files in archives. It was a
simple mistake. Added a call to the hook and also added a test to
catch that error.
const_cast is an unfortunate hack. Files in the resolver are usually
const, but they are not actually const objects, since they are
mutated if either a file is taken from an archive (an archive file
does never return the same file twice) or the beforeLink hook is
called. Maybe we should just remove const from there -- because they
are not const.
llvm-svn: 230808
[&](StringRef undefName, bool dataSymbolOnly) {
if (const File *member = archiveFile->find(undefName, dataSymbolOnly)) {
member->setOrdinal(_context.getNextOrdinalAndIncrement());
+ const_cast<File *>(member)->beforeLink();
undefAdded = handleFile(*member) || undefAdded;
}
});
# drectve2.obj contains "/include:foo".
# RUN: yaml2obj %p/Inputs/drectve2.obj.yaml > %t2.obj
# RUN: not lld -flavor link /out:%t2.exe /entry:main -- %t2.obj >& %t2.log
-# RUN: FileCheck -check-prefix=UNDEF %s < %t2.log
+# RUN: FileCheck -check-prefix=UNDEF2 %s < %t2.log
-UNDEF: Undefined symbol: {{.*}}: foo
+UNDEF2: Undefined symbol: {{.*}}: foo
+
+# drectve4.lib contains "/include:bar".
+# RUN: not lld -flavor link /force /out:%t3.exe /entry:main /include:_fn1 -- \
+# RUN: %t2.obj %p/Inputs/drectve3.lib >& %t3.log
+# RUN: FileCheck -check-prefix=UNDEF3 %s < %t3.log
+
+UNDEF3: Undefined symbol: {{.*}}: bar