Add a --linker command-line option, make all tests pass.

llvm-svn: 50755
This commit is contained in:
Mikhail Glushenkov 2008-05-06 18:13:00 +00:00
parent 20c18c344b
commit 7f6ed20009
5 changed files with 29 additions and 22 deletions

View File

@ -1,5 +1,5 @@
// Test that we can compile .c files as C++ and vice versa
// RUN: llvmc2 -x c++ %s -x c %p/false.cpp -x lisp -x whatnot -x none %p/false2.cpp -o %t
// RUN: llvmc2 --linker=c++ -x c++ %s -x c %p/false.cpp -x lisp -x whatnot -x none %p/false2.cpp -o %t
// RUN: ./%t | grep hello
#include <iostream>
@ -10,5 +10,5 @@ extern std::string test2();
int main() {
std::cout << "h";
test();
std::cout << test2() << '\n';
std::cout << test2() << '\n';
}

View File

@ -1,5 +1,5 @@
// Test that we can compile C++ code.
// RUN: llvmc2 %s -o %t
// RUN: llvmc2 --linker=c++ %s -o %t
// RUN: ./%t | grep hello
#include <iostream>

View File

@ -33,6 +33,13 @@ def CompilationGraph : CompilationGraph<[
Edge<llc, llvm_gcc_assembler>,
Edge<llvm_gcc_assembler, llvm_gcc_linker>,
OptionalEdge<llvm_gcc_assembler, llvm_gcc_cpp_linker,
[(parameter_equals "linker", "g++"),
(parameter_equals "linker", "c++")]>,
Edge<root, llvm_gcc_linker>
Edge<root, llvm_gcc_linker>,
OptionalEdge<root, llvm_gcc_cpp_linker,
[(parameter_equals "linker", "g++"),
(parameter_equals "linker", "c++")]>
]>;

View File

@ -81,19 +81,18 @@ def llvm_gcc_linker : Tool<
]>;
// Alternative linker for C++
// TOTHINK: how to implement this best?
// Something like input_file_language can only choose between two languages.
// def llvm_gcc_cpp_linker : Tool<
// [(in_language "object-code"),
// (out_language "executable"),
// (output_suffix "out"),
// (cmd_line "llvm-g++ $INFILE -o $OUTFILE"),
// (join),
// //(input_file_language "c++"),
// (prefix_list_option "L", (forward)),
// (prefix_list_option "l", (forward)),
// (prefix_list_option "Wl", (unpack_values))
// ]>;
def llvm_gcc_cpp_linker : Tool<
[(in_language "object-code"),
(out_language "executable"),
(output_suffix "out"),
(cmd_line "llvm-g++ $INFILE -o $OUTFILE"),
(join),
(parameter_option "linker",
(help "Choose linker (possible values: gcc, g++)")),
(prefix_list_option "L", (forward)),
(prefix_list_option "l", (forward)),
(prefix_list_option "Wl", (unpack_values))
]>;
// Language map

View File

@ -175,11 +175,12 @@ struct GlobalOptionDescription : public OptionDescription {
if (other.Type != Type)
throw "Conflicting definitions for the option " + Name + "!";
if (Help.empty() && !other.Help.empty())
if (Help == DefaultHelpString)
Help = other.Help;
else if (!Help.empty() && !other.Help.empty())
cerr << "Warning: more than one help string defined for option "
else if (other.Help != DefaultHelpString) {
llvm::cerr << "Warning: more than one help string defined for option "
+ Name + "\n";
}
Flags |= other.Flags;
}
@ -290,8 +291,8 @@ struct ToolProperties : public RefCountedBase<ToolProperties> {
// Default ctor here is needed because StringMap can only store
// DefaultConstructible objects
ToolProperties() {}
ToolProperties (const std::string& n) : Name(n) {}
ToolProperties() : Flags(0) {}
ToolProperties (const std::string& n) : Name(n), Flags(0) {}
};