//===- MemoryLocation.cpp - Memory location descriptions -------------------==// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/Analysis/MemoryLocation.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Type.h" using namespace llvm; MemoryLocation MemoryLocation::get(const LoadInst *LI) { AAMDNodes AATags; LI->getAAMetadata(AATags); const auto &DL = LI->getModule()->getDataLayout(); return MemoryLocation(LI->getPointerOperand(), DL.getTypeStoreSize(LI->getType()), AATags); } MemoryLocation MemoryLocation::get(const StoreInst *SI) { AAMDNodes AATags; SI->getAAMetadata(AATags); const auto &DL = SI->getModule()->getDataLayout(); return MemoryLocation(SI->getPointerOperand(), DL.getTypeStoreSize(SI->getValueOperand()->getType()), AATags); } MemoryLocation MemoryLocation::get(const VAArgInst *VI) { AAMDNodes AATags; VI->getAAMetadata(AATags); return MemoryLocation(VI->getPointerOperand(), UnknownSize, AATags); } MemoryLocation MemoryLocation::get(const AtomicCmpXchgInst *CXI) { AAMDNodes AATags; CXI->getAAMetadata(AATags); const auto &DL = CXI->getModule()->getDataLayout(); return MemoryLocation( CXI->getPointerOperand(), DL.getTypeStoreSize(CXI->getCompareOperand()->getType()), AATags); } MemoryLocation MemoryLocation::get(const AtomicRMWInst *RMWI) { AAMDNodes AATags; RMWI->getAAMetadata(AATags); const auto &DL = RMWI->getModule()->getDataLayout(); return MemoryLocation(RMWI->getPointerOperand(), DL.getTypeStoreSize(RMWI->getValOperand()->getType()), AATags); } MemoryLocation MemoryLocation::getForSource(const MemTransferInst *MTI) { uint64_t Size = UnknownSize; if (ConstantInt *C = dyn_cast(MTI->getLength())) Size = C->getValue().getZExtValue(); // memcpy/memmove can have AA tags. For memcpy, they apply // to both the source and the destination. AAMDNodes AATags; MTI->getAAMetadata(AATags); return MemoryLocation(MTI->getRawSource(), Size, AATags); } MemoryLocation MemoryLocation::getForDest(const MemIntrinsic *MTI) { uint64_t Size = UnknownSize; if (ConstantInt *C = dyn_cast(MTI->getLength())) Size = C->getValue().getZExtValue(); // memcpy/memmove can have AA tags. For memcpy, they apply // to both the source and the destination. AAMDNodes AATags; MTI->getAAMetadata(AATags); return MemoryLocation(MTI->getRawDest(), Size, AATags); }