OSDN Git Service

Fix race condition in jump table list creation
authorDavid Sehr <sehr@chromium.org>
Fri, 20 Nov 2015 05:47:15 +0000 (21:47 -0800)
committerDavid Sehr <sehr@chromium.org>
Fri, 20 Nov 2015 05:47:15 +0000 (21:47 -0800)
BUG=
R=stichnot@chromium.org

Review URL: https://codereview.chromium.org/1460003003 .

src/IceCfg.cpp
src/IceGlobalContext.cpp
src/IceGlobalContext.h
src/IceSwitchLowering.h

index 65844b9..3fe37f3 100644 (file)
@@ -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: {
index fbdcd1b..94a5343 100644 (file)
@@ -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();
 }
 
index e4b1440..11e0daa 100644 (file)
@@ -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; }
 
index 8ac1842..fc9c4a2 100644 (file)
@@ -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>;