Skip to content

Commit

Permalink
[OpenCL] Add supported OpenCL extensions to target info.
Browse files Browse the repository at this point in the history
Add supported OpenCL extensions to target info. It serves as default values to save the users of the burden setting each supported extensions and optional core features in command line.

Differential Revision: http://reviews.llvm.org/D19484

llvm-svn: 269431
  • Loading branch information
yxsamliu committed May 13, 2016
1 parent 57cdcb0 commit 64936ce
Show file tree
Hide file tree
Showing 28 changed files with 277 additions and 146 deletions.
4 changes: 4 additions & 0 deletions clang/include/clang/Basic/DiagnosticParseKinds.td
Expand Up @@ -926,6 +926,10 @@ def warn_pragma_expected_enable_disable : Warning<
"expected 'enable' or 'disable' - ignoring">, InGroup<IgnoredPragmas>;
def warn_pragma_unknown_extension : Warning<
"unknown OpenCL extension %0 - ignoring">, InGroup<IgnoredPragmas>;
def warn_pragma_unsupported_extension : Warning<
"unsupported OpenCL extension %0 - ignoring">, InGroup<IgnoredPragmas>;
def warn_pragma_extension_is_core : Warning<
"OpenCL extension %0 is core feature or supported optional core feature - ignoring">, InGroup<IgnoredPragmas>;

// OpenCL errors.
def err_opencl_taking_function_address_parser : Error<
Expand Down
12 changes: 0 additions & 12 deletions clang/include/clang/Basic/LangOptions.h
Expand Up @@ -160,18 +160,6 @@ class FPOptions {
fp_contract(LangOpts.DefaultFPContract) {}
};

/// \brief OpenCL volatile options
class OpenCLOptions {
public:
#define OPENCLEXT(nm) unsigned nm : 1;
#include "clang/Basic/OpenCLExtensions.def"

OpenCLOptions() {
#define OPENCLEXT(nm) nm = 0;
#include "clang/Basic/OpenCLExtensions.def"
}
};

