@@ -795,7 +795,7 @@ static std::string createName(const std::string &name, ElemKind elemTy) {
795795void LLVMIRGen::initLLVMFunctionNameToMangledNameMap () {
796796 CHECK (llvmFunctionNameToMangledName_.empty ());
797797 constexpr size_t maxFnBaseNameLen = 4096 ;
798- char * fnNameBuf = static_cast < char *>( std::malloc (maxFnBaseNameLen)) ;
798+ char fnNameBuf[maxFnBaseNameLen] = { 0 } ;
799799 // Build a map from names to the list of matching mangled names.
800800 for (llvm::Function &F : getModule ()) {
801801 auto mangledName = F.getName ().str ();
@@ -805,6 +805,16 @@ void LLVMIRGen::initLLVMFunctionNameToMangledNameMap() {
805805 continue ;
806806 }
807807 size_t fnNameLen = maxFnBaseNameLen;
808+ size_t fnContextLen = maxFnBaseNameLen;
809+ // Skip C++ functions that have names like a::b::c. It helps to avoid name
810+ // conflicts with kernels that may be called just c and conflict with C++
811+ // functions.
812+ char *contextNamePtr =
813+ Mangler.getFunctionDeclContextName (fnNameBuf, &fnContextLen);
814+ if (contextNamePtr && fnContextLen != 0 && contextNamePtr[0 ]) {
815+ continue ;
816+ }
817+ fnNameBuf[0 ] = ' \0 ' ;
808818 char *demangledNamePtr = Mangler.getFunctionBaseName (fnNameBuf, &fnNameLen);
809819 if (!demangledNamePtr || fnNameLen == 0 ) {
810820 continue ;
@@ -817,10 +827,6 @@ void LLVMIRGen::initLLVMFunctionNameToMangledNameMap() {
817827 }
818828 llvmFunctionNameToMangledName_[demangledFnName].push_back (mangledName);
819829 }
820- // Free up the memory.
821- if (fnNameBuf) {
822- free (fnNameBuf);
823- }
824830 DEBUG_GLOW ({
825831 // Dump the map for debugging purposes.
826832 llvm::dbgs () << " Mapping between function names and matching LLVM function "
0 commit comments