diff --git a/libsycl/.clang-format b/libsycl/.clang-format new file mode 100644 index 0000000000000..24550f8b339e1 --- /dev/null +++ b/libsycl/.clang-format @@ -0,0 +1,4 @@ +BasedOnStyle: LLVM + +# Preferred indentions of preprocessor statements. +IndentPPDirectives: AfterHash diff --git a/libsycl/.clang-tidy b/libsycl/.clang-tidy new file mode 100644 index 0000000000000..cdc7a2981a41d --- /dev/null +++ b/libsycl/.clang-tidy @@ -0,0 +1,17 @@ +Checks: > + -*, + clang-analyzer-*, + clang-diagnostic-*, + cppcoreguidelines-*, + -cppcoreguidelines-pro-bounds-array-to-pointer-decay, + -cppcoreguidelines-pro-bounds-constant-array-index, + -cppcoreguidelines-pro-bounds-pointer-arithmetic, + -cppcoreguidelines-pro-type-member-init, + -cppcoreguidelines-pro-type-union-access, + google-*, + -google-build-using-namespace, + -google-explicit-constructor, + -google-runtime-references, + misc-*, + -misc-macro-parentheses, + -misc-unused-parameters diff --git a/libsycl/CMakeLists.txt b/libsycl/CMakeLists.txt new file mode 100644 index 0000000000000..42c29217a9b3c --- /dev/null +++ b/libsycl/CMakeLists.txt @@ -0,0 +1,118 @@ +#=============================================================================== +# Setup Project +#=============================================================================== +cmake_minimum_required(VERSION 3.20.0) + +set(LLVM_SUBPROJECT_TITLE "libsycl") + +set(LIBSYCL_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(LIBSYCL_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED YES) +set(CMAKE_CXX_EXTENSIONS OFF) + +#=============================================================================== +# Limitations +#=============================================================================== + +if (CMAKE_SYSTEM_NAME STREQUAL Windows AND NOT MSVC) +# Build with other compilers is not configured, not guaranteed and not tested. + message(FATAL_ERROR + "When compiling for Windows, libsycl requires a" + " version of Microsoft Visual C++ or another compiler" + " that uses the Visual C++ cl command-line syntax.") +endif() + +#=============================================================================== +# Setup CMake Options +#=============================================================================== + +option(LIBSYCL_ENABLE_WERROR "Treat all warnings as errors in the libsycl project" OFF) +option(LIBSYCL_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF) + +#=============================================================================== +# Configure System +#=============================================================================== + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +set(LIBSYCL_SHARED_OUTPUT_NAME "sycl" CACHE STRING "Output name for the shared libsycl runtime library.") + +if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) + set(LIBSYCL_TARGET_SUBDIR ${LLVM_DEFAULT_TARGET_TRIPLE}) + if(LIBSYCL_LIBDIR_SUBDIR) + string(APPEND LIBSYCL_TARGET_SUBDIR /${LIBSYCL_LIBDIR_SUBDIR}) + endif() + cmake_path(NORMAL_PATH LIBSYCL_TARGET_SUBDIR) + set(LIBSYCL_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LIBSYCL_TARGET_SUBDIR}) + set(LIBSYCL_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LIBSYCL_TARGET_SUBDIR} CACHE STRING + "Path where built libsycl libraries should be installed.") + unset(LIBSYCL_TARGET_SUBDIR) +else() + if(LLVM_LIBRARY_OUTPUT_INTDIR) + set(LIBSYCL_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) + else() + set(LIBSYCL_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBSYCL_LIBDIR_SUFFIX}) + endif() + set(LIBSYCL_INSTALL_LIBRARY_DIR lib${LIBSYCL_LIBDIR_SUFFIX} CACHE STRING + "Path where built libsycl libraries should be installed.") +endif() + +set(LIBSYCL_INCLUDE_DIR include) +set(LIBSYCL_BUILD_INCLUDE_DIR ${LLVM_BINARY_DIR}/${LIBSYCL_INCLUDE_DIR}) +set(LIBSYCL_SOURCE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBSYCL_LIBRARY_DIR}) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBSYCL_LIBRARY_DIR}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIBSYCL_LIBRARY_DIR}) + +set(LIBSYCL_MAJOR_VERSION 0) +set(LIBSYCL_MINOR_VERSION 1) +set(LIBSYCL_PATCH_VERSION 0) +set(LIBSYCL_VERSION_STRING "${LIBSYCL_MAJOR_VERSION}.${LIBSYCL_MINOR_VERSION}.${LIBSYCL_PATCH_VERSION}") +set(LIBSYCL_ABI_NAMESPACE "__V${LIBSYCL_MAJOR_VERSION}" CACHE STRING + "The inline ABI namespace used by libsycl. It defaults to __Vn where `n` is the current ABI version.") +if (NOT LIBSYCL_ABI_NAMESPACE MATCHES "__V.*") + message(FATAL_ERROR "LIBSYCL_ABI_NAMESPACE must be a reserved identifier, got '${LIBSYCL_ABI_NAMESPACE}'.") +endif() + +#=============================================================================== +# Setup build & install rules +#=============================================================================== + +# Generate headers +configure_file("${LIBSYCL_SOURCE_DIR}/src/version.hpp.in" "${LIBSYCL_BUILD_INCLUDE_DIR}/sycl/version.hpp") + +# Install generated headers. +install(FILES + "${LIBSYCL_BUILD_INCLUDE_DIR}/sycl/version.hpp" + DESTINATION "${LIBSYCL_INCLUDE_DIR}/sycl" + COMPONENT sycl-headers) + +# This is a workaround to detect changes (add or modify) in subtree which +# are not detected by copy_directory command. +file(GLOB_RECURSE HEADERS_IN_SYCL_DIR CONFIGURE_DEPENDS "${LIBSYCL_SOURCE_INCLUDE_DIR}/sycl/*") + +string(REPLACE "${LIBSYCL_SOURCE_INCLUDE_DIR}" "${LIBSYCL_BUILD_INCLUDE_DIR}" + OUT_HEADERS_IN_SYCL_DIR "${HEADERS_IN_SYCL_DIR}") + +# Copy SYCL headers from sources to build directory +add_custom_target(sycl-headers + DEPENDS ${OUT_HEADERS_IN_SYCL_DIR}) + +add_custom_command( + OUTPUT ${OUT_HEADERS_IN_SYCL_DIR} + DEPENDS ${HEADERS_IN_SYCL_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBSYCL_SOURCE_INCLUDE_DIR}/sycl ${LIBSYCL_BUILD_INCLUDE_DIR}/sycl + COMMENT "Copying SYCL headers...") + +install(DIRECTORY "${LIBSYCL_SOURCE_INCLUDE_DIR}/sycl" DESTINATION ${LIBSYCL_INCLUDE_DIR} COMPONENT sycl-headers) + +set(LIBSYCL_RT_LIBS ${LIBSYCL_SHARED_OUTPUT_NAME}) + +add_subdirectory(src) + +add_custom_target(libsycl-runtime-libraries + DEPENDS ${LIBSYCL_RT_LIBS} +) diff --git a/libsycl/LICENSE.txt b/libsycl/LICENSE.txt new file mode 100644 index 0000000000000..5715176572a46 --- /dev/null +++ b/libsycl/LICENSE.txt @@ -0,0 +1,278 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. diff --git a/libsycl/README.md b/libsycl/README.md new file mode 100644 index 0000000000000..9fed3fdc4efa1 --- /dev/null +++ b/libsycl/README.md @@ -0,0 +1,20 @@ +## SYCL runtime library + +The libsycl subproject is an implementation of the SYCL runtime library as defined by the +[SYCL 2020 specification](https://registry.khronos.org/SYCL/specs/sycl-2020/html/sycl-2020.html). + +Subproject documentation is available at: [SYCL RT documentation](./docs). + +libsycl runtime library and headers require C++17 support or higher. + +### How to use libsycl with Clang + +TODO + +#### How to build + +TODO + +# License + +See [LICENSE](./LICENSE.TXT) for details. diff --git a/libsycl/docs/index.rst b/libsycl/docs/index.rst new file mode 100644 index 0000000000000..78e76e73284d3 --- /dev/null +++ b/libsycl/docs/index.rst @@ -0,0 +1,79 @@ +===================== +SYCL runtime implementation +===================== + +.. contents:: + :local: + +.. _index: + +Current Status +======== + +The implementation is in the very early stages of upstreaming. The first milestone is to get +support for a simple SYCL application with device code using Unified Shared Memory: + +.. code-block:: c++ + + #include + + class TestKernel; + + int main() { + sycl::queue q; + + const size_t dataSize = 32; + int *dataPtr = sycl::malloc_shared(32, q); + for (int i = 0; i < dataSize; ++i) + dataPtr[i] = 0; + + q.submit([&](sycl::handler &cgh) { + cgh.parallel_for( + sycl::range<1>(dataSize), + [=](sycl::id<1> idx) { dataPtr[idx] = idx[0]; }); + }); + q.wait(); + + bool error = false; + for (int i = 0; i < dataSize; ++i) + if (dataPtr[i] != i) error = true; + + free(dataPtr, q); + + return error; + } + +This requires at least partial support of the following functionality on the libsycl side: + * ``sycl::platform`` class + * ``sycl::device`` class + * ``sycl::context`` class + * ``sycl::queue`` class + * ``sycl::handler`` class + * ``sycl::id`` and ``sycl::range`` classes + * Unified shared memory allocation/deallocation + * Program manager, an internal component for retrieving and using device images from the multi-architectural binaries + +Build steps +======== + +To build LLVM with libsycl runtime enabled the following script can be used. + +.. code-block:: console + + #!/bin/sh + + build_llvm=`pwd`/build-llvm + installprefix=`pwd`/install + llvm=`pwd` + mkdir -p $build_llvm + mkdir -p $installprefix + + cmake -G Ninja -S $llvm/llvm -B $build_llvm \ + -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" \ + -DLLVM_INSTALL_UTILS=ON \ + -DCMAKE_INSTALL_PREFIX=$installprefix \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libsycl;libunwind" \ + -DCMAKE_BUILD_TYPE=Release + + ninja -C $build_llvm install + \ No newline at end of file diff --git a/libsycl/include/sycl/__detail/config.hpp b/libsycl/include/sycl/__detail/config.hpp new file mode 100644 index 0000000000000..5186c1abb60a9 --- /dev/null +++ b/libsycl/include/sycl/__detail/config.hpp @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file contains the declaration of the macros defining attributes for +/// exported methods and defining API namespaces. +/// +//===----------------------------------------------------------------------===// + +#ifndef _LIBSYCL_DETAIL_CONFIG_HPP +#define _LIBSYCL_DETAIL_CONFIG_HPP + +#include + +#define _LIBSYCL_BEGIN_UNVERSIONED_NAMESPACE_SYCL namespace sycl { +#define _LIBSYCL_END_UNVERSIONED_NAMESPACE_SYCL } + +#define _LIBSYCL_BEGIN_NAMESPACE_SYCL \ + _LIBSYCL_BEGIN_UNVERSIONED_NAMESPACE_SYCL inline namespace _LIBSYCL_ABI_NAMESPACE { +#define _LIBSYCL_END_NAMESPACE_SYCL \ + } \ + _LIBSYCL_END_UNVERSIONED_NAMESPACE_SYCL + +#ifndef __SYCL_DEVICE_ONLY__ + +# ifndef _LIBSYCL_EXPORT +# ifdef _WIN32 + +# define _LIBSYCL_DLL_LOCAL + +# ifdef _LIBSYCL_BUILDING_LIBRARY +# define _LIBSYCL_EXPORT __declspec(dllexport) +# else +# define _LIBSYCL_EXPORT __declspec(dllimport) +# endif //_LIBSYCL_BUILDING_LIBRARY + +# else // _WIN32 + +# define _LIBSYCL_DLL_LOCAL [[__gnu__::__visibility__("hidden")]] +# define _LIBSYCL_EXPORT [[__gnu__::__visibility__("default")]] + +# endif // _WIN32 +# endif // _LIBSYCL_EXPORT + +#else // __SYCL_DEVICE_ONLY__ + +# ifndef _LIBSYCL_EXPORT +# define _LIBSYCL_EXPORT +# define _LIBSYCL_DLL_LOCAL +# endif + +#endif // __SYCL_DEVICE_ONLY__ + +#endif // _LIBSYCL_DETAIL_CONFIG_HPP diff --git a/libsycl/include/sycl/platform.hpp b/libsycl/include/sycl/platform.hpp new file mode 100644 index 0000000000000..6916d3ac20304 --- /dev/null +++ b/libsycl/include/sycl/platform.hpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file contains the declaration of the Platform class, which encapsulates +/// a single SYCL platform on which kernel functions may be executed. +/// +//===----------------------------------------------------------------------===// + +#ifndef _LIBSYCL_PLATFORM_HPP +#define _LIBSYCL_PLATFORM_HPP + +#include + +_LIBSYCL_BEGIN_NAMESPACE_SYCL + +class _LIBSYCL_EXPORT platform { +public: + /// Constructs a SYCL platform using the default device. + platform(); + +}; // class platform + +_LIBSYCL_END_NAMESPACE_SYCL + +#endif // _LIBSYCL_PLATFORM_HPP diff --git a/libsycl/include/sycl/sycl.hpp b/libsycl/include/sycl/sycl.hpp new file mode 100644 index 0000000000000..a420044f72fe4 --- /dev/null +++ b/libsycl/include/sycl/sycl.hpp @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file is a SYCL2020 standard header file. +/// +//===----------------------------------------------------------------------===// + +#ifndef _LIBSYCL_SYCL_HPP +#define _LIBSYCL_SYCL_HPP + +#include + +#endif // _LIBSYCL_SYCL_HPP diff --git a/libsycl/src/CMakeLists.txt b/libsycl/src/CMakeLists.txt new file mode 100644 index 0000000000000..206b85681cb84 --- /dev/null +++ b/libsycl/src/CMakeLists.txt @@ -0,0 +1,98 @@ +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../runtimes/cmake/Modules") +include(WarningFlags) + +function(add_sycl_rt_library LIB_TARGET_NAME LIB_OBJ_NAME LIB_OUTPUT_NAME) + if (NOT LLVM_ENABLE_PIC) + message( FATAL_ERROR "Position-Independent Code generation is required for libsycl shared library" ) + endif() + + cmake_parse_arguments(ARG "" "" "COMPILE_OPTIONS;SOURCES" ${ARGN}) + + add_library(${LIB_OBJ_NAME} OBJECT ${ARG_SOURCES}) + + # Common compilation step setup + target_compile_definitions(${LIB_OBJ_NAME} PRIVATE + $<$:_LIBSYCL_BUILDING_LIBRARY>) + cxx_add_warning_flags(${LIB_OBJ_NAME} ${LIBSYCL_ENABLE_WERROR} ${LIBSYCL_ENABLE_PEDANTIC}) + + target_include_directories( + ${LIB_OBJ_NAME} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${LIBSYCL_BUILD_INCLUDE_DIR} + ) + + add_library(${LIB_TARGET_NAME} SHARED + $) + + add_dependencies(${LIB_OBJ_NAME} + sycl-headers + ) + + set_target_properties(${LIB_TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX) + + if (CMAKE_SYSTEM_NAME STREQUAL Windows) + # Install stripped PDB + set(PDB_FILENAME "${LIB_TARGET_NAME}$<$:d>") + check_linker_flag(CXX "LINKER:/PDBSTRIPPED:${PDB_FILENAME}.stripped.pdb" + LINKER_SUPPORTS_PDBSTRIPPED) + if(LINKER_SUPPORTS_PDBSTRIPPED) + target_link_options(${LIB_TARGET_NAME} + PRIVATE "LINKER:/PDBSTRIPPED:${PDB_FILENAME}.stripped.pdb") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PDB_FILENAME}.stripped.pdb" + DESTINATION ${CMAKE_INSTALL_PREFIX}/bin + RENAME "${PDB_FILENAME}.pdb" + COMPONENT ${LIB_TARGET_NAME} + OPTIONAL) + endif() + + target_compile_options(${LIB_OBJ_NAME} PUBLIC /EHsc) + else() + target_compile_options(${LIB_OBJ_NAME} PUBLIC + -fvisibility=hidden -fvisibility-inlines-hidden) + + if (UNIX AND NOT APPLE) + set(linker_script "${CMAKE_CURRENT_SOURCE_DIR}/ld-version-script.txt") + target_link_libraries( + ${LIB_TARGET_NAME} PRIVATE "-Wl,--version-script=${linker_script}") + set_target_properties(${LIB_TARGET_NAME} PROPERTIES LINK_DEPENDS ${linker_script}) + endif() + endif() + + find_package(Threads REQUIRED) + + target_link_libraries(${LIB_TARGET_NAME} + PRIVATE + ${CMAKE_DL_LIBS} + ${CMAKE_THREAD_LIBS_INIT} + ) + + set_target_properties(${LIB_TARGET_NAME} PROPERTIES + VERSION ${LIBSYCL_VERSION_STRING} + SOVERSION ${LIBSYCL_VERSION_STRING}) + set_target_properties(${LIB_TARGET_NAME} PROPERTIES OUTPUT_NAME ${LIB_OUTPUT_NAME}) +endfunction(add_sycl_rt_library) + +set(LIBSYCL_SOURCES + "platform.cpp" +) + +set(LIB_NAME "sycl") +set(LIB_OUTPUT_NAME "${LIB_NAME}") +if (CMAKE_SYSTEM_NAME STREQUAL Windows) + if (CMAKE_MSVC_RUNTIME_LIBRARY AND (NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")) + message(FATAL_ERROR "libsycl requires a DLL version of the MSVC CRT.") + endif() + if ((NOT CMAKE_MSVC_RUNTIME_LIBRARY AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") + OR (CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDebugDLL")) + set(LIB_OUTPUT_NAME "${LIB_OUTPUT_NAME}d") + endif() +endif() + +add_sycl_rt_library(${LIB_NAME} sycl_object ${LIB_OUTPUT_NAME} + SOURCES ${LIBSYCL_SOURCES}) + +install(TARGETS ${LIBSYCL_RT_LIBS} + ARCHIVE DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" COMPONENT libsycl + LIBRARY DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" COMPONENT libsycl + RUNTIME DESTINATION "bin" COMPONENT libsycl) diff --git a/libsycl/src/ld-version-script.txt b/libsycl/src/ld-version-script.txt new file mode 100644 index 0000000000000..a347d202a367f --- /dev/null +++ b/libsycl/src/ld-version-script.txt @@ -0,0 +1,20 @@ +{ + /* Symbols to be exported are selected based on mangled names rather than */ + /* the demangled names provided by the `extern "C++"` matcher because it is */ + /* easy to express "export everything defined in the sycl namespace" using */ + /* the former. Matching demangled names is more complicated in the presence */ + /* of examples like: */ + /* "vtable for sycl::foo" (should be exported) */ + /* "vtable for std::__internal" (should not be exported) */ + + global: + /* Export everything from sycl namespace */ + _ZNK4sycl*; /* function */ + _ZN4sycl*; /* function */ + _ZTIN4sycl*; /* typeinfo */ + _ZTSN4sycl*; /* typeinfo name */ + _ZTVN4sycl*; /* vtable */ + + local: + *; +}; diff --git a/libsycl/src/platform.cpp b/libsycl/src/platform.cpp new file mode 100644 index 0000000000000..75336e701cc9b --- /dev/null +++ b/libsycl/src/platform.cpp @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include + +#include + +_LIBSYCL_BEGIN_NAMESPACE_SYCL + +platform::platform() { throw std::runtime_error("Unimplemented"); } + +_LIBSYCL_END_NAMESPACE_SYCL diff --git a/libsycl/src/version.hpp.in b/libsycl/src/version.hpp.in new file mode 100644 index 0000000000000..a7215761e9d4c --- /dev/null +++ b/libsycl/src/version.hpp.in @@ -0,0 +1,16 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file contains the declaration of SYCL RT version macro. +/// +//===----------------------------------------------------------------------===// +#define _LIBSYCL_MAJOR_VERSION ${LIBSYCL_MAJOR_VERSION} +#define _LIBSYCL_MINOR_VERSION ${LIBSYCL_MINOR_VERSION} +#define _LIBSYCL_PATCH_VERSION ${LIBSYCL_PATCH_VERSION} +#define _LIBSYCL_ABI_NAMESPACE ${LIBSYCL_ABI_NAMESPACE} diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 22877bf916abf..72800d40d05cb 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -149,7 +149,7 @@ endforeach() # As we migrate runtimes to using the bootstrapping build, the set of default runtimes # should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above. set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind") -set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;libcxx;compiler-rt;openmp;llvm-libgcc;offload;flang-rt;libclc") +set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;libcxx;compiler-rt;openmp;llvm-libgcc;offload;flang-rt;libclc;libsycl") set(LLVM_ENABLE_RUNTIMES "" CACHE STRING "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.") if(LLVM_ENABLE_RUNTIMES STREQUAL "all") diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt index e4dd4ebfc678d..e6f8d3a40767e 100644 --- a/runtimes/CMakeLists.txt +++ b/runtimes/CMakeLists.txt @@ -36,7 +36,7 @@ list(INSERT CMAKE_MODULE_PATH 0 # We order libraries to mirror roughly how they are layered, except that compiler-rt can depend # on libc++, so we put it after. set(LLVM_DEFAULT_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;libclc;openmp;offload") -set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc;flang-rt") +set(LLVM_SUPPORTED_RUNTIMES "${LLVM_DEFAULT_RUNTIMES};llvm-libgcc;flang-rt;libsycl") set(LLVM_ENABLE_RUNTIMES "" CACHE STRING "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.") if(LLVM_ENABLE_RUNTIMES STREQUAL "all" )