diff options
author | Chris Lattner <sabre@nondot.org> | 2003-08-01 04:37:57 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-08-01 04:37:57 +0000 |
commit | 5c737ad4d669b835b8fb973a5c477a4dbb213830 (patch) | |
tree | d0dda2b3d62f9d7ff14f11a646feed5b35d1bc01 /support/tools/TableGen | |
parent | cf1b5853127352096ea6c2f8ec130f809168da2f (diff) | |
download | external_llvm-5c737ad4d669b835b8fb973a5c477a4dbb213830.zip external_llvm-5c737ad4d669b835b8fb973a5c477a4dbb213830.tar.gz external_llvm-5c737ad4d669b835b8fb973a5c477a4dbb213830.tar.bz2 |
Switch over to an exception handling model for "high-level" requests.
Add new getValueAsString method.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7463 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'support/tools/TableGen')
-rw-r--r-- | support/tools/TableGen/Record.cpp | 30 | ||||
-rw-r--r-- | support/tools/TableGen/Record.h | 19 |
2 files changed, 39 insertions, 10 deletions
diff --git a/support/tools/TableGen/Record.cpp b/support/tools/TableGen/Record.cpp index 6dc409b..f282e4b 100644 --- a/support/tools/TableGen/Record.cpp +++ b/support/tools/TableGen/Record.cpp @@ -452,6 +452,23 @@ std::ostream &operator<<(std::ostream &OS, const Record &R) { return OS << "}\n"; } +/// getValueAsString - This method looks up the specified field and returns its +/// value as a string, throwing an exception if the field does not exist or if +/// the value is not a string. +/// +std::string Record::getValueAsString(const std::string &FieldName) const { + const RecordVal *R = getValue(FieldName); + if (R == 0 || R->getValue() == 0) + throw "Record '" + R->getName() + "' does not have a field named '" + + FieldName + "!\n"; + + if (const StringInit *SI = dynamic_cast<const StringInit*>(R->getValue())) + return SI->getValue(); + throw "Record '" + R->getName() + "', field '" + FieldName + + "' does not have a string initializer!"; +} + + void RecordKeeper::dump() const { std::cerr << *this; } std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK) { @@ -473,18 +490,17 @@ std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK) { /// getAllDerivedDefinitions - This method returns all concrete definitions /// that derive from the specified class name. If a class with the specified /// name does not exist, an error is printed and true is returned. -bool RecordKeeper::getAllDerivedDefinitions(const std::string &ClassName, - std::vector<Record*> &Defs) const { +std::vector<Record*> +RecordKeeper::getAllDerivedDefinitions(const std::string &ClassName) const { Record *Class = Records.getClass(ClassName); - if (!Class) { - std::cerr << "ERROR: Couldn't find the '" << ClassName << "' class!\n"; - return true; - } + if (!Class) + throw "ERROR: Couldn't find the '" + ClassName + "' class!\n"; + std::vector<Record*> Defs; for (std::map<std::string, Record*>::const_iterator I = getDefs().begin(), E = getDefs().end(); I != E; ++I) if (I->second->isSubClassOf(Class)) Defs.push_back(I->second); - return false; + return Defs; } diff --git a/support/tools/TableGen/Record.h b/support/tools/TableGen/Record.h index 7f703aa..467f12a 100644 --- a/support/tools/TableGen/Record.h +++ b/support/tools/TableGen/Record.h @@ -319,6 +319,8 @@ class StringInit : public Init { public: StringInit(const std::string &V) : Value(V) {} + const std::string &getValue() const { return Value; } + virtual Init *convertInitializerTo(RecTy *Ty) { return Ty->convertValue(this); } @@ -592,6 +594,17 @@ public: void resolveReferences(); void dump() const; + + //===--------------------------------------------------------------------===// + // High-level methods useful to tablegen back-ends + // + + /// getValueAsString - This method looks up the specified field and returns + /// its value as a string, throwing an exception if the field does not exist + /// or if the value is not a string. + /// + std::string getValueAsString(const std::string &FieldName) const; + }; std::ostream &operator<<(std::ostream &OS, const Record &R); @@ -633,9 +646,9 @@ public: /// getAllDerivedDefinitions - This method returns all concrete definitions /// that derive from the specified class name. If a class with the specified - /// name does not exist, an error is printed and true is returned. - bool getAllDerivedDefinitions(const std::string &ClassName, - std::vector<Record*> &ReturnDefs) const; + /// name does not exist, an exception is thrown. + std::vector<Record*> + getAllDerivedDefinitions(const std::string &ClassName) const; void dump() const; |