From cadbe233a67674d5fa406c930a5aad3a5bcc6765 Mon Sep 17 00:00:00 2001 From: Yichao Yu Date: Thu, 7 Sep 2017 13:43:47 -0400 Subject: [PATCH] Fix invalid `ptrtoint` on non-integral pointers This broke LLVM 4.0+. --- src/llvm-late-gc-lowering.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/llvm-late-gc-lowering.cpp b/src/llvm-late-gc-lowering.cpp index 6c62c73809bc6..860985beab2f0 100644 --- a/src/llvm-late-gc-lowering.cpp +++ b/src/llvm-late-gc-lowering.cpp @@ -315,6 +315,7 @@ struct LateLowerGCFrame: public FunctionPass { Type *T_int8; Type *T_int32; Type *T_pint8; + Type *T_pjlvalue; Type *T_pjlvalue_der; Type *T_ppjlvalue_der; MDNode *tbaa_gcframe; @@ -1156,7 +1157,9 @@ bool LateLowerGCFrame::CleanupIR(Function &F) { (gc_use_func != nullptr && callee == gc_use_func)) { /* No replacement */ } else if (pointer_from_objref_func != nullptr && callee == pointer_from_objref_func) { - auto *ptr = new PtrToIntInst(CI->getOperand(0), CI->getType(), "", CI); + auto *obj = CI->getOperand(0); + auto *ASCI = new AddrSpaceCastInst(obj, T_pjlvalue, "", CI); + auto *ptr = new PtrToIntInst(ASCI, CI->getType(), "", CI); ptr->takeName(CI); CI->replaceAllUsesWith(ptr); } else if (alloc_obj_func && callee == alloc_obj_func) { @@ -1447,7 +1450,7 @@ bool LateLowerGCFrame::doInitialization(Module &M) { addRetNoAlias(big_alloc_func); } auto T_jlvalue = cast(T_prjlvalue)->getElementType(); - auto T_pjlvalue = PointerType::get(T_jlvalue, 0); + T_pjlvalue = PointerType::get(T_jlvalue, 0); T_ppjlvalue = PointerType::get(T_pjlvalue, 0); T_pjlvalue_der = PointerType::get(T_jlvalue, AddressSpace::Derived); T_ppjlvalue_der = PointerType::get(T_prjlvalue, AddressSpace::Derived); @@ -1455,7 +1458,7 @@ bool LateLowerGCFrame::doInitialization(Module &M) { else if (ptls_getter) { auto functype = ptls_getter->getFunctionType(); T_ppjlvalue = cast(functype->getReturnType())->getElementType(); - auto T_pjlvalue = cast(T_ppjlvalue)->getElementType(); + T_pjlvalue = cast(T_ppjlvalue)->getElementType(); auto T_jlvalue = cast(T_pjlvalue)->getElementType(); T_prjlvalue = PointerType::get(T_jlvalue, AddressSpace::Tracked); T_pjlvalue_der = PointerType::get(T_jlvalue, AddressSpace::Derived); @@ -1464,6 +1467,7 @@ bool LateLowerGCFrame::doInitialization(Module &M) { else { T_ppjlvalue = nullptr; T_prjlvalue = nullptr; + T_pjlvalue = nullptr; T_pjlvalue_der = nullptr; T_ppjlvalue_der = nullptr; }