[weak vtables] Remove a bunch of weak vtables
[oota-llvm.git] / utils / TableGen / CodeGenSchedule.cpp
index 001e97d1e1168fd0fc85d66234a044f8f63c8eeb..6da3ad720265b5dce4402af05dda07983a6615f5 100644 (file)
@@ -38,12 +38,16 @@ static void dumpIdxVec(const SmallVectorImpl<unsigned> &V) {
 
 // (instrs a, b, ...) Evaluate and union all arguments. Identical to AddOp.
 struct InstrsOp : public SetTheory::Operator {
-  void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
-             ArrayRef<SMLoc> Loc) {
-    ST.evaluate(Expr->arg_begin(), Expr->arg_end(), Elts, Loc);
-  }
+  virtual void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
+                     ArrayRef<SMLoc> Loc);
 };
 
+// Provide out-of-line definition to prevent weak vtable.
+void InstrsOp::apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
+                     ArrayRef<SMLoc> Loc) {
+  ST.evaluate(Expr->arg_begin(), Expr->arg_end(), Elts, Loc);
+}
+
 // (instregex "OpcPat",...) Find all instructions matching an opcode pattern.
 //
 // TODO: Since this is a prefix match, perform a binary search over the
@@ -56,34 +60,38 @@ struct InstRegexOp : public SetTheory::Operator {
   const CodeGenTarget &Target;
   InstRegexOp(const CodeGenTarget &t): Target(t) {}
 
-  void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
-             ArrayRef<SMLoc> Loc) {
-    SmallVector<Regex*, 4> RegexList;
-    for (DagInit::const_arg_iterator
-           AI = Expr->arg_begin(), AE = Expr->arg_end(); AI != AE; ++AI) {
-      StringInit *SI = dyn_cast<StringInit>(*AI);
-      if (!SI)
-        PrintFatalError(Loc, "instregex requires pattern string: "
-          + Expr->getAsString());
-      std::string pat = SI->getValue();
-      // Implement a python-style prefix match.
-      if (pat[0] != '^') {
-        pat.insert(0, "^(");
-        pat.insert(pat.end(), ')');
-      }
-      RegexList.push_back(new Regex(pat));
-    }
-    for (CodeGenTarget::inst_iterator I = Target.inst_begin(),
-           E = Target.inst_end(); I != E; ++I) {
-      for (SmallVectorImpl<Regex*>::iterator
-             RI = RegexList.begin(), RE = RegexList.end(); RI != RE; ++RI) {
-        if ((*RI)->match((*I)->TheDef->getName()))
-          Elts.insert((*I)->TheDef);
-      }
+  virtual void apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
+                     ArrayRef<SMLoc> Loc);
+};
+
+// Provide out-of-line definition to prevent weak vtable.
+void InstRegexOp::apply(SetTheory &ST, DagInit *Expr, SetTheory::RecSet &Elts,
+                       ArrayRef<SMLoc> Loc) {
+  SmallVector<Regex*, 4> RegexList;
+  for (DagInit::const_arg_iterator
+       AI = Expr->arg_begin(), AE = Expr->arg_end(); AI != AE; ++AI) {
+    StringInit *SI = dyn_cast<StringInit>(*AI);
+    if (!SI)
+      PrintFatalError(Loc, "instregex requires pattern string: "
+                      + Expr->getAsString());
+    std::string pat = SI->getValue();
+    // Implement a python-style prefix match.
+    if (pat[0] != '^') {
+      pat.insert(0, "^(");
+      pat.insert(pat.end(), ')');
+    }
+    RegexList.push_back(new Regex(pat));
+  }
+  for (CodeGenTarget::inst_iterator I = Target.inst_begin(),
+       E = Target.inst_end(); I != E; ++I) {
+    for (SmallVectorImpl<Regex*>::iterator
+         RI = RegexList.begin(), RE = RegexList.end(); RI != RE; ++RI) {
+      if ((*RI)->match((*I)->TheDef->getName()))
+        Elts.insert((*I)->TheDef);
     }
-    DeleteContainerPointers(RegexList);
   }
-};
+  DeleteContainerPointers(RegexList);
+}
 
 /// CodeGenModels ctor interprets machine model records and populates maps.
 CodeGenSchedModels::CodeGenSchedModels(RecordKeeper &RK,