[llvm-commits] [llvm] r73855 - in /llvm/trunk/tools/llvm-mc: AsmLexer.cpp AsmLexer.h llvm-mc.cpp

Howard Su howard0su at gmail.com
Sun Jun 21 20:33:07 PDT 2009


no strtoll in windows + VC.
D:\llvm-ng\tools\llvm-mc\AsmLexer.cpp(143) : error C3861: 'strtoll':
identifier not found
D:\llvm-ng\tools\llvm-mc\AsmLexer.cpp(156) : error C3861: 'strtoll':
identifier not found
D:\llvm-ng\tools\llvm-mc\AsmLexer.cpp(171) : error C3861: 'strtoll':
identifier not found
D:\llvm-ng\tools\llvm-mc\AsmLexer.cpp(176) : error C3861: 'strtoull':
identifier not found
D:\llvm-ng\tools\llvm-mc\AsmLexer.cpp(188) : error C3861: 'strtoll':
identifier not found

On Mon, Jun 22, 2009 at 3:21 AM, Chris Lattner <sabre at nondot.org> wrote:

> Author: lattner
> Date: Sun Jun 21 14:21:25 2009
> New Revision: 73855
>
> URL: http://llvm.org/viewvc/llvm-project?rev=73855&view=rev
> Log:
> implement enough of a lexer to get through Olden/health/Output/health.llc.s
> without errors.
>
>
> Modified:
>    llvm/trunk/tools/llvm-mc/AsmLexer.cpp
>    llvm/trunk/tools/llvm-mc/AsmLexer.h
>    llvm/trunk/tools/llvm-mc/llvm-mc.cpp
>
> Modified: llvm/trunk/tools/llvm-mc/AsmLexer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmLexer.cpp?rev=73855&r1=73854&r2=73855&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-mc/AsmLexer.cpp (original)
> +++ llvm/trunk/tools/llvm-mc/AsmLexer.cpp Sun Jun 21 14:21:25 2009
> @@ -14,6 +14,7 @@
>  #include "AsmLexer.h"
>  #include "llvm/Support/SourceMgr.h"
>  #include "llvm/Support/MemoryBuffer.h"
> +#include <cerrno>
>  using namespace llvm;
>
>  AsmLexer::AsmLexer(SourceMgr &SM) : SrcMgr(SM) {
> @@ -23,6 +24,10 @@
>   TokStart = 0;
>  }
>
> +SMLoc AsmLexer::getLoc() const {
> +  return SMLoc::getFromPointer(TokStart);
> +}
> +
>  void AsmLexer::PrintError(const char *Loc, const std::string &Msg) const {
>   SrcMgr.PrintError(SMLoc::getFromPointer(Loc), Msg);
>  }
> @@ -31,6 +36,13 @@
>   SrcMgr.PrintError(Loc, Msg);
>  }
>
> +/// ReturnError - Set the error to the specified string at the specified
> +/// location.  This is defined to always return asmtok::Error.
> +asmtok::TokKind AsmLexer::ReturnError(const char *Loc, const std::string
> &Msg) {
> +  PrintError(Loc, Msg);
> +  return asmtok::Error;
> +}
> +
>  int AsmLexer::getNextChar() {
>   char CurChar = *CurPtr++;
>   switch (CurChar) {
> @@ -59,6 +71,129 @@
>   }
>  }
>
> +/// LexIdentifier: [a-zA-Z_.][a-zA-Z0-9_$.@]*
> +asmtok::TokKind AsmLexer::LexIdentifier() {
> +  while (isalnum(*CurPtr) || *CurPtr == '_' || *CurPtr == '$' ||
> +         *CurPtr == '.' || *CurPtr == '@')
> +    ++CurPtr;
> +  CurStrVal.assign(TokStart, CurPtr);   // Skip %
> +  return asmtok::Identifier;
> +}
> +
> +/// LexPercent: Register: %[a-zA-Z0-9]+
> +asmtok::TokKind AsmLexer::LexPercent() {
> +  if (!isalnum(*CurPtr))
> +    return asmtok::Error;  // Must have at least one character.
> +  while (isalnum(*CurPtr))
> +    ++CurPtr;
> +  CurStrVal.assign(TokStart, CurPtr);   // Skip %
> +  return asmtok::Register;
> +}
> +
> +/// LexSlash: Slash: /
> +///           C-Style Comment: /* ... */
> +asmtok::TokKind AsmLexer::LexSlash() {
> +  if (*CurPtr != '*')
> +    return asmtok::Slash;
> +
> +  // C Style comment.
> +  ++CurPtr;  // skip the star.
> +  while (1) {
> +    int CurChar = getNextChar();
> +    switch (CurChar) {
> +    case EOF:
> +      PrintError(TokStart, "Unterminated comment!");
> +      return asmtok::Error;
> +    case '*':
> +      // End of the comment?
> +      if (CurPtr[0] != '/') break;
> +
> +      ++CurPtr;   // End the */.
> +      return LexToken();
> +    }
> +  }
> +}
> +
> +/// LexHash: Comment: #[^\n]*
> +asmtok::TokKind AsmLexer::LexHash() {
> +  int CurChar = getNextChar();
> +  while (CurChar != '\n' && CurChar != '\n' && CurChar != EOF)
> +    CurChar = getNextChar();
> +
> +  if (CurChar == EOF)
> +    return asmtok::Eof;
> +  return asmtok::EndOfStatement;
> +}
> +
> +
> +/// LexDigit: First character is [0-9].
> +///   Local Label: [0-9][:]
> +///   Forward/Backward Label: [0-9][fb]
> +///   Binary integer: 0b[01]+
> +///   Octal integer: 0[0-7]+
> +///   Hex integer: 0x[0-9a-fA-F]+
> +///   Decimal integer: [1-9][0-9]*
> +/// TODO: FP literal.
> +asmtok::TokKind AsmLexer::LexDigit() {
> +  if (*CurPtr == ':')
> +    return asmtok::Error;  // FIXME LOCAL LABEL.
> +  if (*CurPtr == 'f' || *CurPtr == 'b')
> +    return asmtok::Error;  // FIXME FORWARD/BACKWARD LABEL.
> +
> +  // Decimal integer: [1-9][0-9]*
> +  if (CurPtr[-1] != '0') {
> +    while (isdigit(*CurPtr))
> +      ++CurPtr;
> +    CurIntVal = strtoll(TokStart, 0, 10);
> +    return asmtok::IntVal;
> +  }
> +
> +  if (*CurPtr == 'b') {
> +    ++CurPtr;
> +    const char *NumStart = CurPtr;
> +    while (CurPtr[0] == '0' || CurPtr[0] == '1')
> +      ++CurPtr;
> +
> +    // Requires at least one binary digit.
> +    if (CurPtr == NumStart)
> +      return ReturnError(CurPtr-2, "Invalid binary number");
> +    CurIntVal = strtoll(NumStart, 0, 2);
> +    return asmtok::IntVal;
> +  }
> +
> +  if (*CurPtr == 'x') {
> +    ++CurPtr;
> +    const char *NumStart = CurPtr;
> +    while (isxdigit(CurPtr[0]))
> +      ++CurPtr;
> +
> +    // Requires at least one hex digit.
> +    if (CurPtr == NumStart)
> +      return ReturnError(CurPtr-2, "Invalid hexadecimal number");
> +
> +    errno = 0;
> +    CurIntVal = strtoll(NumStart, 0, 16);
> +    if (errno == EINVAL)
> +      return ReturnError(CurPtr-2, "Invalid hexadecimal number");
> +    if (errno == ERANGE) {
> +      errno = 0;
> +      CurIntVal = (int64_t)strtoull(NumStart, 0, 16);
> +      if (errno == EINVAL)
> +        return ReturnError(CurPtr-2, "Invalid hexadecimal number");
> +      if (errno == ERANGE)
> +        return ReturnError(CurPtr-2, "Hexadecimal number out of range");
> +    }
> +    return asmtok::IntVal;
> +  }
> +
> +  // Must be an octal number, it starts with 0.
> +  while (*CurPtr >= '0' && *CurPtr <= '7')
> +    ++CurPtr;
> +  CurIntVal = strtoll(TokStart, 0, 8);
> +  return asmtok::IntVal;
> +}
> +
> +
>  asmtok::TokKind AsmLexer::LexToken() {
>   TokStart = CurPtr;
>   // This always consumes at least one character.
> @@ -66,9 +201,9 @@
>
>   switch (CurChar) {
>   default:
> -    // Handle letters: [a-zA-Z_]
> -//    if (isalpha(CurChar) || CurChar == '_' || CurChar == '#')
> -//      return LexIdentifier();
> +    // Handle identifier: [a-zA-Z_.][a-zA-Z0-9_$.@]*
> +    if (isalpha(CurChar) || CurChar == '_' || CurChar == '.')
> +      return LexIdentifier();
>
>     // Unknown character, emit an error.
>     return asmtok::Error;
> @@ -76,12 +211,29 @@
>   case 0:
>   case ' ':
>   case '\t':
> -  case '\n':
> -  case '\r':
>     // Ignore whitespace.
>     return LexToken();
> +  case '\n': // FALL THROUGH.
> +  case '\r': // FALL THROUGH.
> +  case ';': return asmtok::EndOfStatement;
>   case ':': return asmtok::Colon;
>   case '+': return asmtok::Plus;
>   case '-': return asmtok::Minus;
> +  case '(': return asmtok::LParen;
> +  case ')': return asmtok::RParen;
> +  case '*': return asmtok::Star;
> +  case ',': return asmtok::Comma;
> +  case '$': return asmtok::Dollar;
> +  case '%': return LexPercent();
> +  case '/': return LexSlash();
> +  case '#': return LexHash();
> +  case '0': case '1': case '2': case '3': case '4':
> +  case '5': case '6': case '7': case '8': case '9':
> +    return LexDigit();
> +
> +  // TODO: Quoted identifiers (objc methods etc)
> +  // local labels: [0-9][:]
> +  // Forward/backward labels: [0-9][fb]
> +  // Integers, fp constants, character constants.
>   }
>  }
> \ No newline at end of file
>
> Modified: llvm/trunk/tools/llvm-mc/AsmLexer.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/AsmLexer.h?rev=73855&r1=73854&r2=73855&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-mc/AsmLexer.h (original)
> +++ llvm/trunk/tools/llvm-mc/AsmLexer.h Sun Jun 21 14:21:25 2009
> @@ -29,12 +29,16 @@
>     Eof, Error,
>
>     Identifier,
> +    Register,
>     IntVal,
>
> -
> +    EndOfStatement,
>     Colon,
>     Plus,
> -    Minus
> +    Minus,
> +    Slash,    // '/'
> +    LParen, RParen,
> +    Star, Comma, Dollar
>   };
>  }
>
> @@ -66,7 +70,7 @@
>   asmtok::TokKind getKind() const { return CurKind; }
>
>   const std::string &getCurStrVal() const {
> -    assert(CurKind == asmtok::Identifier &&
> +    assert((CurKind == asmtok::Identifier || CurKind == asmtok::Register)
> &&
>            "This token doesn't have a string value");
>     return CurStrVal;
>   }
> @@ -82,9 +86,15 @@
>
>  private:
>   int getNextChar();
> +  asmtok::TokKind ReturnError(const char *Loc, const std::string &Msg);
>
>   /// LexToken - Read the next token and return its code.
>   asmtok::TokKind LexToken();
> +  asmtok::TokKind LexIdentifier();
> +  asmtok::TokKind LexPercent();
> +  asmtok::TokKind LexSlash();
> +  asmtok::TokKind LexHash();
> +  asmtok::TokKind LexDigit();
>  };
>
>  } // end namespace llvm
>
> Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=73855&r1=73854&r2=73855&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
> +++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Sun Jun 21 14:21:25 2009
> @@ -72,17 +72,29 @@
>   asmtok::TokKind Tok = Lexer.Lex();
>   while (Tok != asmtok::Eof) {
>     switch (Tok) {
> -    default: outs() << "<<unknown token>>\n"; break;
> -    case asmtok::Error: outs() << "<<error>>\n"; break;
> +    default: Lexer.PrintError(Lexer.getLoc(), "driver: unknown token");
> break;
> +    case asmtok::Error:
> +      Lexer.PrintError(Lexer.getLoc(), "error, bad token");
> +      break;
>     case asmtok::Identifier:
>       outs() << "identifier: " << Lexer.getCurStrVal() << '\n';
>       break;
> +    case asmtok::Register:
> +      outs() << "register: " << Lexer.getCurStrVal() << '\n';
> +      break;
>     case asmtok::IntVal:
>       outs() << "int: " << Lexer.getCurIntVal() << '\n';
>       break;
> +    case asmtok::EndOfStatement: outs() << "EndOfStatement\n"; break;
>     case asmtok::Colon:  outs() << "Colon\n"; break;
>     case asmtok::Plus:   outs() << "Plus\n"; break;
>     case asmtok::Minus:  outs() << "Minus\n"; break;
> +    case asmtok::Slash:  outs() << "Slash\n"; break;
> +    case asmtok::LParen: outs() << "LParen\n"; break;
> +    case asmtok::RParen: outs() << "RParen\n"; break;
> +    case asmtok::Star:   outs() << "Star\n"; break;
> +    case asmtok::Comma:  outs() << "Comma\n"; break;
> +    case asmtok::Dollar: outs() << "Dollar\n"; break;
>     }
>
>     Tok = Lexer.Lex();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
-Howard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090622/d8386118/attachment.html>


More information about the llvm-commits mailing list