diff options
author | Dan Gohman <gohman@apple.com> | 2009-07-20 21:19:07 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-07-20 21:19:07 +0000 |
commit | 1224c386981f7948f298ed9ad444c40609570f2e (patch) | |
tree | 69577cb79bc2b30c8f801de5c52a374189fdb7a4 /lib/AsmParser | |
parent | 33d0474bf5d5783cf9690bcab3eabd513d918fc5 (diff) |
Assembly and Bitcode support for unsigned/signed overflow flags and
exact sdiv flags.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76475 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AsmParser')
-rw-r--r-- | lib/AsmParser/LLLexer.cpp | 3 | ||||
-rw-r--r-- | lib/AsmParser/LLParser.cpp | 88 | ||||
-rw-r--r-- | lib/AsmParser/LLToken.h | 3 |
3 files changed, 94 insertions, 0 deletions
diff --git a/lib/AsmParser/LLLexer.cpp b/lib/AsmParser/LLLexer.cpp index a2e5b76fd3..313213cb48 100644 --- a/lib/AsmParser/LLLexer.cpp +++ b/lib/AsmParser/LLLexer.cpp @@ -501,6 +501,9 @@ lltok::Kind LLLexer::LexIdentifier() { KEYWORD(deplibs); KEYWORD(datalayout); KEYWORD(volatile); + KEYWORD(signed); + KEYWORD(unsigned); + KEYWORD(exact); KEYWORD(align); KEYWORD(addrspace); KEYWORD(section); diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index c0b74a2e4c..cbed8695bf 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -21,6 +21,7 @@ #include "llvm/LLVMContext.h" #include "llvm/MDNode.h" #include "llvm/Module.h" +#include "llvm/Operator.h" #include "llvm/ValueSymbolTable.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/StringExtras.h" @@ -2041,6 +2042,49 @@ bool LLParser::ParseValID(ValID &ID) { ID.Kind = ValID::t_Constant; return false; } + case lltok::kw_signed: { + Lex.Lex(); + bool AlsoUnsigned = EatIfPresent(lltok::kw_unsigned); + if (Lex.getKind() != lltok::kw_add && + Lex.getKind() != lltok::kw_sub && + Lex.getKind() != lltok::kw_mul) + return TokError("expected 'add', 'sub', or 'mul'"); + bool Result = LLParser::ParseValID(ID); + if (!Result) { + cast<OverflowingBinaryOperator>(ID.ConstantVal) + ->setHasNoSignedOverflow(true); + if (AlsoUnsigned) + cast<OverflowingBinaryOperator>(ID.ConstantVal) + ->setHasNoUnsignedOverflow(true); + } + return Result; + } + case lltok::kw_unsigned: { + Lex.Lex(); + bool AlsoSigned = EatIfPresent(lltok::kw_signed); + if (Lex.getKind() != lltok::kw_add && + Lex.getKind() != lltok::kw_sub && + Lex.getKind() != lltok::kw_mul) + return TokError("expected 'add', 'sub', or 'mul'"); + bool Result = LLParser::ParseValID(ID); + if (!Result) { + cast<OverflowingBinaryOperator>(ID.ConstantVal) + ->setHasNoUnsignedOverflow(true); + if (AlsoSigned) + cast<OverflowingBinaryOperator>(ID.ConstantVal) + ->setHasNoSignedOverflow(true); + } + return Result; + } + case lltok::kw_exact: { + Lex.Lex(); + if (Lex.getKind() != lltok::kw_sdiv) + return TokError("expected 'sdiv'"); + bool Result = LLParser::ParseValID(ID); + if (!Result) + cast<SDivOperator>(ID.ConstantVal)->setIsExact(true); + return Result; + } } Lex.Lex(); @@ -2558,6 +2602,50 @@ bool LLParser::ParseInstruction(Instruction *&Inst, BasicBlock *BB, return ParseStore(Inst, PFS, true); else return TokError("expected 'load' or 'store'"); + case lltok::kw_signed: { + bool AlsoUnsigned = EatIfPresent(lltok::kw_unsigned); + if (Lex.getKind() == lltok::kw_add || + Lex.getKind() == lltok::kw_sub || + Lex.getKind() == lltok::kw_mul) { + Lex.Lex(); + KeywordVal = Lex.getUIntVal(); + bool Result = ParseArithmetic(Inst, PFS, KeywordVal, 0); + if (!Result) { + cast<OverflowingBinaryOperator>(Inst)->setHasNoSignedOverflow(true); + if (AlsoUnsigned) + cast<OverflowingBinaryOperator>(Inst)->setHasNoUnsignedOverflow(true); + } + return Result; + } + return TokError("expected 'add', 'sub', or 'mul'"); + } + case lltok::kw_unsigned: { + bool AlsoSigned = EatIfPresent(lltok::kw_signed); + if (Lex.getKind() == lltok::kw_add || + Lex.getKind() == lltok::kw_sub || + Lex.getKind() == lltok::kw_mul) { + Lex.Lex(); + KeywordVal = Lex.getUIntVal(); + bool Result = ParseArithmetic(Inst, PFS, KeywordVal, 1); + if (!Result) { + cast<OverflowingBinaryOperator>(Inst)->setHasNoUnsignedOverflow(true); + if (AlsoSigned) + cast<OverflowingBinaryOperator>(Inst)->setHasNoSignedOverflow(true); + } + return Result; + } + return TokError("expected 'add', 'sub', or 'mul'"); + } + case lltok::kw_exact: + if (Lex.getKind() == lltok::kw_sdiv) { + Lex.Lex(); + KeywordVal = Lex.getUIntVal(); + bool Result = ParseArithmetic(Inst, PFS, KeywordVal, 1); + if (!Result) + cast<SDivOperator>(Inst)->setIsExact(true); + return Result; + } + return TokError("expected 'udiv'"); case lltok::kw_getresult: return ParseGetResult(Inst, PFS); case lltok::kw_getelementptr: return ParseGetElementPtr(Inst, PFS); case lltok::kw_extractvalue: return ParseExtractValue(Inst, PFS); diff --git a/lib/AsmParser/LLToken.h b/lib/AsmParser/LLToken.h index 0f00eb63b0..b78a09d43e 100644 --- a/lib/AsmParser/LLToken.h +++ b/lib/AsmParser/LLToken.h @@ -51,6 +51,9 @@ namespace lltok { kw_deplibs, kw_datalayout, kw_volatile, + kw_signed, + kw_unsigned, + kw_exact, kw_align, kw_addrspace, kw_section, |