Index: lib/AST/ItaniumMangle.cpp =================================================================== --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -1796,6 +1796,7 @@ case LangAS::opencl_global: ASString = "CLglobal"; break; case LangAS::opencl_local: ASString = "CLlocal"; break; case LangAS::opencl_constant: ASString = "CLconstant"; break; + case LangAS::opencl_generic: ASString = "CLgeneric"; break; // ::= "CU" [ "device" | "constant" | "shared" ] case LangAS::cuda_device: ASString = "CUdevice"; break; case LangAS::cuda_constant: ASString = "CUconstant"; break; Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -1383,6 +1383,37 @@ } } + if (Quals.hasAddressSpace()) { + // Address space extension: + // + // ::= U + // ::= U + // ::= U + + SmallString<64> ASString; + unsigned AS = Quals.getAddressSpace(); + + if (Context.getASTContext().addressSpaceMapManglingFor(AS)) { + // ::= "AS" + unsigned TargetAS = Context.getASTContext().getTargetAddressSpace(AS); + ASString = "AS" + llvm::utostr_32(TargetAS); + } else { + switch (AS) { + default: llvm_unreachable("Not a language specific address space"); + // ::= "CL" [ "global" | "local" | "constant" ] + case LangAS::opencl_global: ASString = "CLglobal"; break; + case LangAS::opencl_local: ASString = "CLlocal"; break; + case LangAS::opencl_constant: ASString = "CLconstant"; break; + case LangAS::opencl_generic: ASString = "CLgeneric"; break; + // ::= "CU" [ "device" | "constant" | "shared" ] + case LangAS::cuda_device: ASString = "CUdevice"; break; + case LangAS::cuda_constant: ASString = "CUconstant"; break; + case LangAS::cuda_shared: ASString = "CUshared"; break; + } + } + Out << 'U' << ASString.size() << ASString; + } + // FIXME: For now, just drop all extension qualifiers on the floor. } Index: test/CodeGenOpenCL/generic_mangling.cl =================================================================== --- test/CodeGenOpenCL/generic_mangling.cl +++ test/CodeGenOpenCL/generic_mangling.cl @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -ffake-address-space-map -emit-llvm -ffp-contract=off -x cl -cl-std=CL2.0 -o - %s | FileCheck %s + +// CHECK: define zeroext i1 @"\01?atomic_compare_exchange_strong@@$$J0YA_NPCU8CLglobalU?$_Atomic@H@__clang@@PAU9CLgenericHH@Z"(i32 addrspace(1)* %object, i32 addrspace(4)* %expected, i32 %desired) +bool __attribute__((__overloadable__)) atomic_compare_exchange_strong( + volatile __global atomic_int *object, + int *expected, + int desired) +{ + return atomic_compare_exchange_strong_explicit( + object, expected, desired, 1, 2); +} + Index: tools/driver/driver.cpp =================================================================== --- tools/driver/driver.cpp +++ tools/driver/driver.cpp @@ -363,7 +363,8 @@ auto newEnd = std::remove(argv.begin(), argv.end(), nullptr); argv.resize(newEnd - argv.begin()); } - return ExecuteCC1Tool(argv, argv[1] + 4); + int Result = ExecuteCC1Tool(argv, argv[1] + 4); + return Result; // Useful for debugging to set breakpoint here } bool CanonicalPrefixes = true;