diff options
author | Chris Lattner <sabre@nondot.org> | 2008-10-05 18:22:09 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-10-05 18:22:09 +0000 |
commit | 9a6cb1598060e7c33115ffad55e176a737bac99a (patch) | |
tree | 64261423afbdb25bd38718abfd344432ccf2db17 /lib/Bitcode | |
parent | 94b5f7dc78060975f92b800e501cac84ed9b7fb9 (diff) |
make the autoupgrade code for ret attributes dramatically simpler
and actually work. We can now read the llvm 2.3 bc file from PR2849
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57122 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode')
-rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 23fbe1d35f..e49905d23a 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -355,10 +355,10 @@ bool BitcodeReader::ParseAttributeBlock() { if (Record.size() & 1) return Error("Invalid ENTRY record"); - // FIXME : Remove this backword compatibility one day. + // FIXME : Remove this autoupgrade code in LLVM 3.0. // If Function attributes are using index 0 then transfer them - // to index ~0. Index 0 is strictly used for return value - // attributes. + // to index ~0. Index 0 is used for return value attributes but used to be + // used for function attributes. Attributes RetAttribute = Attribute::None; Attributes FnAttribute = Attribute::None; for (unsigned i = 0, e = Record.size(); i != e; i += 2) { @@ -367,39 +367,31 @@ bool BitcodeReader::ParseAttributeBlock() { else if (Record[i] == ~0U) FnAttribute = Record[i+1]; } - bool useUpdatedAttrs = false; - if (FnAttribute == Attribute::None && RetAttribute != Attribute::None) { - if (RetAttribute & Attribute::NoUnwind) { - FnAttribute = FnAttribute | Attribute::NoUnwind; - RetAttribute = RetAttribute ^ Attribute::NoUnwind; - useUpdatedAttrs = true; - } - if (RetAttribute & Attribute::NoReturn) { - FnAttribute = FnAttribute | Attribute::NoReturn; - RetAttribute = RetAttribute ^ Attribute::NoReturn; - useUpdatedAttrs = true; - } - if (RetAttribute & Attribute::ReadOnly) { - FnAttribute = FnAttribute | Attribute::ReadOnly; - RetAttribute = RetAttribute ^ Attribute::ReadOnly; - useUpdatedAttrs = true; - } - if (RetAttribute & Attribute::ReadNone) { - FnAttribute = FnAttribute | Attribute::ReadNone; - RetAttribute = RetAttribute ^ Attribute::ReadNone; - useUpdatedAttrs = true; + + unsigned OldRetAttrs = (Attribute::NoUnwind|Attribute::NoReturn| + Attribute::ReadOnly|Attribute::ReadNone); + + if (FnAttribute == Attribute::None && RetAttribute != Attribute::None && + (RetAttribute & OldRetAttrs) != 0) { + if (FnAttribute == Attribute::None) { // add a slot so they get added. + Record.push_back(~0U); + Record.push_back(0); } + + FnAttribute |= RetAttribute & OldRetAttrs; + RetAttribute &= ~OldRetAttrs; } for (unsigned i = 0, e = Record.size(); i != e; i += 2) { - if (useUpdatedAttrs && Record[i] == 0 - && RetAttribute != Attribute::None) - Attrs.push_back(AttributeWithIndex::get(0, RetAttribute)); - else if (Record[i+1] != Attribute::None) + if (Record[i] == 0) { + if (RetAttribute != Attribute::None) + Attrs.push_back(AttributeWithIndex::get(0, RetAttribute)); + } else if (Record[i] == ~0U) { + if (FnAttribute != Attribute::None) + Attrs.push_back(AttributeWithIndex::get(~0U, FnAttribute)); + } else if (Record[i+1] != Attribute::None) Attrs.push_back(AttributeWithIndex::get(Record[i], Record[i+1])); } - if (useUpdatedAttrs && FnAttribute != Attribute::None) - Attrs.push_back(AttributeWithIndex::get(~0, FnAttribute)); MAttributes.push_back(AttrListPtr::get(Attrs.begin(), Attrs.end())); Attrs.clear(); |