Index: lld/trunk/COFF/Driver.cpp =================================================================== --- lld/trunk/COFF/Driver.cpp +++ lld/trunk/COFF/Driver.cpp @@ -1699,6 +1699,14 @@ Symtab->addCombinedLTOObjects(); run(); + if (Args.hasArg(OPT_include_optional)) { + // Handle /includeoptional + for (auto *Arg : Args.filtered(OPT_include_optional)) + if (dyn_cast_or_null(Symtab->find(Arg->getValue()))) + addUndefined(Arg->getValue()); + while (run()); + } + if (Config->MinGW) { // Load any further object files that might be needed for doing automatic // imports. Index: lld/trunk/COFF/Options.td =================================================================== --- lld/trunk/COFF/Options.td +++ lld/trunk/COFF/Options.td @@ -167,6 +167,8 @@ defm demangle : B<"demangle", "Demangle symbols in output (default)", "Do not demangle symbols in output">; +def include_optional : Joined<["/", "-", "/?", "-?"], "includeoptional:">, + HelpText<"Add symbol as undefined, but allow it to remain undefined">; def kill_at : F<"kill-at">; def lldmingw : F<"lldmingw">; def output_def : Joined<["/", "-", "/?", "-?"], "output-def:">; Index: lld/trunk/test/COFF/includeoptional.yaml =================================================================== --- lld/trunk/test/COFF/includeoptional.yaml +++ lld/trunk/test/COFF/includeoptional.yaml @@ -0,0 +1,39 @@ +# RUN: yaml2obj < %s > %t.main.obj +# RUN: yaml2obj < %p/Inputs/include1c.yaml > %t.lib.obj +# RUN: rm -f %t.lib.lib +# RUN: llvm-ar cru %t.lib.lib %t.lib.obj +# RUN: lld-link /out:%t.exe /entry:main /includeoptional:bar /includeoptional:actuallymissing %t.main.obj %t.lib.lib /verbose >& %t.log +# RUN: FileCheck %s < %t.log + +# CHECK: includeoptional.yaml.tmp.main.obj +# CHECK: includeoptional.yaml.tmp.lib.lib +# CHECK: includeoptional.yaml.tmp.lib.lib(includeoptional.yaml.tmp.lib.obj) for bar +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: B800000000506800000000680000000050E80000000050E800000000 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 28 + NumberOfRelocations: 4 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +... Index: lld/trunk/test/COFF/includeoptional2.yaml =================================================================== --- lld/trunk/test/COFF/includeoptional2.yaml +++ lld/trunk/test/COFF/includeoptional2.yaml @@ -0,0 +1,44 @@ +# RUN: yaml2obj < %s > %t.obj +# RUN: not lld-link /out:%t.exe /entry:main /includeoptional:undeffunc %t.obj /verbose 2>&1 | FileCheck %s + +# CHECK: error: undefined symbol: undeffunc + +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: B800000000506800000000680000000050E80000000050E800000000 + Relocations: + - VirtualAddress: 17 + SymbolName: undeffunc + Type: IMAGE_REL_AMD64_REL32 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 28 + NumberOfRelocations: 1 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: undeffunc + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +...