@@ -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] ;
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,17 @@ 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
+ 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 ' ;
808
819
char *demangledNamePtr = Mangler.getFunctionBaseName (fnNameBuf, &fnNameLen);
809
820
if (!demangledNamePtr || fnNameLen == 0 ) {
810
821
continue ;
@@ -817,10 +828,6 @@ void LLVMIRGen::initLLVMFunctionNameToMangledNameMap() {
817
828
}
818
829
llvmFunctionNameToMangledName_[demangledFnName].push_back (mangledName);
819
830
}
820
- // Free up the memory.
821
- if (fnNameBuf) {
822
- free (fnNameBuf);
823
- }
824
831
DEBUG_GLOW ({
825
832
// Dump the map for debugging purposes.
826
833
llvm::dbgs () << " Mapping between function names and matching LLVM function "
0 commit comments