mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Implement function prefix data as an IR feature.
Previous discussion: http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-July/063909.html Differential Revision: http://llvm-reviews.chandlerc.com/D1191 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190773 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -276,6 +276,9 @@ void Function::dropAllReferences() {
|
||||
// blockaddresses, but BasicBlock's destructor takes care of those.
|
||||
while (!BasicBlocks.empty())
|
||||
BasicBlocks.begin()->eraseFromParent();
|
||||
|
||||
// Prefix data is stored in a side table.
|
||||
setPrefixData(0);
|
||||
}
|
||||
|
||||
void Function::addAttribute(unsigned i, Attribute::AttrKind attr) {
|
||||
@@ -351,6 +354,10 @@ void Function::copyAttributesFrom(const GlobalValue *Src) {
|
||||
setGC(SrcF->getGC());
|
||||
else
|
||||
clearGC();
|
||||
if (SrcF->hasPrefixData())
|
||||
setPrefixData(SrcF->getPrefixData());
|
||||
else
|
||||
setPrefixData(0);
|
||||
}
|
||||
|
||||
/// getIntrinsicID - This method returns the ID number of the specified
|
||||
@@ -720,3 +727,32 @@ bool Function::callsFunctionThatReturnsTwice() const {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Constant *Function::getPrefixData() const {
|
||||
assert(hasPrefixData());
|
||||
const LLVMContextImpl::PrefixDataMapTy &PDMap =
|
||||
getContext().pImpl->PrefixDataMap;
|
||||
assert(PDMap.find(this) != PDMap.end());
|
||||
return cast<Constant>(PDMap.find(this)->second->getReturnValue());
|
||||
}
|
||||
|
||||
void Function::setPrefixData(Constant *PrefixData) {
|
||||
if (!PrefixData && !hasPrefixData())
|
||||
return;
|
||||
|
||||
unsigned SCData = getSubclassDataFromValue();
|
||||
LLVMContextImpl::PrefixDataMapTy &PDMap = getContext().pImpl->PrefixDataMap;
|
||||
ReturnInst *&PDHolder = PDMap[this];
|
||||
if (PrefixData) {
|
||||
if (PDHolder)
|
||||
PDHolder->setOperand(0, PrefixData);
|
||||
else
|
||||
PDHolder = ReturnInst::Create(getContext(), PrefixData);
|
||||
SCData |= 2;
|
||||
} else {
|
||||
delete PDHolder;
|
||||
PDMap.erase(this);
|
||||
SCData &= ~2;
|
||||
}
|
||||
setValueSubclassData(SCData);
|
||||
}
|
||||
|
Reference in New Issue
Block a user