1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

MIR Serialization: Fix serialization of unnamed IR block references.

The block address machine operands can reference IR blocks in other functions.
This commit fixes a bug where the references to unnamed IR blocks in other
functions weren't serialized correctly.

llvm-svn: 244299
This commit is contained in:
Alex Lorenz 2015-08-06 23:57:04 +00:00
parent cc4cd5aa06
commit 28c3634e6a
3 changed files with 55 additions and 12 deletions

View File

@ -174,9 +174,8 @@ private:
/// Return 0 if the name isn't a subregister index class.
unsigned getSubRegIndex(StringRef Name);
void initSlots2BasicBlocks();
const BasicBlock *getIRBlock(unsigned Slot);
const BasicBlock *getIRBlock(unsigned Slot, const Function &F);
void initNames2TargetIndices();
@ -858,7 +857,7 @@ bool MIParser::parseIRBlock(BasicBlock *&BB, const Function &F) {
unsigned SlotNumber = 0;
if (getUnsigned(SlotNumber))
return true;
BB = const_cast<BasicBlock *>(getIRBlock(SlotNumber));
BB = const_cast<BasicBlock *>(getIRBlock(SlotNumber, F));
if (!BB)
return error(Twine("use of undefined IR block '%ir-block.") +
Twine(SlotNumber) + "'");
@ -1208,11 +1207,10 @@ unsigned MIParser::getSubRegIndex(StringRef Name) {
return SubRegInfo->getValue();
}
void MIParser::initSlots2BasicBlocks() {
if (!Slots2BasicBlocks.empty())
return;
const auto &F = *MF.getFunction();
ModuleSlotTracker MST(F.getParent());
static void initSlots2BasicBlocks(
const Function &F,
DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false);
MST.incorporateFunction(F);
for (auto &BB : F) {
if (BB.hasName())
@ -1224,14 +1222,29 @@ void MIParser::initSlots2BasicBlocks() {
}
}
const BasicBlock *MIParser::getIRBlock(unsigned Slot) {
initSlots2BasicBlocks();
static const BasicBlock *getIRBlockFromSlot(
unsigned Slot,
const DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
auto BlockInfo = Slots2BasicBlocks.find(Slot);
if (BlockInfo == Slots2BasicBlocks.end())
return nullptr;
return BlockInfo->second;
}
const BasicBlock *MIParser::getIRBlock(unsigned Slot) {
if (Slots2BasicBlocks.empty())
initSlots2BasicBlocks(*MF.getFunction(), Slots2BasicBlocks);
return getIRBlockFromSlot(Slot, Slots2BasicBlocks);
}
const BasicBlock *MIParser::getIRBlock(unsigned Slot, const Function &F) {
if (&F == MF.getFunction())
return getIRBlock(Slot);
DenseMap<unsigned, const BasicBlock *> CustomSlots2BasicBlocks;
initSlots2BasicBlocks(F, CustomSlots2BasicBlocks);
return getIRBlockFromSlot(Slot, CustomSlots2BasicBlocks);
}
void MIParser::initNames2TargetIndices() {
if (!Names2TargetIndices.empty())
return;

View File

@ -476,7 +476,16 @@ void MIPrinter::printIRBlockReference(const BasicBlock &BB) {
printLLVMNameWithoutPrefix(OS, BB.getName());
return;
}
int Slot = MST.getLocalSlot(&BB);
const Function *F = BB.getParent();
int Slot;
if (F == MST.getCurrentFunction()) {
Slot = MST.getLocalSlot(&BB);
} else {
ModuleSlotTracker CustomMST(F->getParent(),
/*ShouldInitializeAllMetadata=*/false);
CustomMST.incorporateFunction(*F);
Slot = CustomMST.getLocalSlot(&BB);
}
if (Slot == -1)
OS << "<badref>";
else

View File

@ -26,6 +26,12 @@
ret void
}
define void @slot_in_other_function(i8** %addr) {
entry:
store volatile i8* blockaddress(@test3, %0), i8** %addr
ret void
}
define void @test3() {
entry:
store volatile i8* blockaddress(@test3, %0), i8** @addr
@ -81,6 +87,20 @@ body:
- RETQ
...
---
name: slot_in_other_function
tracksRegLiveness: true
body:
- id: 0
name: entry
liveins: [ '%rdi' ]
instructions:
# CHECK: name: slot_in_other_function
# CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _
- '%rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _'
- 'MOV64mr killed %rdi, 1, _, 0, _, killed %rax'
- RETQ
...
---
name: test3
tracksRegLiveness: true
body:
@ -88,7 +108,8 @@ body:
name: entry
successors: [ '%bb.1' ]
instructions:
# CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _
# CHECK: name: test3
# CHECK: %rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _
- '%rax = LEA64r %rip, 1, _, blockaddress(@test3, %ir-block.0), _'
- 'MOV64mr %rip, 1, _, @addr, _, killed %rax'
- 'JMP64m %rip, 1, _, @addr, _'