diff --git a/llvm/include/llvm/Support/Compiler.h b/llvm/include/llvm/Support/Compiler.h --- a/llvm/include/llvm/Support/Compiler.h +++ b/llvm/include/llvm/Support/Compiler.h @@ -113,12 +113,24 @@ /// LLVM_EXTERNAL_VISIBILITY - classes, functions, and variables marked with /// this attribute will be made public and visible outside of any shared library /// they are linked in to. -#if __has_attribute(visibility) && \ - (!(defined(_WIN32) || defined(__CYGWIN__)) || \ + +#if LLVM_HAS_CPP_ATTRIBUTE(gnu::visibility) +#define LLVM_ATTRIBUTE_VISIBILITY_HIDDEN [[gnu::visibility("hidden")]] +#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT [[gnu::visibility("default")]] +#elif __has_attribute(visibility) +#define LLVM_ATTRIBUTE_VISIBILITY_HIDDEN __attribute__((visibility("hidden"))) +#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT __attribute__((visibility("default"))) +#else +#define LLVM_ATTRIBUTE_VISIBILITY_HIDDEN +#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT +#endif + + +#if (!(defined(_WIN32) || defined(__CYGWIN__)) || \ (defined(__MINGW32__) && defined(__clang__))) -#define LLVM_LIBRARY_VISIBILITY __attribute__ ((visibility("hidden"))) +#define LLVM_LIBRARY_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_HIDDEN #if defined(LLVM_BUILD_LLVM_DYLIB) || defined(LLVM_BUILD_SHARED_LIBS) -#define LLVM_EXTERNAL_VISIBILITY __attribute__((visibility("default"))) +#define LLVM_EXTERNAL_VISIBILITY LLVM_ATTRIBUTE_VISIBILITY_DEFAULT #else #define LLVM_EXTERNAL_VISIBILITY #endif diff --git a/llvm/include/llvm/Transforms/Scalar/GVN.h b/llvm/include/llvm/Transforms/Scalar/GVN.h --- a/llvm/include/llvm/Transforms/Scalar/GVN.h +++ b/llvm/include/llvm/Transforms/Scalar/GVN.h @@ -56,7 +56,7 @@ class Value; /// A private "module" namespace for types and utilities used by GVN. These /// are implementation details and should not be used by clients. -namespace gvn LLVM_LIBRARY_VISIBILITY { +namespace LLVM_LIBRARY_VISIBILITY gvn { struct AvailableValue; struct AvailableValueInBlock; diff --git a/llvm/include/llvm/Transforms/Scalar/SROA.h b/llvm/include/llvm/Transforms/Scalar/SROA.h --- a/llvm/include/llvm/Transforms/Scalar/SROA.h +++ b/llvm/include/llvm/Transforms/Scalar/SROA.h @@ -39,7 +39,7 @@ /// A private "module" namespace for types and utilities used by SROA. These /// are implementation details and should not be used by clients. -namespace sroa LLVM_LIBRARY_VISIBILITY { +namespace LLVM_LIBRARY_VISIBILITY sroa { class AllocaSliceRewriter; class AllocaSlices; diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -78,7 +78,7 @@ return new AMDGPUAsmPrinter(tm, std::move(Streamer)); } -extern "C" void LLVM_EXTERNAL_VISIBILITY LLVMInitializeAMDGPUAsmPrinter() { +extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUAsmPrinter() { TargetRegistry::RegisterAsmPrinter(getTheAMDGPUTarget(), llvm::createR600AsmPrinterPass); TargetRegistry::RegisterAsmPrinter(getTheGCNTarget(),