diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:18 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:18 +0000 | 
| commit | ca089b24d48ef6fa8da2d0bb8c25bb802c4a95c0 (patch) | |
| tree | 3a28a772df9b17aef34f49e3c727965ad28c0c93 /lib/AsmParser/LLParser.cpp | |
| parent | 9df3605dea17e84f8183581f6103bd0c79e2a606 (diff) | |
Notes
Diffstat (limited to 'lib/AsmParser/LLParser.cpp')
| -rw-r--r-- | lib/AsmParser/LLParser.cpp | 74 | 
1 files changed, 48 insertions, 26 deletions
| diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 9ad31125f4b8c..717eb0e00f4f4 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -1919,20 +1919,42 @@ bool LLParser::parseAllocSizeArguments(unsigned &BaseSizeArg,  }  /// ParseScopeAndOrdering -///   if isAtomic: ::= 'singlethread'? AtomicOrdering +///   if isAtomic: ::= SyncScope? AtomicOrdering  ///   else: ::=  ///  /// This sets Scope and Ordering to the parsed values. -bool LLParser::ParseScopeAndOrdering(bool isAtomic, SynchronizationScope &Scope, +bool LLParser::ParseScopeAndOrdering(bool isAtomic, SyncScope::ID &SSID,                                       AtomicOrdering &Ordering) {    if (!isAtomic)      return false; -  Scope = CrossThread; -  if (EatIfPresent(lltok::kw_singlethread)) -    Scope = SingleThread; +  return ParseScope(SSID) || ParseOrdering(Ordering); +} + +/// ParseScope +///   ::= syncscope("singlethread" | "<target scope>")? +/// +/// This sets synchronization scope ID to the ID of the parsed value. +bool LLParser::ParseScope(SyncScope::ID &SSID) { +  SSID = SyncScope::System; +  if (EatIfPresent(lltok::kw_syncscope)) { +    auto StartParenAt = Lex.getLoc(); +    if (!EatIfPresent(lltok::lparen)) +      return Error(StartParenAt, "Expected '(' in syncscope"); + +    std::string SSN; +    auto SSNAt = Lex.getLoc(); +    if (ParseStringConstant(SSN)) +      return Error(SSNAt, "Expected synchronization scope name"); -  return ParseOrdering(Ordering); +    auto EndParenAt = Lex.getLoc(); +    if (!EatIfPresent(lltok::rparen)) +      return Error(EndParenAt, "Expected ')' in syncscope"); + +    SSID = Context.getOrInsertSyncScopeID(SSN); +  } + +  return false;  }  /// ParseOrdering @@ -3061,7 +3083,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {      } else {        assert(Opc == Instruction::ICmp && "Unexpected opcode for CmpInst!");        if (!Val0->getType()->isIntOrIntVectorTy() && -          !Val0->getType()->getScalarType()->isPointerTy()) +          !Val0->getType()->isPtrOrPtrVectorTy())          return Error(ID.Loc, "icmp requires pointer or integer operands");        ID.ConstantVal = ConstantExpr::getICmp(Pred, Val0, Val1);      } @@ -3210,7 +3232,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {      if (Opc == Instruction::GetElementPtr) {        if (Elts.size() == 0 || -          !Elts[0]->getType()->getScalarType()->isPointerTy()) +          !Elts[0]->getType()->isPtrOrPtrVectorTy())          return Error(ID.Loc, "base of getelementptr must be a pointer");        Type *BaseType = Elts[0]->getType(); @@ -3226,7 +3248,7 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {        ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end());        for (Constant *Val : Indices) {          Type *ValTy = Val->getType(); -        if (!ValTy->getScalarType()->isIntegerTy()) +        if (!ValTy->isIntOrIntVectorTy())            return Error(ID.Loc, "getelementptr index must be an integer");          if (ValTy->isVectorTy()) {            unsigned ValNumEl = ValTy->getVectorNumElements(); @@ -5697,7 +5719,7 @@ bool LLParser::ParseCompare(Instruction *&Inst, PerFunctionState &PFS,    } else {      assert(Opc == Instruction::ICmp && "Unknown opcode for CmpInst!");      if (!LHS->getType()->isIntOrIntVectorTy() && -        !LHS->getType()->getScalarType()->isPointerTy()) +        !LHS->getType()->isPtrOrPtrVectorTy())        return Error(Loc, "icmp requires integer operands");      Inst = new ICmpInst(CmpInst::Predicate(Pred), LHS, RHS);    } @@ -6100,7 +6122,7 @@ int LLParser::ParseLoad(Instruction *&Inst, PerFunctionState &PFS) {    bool AteExtraComma = false;    bool isAtomic = false;    AtomicOrdering Ordering = AtomicOrdering::NotAtomic; -  SynchronizationScope Scope = CrossThread; +  SyncScope::ID SSID = SyncScope::System;    if (Lex.getKind() == lltok::kw_atomic) {      isAtomic = true; @@ -6118,7 +6140,7 @@ int LLParser::ParseLoad(Instruction *&Inst, PerFunctionState &PFS) {    if (ParseType(Ty) ||        ParseToken(lltok::comma, "expected comma after load's type") ||        ParseTypeAndValue(Val, Loc, PFS) || -      ParseScopeAndOrdering(isAtomic, Scope, Ordering) || +      ParseScopeAndOrdering(isAtomic, SSID, Ordering) ||        ParseOptionalCommaAlign(Alignment, AteExtraComma))      return true; @@ -6134,7 +6156,7 @@ int LLParser::ParseLoad(Instruction *&Inst, PerFunctionState &PFS) {      return Error(ExplicitTypeLoc,                   "explicit pointee type doesn't match operand's pointee type"); -  Inst = new LoadInst(Ty, Val, "", isVolatile, Alignment, Ordering, Scope); +  Inst = new LoadInst(Ty, Val, "", isVolatile, Alignment, Ordering, SSID);    return AteExtraComma ? InstExtraComma : InstNormal;  } @@ -6149,7 +6171,7 @@ int LLParser::ParseStore(Instruction *&Inst, PerFunctionState &PFS) {    bool AteExtraComma = false;    bool isAtomic = false;    AtomicOrdering Ordering = AtomicOrdering::NotAtomic; -  SynchronizationScope Scope = CrossThread; +  SyncScope::ID SSID = SyncScope::System;    if (Lex.getKind() == lltok::kw_atomic) {      isAtomic = true; @@ -6165,7 +6187,7 @@ int LLParser::ParseStore(Instruction *&Inst, PerFunctionState &PFS) {    if (ParseTypeAndValue(Val, Loc, PFS) ||        ParseToken(lltok::comma, "expected ',' after store operand") ||        ParseTypeAndValue(Ptr, PtrLoc, PFS) || -      ParseScopeAndOrdering(isAtomic, Scope, Ordering) || +      ParseScopeAndOrdering(isAtomic, SSID, Ordering) ||        ParseOptionalCommaAlign(Alignment, AteExtraComma))      return true; @@ -6181,7 +6203,7 @@ int LLParser::ParseStore(Instruction *&Inst, PerFunctionState &PFS) {        Ordering == AtomicOrdering::AcquireRelease)      return Error(Loc, "atomic store cannot use Acquire ordering"); -  Inst = new StoreInst(Val, Ptr, isVolatile, Alignment, Ordering, Scope); +  Inst = new StoreInst(Val, Ptr, isVolatile, Alignment, Ordering, SSID);    return AteExtraComma ? InstExtraComma : InstNormal;  } @@ -6193,7 +6215,7 @@ int LLParser::ParseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {    bool AteExtraComma = false;    AtomicOrdering SuccessOrdering = AtomicOrdering::NotAtomic;    AtomicOrdering FailureOrdering = AtomicOrdering::NotAtomic; -  SynchronizationScope Scope = CrossThread; +  SyncScope::ID SSID = SyncScope::System;    bool isVolatile = false;    bool isWeak = false; @@ -6208,7 +6230,7 @@ int LLParser::ParseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {        ParseTypeAndValue(Cmp, CmpLoc, PFS) ||        ParseToken(lltok::comma, "expected ',' after cmpxchg cmp operand") ||        ParseTypeAndValue(New, NewLoc, PFS) || -      ParseScopeAndOrdering(true /*Always atomic*/, Scope, SuccessOrdering) || +      ParseScopeAndOrdering(true /*Always atomic*/, SSID, SuccessOrdering) ||        ParseOrdering(FailureOrdering))      return true; @@ -6231,7 +6253,7 @@ int LLParser::ParseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {    if (!New->getType()->isFirstClassType())      return Error(NewLoc, "cmpxchg operand must be a first class value");    AtomicCmpXchgInst *CXI = new AtomicCmpXchgInst( -      Ptr, Cmp, New, SuccessOrdering, FailureOrdering, Scope); +      Ptr, Cmp, New, SuccessOrdering, FailureOrdering, SSID);    CXI->setVolatile(isVolatile);    CXI->setWeak(isWeak);    Inst = CXI; @@ -6245,7 +6267,7 @@ int LLParser::ParseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {    Value *Ptr, *Val; LocTy PtrLoc, ValLoc;    bool AteExtraComma = false;    AtomicOrdering Ordering = AtomicOrdering::NotAtomic; -  SynchronizationScope Scope = CrossThread; +  SyncScope::ID SSID = SyncScope::System;    bool isVolatile = false;    AtomicRMWInst::BinOp Operation; @@ -6271,7 +6293,7 @@ int LLParser::ParseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {    if (ParseTypeAndValue(Ptr, PtrLoc, PFS) ||        ParseToken(lltok::comma, "expected ',' after atomicrmw address") ||        ParseTypeAndValue(Val, ValLoc, PFS) || -      ParseScopeAndOrdering(true /*Always atomic*/, Scope, Ordering)) +      ParseScopeAndOrdering(true /*Always atomic*/, SSID, Ordering))      return true;    if (Ordering == AtomicOrdering::Unordered) @@ -6288,7 +6310,7 @@ int LLParser::ParseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {                           " integer");    AtomicRMWInst *RMWI = -    new AtomicRMWInst(Operation, Ptr, Val, Ordering, Scope); +    new AtomicRMWInst(Operation, Ptr, Val, Ordering, SSID);    RMWI->setVolatile(isVolatile);    Inst = RMWI;    return AteExtraComma ? InstExtraComma : InstNormal; @@ -6298,8 +6320,8 @@ int LLParser::ParseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {  ///   ::= 'fence' 'singlethread'? AtomicOrdering  int LLParser::ParseFence(Instruction *&Inst, PerFunctionState &PFS) {    AtomicOrdering Ordering = AtomicOrdering::NotAtomic; -  SynchronizationScope Scope = CrossThread; -  if (ParseScopeAndOrdering(true /*Always atomic*/, Scope, Ordering)) +  SyncScope::ID SSID = SyncScope::System; +  if (ParseScopeAndOrdering(true /*Always atomic*/, SSID, Ordering))      return true;    if (Ordering == AtomicOrdering::Unordered) @@ -6307,7 +6329,7 @@ int LLParser::ParseFence(Instruction *&Inst, PerFunctionState &PFS) {    if (Ordering == AtomicOrdering::Monotonic)      return TokError("fence cannot be monotonic"); -  Inst = new FenceInst(Context, Ordering, Scope); +  Inst = new FenceInst(Context, Ordering, SSID);    return InstNormal;  } @@ -6349,7 +6371,7 @@ int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {        break;      }      if (ParseTypeAndValue(Val, EltLoc, PFS)) return true; -    if (!Val->getType()->getScalarType()->isIntegerTy()) +    if (!Val->getType()->isIntOrIntVectorTy())        return Error(EltLoc, "getelementptr index must be an integer");      if (Val->getType()->isVectorTy()) { | 
