diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-09 17:25:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-09 17:25:12 +0000 |
commit | 1fc3d7558139eb6081a7ee5a8f88506d44c8dd7f (patch) | |
tree | 19e6cc5e5ba460dbefc9104f212aea7e810d75a3 /tools | |
parent | f0b9effccba2db106523bb998e61ee7b345474cc (diff) | |
download | external_llvm-1fc3d7558139eb6081a7ee5a8f88506d44c8dd7f.zip external_llvm-1fc3d7558139eb6081a7ee5a8f88506d44c8dd7f.tar.gz external_llvm-1fc3d7558139eb6081a7ee5a8f88506d44c8dd7f.tar.bz2 |
add llvm-mc support for parsing the .lcomm directive, patch by Kevin Enderby!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75148 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r-- | tools/llvm-mc/AsmParser.cpp | 25 | ||||
-rw-r--r-- | tools/llvm-mc/AsmParser.h | 2 |
2 files changed, 15 insertions, 12 deletions
diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index 1a3543a..65ec962 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -521,7 +521,9 @@ bool AsmParser::ParseStatement() { return ParseDirectiveSymbolAttribute(MCStreamer::WeakReference); if (!strcmp(IDVal, ".comm")) - return ParseDirectiveComm(); + return ParseDirectiveComm(/*IsLocal=*/false); + if (!strcmp(IDVal, ".lcomm")) + return ParseDirectiveComm(/*IsLocal=*/true); Warning(IDLoc, "ignoring directive for now"); EatToEndOfStatement(); @@ -901,8 +903,8 @@ bool AsmParser::ParseDirectiveSymbolAttribute(MCStreamer::SymbolAttr Attr) { } /// ParseDirectiveComm -/// ::= .comm identifier , size_expression [ , align_expression ] -bool AsmParser::ParseDirectiveComm() { +/// ::= ( .comm | .lcomm ) identifier , size_expression [ , align_expression ] +bool AsmParser::ParseDirectiveComm(bool IsLocal) { if (Lexer.isNot(asmtok::Identifier)) return TokError("expected identifier in directive"); @@ -930,28 +932,29 @@ bool AsmParser::ParseDirectiveComm() { } if (Lexer.isNot(asmtok::EndOfStatement)) - return TokError("unexpected token in '.comm' directive"); + return TokError("unexpected token in '.comm' or '.lcomm' directive"); Lexer.Lex(); - // NOTE: a size of zero should create a undefined symbol + // NOTE: a size of zero for a .comm should create a undefined symbol + // but a size of .lcomm creates a bss symbol of size zero. if (Size < 0) - return Error(SizeLoc, "invalid '.comm' size, can't be less than zero"); + return Error(SizeLoc, "invalid '.comm' or '.lcomm' directive size, can't " + "be less than zero"); // NOTE: The alignment in the directive is a power of 2 value, the assember // may internally end up wanting an alignment in bytes. // FIXME: Diagnose overflow. if (Pow2Alignment < 0) - return Error(Pow2AlignmentLoc, "invalid '.comm' alignment, can't be less " - "than zero"); + return Error(Pow2AlignmentLoc, "invalid '.comm' or '.lcomm' directive " + "alignment, can't be less than zero"); // TODO: Symbol must be undefined or it is a error to re-defined the symbol if (Sym->getSection() || Ctx.GetSymbolValue(Sym)) return Error(IDLoc, "invalid symbol redefinition"); - // TODO: Symbol to be made into a common with this Size and Pow2Alignment - - Out.EmitCommonSymbol(Sym, Size, Pow2Alignment); + // Create the Symbol as a common or local common with Size and Pow2Alignment + Out.EmitCommonSymbol(Sym, Size, Pow2Alignment, IsLocal); return false; } diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index bafdfb7..8bfeaac 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/tools/llvm-mc/AsmParser.h @@ -110,7 +110,7 @@ private: /// accepts a single symbol (which should be a label or an external). bool ParseDirectiveSymbolAttribute(MCStreamer::SymbolAttr Attr); - bool ParseDirectiveComm(); // ".comm" + bool ParseDirectiveComm(bool IsLocal); // ".comm" and ".lcomm" }; |