Index: lib/IR/Function.cpp =================================================================== --- lib/IR/Function.cpp +++ lib/IR/Function.cpp @@ -533,10 +533,15 @@ } else if (ArrayType* ATyp = dyn_cast(Ty)) { Result += "a" + llvm::utostr(ATyp->getNumElements()) + getMangledTypeStr(ATyp->getElementType()); - } else if (StructType* STyp = dyn_cast(Ty)) { - assert(!STyp->isLiteral() && "TODO: implement literal types"); - Result += STyp->getName(); - } else if (FunctionType* FT = dyn_cast(Ty)) { + } else if (StructType *STyp = dyn_cast(Ty)) { + if (!STyp->isLiteral()) { + Result += STyp->getName(); + } else { + Result += "s"; + for (size_t i = 0; i < STyp->getNumElements(); ++i) + Result += getMangledTypeStr(STyp->getElementType(i)); + } + } else if (FunctionType *FT = dyn_cast(Ty)) { Result += "f_" + getMangledTypeStr(FT->getReturnType()); for (size_t i = 0; i < FT->getNumParams(); i++) Result += getMangledTypeStr(FT->getParamType(i)); Index: test/CodeGen/Generic/overloaded-intrinsic-name.ll =================================================================== --- test/CodeGen/Generic/overloaded-intrinsic-name.ll +++ test/CodeGen/Generic/overloaded-intrinsic-name.ll @@ -48,6 +48,12 @@ ret %struct.test* %v-new } +; literal struct +define {i64, i64}* @test_literal_struct({i64, i64}* %v) gc "statepoint-example" { + %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0, {i64, i64} *%v) + %v-new = call {i64, i64}* @llvm.experimental.gc.relocate.p0si64i64.test(token %tok, i32 7, i32 7) + ret {i64, i64}* %v-new +} declare zeroext i1 @return_i1() declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...) declare i32* @llvm.experimental.gc.relocate.p0i32(token, i32, i32) @@ -55,3 +61,4 @@ declare [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(token, i32, i32) declare <3 x i32>* @llvm.experimental.gc.relocate.p0v3i32(token, i32, i32) declare %struct.test* @llvm.experimental.gc.relocate.p0struct.test(token, i32, i32) +declare {i64, i64}* @llvm.experimental.gc.relocate.p0si64i64.test(token, i32, i32)