@@ -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] ;
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,17 @@ 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+ fnNameBuf[0 ] = ' \0 ' ;
813+ char *contextNamePtr =
814+ Mangler.getFunctionDeclContextName (fnNameBuf, &fnContextLen);
815+ if (contextNamePtr && fnContextLen != 0 && contextNamePtr[0 ]) {
816+ continue ;
817+ }
818+ fnNameBuf[0 ] = ' \0 ' ;
808819 char *demangledNamePtr = Mangler.getFunctionBaseName (fnNameBuf, &fnNameLen);
809820 if (!demangledNamePtr || fnNameLen == 0 ) {
810821 continue ;
@@ -817,10 +828,6 @@ void LLVMIRGen::initLLVMFunctionNameToMangledNameMap() {
817828 }
818829 llvmFunctionNameToMangledName_[demangledFnName].push_back (mangledName);
819830 }
820- // Free up the memory.
821- if (fnNameBuf) {
822- free (fnNameBuf);
823- }
824831 DEBUG_GLOW ({
825832 // Dump the map for debugging purposes.
826833 llvm::dbgs () << " Mapping between function names and matching LLVM function "
0 commit comments