@@ -795,7 +795,7 @@ static std::string createName(const std::string &name, ElemKind elemTy) {
795
795
void LLVMIRGen::initLLVMFunctionNameToMangledNameMap () {
796
796
CHECK (llvmFunctionNameToMangledName_.empty ());
797
797
constexpr size_t maxFnBaseNameLen = 4096 ;
798
- char * fnNameBuf = static_cast < char *>( std::malloc (maxFnBaseNameLen)) ;
798
+ char fnNameBuf[maxFnBaseNameLen] = { 0 } ;
799
799
// Build a map from names to the list of matching mangled names.
800
800
for (llvm::Function &F : getModule ()) {
801
801
auto mangledName = F.getName ().str ();
@@ -805,6 +805,16 @@ void LLVMIRGen::initLLVMFunctionNameToMangledNameMap() {
805
805
continue ;
806
806
}
807
807
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 ' ;
808
818
char *demangledNamePtr = Mangler.getFunctionBaseName (fnNameBuf, &fnNameLen);
809
819
if (!demangledNamePtr || fnNameLen == 0 ) {
810
820
continue ;
@@ -817,10 +827,6 @@ void LLVMIRGen::initLLVMFunctionNameToMangledNameMap() {
817
827
}
818
828
llvmFunctionNameToMangledName_[demangledFnName].push_back (mangledName);
819
829
}
820
- // Free up the memory.
821
- if (fnNameBuf) {
822
- free (fnNameBuf);
823
- }
824
830
DEBUG_GLOW ({
825
831
// Dump the map for debugging purposes.
826
832
llvm::dbgs () << " Mapping between function names and matching LLVM function "
0 commit comments