diff options
| -rw-r--r-- | llvm/support/tools/TableGen/FileParser.y | 26 | ||||
| -rw-r--r-- | llvm/support/tools/TableGen/InstrSelectorEmitter.cpp | 9 | ||||
| -rw-r--r-- | llvm/support/tools/TableGen/Record.cpp | 5 | ||||
| -rw-r--r-- | llvm/support/tools/TableGen/Record.h | 22 | 
4 files changed, 45 insertions, 17 deletions
diff --git a/llvm/support/tools/TableGen/FileParser.y b/llvm/support/tools/TableGen/FileParser.y index 5b983eb06c7..9650c53e2f2 100644 --- a/llvm/support/tools/TableGen/FileParser.y +++ b/llvm/support/tools/TableGen/FileParser.y @@ -161,12 +161,12 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {    int                   IntVal;    RecTy                *Ty;    Init                 *Initializer; -  std::vector<Init*>   *DagValueList;    std::vector<Init*>   *FieldList;    std::vector<unsigned>*BitList;    Record               *Rec;    SubClassRefTy        *SubClassRef;    std::vector<SubClassRefTy> *SubClassList; +  std::vector<std::pair<Init*, std::string> > *DagValueList;  };  %token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN @@ -183,7 +183,7 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {  %type <DagValueList> DagArgList DagArgListNE  %type <FieldList>    ValueList ValueListNE  %type <BitList>      BitList OptBitList RBitList -%type <StrVal>       Declaration OptID +%type <StrVal>       Declaration OptID OptVarName  %start File  %% @@ -282,16 +282,26 @@ Value : INTVAL {      delete $2; delete $3;    }; -DagArgListNE : Value { -    $$ = new std::vector<Init*>(); -    $$->push_back($1); +OptVarName : /* empty */ { +    $$ = new std::string();    } -  | DagArgListNE ',' Value { -    $1->push_back($3); +  | ':' VARNAME { +    $$ = $2; +  }; + +DagArgListNE : Value OptVarName { +    $$ = new std::vector<std::pair<Init*, std::string> >(); +    $$->push_back(std::make_pair($1, *$2)); +    delete $2; +  } +  | DagArgListNE ',' Value OptVarName { +    $1->push_back(std::make_pair($3, *$4)); +    delete $4; +    $$ = $1;    };  DagArgList : /*empty*/ { -    $$ = new std::vector<Init*>(); +    $$ = new std::vector<std::pair<Init*, std::string> >();    }    | DagArgListNE { $$ = $1; }; diff --git a/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp b/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp index f0b3ca1c4f7..9eb3be7f3fb 100644 --- a/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp +++ b/llvm/support/tools/TableGen/InstrSelectorEmitter.cpp @@ -172,15 +172,14 @@ MVT::ValueType Pattern::getIntrinsicType(Record *R) const {  TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {    Record *Operator = DI->getNodeType(); -  const std::vector<Init*> &Args = DI->getArgs();    if (Operator->isSubClassOf("ValueType")) {      // If the operator is a ValueType, then this must be "type cast" of a leaf      // node. -    if (Args.size() != 1) +    if (DI->getNumArgs() != 1)        error("Type cast only valid for a leaf node!"); -    Init *Arg = Args[0]; +    Init *Arg = DI->getArg(0);      TreePatternNode *New;      if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {        New = new TreePatternNode(DI); @@ -201,8 +200,8 @@ TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {    std::vector<TreePatternNode*> Children; -  for (unsigned i = 0, e = Args.size(); i != e; ++i) { -    Init *Arg = Args[i]; +  for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) { +    Init *Arg = DI->getArg(i);      if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {        Children.push_back(ParseTreePattern(DI));      } else if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) { diff --git a/llvm/support/tools/TableGen/Record.cpp b/llvm/support/tools/TableGen/Record.cpp index a76c55cfb67..384005081e7 100644 --- a/llvm/support/tools/TableGen/Record.cpp +++ b/llvm/support/tools/TableGen/Record.cpp @@ -438,8 +438,11 @@ void DagInit::print(std::ostream &OS) const {    OS << "(" << NodeTypeDef->getName();    if (Args.size()) {      OS << " " << *Args[0]; -    for (unsigned i = 1, e = Args.size(); i != e; ++i) +    if (!ArgNames[0].empty()) OS << ":$" << ArgNames[0]; +    for (unsigned i = 1, e = Args.size(); i != e; ++i) {        OS << ", " << *Args[i]; +      if (!ArgNames[i].empty()) OS << ":$" << ArgNames[i]; +    }    }    OS << ")";  } diff --git a/llvm/support/tools/TableGen/Record.h b/llvm/support/tools/TableGen/Record.h index 5c50a07651d..88312509ef3 100644 --- a/llvm/support/tools/TableGen/Record.h +++ b/llvm/support/tools/TableGen/Record.h @@ -591,9 +591,16 @@ public:  class DagInit : public Init {    Record *NodeTypeDef;    std::vector<Init*> Args; +  std::vector<std::string> ArgNames;  public: -  DagInit(Record *D, std::vector<Init*> &a) : NodeTypeDef(D) { -    Args.swap(a);  // DESTRUCTIVELY take the arguments +  DagInit(Record *D, const std::vector<std::pair<Init*, std::string> > &args) +    : NodeTypeDef(D) { +    Args.reserve(args.size()); +    ArgNames.reserve(args.size()); +    for (unsigned i = 0, e = args.size(); i != e; ++i) { +      Args.push_back(args[i].first); +      ArgNames.push_back(args[i].second); +    }    }    virtual Init *convertInitializerTo(RecTy *Ty) { @@ -601,7 +608,16 @@ public:    }    Record *getNodeType() const { return NodeTypeDef; } -  const std::vector<Init*> &getArgs() const { return Args; } + +  unsigned getNumArgs() const { return Args.size(); } +  Init *getArg(unsigned Num) const { +    assert(Num < Args.size() && "Arg number out of range!"); +    return Args[Num]; +  } +  const std::string &getArgName(unsigned Num) const { +    assert(Num < ArgNames.size() && "Arg number out of range!"); +    return ArgNames[Num]; +  }    virtual void print(std::ostream &OS) const;  };  | 

