diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-03-19 07:29:38 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-03-19 07:29:38 +0000 |
commit | 115a79277edababaf1b26e3654044ae983197679 (patch) | |
tree | 4b564221de8b5cc2a3c9937464cccc5e0186876e | |
parent | 42f7fc23044cc736db77878734258d35ad3dfe66 (diff) |
Driver: Handle "linker input" arguments.
- Make InputInfo a variant of filename, pipe, input argument,
nothing.
- Leave a FIXME in InputInfo that this should be revisited.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67292 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Driver/Driver.cpp | 15 | ||||
-rw-r--r-- | lib/Driver/InputInfo.h | 54 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 31 |
3 files changed, 69 insertions, 31 deletions
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index b147bb3a41..c330707d34 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -697,12 +697,15 @@ void Driver::BuildJobsForAction(Compilation &C, UsePipes = false; if (const InputAction *IA = dyn_cast<InputAction>(A)) { - // FIXME: This is broken, linker inputs won't work here. - assert(isa<PositionalArg>(IA->getInputArg()) && "FIXME: Linker inputs"); - - IA->getInputArg().claim(); - const char *Name = IA->getInputArg().getValue(C.getArgs()); - Result = InputInfo(Name, A->getType(), Name); + // FIXME: It would be nice to not claim this here; maybe the old + // scheme of just using Args was better? + const Arg &Input = IA->getInputArg(); + Input.claim(); + if (isa<PositionalArg>(Input)) { + const char *Name = Input.getValue(C.getArgs()); + Result = InputInfo(Name, A->getType(), Name); + } else + Result = InputInfo(&Input, A->getType(), ""); return; } diff --git a/lib/Driver/InputInfo.h b/lib/Driver/InputInfo.h index 617e70365d..c657bef95a 100644 --- a/lib/Driver/InputInfo.h +++ b/lib/Driver/InputInfo.h @@ -21,37 +21,61 @@ namespace driver { /// InputInfo - Wrapper for information about an input source. class InputInfo { + // FIXME: The distinction between filenames and inputarg here is + // gross; we should probably drop the idea of a "linker + // input". Doing so means tweaking pipelining to still create link + // steps when it sees linker inputs (but not treat them as + // arguments), and making sure that arguments get rendered + // correctly. + enum Class { + Nothing, + Filename, + InputArg, + Pipe + }; + union { const char *Filename; + const Arg *InputArg; PipedJob *Pipe; } Data; - bool IsPipe; + Class Kind; types::ID Type; const char *BaseInput; public: InputInfo() {} InputInfo(types::ID _Type, const char *_BaseInput) - : IsPipe(false), Type(_Type), BaseInput(_BaseInput) { - Data.Filename = 0; + : Kind(Nothing), Type(_Type), BaseInput(_BaseInput) { + } + InputInfo(const char *_Filename, types::ID _Type, const char *_BaseInput) + : Kind(Filename), Type(_Type), BaseInput(_BaseInput) { + Data.Filename = _Filename; } - InputInfo(const char *Filename, types::ID _Type, const char *_BaseInput) - : IsPipe(false), Type(_Type), BaseInput(_BaseInput) { - Data.Filename = Filename; + InputInfo(const Arg *_InputArg, types::ID _Type, const char *_BaseInput) + : Kind(InputArg), Type(_Type), BaseInput(_BaseInput) { + Data.InputArg = _InputArg; } - InputInfo(PipedJob *Pipe, types::ID _Type, const char *_BaseInput) - : IsPipe(true), Type(_Type), BaseInput(_BaseInput) { - Data.Pipe = Pipe; + InputInfo(PipedJob *_Pipe, types::ID _Type, const char *_BaseInput) + : Kind(Pipe), Type(_Type), BaseInput(_BaseInput) { + Data.Pipe = _Pipe; } - bool isPipe() const { return IsPipe; } + bool isNothing() const { return Kind == Nothing; } + bool isFilename() const { return Kind == Filename; } + bool isInputArg() const { return Kind == InputArg; } + bool isPipe() const { return Kind == Pipe; } types::ID getType() const { return Type; } const char *getBaseInput() const { return BaseInput; } - const char *getInputFilename() const { - assert(!isPipe() && "Invalid accessor."); + const char *getFilename() const { + assert(isFilename() && "Invalid accessor."); return Data.Filename; } + const Arg &getInputArg() const { + assert(isInputArg() && "Invalid accessor."); + return *Data.InputArg; + } PipedJob &getPipe() const { assert(isPipe() && "Invalid accessor."); return *Data.Pipe; @@ -62,8 +86,10 @@ public: std::string getAsString() const { if (isPipe()) return "(pipe)"; - else if (const char *N = getInputFilename()) - return std::string("\"") + N + '"'; + else if (isFilename()) + return std::string("\"") + getFilename() + '"'; + else if (isInputArg()) + return "(input arg)"; else return "(nothing)"; } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 4cb73dbda3..5cba626195 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -49,10 +49,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // FIXME: This is a total hack. Copy the input header file // to the output, so that it can be -include'd by clang. assert(Inputs.size() == 1 && "Cannot make PCH with multiple inputs."); - assert(!Output.isPipe() && "Unexpected pipe"); + assert(Output.isFilename() && "Unexpected output"); assert(!Inputs[0].isPipe() && "Unexpected pipe"); - const char *InputPath = Inputs[0].getInputFilename(); - llvm::sys::Path OutputPath(Output.getInputFilename()); + assert(Inputs[0].isFilename() && "Unexpected input"); + const char *InputPath = Inputs[0].getFilename(); + llvm::sys::Path OutputPath(Output.getFilename()); OutputPath.eraseComponent(); if (OutputPath.empty()) OutputPath = llvm::sys::Path(InputPath).getLast(); @@ -317,9 +318,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (Output.isPipe()) { CmdArgs.push_back("-o"); CmdArgs.push_back("-"); - } else if (const char *N = Output.getInputFilename()) { + } else if (Output.isFilename()) { CmdArgs.push_back("-o"); - CmdArgs.push_back(N); + CmdArgs.push_back(Output.getFilename()); + } else { + assert(Output.isNothing() && "Invalid output."); } for (InputInfoList::const_iterator @@ -329,8 +332,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(types::getTypeName(II.getType())); if (II.isPipe()) CmdArgs.push_back("-"); + else if (II.isFilename()) + CmdArgs.push_back(II.getFilename()); else - CmdArgs.push_back(II.getInputFilename()); + II.getInputArg().renderAsInput(Args, CmdArgs); } const char *Exec = @@ -364,11 +369,13 @@ void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, if (Output.isPipe()) { CmdArgs.push_back("-o"); CmdArgs.push_back("-"); - } else if (const char *N = Output.getInputFilename()) { + } else if (Output.isFilename()) { CmdArgs.push_back("-o"); - CmdArgs.push_back(N); - } else + CmdArgs.push_back(Output.getFilename()); + } else { + assert(Output.isNothing() && "Unexpected output"); CmdArgs.push_back("-fsyntax-only"); + } // Only pass -x if gcc will understand it; otherwise hope gcc @@ -389,9 +396,11 @@ void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, if (II.isPipe()) CmdArgs.push_back("-"); + else if (II.isFilename()) + CmdArgs.push_back(II.getFilename()); else - // FIXME: Linker inputs - CmdArgs.push_back(II.getInputFilename()); + // Don't render as input, we need gcc to do the translations. + II.getInputArg().render(Args, CmdArgs); } const char *Exec = |