diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/AsmParser/LLLexer.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/AsmParser/llvmAsmParser.y | 23 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/VMCore/Attributes.cpp | 7 | 
5 files changed, 42 insertions, 14 deletions
diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp index 20b2b888b1f..b8f497a5e90 100644 --- a/llvm/lib/AsmParser/LLLexer.cpp +++ b/llvm/lib/AsmParser/LLLexer.cpp @@ -491,6 +491,7 @@ int LLLexer::LexIdentifier() {    KEYWORD("nounwind", NOUNWIND);    KEYWORD("noreturn", NORETURN);    KEYWORD("noalias", NOALIAS); +  KEYWORD("nocapture", NOCAPTURE);    KEYWORD("byval", BYVAL);    KEYWORD("nest", NEST);    KEYWORD("readnone", READNONE); diff --git a/llvm/lib/AsmParser/llvmAsmParser.y b/llvm/lib/AsmParser/llvmAsmParser.y index 8b54251c658..350584f432a 100644 --- a/llvm/lib/AsmParser/llvmAsmParser.y +++ b/llvm/lib/AsmParser/llvmAsmParser.y @@ -1136,8 +1136,8 @@ Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) {  %token <OtherOpVal> EXTRACTVALUE INSERTVALUE  // Function Attributes -%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS BYVAL NEST -%token READNONE READONLY GC OPTSIZE NOINLINE ALWAYSINLINE SSP SSPREQ +%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS NOCAPTURE BYVAL +%token READNONE READONLY GC OPTSIZE NOINLINE ALWAYSINLINE SSP SSPREQ NEST  // Visibility Styles  %token DEFAULT HIDDEN PROTECTED @@ -1265,15 +1265,16 @@ OptCallingConv : /*empty*/          { $$ = CallingConv::C; } |                    CHECK_FOR_ERROR                   }; -Attribute     : ZEROEXT { $$ = Attribute::ZExt;      } -              | ZEXT    { $$ = Attribute::ZExt;      } -              | SIGNEXT { $$ = Attribute::SExt;      } -              | SEXT    { $$ = Attribute::SExt;      } -              | INREG   { $$ = Attribute::InReg;     } -              | SRET    { $$ = Attribute::StructRet; } -              | NOALIAS { $$ = Attribute::NoAlias;   } -              | BYVAL   { $$ = Attribute::ByVal;     } -              | NEST    { $$ = Attribute::Nest;      } +Attribute     : ZEROEXT   { $$ = Attribute::ZExt;      } +              | ZEXT      { $$ = Attribute::ZExt;      } +              | SIGNEXT   { $$ = Attribute::SExt;      } +              | SEXT      { $$ = Attribute::SExt;      } +              | INREG     { $$ = Attribute::InReg;     } +              | SRET      { $$ = Attribute::StructRet; } +              | NOALIAS   { $$ = Attribute::NoAlias;   } +              | NOCAPTURE { $$ = Attribute::NoCapture; } +              | BYVAL     { $$ = Attribute::ByVal;     } +              | NEST      { $$ = Attribute::Nest;      }                | ALIGN EUINT64VAL { $$ =                            Attribute::constructAlignmentFromInt($2);    }                ; diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index f06c61de415..2d994d4b13d 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -362,6 +362,20 @@ bool BitcodeReader::ParseAttributeBlock() {        Attributes RetAttribute = Attribute::None;        Attributes FnAttribute = Attribute::None;        for (unsigned i = 0, e = Record.size(); i != e; i += 2) { +        // FIXME: remove in LLVM 3.0 +        // The alignment is stored as a 16-bit raw value from bits 31--16. +        // We shift the bits above 31 down by 11 bits. + +        unsigned Alignment = (Record[i+1] & (0xffffull << 16)) >> 16; +        if (Alignment && !isPowerOf2_32(Alignment)) +          return Error("Alignment is not a power of two."); + +        Attributes ReconstitutedAttr = Record[i+1] & 0xffff; +        if (Alignment) +          ReconstitutedAttr |= Attribute::constructAlignmentFromInt(Alignment); +        ReconstitutedAttr |= (Record[i+1] & (0xffffull << 32)) >> 11; +        Record[i+1] = ReconstitutedAttr; +          if (Record[i] == 0)            RetAttribute = Record[i+1];          else if (Record[i] == ~0U) diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 279e447873c..0555ed90f64 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -122,7 +122,16 @@ static void WriteAttributeTable(const ValueEnumerator &VE,      for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) {        const AttributeWithIndex &PAWI = A.getSlot(i);        Record.push_back(PAWI.Index); -      Record.push_back(PAWI.Attrs); + +      // FIXME: remove in LLVM 3.0 +      // Store the alignment in the bitcode as a 16-bit raw value instead of a +      // 5-bit log2 encoded value. Shift the bits above the alignment up by +      // 11 bits. +      uint64_t FauxAttr = PAWI.Attrs & 0xffff; +      FauxAttr |= (1ull<<16)<<((PAWI.Attrs & Attribute::Alignment) >> 16); +      FauxAttr |= (PAWI.Attrs & (0x3FFull << 21)) << 11; + +      Record.push_back(FauxAttr);      }      Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record); diff --git a/llvm/lib/VMCore/Attributes.cpp b/llvm/lib/VMCore/Attributes.cpp index 92acc111be9..0a0d0a842d0 100644 --- a/llvm/lib/VMCore/Attributes.cpp +++ b/llvm/lib/VMCore/Attributes.cpp @@ -37,6 +37,8 @@ std::string Attribute::getAsString(Attributes Attrs) {      Result += "inreg ";    if (Attrs & Attribute::NoAlias)      Result += "noalias "; +  if (Attrs & Attribute::NoCapture) +    Result += "nocapture ";    if (Attrs & Attribute::StructRet)      Result += "sret ";      if (Attrs & Attribute::ByVal) @@ -59,10 +61,11 @@ std::string Attribute::getAsString(Attributes Attrs) {      Result += "sspreq ";    if (Attrs & Attribute::Alignment) {      Result += "align "; -    Result += utostr((Attrs & Attribute::Alignment) >> 16); +    Result += utostr(1ull << ((Attrs & Attribute::Alignment)>>16));      Result += " ";    }    // Trim the trailing space. +  assert(!Result.empty() && "Unknown attribute!");    Result.erase(Result.end()-1);    return Result;  } @@ -76,7 +79,7 @@ Attributes Attribute::typeIncompatible(const Type *Ty) {    if (!isa<PointerType>(Ty))      // Attributes that only apply to pointers. -    Incompatible |= ByVal | Nest | NoAlias | StructRet; +    Incompatible |= ByVal | Nest | NoAlias | StructRet | NoCapture;    return Incompatible;  }  | 

