[lld] r192342 - [PECOFF] Add files appear in .drectve to input graph
Rui Ueyama
ruiu at google.com
Wed Oct 9 22:39:43 PDT 2013
Author: ruiu
Date: Thu Oct 10 00:39:43 2013
New Revision: 192342
URL: http://llvm.org/viewvc/llvm-project?rev=192342&view=rev
Log:
[PECOFF] Add files appear in .drectve to input graph
-- so that command line options to specify new input files, such as
/defaultlib:foo, is handled properly. Such options were ignored before
this patch.
Modified:
lld/trunk/lib/Driver/WinLinkDriver.cpp
lld/trunk/test/pecoff/Inputs/drectve.obj.yaml
lld/trunk/test/pecoff/drectve.test
Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=192342&r1=192341&r2=192342&view=diff
==============================================================================
--- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)
+++ lld/trunk/lib/Driver/WinLinkDriver.cpp Thu Oct 10 00:39:43 2013
@@ -208,7 +208,7 @@ StringRef getDefaultEntrySymbolName(PECO
// there's an error in the options.
std::unique_ptr<llvm::opt::InputArgList>
parseArgs(int argc, const char *argv[], raw_ostream &diagnostics,
- bool isDirective) {
+ bool isReadingDirectiveSection) {
// Parse command line options using WinLinkOptions.td
std::unique_ptr<llvm::opt::InputArgList> parsedArgs;
WinLinkOptTable table;
@@ -229,7 +229,7 @@ parseArgs(int argc, const char *argv[],
for (auto it = parsedArgs->filtered_begin(OPT_UNKNOWN),
ie = parsedArgs->filtered_end(); it != ie; ++it) {
StringRef arg = (*it)->getAsString(*parsedArgs);
- if (isDirective && arg.startswith("-?"))
+ if (isReadingDirectiveSection && arg.startswith("-?"))
continue;
diagnostics << "warning: ignoring unknown argument: " << arg << "\n";
}
@@ -262,19 +262,18 @@ bool WinLinkDriver::linkPECOFF(int argc,
return link(context, diagnostics);
}
-bool WinLinkDriver::parse(int argc, const char *argv[], PECOFFLinkingContext &ctx,
- raw_ostream &diagnostics, bool isDirective) {
+bool
+WinLinkDriver::parse(int argc, const char *argv[], PECOFFLinkingContext &ctx,
+ raw_ostream &diagnostics, bool isReadingDirectiveSection) {
std::map<StringRef, StringRef> failIfMismatchMap;
// Parse the options.
std::unique_ptr<llvm::opt::InputArgList> parsedArgs = parseArgs(
- argc, argv, diagnostics, isDirective);
+ argc, argv, diagnostics, isReadingDirectiveSection);
if (!parsedArgs)
return false;
- if (!ctx.hasInputGraph())
- ctx.setInputGraph(std::unique_ptr<InputGraph>(new InputGraph()));
-
- InputGraph &inputGraph = ctx.inputGraph();
+ // The list of input files.
+ std::vector<std::unique_ptr<InputElement> > inputElements;
// Handle /help
if (parsedArgs->getLastArg(OPT_help)) {
@@ -461,8 +460,7 @@ bool WinLinkDriver::parse(int argc, cons
break;
case OPT_INPUT:
- // Add an input file.
- inputGraph.addInputElement(std::unique_ptr<InputElement>(
+ inputElements.push_back(std::unique_ptr<InputElement>(
new PECOFFFileNode(ctx, inputArg->getValue())));
break;
@@ -513,7 +511,7 @@ bool WinLinkDriver::parse(int argc, cons
// but useful for us to test lld on Unix.
if (llvm::opt::Arg *dashdash = parsedArgs->getLastArg(OPT_DASH_DASH)) {
for (const StringRef value : dashdash->getValues())
- inputGraph.addInputElement(
+ inputElements.push_back(
std::unique_ptr<InputElement>(new PECOFFFileNode(ctx, value)));
}
@@ -523,10 +521,10 @@ bool WinLinkDriver::parse(int argc, cons
for (const StringRef defaultLibPath : defaultLibs)
if (ctx.getNoDefaultLibs().find(defaultLibPath) ==
ctx.getNoDefaultLibs().end())
- inputGraph.addInputElement(std::unique_ptr<InputElement>(
+ inputElements.push_back(std::unique_ptr<InputElement>(
new PECOFFLibraryNode(ctx, defaultLibPath)));
- if (!inputGraph.size()) {
+ if (inputElements.size() == 0 && !isReadingDirectiveSection) {
diagnostics << "No input files\n";
return false;
}
@@ -536,11 +534,25 @@ bool WinLinkDriver::parse(int argc, cons
// with ".exe".
if (ctx.outputPath().empty()) {
SmallString<128> firstInputFilePath =
- *dyn_cast<FileNode>(&inputGraph[0])->getPath(ctx);
+ *dyn_cast<FileNode>(&*inputElements[0])->getPath(ctx);
llvm::sys::path::replace_extension(firstInputFilePath, ".exe");
ctx.setOutputPath(ctx.allocateString(firstInputFilePath.str()));
}
+ // If the core linker already started, we need to explicitly call parse() for
+ // each input element, because the pass to parse input files in Driver::link
+ // has already done.
+ if (isReadingDirectiveSection)
+ for (auto &e : inputElements)
+ if (error_code ec = e->parse(ctx, diagnostics))
+ return ec;
+
+ // Add the input files to the input graph.
+ if (!ctx.hasInputGraph())
+ ctx.setInputGraph(std::unique_ptr<InputGraph>(new InputGraph()));
+ for (auto &e : inputElements)
+ ctx.inputGraph().addInputElement(std::move(e));
+
// Validate the combination of options used.
return ctx.validate(diagnostics);
}
Modified: lld/trunk/test/pecoff/Inputs/drectve.obj.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/drectve.obj.yaml?rev=192342&r1=192341&r2=192342&view=diff
==============================================================================
--- lld/trunk/test/pecoff/Inputs/drectve.obj.yaml (original)
+++ lld/trunk/test/pecoff/Inputs/drectve.obj.yaml Thu Oct 10 00:39:43 2013
@@ -5,16 +5,22 @@ header:
sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
- Alignment: 4
- SectionData: B82A000000C3
- - Name: .data
- Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
- Alignment: 4
- SectionData: ""
+ Alignment: 16
+ SectionData: 558BEC56FF15000000008B0D000000008B3103F0FF150000000003C65E5DC3
+ Relocations:
+ - VirtualAddress: 6
+ SymbolName: __imp__fn
+ Type: IMAGE_REL_I386_DIR32
+ - VirtualAddress: 12
+ SymbolName: __imp__var
+ Type: IMAGE_REL_I386_DIR32
+ - VirtualAddress: 22
+ SymbolName: __imp___name_with_underscore
+ Type: IMAGE_REL_I386_DIR32
- Name: .drectve
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
Alignment: 2147483648
- SectionData: 2f73756273797374656d3a636f6e736f6c652c34322e313935202d3f666f6f00
+ SectionData: 2f64656661756c746c69623a766172732e6c6962202f73756273797374656d3a636f6e736f6c652c34322e313935202d3f666f6f00
symbols:
- Name: .text
Value: 0
@@ -23,24 +29,34 @@ symbols:
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
NumberOfAuxSymbols: 1
- AuxiliaryData: 060000000000000000000000000000000000
- - Name: .data
+ AuxiliaryData: 1F000000030000008C7450D6000000000000
+ - Name: __imp__fn
Value: 0
- SectionNumber: 2
+ SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
- StorageClass: IMAGE_SYM_CLASS_STATIC
- NumberOfAuxSymbols: 1
- AuxiliaryData: 000000000000000000000000000000000000
- - Name: _start
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: __imp___name_with_underscore
+ Value: 0
+ SectionNumber: 0
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: _main
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_FUNCTION
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: __imp__var
+ Value: 0
+ SectionNumber: 0
+ SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: .drectve
Value: 0
- SectionNumber: 3
+ SectionNumber: 2
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
Modified: lld/trunk/test/pecoff/drectve.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/drectve.test?rev=192342&r1=192341&r2=192342&view=diff
==============================================================================
--- lld/trunk/test/pecoff/drectve.test (original)
+++ lld/trunk/test/pecoff/drectve.test Thu Oct 10 00:39:43 2013
@@ -1,15 +1,24 @@
# Test if the linker can properly parse the .drectve section contents.
-# "drectve.obj" contains "/subsystem:console,42.195 -?foo" in its .drectve
-# section.
+# "drectve.obj" contains "/defaultlib:vars /subsystem:console,42.195 -?foo"
+# in its .drectve section.
# RUN: yaml2obj %p/Inputs/drectve.obj.yaml > %t.obj
#
-# RUN: lld -flavor link /out:%t.exe /entry:start -- %t.obj >& %t.log
+# RUN: lld -flavor link /out:%t.exe /entry:main /opt:noref /libpath:%p/Inputs \
+# RUN: -- %t.obj >& %t.log
+#
# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=HEADER %s
+# RUN: llvm-objdump -p %t.exe | FileCheck -check-prefix=IMPORT %s
# RUN: echo >> %t.log
# RUN: FileCheck -check-prefix=ERROR %s < %t.log
HEADER: MajorOperatingSystemVersion: 42
HEADER: MinorOperatingSystemVersion: 195
+IMPORT: DLL Name: vars.dll
+IMPORT-NEXT: Hint/Ord Name
+IMPORT-NEXT: 0 _name_with_underscore
+IMPORT-NEXT: 1 fn
+IMPORT-NEXT: 1
+
ERROR-NOT: foo
More information about the llvm-commits
mailing list