// 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>
int main() {
std::cout << "h";
test();
- std::cout << test2() << '\n';
+ std::cout << test2() << '\n';
}
// 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>
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++")]>
]>;
]>;
// 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
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;
}
// 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) {}
};