[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 23:40:38 PDT 2009


the magic is that TGLexer include config.h. there is a definition:/* Define
to a function implementing strtoull */
#define strtoull _strtoui64




On Mon, Jun 22, 2009 at 12:57 PM, Chris Lattner <clattner at apple.com> wrote:

>
> On Jun 21, 2009, at 8:33 PM, Howard Su wrote:
>
> 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
>
>
> Did my subsequent #include of <cstdlib> fix this?  If not,
> llvm/utils/TableGen/TGLexer.cpp uses strtoull, do you know what magic does
> it?
>
> -Chris
>
>
> 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
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
> _______________________________________________
> 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/84876bd0/attachment.html>


More information about the llvm-commits mailing list