Add the offload directory which contains the code needed to support
OpenMP 4.0 "target" directives. This will need more work for
generality, but we want to get it out and visible to the community.

llvm-svn: 205909
diff --git a/openmp/offload/src/offload_orsl.cpp b/openmp/offload/src/offload_orsl.cpp
new file mode 100644
index 0000000..6162f8a
--- /dev/null
+++ b/openmp/offload/src/offload_orsl.cpp
@@ -0,0 +1,84 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#include "offload_orsl.h"
+#include <stdlib.h>
+#include "offload_host.h"
+#include "orsl-lite/include/orsl-lite.h"
+
+namespace ORSL {
+
+static bool            is_enabled = false;
+static const ORSLTag   my_tag = "Offload";
+
+void init()
+{
+    const char *env_var = getenv("OFFLOAD_ENABLE_ORSL");
+    if (env_var != 0 && *env_var != '\0') {
+        int64_t new_val;
+        if (__offload_parse_int_string(env_var, new_val)) {
+            is_enabled = new_val;
+        }
+        else {
+            LIBOFFLOAD_ERROR(c_invalid_env_var_int_value,
+                             "OFFLOAD_ENABLE_ORSL");
+        }
+    }
+
+    if (is_enabled) {
+        OFFLOAD_DEBUG_TRACE(2, "ORSL is enabled\n");
+    }
+    else {
+        OFFLOAD_DEBUG_TRACE(2, "ORSL is disabled\n");
+    }
+}
+
+bool reserve(int device)
+{
+    if (is_enabled) {
+        int pnum = mic_engines[device].get_physical_index();
+        ORSLBusySet bset;
+
+        bset.type = BUSY_SET_FULL;
+        if (ORSLReserve(1, &pnum, &bset, my_tag) != 0) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool try_reserve(int device)
+{
+    if (is_enabled) {
+        int pnum = mic_engines[device].get_physical_index();
+        ORSLBusySet bset;
+
+        bset.type = BUSY_SET_FULL;
+        if (ORSLTryReserve(1, &pnum, &bset, my_tag) != 0) {
+            return false;
+        }
+    }
+    return true;
+}
+
+void release(int device)
+{
+    if (is_enabled) {
+        int pnum = mic_engines[device].get_physical_index();
+        ORSLBusySet bset;
+
+        bset.type = BUSY_SET_FULL;
+        if (ORSLRelease(1, &pnum, &bset, my_tag) != 0) {
+            // should never get here
+        }
+    }
+}
+
+} // namespace ORSL