aboutsummaryrefslogtreecommitdiffstats
path: root/tools/llvm-mc
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-06-24 00:33:19 +0000
committerChris Lattner <sabre@nondot.org>2009-06-24 00:33:19 +0000
commit592e3bb6ea0e3a1a16e33b0fdea3a06a7b97c7b1 (patch)
tree531c390bfcb86473d300fb78717286591a1ff93c /tools/llvm-mc
parentb6b9e9e159928b79ec0f132ee7f5faf876887ee9 (diff)
downloadexternal_llvm-592e3bb6ea0e3a1a16e33b0fdea3a06a7b97c7b1.zip
external_llvm-592e3bb6ea0e3a1a16e33b0fdea3a06a7b97c7b1.tar.gz
external_llvm-592e3bb6ea0e3a1a16e33b0fdea3a06a7b97c7b1.tar.bz2
make the lexer unique strings it lexes instead of passing them back as
std::strings. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-mc')
-rw-r--r--tools/llvm-mc/AsmLexer.cpp24
-rw-r--r--tools/llvm-mc/AsmLexer.h10
-rw-r--r--tools/llvm-mc/AsmParser.cpp2
3 files changed, 29 insertions, 7 deletions
diff --git a/tools/llvm-mc/AsmLexer.cpp b/tools/llvm-mc/AsmLexer.cpp
index dbd3c06..186a058 100644
--- a/tools/llvm-mc/AsmLexer.cpp
+++ b/tools/llvm-mc/AsmLexer.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "AsmLexer.h"
+#include "llvm/ADT/StringSet.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Config/config.h" // for strtoull.
@@ -20,11 +21,21 @@
#include <cstdlib>
using namespace llvm;
+static StringSet<> &getSS(void *TheSS) {
+ return *(StringSet<>*)TheSS;
+}
+
AsmLexer::AsmLexer(SourceMgr &SM) : SrcMgr(SM) {
CurBuffer = 0;
CurBuf = SrcMgr.getMemoryBuffer(CurBuffer);
CurPtr = CurBuf->getBufferStart();
TokStart = 0;
+
+ TheStringSet = new StringSet<>();
+}
+
+AsmLexer::~AsmLexer() {
+ delete &getSS(TheStringSet);
}
SMLoc AsmLexer::getLoc() const {
@@ -75,7 +86,9 @@ asmtok::TokKind AsmLexer::LexIdentifier() {
while (isalnum(*CurPtr) || *CurPtr == '_' || *CurPtr == '$' ||
*CurPtr == '.' || *CurPtr == '@')
++CurPtr;
- CurStrVal.assign(TokStart, CurPtr);
+ // Unique string.
+ CurStrVal =
+ getSS(TheStringSet).GetOrCreateValue(TokStart, CurPtr, 0).getKeyData();
return asmtok::Identifier;
}
@@ -86,7 +99,10 @@ asmtok::TokKind AsmLexer::LexPercent() {
while (isalnum(*CurPtr))
++CurPtr;
- CurStrVal.assign(TokStart, CurPtr); // Include %
+
+ // Unique string.
+ CurStrVal =
+ getSS(TheStringSet).GetOrCreateValue(TokStart, CurPtr, 0).getKeyData();
return asmtok::Register;
}
@@ -208,7 +224,9 @@ asmtok::TokKind AsmLexer::LexQuote() {
CurChar = getNextChar();
}
- CurStrVal.assign(TokStart, CurPtr); // include quotes.
+ // Unique string, include quotes for now.
+ CurStrVal =
+ getSS(TheStringSet).GetOrCreateValue(TokStart, CurPtr, 0).getKeyData();
return asmtok::String;
}
diff --git a/tools/llvm-mc/AsmLexer.h b/tools/llvm-mc/AsmLexer.h
index 23c5f85..d074db7 100644
--- a/tools/llvm-mc/AsmLexer.h
+++ b/tools/llvm-mc/AsmLexer.h
@@ -55,20 +55,24 @@ class AsmLexer {
const char *CurPtr;
const MemoryBuffer *CurBuf;
+ // A llvm::StringSet<>, which provides uniqued and null-terminated strings.
+ void *TheStringSet;
// Information about the current token.
const char *TokStart;
asmtok::TokKind CurKind;
- std::string CurStrVal; // This is valid for Identifier.
+ const char *CurStrVal; // This is valid for Identifier.
int64_t CurIntVal;
/// CurBuffer - This is the current buffer index we're lexing from as managed
/// by the SourceMgr object.
int CurBuffer;
+ void operator=(const AsmLexer&); // DO NOT IMPLEMENT
+ AsmLexer(const AsmLexer&); // DO NOT IMPLEMENT
public:
AsmLexer(SourceMgr &SrcMgr);
- ~AsmLexer() {}
+ ~AsmLexer();
asmtok::TokKind Lex() {
return CurKind = LexToken();
@@ -78,7 +82,7 @@ public:
bool is(asmtok::TokKind K) const { return CurKind == K; }
bool isNot(asmtok::TokKind K) const { return CurKind != K; }
- const std::string &getCurStrVal() const {
+ const char *getCurStrVal() const {
assert((CurKind == asmtok::Identifier || CurKind == asmtok::Register ||
CurKind == asmtok::String) &&
"This token doesn't have a string value");
diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp
index c9d2071..4dd136d 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -179,7 +179,7 @@ bool AsmParser::ParseStatement() {
// If we have an identifier, handle it as the key symbol.
SMLoc IDLoc = Lexer.getLoc();
- std::string IDVal = Lexer.getCurStrVal();
+ const char *IDVal = Lexer.getCurStrVal();
// Consume the identifier, see what is after it.
if (Lexer.Lex() == asmtok::Colon) {