Skip to content

Commit d028b17

Browse files
Roman Levensteinfacebook-github-bot
Roman Levenstein
authored andcommitted
Fix how mangled C++ functions are handled
Reviewed By: jaybean-dev Differential Revision: D56683446 fbshipit-source-id: d9cfec00f5d9260a241b6deaebbe4c168216586c
1 parent f9079b1 commit d028b17

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

Diff for: lib/LLVMIRCodeGen/LLVMIRGen.cpp

+12-5
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ static std::string createName(const std::string &name, ElemKind elemTy) {
795795
void 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

Comments
 (0)