/// \brief Describes the kind of translation unit being processed.
enum TranslationUnitKind {
/// \brief The translation unit is a complete translation unit.
Expand Down
76 changes: 59 additions & 17 deletions clang/include/clang/Basic/OpenCLExtensions.def
Expand Up @@ -11,25 +11,67 @@
//
//===----------------------------------------------------------------------===//

// Macro OPENCLEXT or OPENCLEXT_INTERNAL can be defined to enumerate the
// OpenCL extensions listed in this file.
//
// If the extensions are to be enumerated without the supported OpenCL version,
// define OPENCLEXT(ext) where ext is the name of the extension.
//
// If the extensions are to be enumerated with supported OpenCL version,
// define OPENCLEXT_INTERNAL(ext, avail, core) where
// ext - name of the extension or optional core feature.
// avail - minimum OpenCL version supporting it.
// core - minimum OpenCL version when the extension becomes optional core
// feature or core feature. ~0U indicates not a core feature or an
// optional core feature.

#ifndef OPENCLEXT_INTERNAL
#ifndef OPENCLEXT
#pragma error "macro OPENCLEXT or OPENCLEXT_INTERNAL is required"
#else
#define OPENCLEXT_INTERNAL(ext, ...) OPENCLEXT(ext)
#endif // OPENCLEXT
#endif // OPENCLEXT_INTERNAL

// OpenCL 1.0.
OPENCLEXT_INTERNAL(cl_khr_3d_image_writes, 100, 120)
OPENCLEXT_INTERNAL(cl_khr_byte_addressable_store, 100, 110)
OPENCLEXT_INTERNAL(cl_khr_fp16, 100, ~0U)
OPENCLEXT_INTERNAL(cl_khr_fp64, 100, 120)
OPENCLEXT_INTERNAL(cl_khr_global_int32_base_atomics, 100, 110)
OPENCLEXT_INTERNAL(cl_khr_global_int32_extended_atomics, 100, 110)
OPENCLEXT_INTERNAL(cl_khr_gl_sharing, 100, ~0U)
OPENCLEXT_INTERNAL(cl_khr_icd, 100, ~0U)
OPENCLEXT_INTERNAL(cl_khr_local_int32_base_atomics, 100, 110)
OPENCLEXT_INTERNAL(cl_khr_local_int32_extended_atomics, 100, 110)

// OpenCL 1.1.
OPENCLEXT(cl_khr_fp64)
OPENCLEXT(cl_khr_int64_base_atomics)
OPENCLEXT(cl_khr_int64_extended_atomics)
OPENCLEXT(cl_khr_fp16)
OPENCLEXT(cl_khr_gl_sharing)
OPENCLEXT(cl_khr_gl_event)
OPENCLEXT(cl_khr_d3d10_sharing)
OPENCLEXT(cl_khr_global_int32_base_atomics)
OPENCLEXT(cl_khr_global_int32_extended_atomics)
OPENCLEXT(cl_khr_local_int32_base_atomics)
OPENCLEXT(cl_khr_local_int32_extended_atomics)
OPENCLEXT(cl_khr_byte_addressable_store)
OPENCLEXT(cl_khr_3d_image_writes)

// OpenCL 2.0
OPENCLEXT(cl_khr_gl_msaa_sharing)
OPENCLEXT_INTERNAL(cl_khr_d3d10_sharing, 110, ~0U)
OPENCLEXT_INTERNAL(cl_khr_gl_event, 110, ~0U)
OPENCLEXT_INTERNAL(cl_khr_int64_base_atomics, 110, ~0U)
OPENCLEXT_INTERNAL(cl_khr_int64_extended_atomics, 110, ~0U)

// OpenCL 1.2.
OPENCLEXT_INTERNAL(cl_khr_d3d11_sharing, 120, ~0U)
OPENCLEXT_INTERNAL(cl_khr_depth_images, 120, ~0U)
OPENCLEXT_INTERNAL(cl_khr_dx9_media_sharing, 120, ~0U)
OPENCLEXT_INTERNAL(cl_khr_gl_depth_images, 120, ~0U)
OPENCLEXT_INTERNAL(cl_khr_spir, 120, ~0U)

// OpenCL 2.0.
OPENCLEXT_INTERNAL(cl_khr_egl_event, 200, ~0U)
OPENCLEXT_INTERNAL(cl_khr_egl_image, 200, ~0U)
OPENCLEXT_INTERNAL(cl_khr_gl_msaa_sharing, 200, ~0U)
OPENCLEXT_INTERNAL(cl_khr_initialize_memory, 200, ~0U)
OPENCLEXT_INTERNAL(cl_khr_srgb_image_writes, 200, ~0U)
OPENCLEXT_INTERNAL(cl_khr_subgroups, 200, ~0U)
OPENCLEXT_INTERNAL(cl_khr_terminate_context, 200, ~0U)

// Clang Extensions.
OPENCLEXT(cl_clang_storage_class_specifiers)
OPENCLEXT_INTERNAL(cl_clang_storage_class_specifiers, 100, ~0U)

#undef OPENCLEXT_INTERNAL

#ifdef OPENCLEXT
#undef OPENCLEXT
#endif
68 changes: 68 additions & 0 deletions clang/include/clang/Basic/OpenCLOptions.h
@@ -0,0 +1,68 @@
//===--- OpenCLOptions.h ----------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Defines the clang::OpenCLOptions class.
///
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_BASIC_OPENCLOPTIONS_H
#define LLVM_CLANG_BASIC_OPENCLOPTIONS_H

#include <string>
#include <vector>

namespace clang {

/// \brief OpenCL supported extensions and optional core features
class OpenCLOptions {
public:
#define OPENCLEXT(nm) unsigned nm : 1;
#include "clang/Basic/OpenCLExtensions.def"

OpenCLOptions() {
#define OPENCLEXT(nm) nm = 0;
#include "clang/Basic/OpenCLExtensions.def"
}

// Enable all options.
void setAll() {
#define OPENCLEXT(nm) nm = 1;
#include "clang/Basic/OpenCLExtensions.def"
}

// Is supported with OpenCL version \p OCLVer.
#define OPENCLEXT_INTERNAL(Ext, Avail, ...) \
bool is_##Ext##_supported(unsigned OCLVer) const { \
return Ext && OCLVer >= Avail; \
}
#include "clang/Basic/OpenCLExtensions.def"


// Is supported OpenCL extension with OpenCL version \p OCLVer.
// For supported optional core feature, return false.
#define OPENCLEXT_INTERNAL(Ext, Avail, Core) \
bool is_##Ext##_supported_extension(unsigned CLVer) const { \
return is_##Ext##_supported(CLVer) && (Core == ~0U || CLVer < Core); \
}
#include "clang/Basic/OpenCLExtensions.def"

// Is supported OpenCL core features with OpenCL version \p OCLVer.
// For supported extension, return false.
#define OPENCLEXT_INTERNAL(Ext, Avail, Core) \
bool is_##Ext##_supported_core(unsigned CLVer) const { \
return is_##Ext##_supported(CLVer) && Core != ~0U && CLVer >= Core; \
}
#include "clang/Basic/OpenCLExtensions.def"

};

} // end namespace clang

