aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CompilerDriver/Tools.td34
-rw-r--r--test/LLVMC/hello.m12
-rw-r--r--test/LLVMC/hello.mm8
-rw-r--r--tools/llvmc2/plugins/Base/Base.td14
4 files changed, 66 insertions, 2 deletions
diff --git a/include/llvm/CompilerDriver/Tools.td b/include/llvm/CompilerDriver/Tools.td
index 1a466a2735..7bd6dd4d94 100644
--- a/include/llvm/CompilerDriver/Tools.td
+++ b/include/llvm/CompilerDriver/Tools.td
@@ -44,6 +44,38 @@ def llvm_gcc_cpp : Tool<
(sink)
]>;
+def llvm_gcc_m : Tool<
+[(in_language "objective-c"),
+ (out_language "llvm-bitcode"),
+ (output_suffix "bc"),
+ (cmd_line (case
+ (switch_on "E"),
+ (case (not_empty "o"),
+ "llvm-gcc -E -x objective-c $INFILE -o $OUTFILE",
+ (default),
+ "llvm-gcc -E -x objective-c $INFILE"),
+ (default),
+ "llvm-gcc -c -x objective-c $INFILE -o $OUTFILE -emit-llvm")),
+ (switch_option "E", (stop_compilation)),
+ (sink)
+]>;
+
+def llvm_gcc_mxx : Tool<
+[(in_language "objective-c++"),
+ (out_language "llvm-bitcode"),
+ (output_suffix "bc"),
+ (cmd_line (case
+ (switch_on "E"),
+ (case (not_empty "o"),
+ "llvm-gcc -E -x objective-c++ $INFILE -o $OUTFILE",
+ (default),
+ "llvm-gcc -E -x objective-c++ $INFILE"),
+ (default),
+ "llvm-gcc -c -x objective-c++ $INFILE -o $OUTFILE -emit-llvm")),
+ (switch_option "E", (stop_compilation)),
+ (sink)
+]>;
+
def opt : Tool<
[(in_language "llvm-bitcode"),
(out_language "llvm-bitcode"),
@@ -109,6 +141,8 @@ def llvm_gcc_cpp_linker : Tool<
def LanguageMap : LanguageMap<
[LangToSuffixes<"c++", ["cc", "cp", "cxx", "cpp", "CPP", "c++", "C"]>,
LangToSuffixes<"c", ["c"]>,
+ LangToSuffixes<"objective-c++", ["mm"]>,
+ LangToSuffixes<"objective-c", ["m"]>,
LangToSuffixes<"assembler", ["s"]>,
LangToSuffixes<"llvm-assembler", ["ll"]>,
LangToSuffixes<"llvm-bitcode", ["bc"]>,
diff --git a/test/LLVMC/hello.m b/test/LLVMC/hello.m
new file mode 100644
index 0000000000..bf917bcdea
--- /dev/null
+++ b/test/LLVMC/hello.m
@@ -0,0 +1,12 @@
+/*
+ * Check that we can compile helloworld
+ * RUN: llvmc2 %s -o %t
+ * RUN: ./%t | grep hello
+ */
+
+#include <stdio.h>
+
+int main() {
+ printf("hello\n");
+ return 0;
+}
diff --git a/test/LLVMC/hello.mm b/test/LLVMC/hello.mm
new file mode 100644
index 0000000000..5f14a94ccc
--- /dev/null
+++ b/test/LLVMC/hello.mm
@@ -0,0 +1,8 @@
+// Test that we can compile Objective-C++ code.
+// RUN: llvmc2 %s -o %t
+// RUN: ./%t | grep hello
+#include <iostream>
+
+int main() {
+ std::cout << "hello" << '\n';
+}
diff --git a/tools/llvmc2/plugins/Base/Base.td b/tools/llvmc2/plugins/Base/Base.td
index 0a43d0fd53..158520c278 100644
--- a/tools/llvmc2/plugins/Base/Base.td
+++ b/tools/llvmc2/plugins/Base/Base.td
@@ -20,14 +20,20 @@ def CompilationGraph : CompilationGraph<[
Edge<root, llvm_gcc_c>,
Edge<root, llvm_gcc_assembler>,
Edge<root, llvm_gcc_cpp>,
+ Edge<root, llvm_gcc_m>,
+ Edge<root, llvm_gcc_mxx>,
Edge<root, llvm_as>,
Edge<llvm_gcc_c, llc>,
Edge<llvm_gcc_cpp, llc>,
+ Edge<llvm_gcc_m, llc>,
+ Edge<llvm_gcc_mxx, llc>,
Edge<llvm_as, llc>,
OptionalEdge<llvm_gcc_c, opt, (case (switch_on "opt"), (inc_weight))>,
OptionalEdge<llvm_gcc_cpp, opt, (case (switch_on "opt"), (inc_weight))>,
+ OptionalEdge<llvm_gcc_m, opt, (case (switch_on "opt"), (inc_weight))>,
+ OptionalEdge<llvm_gcc_mxx, opt, (case (switch_on "opt"), (inc_weight))>,
OptionalEdge<llvm_as, opt, (case (switch_on "opt"), (inc_weight))>,
Edge<opt, llc>,
@@ -35,7 +41,9 @@ def CompilationGraph : CompilationGraph<[
Edge<llvm_gcc_assembler, llvm_gcc_linker>,
OptionalEdge<llvm_gcc_assembler, llvm_gcc_cpp_linker,
(case
- (input_languages_contain "c++"), (inc_weight),
+ (or (input_languages_contain "c++"),
+ (input_languages_contain "objective-c++")),
+ (inc_weight),
(or (parameter_equals "linker", "g++"),
(parameter_equals "linker", "c++")), (inc_weight))>,
@@ -43,7 +51,9 @@ def CompilationGraph : CompilationGraph<[
Edge<root, llvm_gcc_linker>,
OptionalEdge<root, llvm_gcc_cpp_linker,
(case
- (input_languages_contain "c++"), (inc_weight),
+ (or (input_languages_contain "c++"),
+ (input_languages_contain "objective-c++")),
+ (inc_weight),
(or (parameter_equals "linker", "g++"),
(parameter_equals "linker", "c++")), (inc_weight))>
]>;