Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- ReplacePtrsWithInts.cpp - Convert pointer values to integer values--===// | 1 //===- ReplacePtrsWithInts.cpp - Convert pointer values to integer values--===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This pass strips out aggregate pointer types and replaces them with | 10 // This pass strips out aggregate pointer types and replaces them with |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 276 I != E; ++I) { | 276 I != E; ++I) { |
| 277 (*I)->dropAllReferences(); | 277 (*I)->dropAllReferences(); |
| 278 } | 278 } |
| 279 for (SmallVectorImpl<Instruction *>::iterator I = ToErase.begin(), | 279 for (SmallVectorImpl<Instruction *>::iterator I = ToErase.begin(), |
| 280 E = ToErase.end(); | 280 E = ToErase.end(); |
| 281 I != E; ++I) { | 281 I != E; ++I) { |
| 282 (*I)->eraseFromParent(); | 282 (*I)->eraseFromParent(); |
| 283 } | 283 } |
| 284 } | 284 } |
| 285 | 285 |
| 286 static void ConvertMetadataOperand(FunctionConverter *FC, | |
| 287 IntrinsicInst *Call, int Index) { | |
| 288 MDNode *MD = cast<MDNode>(Call->getArgOperand(Index)); | |
| 289 if (MD->getNumOperands() != 1) | |
| 290 return; | |
| 291 Value *MDArg = MD->getOperand(0); | |
| 292 if (MDArg && (isa<Argument>(MDArg) || isa<Instruction>(MDArg))) { | |
| 293 MDArg = FC->convert(MDArg, /* BypassPlaceholder= */ true); | |
| 294 if (PtrToIntInst *Cast = dyn_cast<PtrToIntInst>(MDArg)) { | |
| 295 // Unwrapping this is necessary for llvm.dbg.declare to work. | |
| 296 MDArg = Cast->getPointerOperand(); | |
| 297 } | |
| 298 SmallVector<Value *, 1> Args; | |
| 299 Args.push_back(MDArg); | |
| 300 Call->setArgOperand(Index, MDNode::get(Call->getContext(), Args)); | |
| 301 } | |
| 302 } | |
| 303 | |
| 304 // Remove attributes that only apply to pointer arguments. Returns | 286 // Remove attributes that only apply to pointer arguments. Returns |
| 305 // the updated AttributeSet. | 287 // the updated AttributeSet. |
| 306 static AttributeSet RemovePointerAttrs(LLVMContext &Context, | 288 static AttributeSet RemovePointerAttrs(LLVMContext &Context, |
| 307 AttributeSet Attrs) { | 289 AttributeSet Attrs) { |
| 308 SmallVector<AttributeSet, 8> AttrList; | 290 SmallVector<AttributeSet, 8> AttrList; |
| 309 for (unsigned Slot = 0; Slot < Attrs.getNumSlots(); ++Slot) { | 291 for (unsigned Slot = 0; Slot < Attrs.getNumSlots(); ++Slot) { |
| 310 unsigned Index = Attrs.getSlotIndex(Slot); | 292 unsigned Index = Attrs.getSlotIndex(Slot); |
| 311 AttrBuilder AB; | 293 AttrBuilder AB; |
| 312 for (AttributeSet::iterator Attr = Attrs.begin(Slot), E = Attrs.end(Slot); | 294 for (AttributeSet::iterator Attr = Attrs.begin(Slot), E = Attrs.end(Slot); |
| 313 Attr != E; ++Attr) { | 295 Attr != E; ++Attr) { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 326 break; | 308 break; |
| 327 // Strip these attributes because they apply only to pointers. This pass | 309 // Strip these attributes because they apply only to pointers. This pass |
| 328 // rewrites pointer arguments, thus these parameter attributes are | 310 // rewrites pointer arguments, thus these parameter attributes are |
| 329 // meaningless. Also, they are rejected by the PNaCl module verifier. | 311 // meaningless. Also, they are rejected by the PNaCl module verifier. |
| 330 case Attribute::NoCapture: | 312 case Attribute::NoCapture: |
| 331 case Attribute::NoAlias: | 313 case Attribute::NoAlias: |
| 332 case Attribute::ReadNone: | 314 case Attribute::ReadNone: |
| 333 case Attribute::ReadOnly: | 315 case Attribute::ReadOnly: |
| 334 case Attribute::NonNull: | 316 case Attribute::NonNull: |
| 335 case Attribute::Dereferenceable: | 317 case Attribute::Dereferenceable: |
| 318 case Attribute::DereferenceableOrNull: | |
| 336 break; | 319 break; |
| 337 default: | 320 default: |
| 338 AB.addAttribute(*Attr); | 321 AB.addAttribute(*Attr); |
| 339 } | 322 } |
| 340 } | 323 } |
| 341 AttrList.push_back(AttributeSet::get(Context, Index, AB)); | 324 AttrList.push_back(AttributeSet::get(Context, Index, AB)); |
| 342 } | 325 } |
| 343 return AttributeSet::get(Context, AttrList); | 326 return AttributeSet::get(Context, AttrList); |
| 344 } | 327 } |
| 345 | 328 |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 584 } | 567 } |
| 585 | 568 |
| 586 // Convert the function body. | 569 // Convert the function body. |
| 587 for (Function::iterator BB = NewFunc->begin(), E = NewFunc->end(); | 570 for (Function::iterator BB = NewFunc->begin(), E = NewFunc->end(); |
| 588 BB != E; ++BB) { | 571 BB != E; ++BB) { |
| 589 for (BasicBlock::iterator Iter = BB->begin(), E = BB->end(); | 572 for (BasicBlock::iterator Iter = BB->begin(), E = BB->end(); |
| 590 Iter != E; ) { | 573 Iter != E; ) { |
| 591 ConvertInstruction(&DL, IntPtrType, &FC, Iter++); | 574 ConvertInstruction(&DL, IntPtrType, &FC, Iter++); |
| 592 } | 575 } |
| 593 } | 576 } |
| 594 // Now that all the replacement instructions have been created, we | |
|
jvoung (off chromium)
2015/05/26 20:39:45
this is automatic now?
Derek Schuff
2015/05/26 22:01:32
RAUW seems to work on MetadataAsValue. We could ma
| |
| 595 // can update the debug intrinsic calls. | |
| 596 for (Function::iterator BB = NewFunc->begin(), E = NewFunc->end(); | |
| 597 BB != E; ++BB) { | |
| 598 for (BasicBlock::iterator Inst = BB->begin(), E = BB->end(); | |
| 599 Inst != E; ++Inst) { | |
| 600 if (IntrinsicInst *Call = dyn_cast<IntrinsicInst>(Inst)) { | |
| 601 if (Call->getIntrinsicID() == Intrinsic::dbg_declare) { | |
| 602 ConvertMetadataOperand(&FC, Call, 0); | |
| 603 } | |
| 604 } | |
| 605 } | |
| 606 } | |
| 607 FC.eraseReplacedInstructions(); | 577 FC.eraseReplacedInstructions(); |
| 608 | 578 |
| 609 // Patch the pointer to LLVM function in debug info descriptor. | 579 // Patch the pointer to LLVM function in debug info descriptor. |
| 610 auto DI = FunctionDIs.find(OldFunc); | 580 auto DI = FunctionDIs.find(OldFunc); |
| 611 if (DI != FunctionDIs.end()) | 581 if (DI != FunctionDIs.end()) |
| 612 DI->second.replaceFunction(NewFunc); | 582 DI->second->replaceFunction(NewFunc); |
| 613 | 583 |
| 614 OldFunc->eraseFromParent(); | 584 OldFunc->eraseFromParent(); |
| 615 } | 585 } |
| 616 // Now that all functions have their normalized types, we can remove | 586 // Now that all functions have their normalized types, we can remove |
| 617 // various casts. | 587 // various casts. |
| 618 for (Module::iterator Func = M.begin(), E = M.end(); Func != E; ++Func) { | 588 for (Module::iterator Func = M.begin(), E = M.end(); Func != E; ++Func) { |
| 619 CleanUpFunction(Func, IntPtrType); | 589 CleanUpFunction(Func, IntPtrType); |
| 620 // Delete the now-unused bitcast ConstantExprs that we created so | 590 // Delete the now-unused bitcast ConstantExprs that we created so |
| 621 // that they don't interfere with StripDeadPrototypes. | 591 // that they don't interfere with StripDeadPrototypes. |
| 622 Func->removeDeadConstantUsers(); | 592 Func->removeDeadConstantUsers(); |
| 623 } | 593 } |
| 624 return true; | 594 return true; |
| 625 } | 595 } |
| 626 | 596 |
| 627 ModulePass *llvm::createReplacePtrsWithIntsPass() { | 597 ModulePass *llvm::createReplacePtrsWithIntsPass() { |
| 628 return new ReplacePtrsWithInts(); | 598 return new ReplacePtrsWithInts(); |
| 629 } | 599 } |
| OLD | NEW |