mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-03 13:31:05 +00:00
Only one custom meadata of each kind can be attached with an instruction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83105 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a9a9c95f67
commit
58a230a491
@ -342,8 +342,8 @@ public:
|
|||||||
/// getMDs - Get the metadata attached with an Instruction.
|
/// getMDs - Get the metadata attached with an Instruction.
|
||||||
const MDMapTy *getMDs(const Instruction *Inst);
|
const MDMapTy *getMDs(const Instruction *Inst);
|
||||||
|
|
||||||
/// setMD - Attach the metadata of given kind with an Instruction.
|
/// addMD - Attach the metadata of given kind with an Instruction.
|
||||||
void setMD(unsigned Kind, MDNode *Node, Instruction *Inst);
|
void addMD(unsigned Kind, MDNode *Node, Instruction *Inst);
|
||||||
|
|
||||||
/// getHandlerNames - Get handler names. This is used by bitcode
|
/// getHandlerNames - Get handler names. This is used by bitcode
|
||||||
/// writer.
|
/// writer.
|
||||||
|
@ -148,7 +148,7 @@ public:
|
|||||||
/// SetDebugLocation - Set location information for the given instruction.
|
/// SetDebugLocation - Set location information for the given instruction.
|
||||||
void SetDebugLocation(Instruction *I) {
|
void SetDebugLocation(Instruction *I) {
|
||||||
if (CurDbgLocation)
|
if (CurDbgLocation)
|
||||||
Context.getMetadata().setMD(MDKind, CurDbgLocation, I);
|
Context.getMetadata().addMD(MDKind, CurDbgLocation, I);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Insert - Insert and return the specified instruction.
|
/// Insert - Insert and return the specified instruction.
|
||||||
@ -156,7 +156,7 @@ public:
|
|||||||
InstTy *Insert(InstTy *I, const Twine &Name = "") const {
|
InstTy *Insert(InstTy *I, const Twine &Name = "") const {
|
||||||
this->InsertHelper(I, Name, BB, InsertPt);
|
this->InsertHelper(I, Name, BB, InsertPt);
|
||||||
if (CurDbgLocation)
|
if (CurDbgLocation)
|
||||||
Context.getMetadata().setMD(MDKind, CurDbgLocation, I);
|
Context.getMetadata().addMD(MDKind, CurDbgLocation, I);
|
||||||
return I;
|
return I;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2665,7 +2665,7 @@ bool LLParser::ParseBasicBlock(PerFunctionState &PFS) {
|
|||||||
MetadataContext &TheMetadata = M->getContext().getMetadata();
|
MetadataContext &TheMetadata = M->getContext().getMetadata();
|
||||||
for (SmallVector<std::pair<unsigned, MDNode *>, 2>::iterator
|
for (SmallVector<std::pair<unsigned, MDNode *>, 2>::iterator
|
||||||
MDI = MDsOnInst.begin(), MDE = MDsOnInst.end(); MDI != MDE; ++MDI)
|
MDI = MDsOnInst.begin(), MDE = MDsOnInst.end(); MDI != MDE; ++MDI)
|
||||||
TheMetadata.setMD(MDI->first, MDI->second, Inst);
|
TheMetadata.addMD(MDI->first, MDI->second, Inst);
|
||||||
MDsOnInst.clear();
|
MDsOnInst.clear();
|
||||||
|
|
||||||
BB->getInstList().push_back(Inst);
|
BB->getInstList().push_back(Inst);
|
||||||
|
@ -1582,7 +1582,7 @@ bool BitcodeReader::ParseMetadataAttachment() {
|
|||||||
for (unsigned i = 1; i != RecordLength; i = i+2) {
|
for (unsigned i = 1; i != RecordLength; i = i+2) {
|
||||||
unsigned Kind = Record[i];
|
unsigned Kind = Record[i];
|
||||||
Value *Node = MDValueList.getValueFwdRef(Record[i+1]);
|
Value *Node = MDValueList.getValueFwdRef(Record[i+1]);
|
||||||
TheMetadata.setMD(Kind, cast<MDNode>(Node), Inst);
|
TheMetadata.addMD(Kind, cast<MDNode>(Node), Inst);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -300,18 +300,29 @@ unsigned MetadataContext::getMDKind(const char *Name) {
|
|||||||
return I->getValue();
|
return I->getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// setMD - Attach the metadata of given kind with an Instruction.
|
/// addMD - Attach the metadata of given kind with an Instruction.
|
||||||
void MetadataContext::setMD(unsigned MDKind, MDNode *Node, Instruction *Inst) {
|
void MetadataContext::addMD(unsigned MDKind, MDNode *Node, Instruction *Inst) {
|
||||||
MDStoreTy::iterator I = MetadataStore.find(Inst);
|
assert (Node && "Unable to add custome metadata");
|
||||||
Inst->HasMetadata = true;
|
Inst->HasMetadata = true;
|
||||||
|
MDStoreTy::iterator I = MetadataStore.find(Inst);
|
||||||
if (I == MetadataStore.end()) {
|
if (I == MetadataStore.end()) {
|
||||||
MDMapTy Info;
|
MDMapTy Info;
|
||||||
Info.push_back(std::make_pair(MDKind, Node));
|
Info.push_back(std::make_pair(MDKind, Node));
|
||||||
MetadataStore.insert(std::make_pair(Inst, Info));
|
MetadataStore.insert(std::make_pair(Inst, Info));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MDMapTy &Info = I->second;
|
MDMapTy &Info = I->second;
|
||||||
|
// If there is an entry for this MDKind then replace it.
|
||||||
|
for (unsigned i = 0, e = Info.size(); i != e; ++i) {
|
||||||
|
MDPairTy &P = Info[i];
|
||||||
|
if (P.first == MDKind) {
|
||||||
|
Info[i] = std::make_pair(MDKind, Node);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise add a new entry.
|
||||||
Info.push_back(std::make_pair(MDKind, Node));
|
Info.push_back(std::make_pair(MDKind, Node));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -319,16 +330,15 @@ void MetadataContext::setMD(unsigned MDKind, MDNode *Node, Instruction *Inst) {
|
|||||||
/// getMD - Get the metadata of given kind attached with an Instruction.
|
/// getMD - Get the metadata of given kind attached with an Instruction.
|
||||||
/// If the metadata is not found then return 0.
|
/// If the metadata is not found then return 0.
|
||||||
MDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) {
|
MDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) {
|
||||||
MDNode *Node = NULL;
|
|
||||||
MDStoreTy::iterator I = MetadataStore.find(Inst);
|
MDStoreTy::iterator I = MetadataStore.find(Inst);
|
||||||
if (I == MetadataStore.end())
|
if (I == MetadataStore.end())
|
||||||
return Node;
|
return NULL;
|
||||||
|
|
||||||
MDMapTy &Info = I->second;
|
MDMapTy &Info = I->second;
|
||||||
for (MDMapTy::iterator I = Info.begin(), E = Info.end(); I != E; ++I)
|
for (MDMapTy::iterator I = Info.begin(), E = Info.end(); I != E; ++I)
|
||||||
if (I->first == MDKind)
|
if (I->first == MDKind)
|
||||||
Node = dyn_cast_or_null<MDNode>(I->second);
|
return dyn_cast_or_null<MDNode>(I->second);
|
||||||
return Node;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// getMDs - Get the metadata attached with an Instruction.
|
/// getMDs - Get the metadata attached with an Instruction.
|
||||||
@ -374,5 +384,5 @@ void MetadataContext::ValueIsCloned(const Instruction *In1, Instruction *In2) {
|
|||||||
MDMapTy In2Info;
|
MDMapTy In2Info;
|
||||||
for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I)
|
for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I)
|
||||||
if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second))
|
if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second))
|
||||||
setMD(I->first, MD, In2);
|
addMD(I->first, MD, In2);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user