@@ -2071,12 +2071,57 @@ void TypeAnalyzer::visitPHINode(PHINode &phi) {
20712071 if (BO->getOperand (0 ) == &phi) {
20722072 set = true ;
20732073 PhiTypes = otherData;
2074- PhiTypes.binopIn (getAnalysis (BO->getOperand (1 )), BO->getOpcode ());
2074+ bool Legal = true ;
2075+ PhiTypes.binopIn (Legal, getAnalysis (BO->getOperand (1 )),
2076+ BO->getOpcode ());
2077+ if (!Legal) {
2078+ std::string str;
2079+ raw_string_ostream ss (str);
2080+ if (!CustomErrorHandler) {
2081+ llvm::errs () << *fntypeinfo.Function ->getParent () << " \n " ;
2082+ llvm::errs () << *fntypeinfo.Function << " \n " ;
2083+ dump (ss);
2084+ }
2085+ ss << " Illegal updateBinop Analysis " << *BO << " \n " ;
2086+ ss << " Illegal binopIn(0): " << *BO
2087+ << " lhs: " << PhiTypes.str ()
2088+ << " rhs: " << getAnalysis (BO->getOperand (0 )).str () << " \n " ;
2089+ if (CustomErrorHandler) {
2090+ CustomErrorHandler (str.c_str (), wrap (BO),
2091+ ErrorType::IllegalTypeAnalysis,
2092+ (void *)this , wrap (BO), nullptr );
2093+ }
2094+ EmitFailure (" IllegalUpdateAnalysis" , BO->getDebugLoc (), BO,
2095+ ss.str ());
2096+ report_fatal_error (" Performed illegal updateAnalysis" );
2097+ }
20752098 break ;
20762099 } else if (BO->getOperand (1 ) == &phi) {
20772100 set = true ;
20782101 PhiTypes = getAnalysis (BO->getOperand (0 ));
2079- PhiTypes.binopIn (otherData, BO->getOpcode ());
2102+ bool Legal = true ;
2103+ PhiTypes.binopIn (Legal, otherData, BO->getOpcode ());
2104+ if (!Legal) {
2105+ std::string str;
2106+ raw_string_ostream ss (str);
2107+ if (!CustomErrorHandler) {
2108+ llvm::errs () << *fntypeinfo.Function ->getParent () << " \n " ;
2109+ llvm::errs () << *fntypeinfo.Function << " \n " ;
2110+ dump (ss);
2111+ }
2112+ ss << " Illegal updateBinop Analysis " << *BO << " \n " ;
2113+ ss << " Illegal binopIn(1): " << *BO
2114+ << " lhs: " << PhiTypes.str () << " rhs: " << otherData.str ()
2115+ << " \n " ;
2116+ if (CustomErrorHandler) {
2117+ CustomErrorHandler (str.c_str (), wrap (BO),
2118+ ErrorType::IllegalTypeAnalysis,
2119+ (void *)this , wrap (BO), nullptr );
2120+ }
2121+ EmitFailure (" IllegalUpdateAnalysis" , BO->getDebugLoc (), BO,
2122+ ss.str ());
2123+ report_fatal_error (" Performed illegal updateAnalysis" );
2124+ }
20802125 break ;
20812126 }
20822127 } else if (BO->getOpcode () == BinaryOperator::Sub) {
@@ -2124,7 +2169,27 @@ void TypeAnalyzer::visitPHINode(PHINode &phi) {
21242169 TypeTree vd2 = isa<Constant>(bo->getOperand (1 ))
21252170 ? getAnalysis (bo->getOperand (1 )).Data0 ()
21262171 : PhiTypes.Data0 ();
2127- vd1.binopIn (vd2, bo->getOpcode ());
2172+ bool Legal = true ;
2173+ vd1.binopIn (Legal, vd2, bo->getOpcode ());
2174+ if (!Legal) {
2175+ std::string str;
2176+ raw_string_ostream ss (str);
2177+ if (!CustomErrorHandler) {
2178+ llvm::errs () << *fntypeinfo.Function ->getParent () << " \n " ;
2179+ llvm::errs () << *fntypeinfo.Function << " \n " ;
2180+ dump (ss);
2181+ }
2182+ ss << " Illegal updateBinop Analysis " << *bo << " \n " ;
2183+ ss << " Illegal binopIn(consts): " << *bo << " lhs: " << vd1.str ()
2184+ << " rhs: " << vd2.str () << " \n " ;
2185+ if (CustomErrorHandler) {
2186+ CustomErrorHandler (str.c_str (), wrap (bo),
2187+ ErrorType::IllegalTypeAnalysis, (void *)this ,
2188+ wrap (bo), nullptr );
2189+ }
2190+ EmitFailure (" IllegalUpdateAnalysis" , bo->getDebugLoc (), bo, ss.str ());
2191+ report_fatal_error (" Performed illegal updateAnalysis" );
2192+ }
21282193 PhiTypes &= vd1.Only (bo->getType ()->isIntegerTy () ? -1 : 0 , &phi);
21292194 }
21302195
@@ -2999,8 +3064,28 @@ void TypeAnalyzer::visitBinaryOperation(const DataLayout &dl, llvm::Type *T,
29993064
30003065 if (direction & DOWN) {
30013066 TypeTree Result = AnalysisLHS;
3002- Result.binopIn (AnalysisRHS, Opcode);
3003-
3067+ bool Legal = true ;
3068+ Result.binopIn (Legal, AnalysisRHS, Opcode);
3069+ if (!Legal) {
3070+ std::string str;
3071+ raw_string_ostream ss (str);
3072+ if (!CustomErrorHandler) {
3073+ llvm::errs () << *fntypeinfo.Function ->getParent () << " \n " ;
3074+ llvm::errs () << *fntypeinfo.Function << " \n " ;
3075+ dump (ss);
3076+ }
3077+ ss << " Illegal updateBinop Analysis " << *origin << " \n " ;
3078+ ss << " Illegal binopIn(down): " << Opcode << " lhs: " << Result.str ()
3079+ << " rhs: " << AnalysisRHS.str () << " \n " ;
3080+ if (CustomErrorHandler) {
3081+ CustomErrorHandler (str.c_str (), wrap (origin),
3082+ ErrorType::IllegalTypeAnalysis, (void *)this ,
3083+ wrap (origin), nullptr );
3084+ }
3085+ EmitFailure (" IllegalUpdateAnalysis" , origin->getDebugLoc (), origin,
3086+ ss.str ());
3087+ report_fatal_error (" Performed illegal updateAnalysis" );
3088+ }
30043089 if (Opcode == BinaryOperator::And) {
30053090 for (int i = 0 ; i < 2 ; ++i) {
30063091 if (Args[i])
@@ -3254,16 +3339,27 @@ void TypeAnalyzer::visitMemTransferCommon(llvm::CallBase &MTI) {
32543339 bool Legal = true ;
32553340 res.checkedOrIn (res2, /* PointerIntSame*/ false , Legal);
32563341 if (!Legal) {
3257- dump ();
3258- llvm::errs () << MTI << " \n " ;
3259- llvm::errs () << " Illegal orIn: " << res.str () << " right: " << res2.str ()
3260- << " \n " ;
3261- llvm::errs () << *MTI.getArgOperand (0 ) << " "
3262- << getAnalysis (MTI.getArgOperand (0 )).str () << " \n " ;
3263- llvm::errs () << *MTI.getArgOperand (1 ) << " "
3264- << getAnalysis (MTI.getArgOperand (1 )).str () << " \n " ;
3265- assert (0 && " Performed illegal visitMemTransferInst::orIn" );
3266- llvm_unreachable (" Performed illegal visitMemTransferInst::orIn" );
3342+ std::string str;
3343+ raw_string_ostream ss (str);
3344+ if (!CustomErrorHandler) {
3345+ llvm::errs () << *fntypeinfo.Function ->getParent () << " \n " ;
3346+ llvm::errs () << *fntypeinfo.Function << " \n " ;
3347+ dump (ss);
3348+ }
3349+ ss << " Illegal updateMemTransfer Analysis " << MTI << " \n " ;
3350+ ss << " Illegal orIn: " << res.str () << " right: " << res2.str () << " \n " ;
3351+ ss << *MTI.getArgOperand (0 ) << " "
3352+ << getAnalysis (MTI.getArgOperand (0 )).str () << " \n " ;
3353+ ss << *MTI.getArgOperand (1 ) << " "
3354+ << getAnalysis (MTI.getArgOperand (1 )).str () << " \n " ;
3355+
3356+ if (CustomErrorHandler) {
3357+ CustomErrorHandler (str.c_str (), wrap (&MTI),
3358+ ErrorType::IllegalTypeAnalysis, (void *)this ,
3359+ wrap (&MTI), nullptr );
3360+ }
3361+ EmitFailure (" IllegalUpdateAnalysis" , MTI.getDebugLoc (), &MTI, ss.str ());
3362+ report_fatal_error (" Performed illegal updateAnalysis" );
32673363 }
32683364 res.insert ({}, BaseType::Pointer);
32693365 res = res.Only (-1 , &MTI);
@@ -3810,8 +3906,27 @@ void TypeAnalyzer::visitIntrinsicInst(llvm::IntrinsicInst &I) {
38103906 updateAnalysis (I.getOperand (1 ), analysis.Only (-1 , &I), &I);
38113907
38123908 TypeTree vd = getAnalysis (I.getOperand (0 )).Data0 ();
3813- vd.binopIn (getAnalysis (I.getOperand (1 )).Data0 (), opcode);
3814-
3909+ bool Legal = true ;
3910+ vd.binopIn (Legal, getAnalysis (I.getOperand (1 )).Data0 (), opcode);
3911+ if (!Legal) {
3912+ std::string str;
3913+ raw_string_ostream ss (str);
3914+ if (!CustomErrorHandler) {
3915+ llvm::errs () << *fntypeinfo.Function ->getParent () << " \n " ;
3916+ llvm::errs () << *fntypeinfo.Function << " \n " ;
3917+ dump (ss);
3918+ }
3919+ ss << " Illegal updateBinopIntr Analysis " << I << " \n " ;
3920+ ss << " Illegal binopIn(intr): " << I << " lhs: " << vd.str ()
3921+ << " rhs: " << getAnalysis (I.getOperand (1 )).str () << " \n " ;
3922+ if (CustomErrorHandler) {
3923+ CustomErrorHandler (str.c_str (), wrap (&I),
3924+ ErrorType::IllegalTypeAnalysis, (void *)this ,
3925+ wrap (&I), nullptr );
3926+ }
3927+ EmitFailure (" IllegalUpdateAnalysis" , I.getDebugLoc (), &I, ss.str ());
3928+ report_fatal_error (" Performed illegal updateAnalysis" );
3929+ }
38153930 auto &dl = I.getParent ()->getParent ()->getParent ()->getDataLayout ();
38163931 int sz = (dl.getTypeSizeInBits (I.getOperand (0 )->getType ()) + 7 ) / 8 ;
38173932 TypeTree overall = vd.Only (-1 , &I).ShiftIndices (dl, 0 , sz, 0 );
0 commit comments