#endif
13 changes: 13 additions & 0 deletions clang/include/clang/Basic/TargetInfo.h
Expand Up @@ -969,6 +969,19 @@ class TargetInfo : public RefCountedBase<TargetInfo> {
/// \brief Whether target allows to overalign ABI-specified prefered alignment
virtual bool allowsLargerPreferedTypeAlignment() const { return true; }

/// \brief Set supported OpenCL extensions and optional core features.
virtual void setSupportedOpenCLOpts() {}

/// \brief Get supported OpenCL extensions and optional core features.
OpenCLOptions &getSupportedOpenCLOpts() {
return getTargetOpts().SupportedOpenCLOptions;
}

/// \brief Get const supported OpenCL extensions and optional core features.
const OpenCLOptions &getSupportedOpenCLOpts() const {
return getTargetOpts().SupportedOpenCLOptions;
}

protected:
virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
return PointerWidth;
Expand Down
4 changes: 4 additions & 0 deletions clang/include/clang/Basic/TargetOptions.h
Expand Up @@ -17,6 +17,7 @@

#include <string>
#include <vector>
#include "clang/Basic/OpenCLOptions.h"

namespace clang {

Expand Down Expand Up @@ -54,6 +55,9 @@ class TargetOptions {
std::vector<std::string> Features;

std::vector<std::string> Reciprocals;

/// Supported OpenCL extensions and optional core features.
OpenCLOptions SupportedOpenCLOptions;
};

} // end namespace clang
Expand Down
48 changes: 37 additions & 11 deletions clang/lib/Basic/Targets.cpp
Expand Up @@ -1999,17 +1999,6 @@ class AMDGPUTargetInfo : public TargetInfo {
Builder.defineMacro("__HAS_FMAF__");
if (hasLDEXPF)
Builder.defineMacro("__HAS_LDEXPF__");
if (hasFP64 && Opts.OpenCL)
Builder.defineMacro("cl_khr_fp64");
if (Opts.OpenCL) {
if (GPU >= GK_NORTHERN_ISLANDS) {
Builder.defineMacro("cl_khr_byte_addressable_store");
Builder.defineMacro("cl_khr_global_int32_base_atomics");
Builder.defineMacro("cl_khr_global_int32_extended_atomics");
Builder.defineMacro("cl_khr_local_int32_base_atomics");
Builder.defineMacro("cl_khr_local_int32_extended_atomics");
}
}
}

BuiltinVaListKind getBuiltinVaListKind() const override {
Expand Down Expand Up @@ -2097,6 +2086,31 @@ class AMDGPUTargetInfo : public TargetInfo {

return true;
}

void setSupportedOpenCLOpts() {
auto &Opts = getSupportedOpenCLOpts();
Opts.cl_clang_storage_class_specifiers = 1;
Opts.cl_khr_gl_sharing = 1;
Opts.cl_khr_gl_event = 1;
Opts.cl_khr_d3d10_sharing = 1;
Opts.cl_khr_subgroups = 1;

if (hasFP64)
Opts.cl_khr_fp64 = 1;
if (GPU >= GK_NORTHERN_ISLANDS) {
Opts.cl_khr_byte_addressable_store = 1;
Opts.cl_khr_global_int32_base_atomics = 1;
Opts.cl_khr_global_int32_extended_atomics = 1;
Opts.cl_khr_local_int32_base_atomics = 1;
Opts.cl_khr_local_int32_extended_atomics = 1;
}
if (GPU >= GK_SOUTHERN_ISLANDS)
Opts.cl_khr_fp16 = 1;
Opts.cl_khr_int64_base_atomics = 1;
Opts.cl_khr_int64_extended_atomics = 1;
Opts.cl_khr_3d_image_writes = 1;
Opts.cl_khr_gl_msaa_sharing = 1;
}
};

const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Expand Down Expand Up @@ -2716,6 +2730,10 @@ class X86TargetInfo : public TargetInfo {
bool hasSjLjLowering() const override {
return true;
}

void setSupportedOpenCLOpts() {
getSupportedOpenCLOpts().setAll();
}
};

bool X86TargetInfo::setFPMath(StringRef Name) {
Expand Down Expand Up @@ -7858,6 +7876,12 @@ class SPIRTargetInfo : public TargetInfo {
CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
return CC_SpirFunction;
}

void setSupportedOpenCLOpts() {
// Assume all OpenCL extensions and optional core features are supported
// for SPIR since it is a generic target.
getSupportedOpenCLOpts().setAll();
}
};

class SPIR32TargetInfo : public SPIRTargetInfo {
Expand Down Expand Up @@ -8458,5 +8482,7 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
if (!Target->handleTargetFeatures(Opts->Features, Diags))
return nullptr;

Target->setSupportedOpenCLOpts();

return Target.release();
}
9 changes: 9 additions & 0 deletions clang/lib/Frontend/InitPreprocessor.cpp
Expand Up @@ -938,6 +938,15 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
Builder.defineMacro("__CUDA_ARCH__");
}

