Commit 0fe6b544 by David Sehr

Fix race condition in jump table list creation

BUG= R=stichnot@chromium.org Review URL: https://codereview.chromium.org/1460003003 .
parent f4d0a7a5
......@@ -966,12 +966,13 @@ void Cfg::emitJumpTables() {
IceString MangledName = Ctx->mangleName(getFunctionName());
for (const InstJumpTable *JumpTable : JumpTables) {
SizeT NumTargets = JumpTable->getNumTargets();
JumpTableData &JT =
Ctx->addJumpTable(MangledName, JumpTable->getId(), NumTargets);
JumpTableData::TargetList TargetList;
for (SizeT I = 0; I < NumTargets; ++I) {
SizeT Index = JumpTable->getTarget(I)->getIndex();
JT.pushTarget(getAssembler()->getCfgNodeLabel(Index)->getPosition());
TargetList.emplace_back(
getAssembler()->getCfgNodeLabel(Index)->getPosition());
}
Ctx->addJumpTable(MangledName, JumpTable->getId(), TargetList);
}
} break;
case FT_Asm: {
......
......@@ -895,10 +895,11 @@ JumpTableDataList GlobalContext::getJumpTables() {
return JumpTables;
}
JumpTableData &GlobalContext::addJumpTable(IceString FuncName, SizeT Id,
SizeT NumTargets) {
JumpTableData &
GlobalContext::addJumpTable(IceString FuncName, SizeT Id,
const JumpTableData::TargetList &TargetList) {
auto JumpTableList = getJumpTableList();
JumpTableList->emplace_back(FuncName, Id, NumTargets);
JumpTableList->emplace_back(FuncName, Id, TargetList);
return JumpTableList->back();
}
......
......@@ -217,7 +217,8 @@ public:
/// Return a locked pointer to the registered jump tables.
JumpTableDataList getJumpTables();
/// Create a new jump table entry and return a reference to it.
JumpTableData &addJumpTable(IceString FuncName, SizeT Id, SizeT NumTargets);
JumpTableData &addJumpTable(IceString FuncName, SizeT Id,
const JumpTableData::TargetList &TargetList);
const ClFlags &getFlags() const { return Flags; }
......
......@@ -81,26 +81,23 @@ class JumpTableData {
JumpTableData &operator=(const JumpTableData &) = delete;
public:
JumpTableData(IceString FuncName, SizeT Id, SizeT NumTargets)
: FuncName(FuncName), Id(Id) {
TargetOffsets.reserve(NumTargets);
}
using TargetList = std::vector<intptr_t>;
JumpTableData(const IceString &FuncName, SizeT Id,
const TargetList &TargetOffsets)
: FuncName(FuncName), Id(Id), TargetOffsets(TargetOffsets) {}
JumpTableData(const JumpTableData &) = default;
JumpTableData(JumpTableData &&) = default;
JumpTableData &operator=(JumpTableData &&) = default;
void pushTarget(intptr_t Offset) { TargetOffsets.emplace_back(Offset); }
const IceString &getFunctionName() const { return FuncName; }
SizeT getId() const { return Id; }
const std::vector<intptr_t> &getTargetOffsets() const {
return TargetOffsets;
}
const TargetList &getTargetOffsets() const { return TargetOffsets; }
private:
IceString FuncName;
SizeT Id;
std::vector<intptr_t> TargetOffsets;
TargetList TargetOffsets;
};
using JumpTableDataList = std::vector<JumpTableData>;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment