Revert "Revert "Handle kernel launch calls""

Bug: 23535985

This reverts commit 5d9263d3a3a7457b9e5fe6e518c0d822dcdfcda6.

This also fixes issues in change list 172074, which caused some
slang tests to fail due to changed hehavior in error handling.

The fix was based on changes originally posted by srhines@.

To keep single-source functionality working, I separated kernel
name logging from the final export processing code. We would
build a map from kernel funciton names to slot numbers as we parse
the script. The map is used when translating a rsParallelFor call
to a call to the internal rsForEachInternal API, so that we can find
the proper slot numbers.

Here is Steve's original commit message.

Only call processExports() after a successful C99 compilation.

This refactoring fixes a bug in the previous single-source patch, where
exported functions/variables/kernels were being processed during the
regular compilation steps. This wastes compile time, since we don't need
to actually prepare for outputting reflected Java/C++ code if the
compile is going to fail for regular C99 reasons.

Change-Id: I81d88731188f4258f12f4c90ae8dd8abc8c2d641
diff --git a/slang_rs_foreach_lowering.h b/slang_rs_foreach_lowering.h
new file mode 100644
index 0000000..6cb0e62
--- /dev/null
+++ b/slang_rs_foreach_lowering.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2015, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H
+#define _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H
+
+#include "clang/AST/StmtVisitor.h"
+
+namespace clang {
+  class ASTContext;
+  class CallExpr;
+  class Expr;
+  class FunctionDecl;
+}
+
+namespace slang {
+
+class RSContext;
+
+class RSForEachLowering : public clang::StmtVisitor<RSForEachLowering> {
+ public:
+  RSForEachLowering(RSContext* ctxt);
+
+  void VisitCallExpr(clang::CallExpr *CE);
+  void VisitStmt(clang::Stmt *S);
+
+ private:
+  RSContext* mCtxt;
+  clang::ASTContext& mASTCtxt;
+
+  const clang::FunctionDecl* matchFunctionDesignator(clang::Expr* expr);
+  const clang::FunctionDecl* matchKernelLaunchCall(clang::CallExpr* CE);
+  clang::FunctionDecl* CreateForEachInternalFunctionDecl();
+  clang::Expr* CreateCalleeExprForInternalForEach();
+};  // RSForEachLowering
+
+}  // namespace slang
+
+#endif  // _FRAMEWORKS_COMPILE_SLANG_RS_FOREACH_LOWERING_H