// OpenCL definitions.
if (LangOpts.OpenCL) {
#define OPENCLEXT(Ext) \
if (TI.getSupportedOpenCLOpts().is_##Ext##_supported( \
LangOpts.OpenCLVersion)) \
Builder.defineMacro(#Ext);
#include "clang/Basic/OpenCLExtensions.def"
}

// Get other target #defines.
TI.getTargetDefines(LangOpts, Builder);
}
Expand Down
14 changes: 12 additions & 2 deletions clang/lib/Parse/ParsePragma.cpp
Expand Up @@ -468,14 +468,24 @@ void Parser::HandlePragmaOpenCLExtension() {
ConsumeToken(); // The annotation token.

OpenCLOptions &f = Actions.getOpenCLOptions();
auto CLVer = getLangOpts().OpenCLVersion;
auto &Supp = getTargetInfo().getSupportedOpenCLOpts();
// OpenCL 1.1 9.1: "The all variant sets the behavior for all extensions,
// overriding all previously issued extension directives, but only if the
// behavior is set to disable."
if (state == 0 && ename->isStr("all")) {
#define OPENCLEXT(nm) f.nm = 0;
#define OPENCLEXT(nm) \
if (Supp.is_##nm##_supported_extension(CLVer)) \
f.nm = 0;
#include "clang/Basic/OpenCLExtensions.def"
}
#define OPENCLEXT(nm) else if (ename->isStr(#nm)) { f.nm = state; }
#define OPENCLEXT(nm) else if (ename->isStr(#nm)) \
if (Supp.is_##nm##_supported_extension(CLVer)) \
f.nm = state; \
else if (Supp.is_##nm##_supported_core(CLVer)) \
PP.Diag(NameLoc, diag::warn_pragma_extension_is_core) << ename; \
else \
PP.Diag(NameLoc, diag::warn_pragma_unsupported_extension) << ename;
#include "clang/Basic/OpenCLExtensions.def"
else {
PP.Diag(NameLoc, diag::warn_pragma_unknown_extension) << ename;
Expand Down
8 changes: 7 additions & 1 deletion clang/lib/Sema/Sema.cpp
Expand Up @@ -207,8 +207,14 @@ void Sema::Initialize() {
addImplicitTypedef("size_t", Context.getSizeType());
}

// Initialize predefined OpenCL types.
// Initialize predefined OpenCL types and supported optional core features.
if (getLangOpts().OpenCL) {
#define OPENCLEXT(Ext) \
if (Context.getTargetInfo().getSupportedOpenCLOpts().is_##Ext##_supported_core( \
getLangOpts().OpenCLVersion)) \
getOpenCLOptions().Ext = 1;
#include "clang/Basic/OpenCLExtensions.def"

addImplicitTypedef("sampler_t", Context.OCLSamplerTy);
addImplicitTypedef("event_t", Context.OCLEventTy);
if (getLangOpts().OpenCLVersion >= 200) {
Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGenOpenCL/builtins-r600.cl
@@ -1,5 +1,5 @@
// REQUIRES: amdgpu-registered-target
// RUN: %clang_cc1 -triple r600-unknown-unknown -S -emit-llvm -o - %s | FileCheck %s
// RUN: %clang_cc1 -triple r600-unknown-unknown -target-cpu rv670 -S -emit-llvm -o - %s | FileCheck %s

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGenOpenCL/fpmath.cl
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple spir-unknown-unknown | FileCheck %s

typedef __attribute__(( ext_vector_type(4) )) float float4;

Expand Down
2 changes: 1 addition & 1 deletion clang/test/CodeGenOpenCL/half.cl
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
// RUN: %clang_cc1 %s -emit-llvm -o - -triple spir-unknown-unknown | FileCheck %s

#pragma OPENCL EXTENSION cl_khr_fp16 : enable

Expand Down
2 changes: 1 addition & 1 deletion clang/test/Lexer/opencl-half-literal.cl
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 %s -fsyntax-only -verify
// RUN: %clang_cc1 %s -fsyntax-only -verify -triple spir-unknown-unknown

#pragma OPENCL EXTENSION cl_khr_fp16 : enable

Expand Down
2 changes: 1 addition & 1 deletion clang/test/Misc/languageOptsOpenCL.cl
@@ -1,4 +1,4 @@
// RUN: %clang_cc1 -x cl %s -verify
// RUN: %clang_cc1 -x cl %s -verify -triple spir-unknown-unknown
// expected-no-diagnostics

// Test the forced language options for OpenCL are set correctly.
Expand Down

0 comments on commit 64936ce

Please sign in to comment.