diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-07-27 21:49:56 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-07-27 21:49:56 +0000 |
commit | 9a7e2ccf574368b60455f8c8975030475a1f3ce0 (patch) | |
tree | deb12fe8d94ce3cf58babf569d0a8a2511d347cf /tools | |
parent | 5a4e2a47b3444bf92caffcbd2371cf18845d83ba (diff) | |
download | external_llvm-9a7e2ccf574368b60455f8c8975030475a1f3ce0.zip external_llvm-9a7e2ccf574368b60455f8c8975030475a1f3ce0.tar.gz external_llvm-9a7e2ccf574368b60455f8c8975030475a1f3ce0.tar.bz2 |
llvm-mc: Move AsmLexer::getCurStrVal to StringRef based API.
- My DFS traversal of LLVM is, at least for now, nearly complete! :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77258 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r-- | tools/llvm-mc/AsmLexer.h | 10 | ||||
-rw-r--r-- | tools/llvm-mc/AsmParser.cpp | 181 | ||||
-rw-r--r-- | tools/llvm-mc/AsmParser.h | 4 | ||||
-rw-r--r-- | tools/llvm-mc/MC-X86Specific.cpp | 4 |
4 files changed, 103 insertions, 96 deletions
diff --git a/tools/llvm-mc/AsmLexer.h b/tools/llvm-mc/AsmLexer.h index 32bbb50..c862a05 100644 --- a/tools/llvm-mc/AsmLexer.h +++ b/tools/llvm-mc/AsmLexer.h @@ -14,6 +14,7 @@ #ifndef ASMLEXER_H #define ASMLEXER_H +#include "llvm/ADT/StringRef.h" #include "llvm/MC/MCAsmLexer.h" #include "llvm/Support/DataTypes.h" #include <string> @@ -84,8 +85,13 @@ public: asmtok::TokKind getKind() const { return CurKind; } bool is(asmtok::TokKind K) const { return CurKind == K; } bool isNot(asmtok::TokKind K) const { return CurKind != K; } - - const char *getCurStrVal() const { + + /// getCurStrVal - Get the string for the current token, this includes all + /// characters (for example, the quotes on strings) in the token. + /// + /// The returned StringRef points into the source manager's memory buffer, and + /// is safe to store across calls to Lex(). + StringRef 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 1b9ca05..371a58e 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -313,7 +313,7 @@ bool AsmParser::ParseStatement() { // If we have an identifier, handle it as the key symbol. SMLoc IDLoc = Lexer.getLoc(); - const char *IDVal = Lexer.getCurStrVal(); + StringRef IDVal = Lexer.getCurStrVal(); // Consume the identifier, see what is after it. switch (Lexer.Lex()) { @@ -353,194 +353,194 @@ bool AsmParser::ParseStatement() { // Otherwise, we have a normal instruction or directive. if (IDVal[0] == '.') { // FIXME: This should be driven based on a hash lookup and callback. - if (!strcmp(IDVal, ".section")) + if (IDVal == ".section") return ParseDirectiveDarwinSection(); - if (!strcmp(IDVal, ".text")) + if (IDVal == ".text") // FIXME: This changes behavior based on the -static flag to the // assembler. return ParseDirectiveSectionSwitch("__TEXT,__text", "regular,pure_instructions"); - if (!strcmp(IDVal, ".const")) + if (IDVal == ".const") return ParseDirectiveSectionSwitch("__TEXT,__const"); - if (!strcmp(IDVal, ".static_const")) + if (IDVal == ".static_const") return ParseDirectiveSectionSwitch("__TEXT,__static_const"); - if (!strcmp(IDVal, ".cstring")) + if (IDVal == ".cstring") return ParseDirectiveSectionSwitch("__TEXT,__cstring", "cstring_literals"); - if (!strcmp(IDVal, ".literal4")) + if (IDVal == ".literal4") return ParseDirectiveSectionSwitch("__TEXT,__literal4", "4byte_literals"); - if (!strcmp(IDVal, ".literal8")) + if (IDVal == ".literal8") return ParseDirectiveSectionSwitch("__TEXT,__literal8", "8byte_literals"); - if (!strcmp(IDVal, ".literal16")) + if (IDVal == ".literal16") return ParseDirectiveSectionSwitch("__TEXT,__literal16", "16byte_literals"); - if (!strcmp(IDVal, ".constructor")) + if (IDVal == ".constructor") return ParseDirectiveSectionSwitch("__TEXT,__constructor"); - if (!strcmp(IDVal, ".destructor")) + if (IDVal == ".destructor") return ParseDirectiveSectionSwitch("__TEXT,__destructor"); - if (!strcmp(IDVal, ".fvmlib_init0")) + if (IDVal == ".fvmlib_init0") return ParseDirectiveSectionSwitch("__TEXT,__fvmlib_init0"); - if (!strcmp(IDVal, ".fvmlib_init1")) + if (IDVal == ".fvmlib_init1") return ParseDirectiveSectionSwitch("__TEXT,__fvmlib_init1"); - if (!strcmp(IDVal, ".symbol_stub")) // FIXME: Different on PPC. + if (IDVal == ".symbol_stub") // FIXME: Different on PPC. return ParseDirectiveSectionSwitch("__IMPORT,__jump_table,symbol_stubs", "self_modifying_code+pure_instructions,5"); // FIXME: .picsymbol_stub on PPC. - if (!strcmp(IDVal, ".data")) + if (IDVal == ".data") return ParseDirectiveSectionSwitch("__DATA,__data"); - if (!strcmp(IDVal, ".static_data")) + if (IDVal == ".static_data") return ParseDirectiveSectionSwitch("__DATA,__static_data"); - if (!strcmp(IDVal, ".non_lazy_symbol_pointer")) + if (IDVal == ".non_lazy_symbol_pointer") return ParseDirectiveSectionSwitch("__DATA,__nl_symbol_pointer", "non_lazy_symbol_pointers"); - if (!strcmp(IDVal, ".lazy_symbol_pointer")) + if (IDVal == ".lazy_symbol_pointer") return ParseDirectiveSectionSwitch("__DATA,__la_symbol_pointer", "lazy_symbol_pointers"); - if (!strcmp(IDVal, ".dyld")) + if (IDVal == ".dyld") return ParseDirectiveSectionSwitch("__DATA,__dyld"); - if (!strcmp(IDVal, ".mod_init_func")) + if (IDVal == ".mod_init_func") return ParseDirectiveSectionSwitch("__DATA,__mod_init_func", "mod_init_funcs"); - if (!strcmp(IDVal, ".mod_term_func")) + if (IDVal == ".mod_term_func") return ParseDirectiveSectionSwitch("__DATA,__mod_term_func", "mod_term_funcs"); - if (!strcmp(IDVal, ".const_data")) + if (IDVal == ".const_data") return ParseDirectiveSectionSwitch("__DATA,__const", "regular"); // FIXME: Verify attributes on sections. - if (!strcmp(IDVal, ".objc_class")) + if (IDVal == ".objc_class") return ParseDirectiveSectionSwitch("__OBJC,__class"); - if (!strcmp(IDVal, ".objc_meta_class")) + if (IDVal == ".objc_meta_class") return ParseDirectiveSectionSwitch("__OBJC,__meta_class"); - if (!strcmp(IDVal, ".objc_cat_cls_meth")) + if (IDVal == ".objc_cat_cls_meth") return ParseDirectiveSectionSwitch("__OBJC,__cat_cls_meth"); - if (!strcmp(IDVal, ".objc_cat_inst_meth")) + if (IDVal == ".objc_cat_inst_meth") return ParseDirectiveSectionSwitch("__OBJC,__cat_inst_meth"); - if (!strcmp(IDVal, ".objc_protocol")) + if (IDVal == ".objc_protocol") return ParseDirectiveSectionSwitch("__OBJC,__protocol"); - if (!strcmp(IDVal, ".objc_string_object")) + if (IDVal == ".objc_string_object") return ParseDirectiveSectionSwitch("__OBJC,__string_object"); - if (!strcmp(IDVal, ".objc_cls_meth")) + if (IDVal == ".objc_cls_meth") return ParseDirectiveSectionSwitch("__OBJC,__cls_meth"); - if (!strcmp(IDVal, ".objc_inst_meth")) + if (IDVal == ".objc_inst_meth") return ParseDirectiveSectionSwitch("__OBJC,__inst_meth"); - if (!strcmp(IDVal, ".objc_cls_refs")) + if (IDVal == ".objc_cls_refs") return ParseDirectiveSectionSwitch("__OBJC,__cls_refs"); - if (!strcmp(IDVal, ".objc_message_refs")) + if (IDVal == ".objc_message_refs") return ParseDirectiveSectionSwitch("__OBJC,__message_refs"); - if (!strcmp(IDVal, ".objc_symbols")) + if (IDVal == ".objc_symbols") return ParseDirectiveSectionSwitch("__OBJC,__symbols"); - if (!strcmp(IDVal, ".objc_category")) + if (IDVal == ".objc_category") return ParseDirectiveSectionSwitch("__OBJC,__category"); - if (!strcmp(IDVal, ".objc_class_vars")) + if (IDVal == ".objc_class_vars") return ParseDirectiveSectionSwitch("__OBJC,__class_vars"); - if (!strcmp(IDVal, ".objc_instance_vars")) + if (IDVal == ".objc_instance_vars") return ParseDirectiveSectionSwitch("__OBJC,__instance_vars"); - if (!strcmp(IDVal, ".objc_module_info")) + if (IDVal == ".objc_module_info") return ParseDirectiveSectionSwitch("__OBJC,__module_info"); - if (!strcmp(IDVal, ".objc_class_names")) + if (IDVal == ".objc_class_names") return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals"); - if (!strcmp(IDVal, ".objc_meth_var_types")) + if (IDVal == ".objc_meth_var_types") return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals"); - if (!strcmp(IDVal, ".objc_meth_var_names")) + if (IDVal == ".objc_meth_var_names") return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals"); - if (!strcmp(IDVal, ".objc_selector_strs")) + if (IDVal == ".objc_selector_strs") return ParseDirectiveSectionSwitch("__OBJC,__selector_strs"); // Assembler features - if (!strcmp(IDVal, ".set")) + if (IDVal == ".set") return ParseDirectiveSet(); // Data directives - if (!strcmp(IDVal, ".ascii")) + if (IDVal == ".ascii") return ParseDirectiveAscii(false); - if (!strcmp(IDVal, ".asciz")) + if (IDVal == ".asciz") return ParseDirectiveAscii(true); // FIXME: Target hooks for size? Also for "word", "hword". - if (!strcmp(IDVal, ".byte")) + if (IDVal == ".byte") return ParseDirectiveValue(1); - if (!strcmp(IDVal, ".short")) + if (IDVal == ".short") return ParseDirectiveValue(2); - if (!strcmp(IDVal, ".long")) + if (IDVal == ".long") return ParseDirectiveValue(4); - if (!strcmp(IDVal, ".quad")) + if (IDVal == ".quad") return ParseDirectiveValue(8); // FIXME: Target hooks for IsPow2. - if (!strcmp(IDVal, ".align")) + if (IDVal == ".align") return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/1); - if (!strcmp(IDVal, ".align32")) + if (IDVal == ".align32") return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/4); - if (!strcmp(IDVal, ".balign")) + if (IDVal == ".balign") return ParseDirectiveAlign(/*IsPow2=*/false, /*ExprSize=*/1); - if (!strcmp(IDVal, ".balignw")) + if (IDVal == ".balignw") return ParseDirectiveAlign(/*IsPow2=*/false, /*ExprSize=*/2); - if (!strcmp(IDVal, ".balignl")) + if (IDVal == ".balignl") return ParseDirectiveAlign(/*IsPow2=*/false, /*ExprSize=*/4); - if (!strcmp(IDVal, ".p2align")) + if (IDVal == ".p2align") return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/1); - if (!strcmp(IDVal, ".p2alignw")) + if (IDVal == ".p2alignw") return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/2); - if (!strcmp(IDVal, ".p2alignl")) + if (IDVal == ".p2alignl") return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/4); - if (!strcmp(IDVal, ".org")) + if (IDVal == ".org") return ParseDirectiveOrg(); - if (!strcmp(IDVal, ".fill")) + if (IDVal == ".fill") return ParseDirectiveFill(); - if (!strcmp(IDVal, ".space")) + if (IDVal == ".space") return ParseDirectiveSpace(); // Symbol attribute directives - if (!strcmp(IDVal, ".globl") || !strcmp(IDVal, ".global")) + if (IDVal == ".globl" || IDVal == ".global") return ParseDirectiveSymbolAttribute(MCStreamer::Global); - if (!strcmp(IDVal, ".hidden")) + if (IDVal == ".hidden") return ParseDirectiveSymbolAttribute(MCStreamer::Hidden); - if (!strcmp(IDVal, ".indirect_symbol")) + if (IDVal == ".indirect_symbol") return ParseDirectiveSymbolAttribute(MCStreamer::IndirectSymbol); - if (!strcmp(IDVal, ".internal")) + if (IDVal == ".internal") return ParseDirectiveSymbolAttribute(MCStreamer::Internal); - if (!strcmp(IDVal, ".lazy_reference")) + if (IDVal == ".lazy_reference") return ParseDirectiveSymbolAttribute(MCStreamer::LazyReference); - if (!strcmp(IDVal, ".no_dead_strip")) + if (IDVal == ".no_dead_strip") return ParseDirectiveSymbolAttribute(MCStreamer::NoDeadStrip); - if (!strcmp(IDVal, ".private_extern")) + if (IDVal == ".private_extern") return ParseDirectiveSymbolAttribute(MCStreamer::PrivateExtern); - if (!strcmp(IDVal, ".protected")) + if (IDVal == ".protected") return ParseDirectiveSymbolAttribute(MCStreamer::Protected); - if (!strcmp(IDVal, ".reference")) + if (IDVal == ".reference") return ParseDirectiveSymbolAttribute(MCStreamer::Reference); - if (!strcmp(IDVal, ".weak")) + if (IDVal == ".weak") return ParseDirectiveSymbolAttribute(MCStreamer::Weak); - if (!strcmp(IDVal, ".weak_definition")) + if (IDVal == ".weak_definition") return ParseDirectiveSymbolAttribute(MCStreamer::WeakDefinition); - if (!strcmp(IDVal, ".weak_reference")) + if (IDVal == ".weak_reference") return ParseDirectiveSymbolAttribute(MCStreamer::WeakReference); - if (!strcmp(IDVal, ".comm")) + if (IDVal == ".comm") return ParseDirectiveComm(/*IsLocal=*/false); - if (!strcmp(IDVal, ".lcomm")) + if (IDVal == ".lcomm") return ParseDirectiveComm(/*IsLocal=*/true); - if (!strcmp(IDVal, ".zerofill")) + if (IDVal == ".zerofill") return ParseDirectiveDarwinZerofill(); - if (!strcmp(IDVal, ".desc")) + if (IDVal == ".desc") return ParseDirectiveDarwinSymbolDesc(); - if (!strcmp(IDVal, ".lsym")) + if (IDVal == ".lsym") return ParseDirectiveDarwinLsym(); - if (!strcmp(IDVal, ".subsections_via_symbols")) + if (IDVal == ".subsections_via_symbols") return ParseDirectiveDarwinSubsectionsViaSymbols(); - if (!strcmp(IDVal, ".abort")) + if (IDVal == ".abort") return ParseDirectiveAbort(); - if (!strcmp(IDVal, ".include")) + if (IDVal == ".include") return ParseDirectiveInclude(); - if (!strcmp(IDVal, ".dump")) + if (IDVal == ".dump") return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsDump=*/true); - if (!strcmp(IDVal, ".load")) + if (IDVal == ".load") return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsLoad=*/false); Warning(IDLoc, "ignoring directive for now"); @@ -566,7 +566,7 @@ bool AsmParser::ParseStatement() { return false; } -bool AsmParser::ParseAssignment(const char *Name, bool IsDotSet) { +bool AsmParser::ParseAssignment(const StringRef &Name, bool IsDotSet) { // FIXME: Use better location, we should use proper tokens. SMLoc EqualLoc = Lexer.getLoc(); @@ -605,7 +605,7 @@ bool AsmParser::ParseDirectiveSet() { if (Lexer.isNot(asmtok::Identifier)) return TokError("expected identifier after '.set' directive"); - const char *Name = Lexer.getCurStrVal(); + StringRef Name = Lexer.getCurStrVal(); if (Lexer.Lex() != asmtok::Comma) return TokError("unexpected token in '.set'"); @@ -632,7 +632,7 @@ bool AsmParser::ParseDirectiveDarwinSection() { if (Lexer.isNot(asmtok::Identifier)) return TokError("expected identifier in '.section' directive"); Section += ','; - Section += Lexer.getCurStrVal(); + Section += Lexer.getCurStrVal().str(); Lexer.Lex(); } @@ -671,10 +671,10 @@ bool AsmParser::ParseDirectiveAscii(bool ZeroTerminated) { // FIXME: This shouldn't use a const char* + strlen, the string could have // embedded nulls. // FIXME: Should have accessor for getting string contents. - const char *Str = Lexer.getCurStrVal(); - Out.EmitBytes(Str + 1, strlen(Str) - 2); + StringRef Str = Lexer.getCurStrVal(); + Out.EmitBytes(Str.substr(1, Str.size() - 2)); if (ZeroTerminated) - Out.EmitBytes("\0", 1); + Out.EmitBytes(StringRef("\0", 1)); Lexer.Lex(); @@ -1026,7 +1026,7 @@ bool AsmParser::ParseDirectiveDarwinZerofill() { if (Lexer.isNot(asmtok::Identifier)) return TokError("expected section name after comma in '.zerofill' " "directive"); - Section += Lexer.getCurStrVal(); + Section += Lexer.getCurStrVal().str(); Lexer.Lex(); // FIXME: we will need to tell GetSection() that this is to be created with or @@ -1117,7 +1117,7 @@ bool AsmParser::ParseDirectiveDarwinSubsectionsViaSymbols() { /// ParseDirectiveAbort /// ::= .abort [ "abort_string" ] bool AsmParser::ParseDirectiveAbort() { - const char *Str = NULL; + StringRef Str = ""; if (Lexer.isNot(asmtok::EndOfStatement)) { if (Lexer.isNot(asmtok::String)) return TokError("expected string in '.abort' directive"); @@ -1132,7 +1132,8 @@ bool AsmParser::ParseDirectiveAbort() { Lexer.Lex(); - Out.AbortAssembly(Str); + // FIXME: Handle here. + Out.AbortAssembly(Str.str().c_str()); return false; } diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index b3190b12..3d9842e 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/tools/llvm-mc/AsmParser.h @@ -58,7 +58,7 @@ private: void EatToEndOfStatement(); - bool ParseAssignment(const char *Name, bool IsDotSet); + bool ParseAssignment(const StringRef &Name, bool IsDotSet); /// ParseExpression - Parse a general assembly expression. /// @@ -97,7 +97,7 @@ private: bool ParseParenExpr(AsmExpr *&Res); // X86 specific. - bool ParseX86InstOperands(const char *InstName, MCInst &Inst); + bool ParseX86InstOperands(const StringRef &InstName, MCInst &Inst); bool ParseX86Operand(X86Operand &Op); bool ParseX86MemOperand(X86Operand &Op); bool ParseX86Register(X86Operand &Op); diff --git a/tools/llvm-mc/MC-X86Specific.cpp b/tools/llvm-mc/MC-X86Specific.cpp index fec13ce..d16bb15 100644 --- a/tools/llvm-mc/MC-X86Specific.cpp +++ b/tools/llvm-mc/MC-X86Specific.cpp @@ -235,7 +235,7 @@ bool AsmParser::ParseX86MemOperand(X86Operand &Op) { /// MatchX86Inst - Convert a parsed instruction name and operand list into a /// concrete instruction. -static bool MatchX86Inst(const char *Name, +static bool MatchX86Inst(const StringRef &Name, llvm::SmallVector<AsmParser::X86Operand, 3> &Operands, MCInst &Inst) { return false; @@ -243,7 +243,7 @@ static bool MatchX86Inst(const char *Name, /// ParseX86InstOperands - Parse the operands of an X86 instruction and return /// them as the operands of an MCInst. -bool AsmParser::ParseX86InstOperands(const char *InstName, MCInst &Inst) { +bool AsmParser::ParseX86InstOperands(const StringRef &InstName, MCInst &Inst) { llvm::SmallVector<X86Operand, 3> Operands; if (Lexer.isNot(asmtok::EndOfStatement)) { |