diff options
author | Devang Patel <dpatel@apple.com> | 2008-09-26 22:53:05 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2008-09-26 22:53:05 +0000 |
commit | 19c874638d9478a5d5028854817a5ee72293bb2b (patch) | |
tree | 748636424f3d1005b6c8713365639fb969466c37 /lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | d5d8191b202c0f96f33c826c93d9796451ff7fca (diff) |
Now Attributes are divided in three groups
- return attributes - inreg, zext and sext
- parameter attributes
- function attributes - nounwind, readonly, readnone, noreturn
Return attributes use 0 as the index.
Function attributes use ~0U as the index.
This patch requires corresponding changes in llvm-gcc and clang.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56704 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 205650ddd0..23fbe1d35f 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -32,7 +32,7 @@ void BitcodeReader::FreeState() { std::vector<PATypeHolder>().swap(TypeList); ValueList.clear(); - std::vector<AttrListPtr>().swap(Attributes); + std::vector<AttrListPtr>().swap(MAttributes); std::vector<BasicBlock*>().swap(FunctionBBs); std::vector<Function*>().swap(FunctionsWithBodies); DeferredFunctionInfo.clear(); @@ -317,7 +317,7 @@ bool BitcodeReader::ParseAttributeBlock() { if (Stream.EnterSubBlock(bitc::PARAMATTR_BLOCK_ID)) return Error("Malformed block record"); - if (!Attributes.empty()) + if (!MAttributes.empty()) return Error("Multiple PARAMATTR blocks found!"); SmallVector<uint64_t, 64> Record; @@ -355,12 +355,53 @@ bool BitcodeReader::ParseAttributeBlock() { if (Record.size() & 1) return Error("Invalid ENTRY record"); + // FIXME : Remove this backword compatibility one day. + // If Function attributes are using index 0 then transfer them + // to index ~0. Index 0 is strictly used for return value + // attributes. + Attributes RetAttribute = Attribute::None; + Attributes FnAttribute = Attribute::None; for (unsigned i = 0, e = Record.size(); i != e; i += 2) { - if (Record[i+1] != Attribute::None) + if (Record[i] == 0) + RetAttribute = Record[i+1]; + 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; + } + } + + 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) Attrs.push_back(AttributeWithIndex::get(Record[i], Record[i+1])); } + if (useUpdatedAttrs && FnAttribute != Attribute::None) + Attrs.push_back(AttributeWithIndex::get(~0, FnAttribute)); - Attributes.push_back(AttrListPtr::get(Attrs.begin(), Attrs.end())); + MAttributes.push_back(AttrListPtr::get(Attrs.begin(), Attrs.end())); Attrs.clear(); break; } |