@@ -20,6 +20,10 @@ using namespace llvm;
20
20
#include < set>
21
21
22
22
23
+ /*
24
+ * This Pass is only needed for 0.103 on Windows, so when we no longer need to support 0.103, it can be removed.
25
+ */
26
+
23
27
namespace
24
28
{
25
29
class ClamBCRemovePointerPHIs : public PassInfoMixin <ClamBCRemovePointerPHIs>
@@ -352,103 +356,6 @@ class ClamBCRemovePointerPHIs : public PassInfoMixin<ClamBCRemovePointerPHIs>
352
356
353
357
}
354
358
355
- FunctionType * getSaveFunctionType (){
356
- static FunctionType * pRet = nullptr ;
357
-
358
- if (nullptr == pRet){
359
-
360
- Type * vt = Type::getVoidTy (pMod->getContext ());
361
- Type * pt = Type::getInt8Ty (pMod->getContext ())->getPointerTo ();
362
- Type * it = Type::getInt32Ty (pMod->getContext ());
363
- pRet = FunctionType::get (vt, {pt, it, pt, it}, false );
364
-
365
- }
366
-
367
- return pRet;
368
-
369
- }
370
- Function * getSaveFunction (){
371
- static Function * pRet = nullptr ;
372
- if (nullptr == pRet){
373
- FunctionType * ft = getSaveFunctionType ();
374
- pRet = Function::Create (ft, GlobalValue::InternalLinkage, " __save_pointer" , pMod);
375
- pRet->addFnAttr (Attribute::OptimizeNone);
376
- pRet->addFnAttr (Attribute::NoInline);
377
-
378
- BasicBlock * pEntry = BasicBlock::Create (pMod->getContext (), " entry" , pRet, nullptr );
379
- CastInst * pCast = CastInst::CreatePointerCast (pRet->getArg (0 ), pRet->getArg (0 )->getType ()->getPointerTo (), " ClamBCRemovePointerPHIs_pointerCast_" , pEntry);
380
- new StoreInst (pRet->getArg (2 ), pCast, pEntry);
381
- ReturnInst::Create (pMod->getContext (), nullptr , pEntry);
382
-
383
- DEBUG_VALUE (pRet);
384
-
385
- }
386
- return pRet;
387
- }
388
-
389
- void savePointer (Value * src, Value * dst, Instruction * insPt){
390
- Function * saveFunction = getSaveFunction ();
391
- ConstantInt * pci = ConstantInt::get (Type::getInt32Ty (pMod->getContext ()), 8 );
392
- CastInst * pCast = CastInst::CreatePointerCast (dst, src->getType (), " ClamBCRemovePointerPHIs_pointerCast_" , insPt);
393
- CallInst::Create (getSaveFunctionType (), saveFunction, {pCast, pci, src, pci}, " " , insPt);
394
- }
395
-
396
- bool handlePHI2 (PHINode *pn)
397
- {
398
- if (not pn->getType ()->isPointerTy ()) {
399
- return false ;
400
- }
401
-
402
- Value *pBasePtr = findBasePointer (pn);
403
- if (nullptr == pBasePtr) { /* No unique base pointer.*/
404
- return false ;
405
- }
406
-
407
- /* Create our storage variable in the first basic block,
408
- * right before the branch instruction.*/
409
- Function * pFunc = pn->getParent ()->getParent ();
410
- BasicBlock * pEntry = llvm::cast<BasicBlock>(pFunc->begin ());
411
- Instruction * insPt = pEntry->getTerminator ();
412
- AllocaInst * pai = new AllocaInst (pn->getType (),
413
- pFunc->getAddressSpace (), " ClamBCRemovePointerPHIs_" , insPt);
414
-
415
- DEBUG_VALUE (pn);
416
- /* Go to all the locations that are incoming to our phi block, and store
417
- * the value the phi is using as input in our alloca instruction.
418
- */
419
- for (size_t i = 0 ; i < pn->getNumIncomingValues (); i++) {
420
- BasicBlock * pBB = pn->getIncomingBlock (i);
421
- #if 0
422
- Instruction *incoming = llvm::dyn_cast<Instruction>(pn->getIncomingValue(i));
423
- if (nullptr == incoming){
424
- DEBUG_VALUE(pn);
425
- DEBUG_VALUE(pn->getIncomingValue(i));
426
- assert (0 && "HOW DID THIS HAPPEN?");
427
- }
428
-
429
- insPt = getInsertionPoint(incoming);
430
- new StoreInst(incoming, pai, insPt);
431
- #else
432
- insPt = pBB->getTerminator ();
433
- #if 1
434
- new StoreInst (pn->getIncomingValue (i), pai, insPt);
435
- #else
436
- savePointer(pn->getIncomingValue(i), pai, insPt);
437
- #endif
438
- #endif
439
- }
440
-
441
- replaceUses (pn, pai);
442
- pn->eraseFromParent ();
443
-
444
-
445
-
446
- return true ;
447
-
448
- }
449
-
450
-
451
-
452
359
public:
453
360
ClamBCRemovePointerPHIs () {}
454
361
@@ -458,8 +365,6 @@ return pRet;
458
365
pMod = &m;
459
366
bool ret = false ;
460
367
461
- llvm::errs () << " <" << __FUNCTION__ << " ::" << __LINE__ << " >" << " HAVING ISSUES WITH POINTER PHIS ON 0.103 windows, keep changes isolated to this pass so that we can remove it when we no longer have to support 0.103" << " <END>\n " ;
462
-
463
368
for (auto i = pMod->begin (), e = pMod->end (); i != e; i++) {
464
369
llvm::Function *pFunc = llvm::dyn_cast<Function>(i);
465
370
if (nullptr == pFunc) {
@@ -469,15 +374,9 @@ return pRet;
469
374
for (size_t i = 0 ; i < phis.size (); i++) {
470
375
PHINode *pn = phis[i];
471
376
472
- #if 1
473
377
if (handlePHI (pn)) {
474
378
ret = true ;
475
379
}
476
- #else
477
- if (handlePHI2(pn)) {
478
- ret = true;
479
- }
480
- #endif
481
380
}
482
381
}
483
382
0 commit comments