Parse and ignore some .cfi_* directives.
[oota-llvm.git] / lib / MC / MCParser / AsmParser.cpp
1 //===- AsmParser.cpp - Parser for Assembly Files --------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This class implements the parser for assembly files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/ADT/APFloat.h"
15 #include "llvm/ADT/SmallString.h"
16 #include "llvm/ADT/StringMap.h"
17 #include "llvm/ADT/StringSwitch.h"
18 #include "llvm/ADT/Twine.h"
19 #include "llvm/MC/MCAsmInfo.h"
20 #include "llvm/MC/MCContext.h"
21 #include "llvm/MC/MCExpr.h"
22 #include "llvm/MC/MCParser/AsmCond.h"
23 #include "llvm/MC/MCParser/AsmLexer.h"
24 #include "llvm/MC/MCParser/MCAsmParser.h"
25 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
26 #include "llvm/MC/MCSectionMachO.h"
27 #include "llvm/MC/MCStreamer.h"
28 #include "llvm/MC/MCSymbol.h"
29 #include "llvm/MC/MCDwarf.h"
30 #include "llvm/Support/MemoryBuffer.h"
31 #include "llvm/Support/SourceMgr.h"
32 #include "llvm/Support/raw_ostream.h"
33 #include "llvm/Target/TargetAsmParser.h"
34 #include <vector>
35 using namespace llvm;
36
37 namespace {
38
39 /// \brief Helper class for tracking macro definitions.
40 struct Macro {
41   StringRef Name;
42   StringRef Body;
43
44 public:
45   Macro(StringRef N, StringRef B) : Name(N), Body(B) {}
46 };
47
48 /// \brief Helper class for storing information about an active macro
49 /// instantiation.
50 struct MacroInstantiation {
51   /// The macro being instantiated.
52   const Macro *TheMacro;
53
54   /// The macro instantiation with substitutions.
55   MemoryBuffer *Instantiation;
56
57   /// The location of the instantiation.
58   SMLoc InstantiationLoc;
59
60   /// The location where parsing should resume upon instantiation completion.
61   SMLoc ExitLoc;
62
63 public:
64   MacroInstantiation(const Macro *M, SMLoc IL, SMLoc EL,
65                      const std::vector<std::vector<AsmToken> > &A);
66 };
67
68 /// \brief The concrete assembly parser instance.
69 class AsmParser : public MCAsmParser {
70   friend class GenericAsmParser;
71
72   AsmParser(const AsmParser &);   // DO NOT IMPLEMENT
73   void operator=(const AsmParser &);  // DO NOT IMPLEMENT
74 private:
75   AsmLexer Lexer;
76   MCContext &Ctx;
77   MCStreamer &Out;
78   SourceMgr &SrcMgr;
79   MCAsmParserExtension *GenericParser;
80   MCAsmParserExtension *PlatformParser;
81
82   /// This is the current buffer index we're lexing from as managed by the
83   /// SourceMgr object.
84   int CurBuffer;
85
86   AsmCond TheCondState;
87   std::vector<AsmCond> TheCondStack;
88
89   /// DirectiveMap - This is a table handlers for directives.  Each handler is
90   /// invoked after the directive identifier is read and is responsible for
91   /// parsing and validating the rest of the directive.  The handler is passed
92   /// in the directive name and the location of the directive keyword.
93   StringMap<std::pair<MCAsmParserExtension*, DirectiveHandler> > DirectiveMap;
94
95   /// MacroMap - Map of currently defined macros.
96   StringMap<Macro*> MacroMap;
97
98   /// ActiveMacros - Stack of active macro instantiations.
99   std::vector<MacroInstantiation*> ActiveMacros;
100
101   /// Boolean tracking whether macro substitution is enabled.
102   unsigned MacrosEnabled : 1;
103
104   /// Flag tracking whether any errors have been encountered.
105   unsigned HadError : 1;
106
107 public:
108   AsmParser(const Target &T, SourceMgr &SM, MCContext &Ctx, MCStreamer &Out,
109             const MCAsmInfo &MAI);
110   ~AsmParser();
111
112   virtual bool Run(bool NoInitialTextSection, bool NoFinalize = false);
113
114   void AddDirectiveHandler(MCAsmParserExtension *Object,
115                            StringRef Directive,
116                            DirectiveHandler Handler) {
117     DirectiveMap[Directive] = std::make_pair(Object, Handler);
118   }
119
120 public:
121   /// @name MCAsmParser Interface
122   /// {
123
124   virtual SourceMgr &getSourceManager() { return SrcMgr; }
125   virtual MCAsmLexer &getLexer() { return Lexer; }
126   virtual MCContext &getContext() { return Ctx; }
127   virtual MCStreamer &getStreamer() { return Out; }
128
129   virtual void Warning(SMLoc L, const Twine &Meg);
130   virtual bool Error(SMLoc L, const Twine &Msg);
131
132   const AsmToken &Lex();
133
134   bool ParseExpression(const MCExpr *&Res);
135   virtual bool ParseExpression(const MCExpr *&Res, SMLoc &EndLoc);
136   virtual bool ParseParenExpression(const MCExpr *&Res, SMLoc &EndLoc);
137   virtual bool ParseAbsoluteExpression(int64_t &Res);
138
139   /// }
140
141 private:
142   void CheckForValidSection();
143
144   bool ParseStatement();
145
146   bool HandleMacroEntry(StringRef Name, SMLoc NameLoc, const Macro *M);
147   void HandleMacroExit();
148
149   void PrintMacroInstantiations();
150   void PrintMessage(SMLoc Loc, const Twine &Msg, const char *Type) const {
151     SrcMgr.PrintMessage(Loc, Msg, Type);
152   }
153
154   /// EnterIncludeFile - Enter the specified file. This returns true on failure.
155   bool EnterIncludeFile(const std::string &Filename);
156
157   /// \brief Reset the current lexer position to that given by \arg Loc. The
158   /// current token is not set; clients should ensure Lex() is called
159   /// subsequently.
160   void JumpToLoc(SMLoc Loc);
161
162   void EatToEndOfStatement();
163
164   /// \brief Parse up to the end of statement and a return the contents from the
165   /// current token until the end of the statement; the current token on exit
166   /// will be either the EndOfStatement or EOF.
167   StringRef ParseStringToEndOfStatement();
168
169   bool ParseAssignment(StringRef Name);
170
171   bool ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc);
172   bool ParseBinOpRHS(unsigned Precedence, const MCExpr *&Res, SMLoc &EndLoc);
173   bool ParseParenExpr(const MCExpr *&Res, SMLoc &EndLoc);
174
175   /// ParseIdentifier - Parse an identifier or string (as a quoted identifier)
176   /// and set \arg Res to the identifier contents.
177   bool ParseIdentifier(StringRef &Res);
178
179   // Directive Parsing.
180
181  // ".ascii", ".asciiz", ".string"
182   bool ParseDirectiveAscii(StringRef IDVal, bool ZeroTerminated);
183   bool ParseDirectiveValue(unsigned Size); // ".byte", ".long", ...
184   bool ParseDirectiveRealValue(const fltSemantics &); // ".single", ...
185   bool ParseDirectiveFill(); // ".fill"
186   bool ParseDirectiveSpace(); // ".space"
187   bool ParseDirectiveZero(); // ".zero"
188   bool ParseDirectiveSet(StringRef IDVal); // ".set" or ".equ"
189   bool ParseDirectiveOrg(); // ".org"
190   // ".align{,32}", ".p2align{,w,l}"
191   bool ParseDirectiveAlign(bool IsPow2, unsigned ValueSize);
192
193   /// ParseDirectiveSymbolAttribute - Parse a directive like ".globl" which
194   /// accepts a single symbol (which should be a label or an external).
195   bool ParseDirectiveSymbolAttribute(MCSymbolAttr Attr);
196
197   bool ParseDirectiveComm(bool IsLocal); // ".comm" and ".lcomm"
198
199   bool ParseDirectiveAbort(); // ".abort"
200   bool ParseDirectiveInclude(); // ".include"
201
202   bool ParseDirectiveIf(SMLoc DirectiveLoc); // ".if"
203   bool ParseDirectiveElseIf(SMLoc DirectiveLoc); // ".elseif"
204   bool ParseDirectiveElse(SMLoc DirectiveLoc); // ".else"
205   bool ParseDirectiveEndIf(SMLoc DirectiveLoc); // .endif
206
207   /// ParseEscapedString - Parse the current token as a string which may include
208   /// escaped characters and return the string contents.
209   bool ParseEscapedString(std::string &Data);
210
211   const MCExpr *ApplyModifierToExpr(const MCExpr *E,
212                                     MCSymbolRefExpr::VariantKind Variant);
213 };
214
215 /// \brief Generic implementations of directive handling, etc. which is shared
216 /// (or the default, at least) for all assembler parser.
217 class GenericAsmParser : public MCAsmParserExtension {
218   template<bool (GenericAsmParser::*Handler)(StringRef, SMLoc)>
219   void AddDirectiveHandler(StringRef Directive) {
220     getParser().AddDirectiveHandler(this, Directive,
221                                     HandleDirective<GenericAsmParser, Handler>);
222   }
223
224 public:
225   GenericAsmParser() {}
226
227   AsmParser &getParser() {
228     return (AsmParser&) this->MCAsmParserExtension::getParser();
229   }
230
231   virtual void Initialize(MCAsmParser &Parser) {
232     // Call the base implementation.
233     this->MCAsmParserExtension::Initialize(Parser);
234
235     // Debugging directives.
236     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveFile>(".file");
237     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveLine>(".line");
238     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveLoc>(".loc");
239     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveStabs>(".stabs");
240
241     // CFI directives.
242     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIStartProc>(
243                                                               ".cfi_startproc");
244     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIEndProc>(
245                                                                 ".cfi_endproc");
246     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIDefCfaOffset>(
247                                                          ".cfi_def_cfa_offset");
248     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIDefCfaRegister>(
249                                                        ".cfi_def_cfa_register");
250     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIOffset>(
251                                                                  ".cfi_offset");
252     AddDirectiveHandler<
253      &GenericAsmParser::ParseDirectiveCFIPersonalityOrLsda>(".cfi_personality");
254     AddDirectiveHandler<
255             &GenericAsmParser::ParseDirectiveCFIPersonalityOrLsda>(".cfi_lsda");
256
257     // Macro directives.
258     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveMacrosOnOff>(
259       ".macros_on");
260     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveMacrosOnOff>(
261       ".macros_off");
262     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveMacro>(".macro");
263     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveEndMacro>(".endm");
264     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveEndMacro>(".endmacro");
265
266     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveLEB128>(".sleb128");
267     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveLEB128>(".uleb128");
268   }
269
270   bool ParseDirectiveFile(StringRef, SMLoc DirectiveLoc);
271   bool ParseDirectiveLine(StringRef, SMLoc DirectiveLoc);
272   bool ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc);
273   bool ParseDirectiveStabs(StringRef, SMLoc DirectiveLoc);
274   bool ParseDirectiveCFIStartProc(StringRef, SMLoc DirectiveLoc);
275   bool ParseDirectiveCFIEndProc(StringRef, SMLoc DirectiveLoc);
276   bool ParseDirectiveCFIDefCfaOffset(StringRef, SMLoc DirectiveLoc);
277   bool ParseDirectiveCFIDefCfaRegister(StringRef, SMLoc DirectiveLoc);
278   bool ParseDirectiveCFIOffset(StringRef, SMLoc DirectiveLoc);
279   bool ParseDirectiveCFIPersonalityOrLsda(StringRef, SMLoc DirectiveLoc);
280
281   bool ParseDirectiveMacrosOnOff(StringRef, SMLoc DirectiveLoc);
282   bool ParseDirectiveMacro(StringRef, SMLoc DirectiveLoc);
283   bool ParseDirectiveEndMacro(StringRef, SMLoc DirectiveLoc);
284
285   bool ParseDirectiveLEB128(StringRef, SMLoc);
286 };
287
288 }
289
290 namespace llvm {
291
292 extern MCAsmParserExtension *createDarwinAsmParser();
293 extern MCAsmParserExtension *createELFAsmParser();
294 extern MCAsmParserExtension *createCOFFAsmParser();
295
296 }
297
298 enum { DEFAULT_ADDRSPACE = 0 };
299
300 AsmParser::AsmParser(const Target &T, SourceMgr &_SM, MCContext &_Ctx,
301                      MCStreamer &_Out, const MCAsmInfo &_MAI)
302   : Lexer(_MAI), Ctx(_Ctx), Out(_Out), SrcMgr(_SM),
303     GenericParser(new GenericAsmParser), PlatformParser(0),
304     CurBuffer(0), MacrosEnabled(true) {
305   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer));
306
307   // Initialize the generic parser.
308   GenericParser->Initialize(*this);
309
310   // Initialize the platform / file format parser.
311   //
312   // FIXME: This is a hack, we need to (majorly) cleanup how these objects are
313   // created.
314   if (_MAI.hasMicrosoftFastStdCallMangling()) {
315     PlatformParser = createCOFFAsmParser();
316     PlatformParser->Initialize(*this);
317   } else if (_MAI.hasSubsectionsViaSymbols()) {
318     PlatformParser = createDarwinAsmParser();
319     PlatformParser->Initialize(*this);
320   } else {
321     PlatformParser = createELFAsmParser();
322     PlatformParser->Initialize(*this);
323   }
324 }
325
326 AsmParser::~AsmParser() {
327   assert(ActiveMacros.empty() && "Unexpected active macro instantiation!");
328
329   // Destroy any macros.
330   for (StringMap<Macro*>::iterator it = MacroMap.begin(),
331          ie = MacroMap.end(); it != ie; ++it)
332     delete it->getValue();
333
334   delete PlatformParser;
335   delete GenericParser;
336 }
337
338 void AsmParser::PrintMacroInstantiations() {
339   // Print the active macro instantiation stack.
340   for (std::vector<MacroInstantiation*>::const_reverse_iterator
341          it = ActiveMacros.rbegin(), ie = ActiveMacros.rend(); it != ie; ++it)
342     PrintMessage((*it)->InstantiationLoc, "while in macro instantiation",
343                  "note");
344 }
345
346 void AsmParser::Warning(SMLoc L, const Twine &Msg) {
347   PrintMessage(L, Msg, "warning");
348   PrintMacroInstantiations();
349 }
350
351 bool AsmParser::Error(SMLoc L, const Twine &Msg) {
352   HadError = true;
353   PrintMessage(L, Msg, "error");
354   PrintMacroInstantiations();
355   return true;
356 }
357
358 bool AsmParser::EnterIncludeFile(const std::string &Filename) {
359   int NewBuf = SrcMgr.AddIncludeFile(Filename, Lexer.getLoc());
360   if (NewBuf == -1)
361     return true;
362
363   CurBuffer = NewBuf;
364
365   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer));
366
367   return false;
368 }
369
370 void AsmParser::JumpToLoc(SMLoc Loc) {
371   CurBuffer = SrcMgr.FindBufferContainingLoc(Loc);
372   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer), Loc.getPointer());
373 }
374
375 const AsmToken &AsmParser::Lex() {
376   const AsmToken *tok = &Lexer.Lex();
377
378   if (tok->is(AsmToken::Eof)) {
379     // If this is the end of an included file, pop the parent file off the
380     // include stack.
381     SMLoc ParentIncludeLoc = SrcMgr.getParentIncludeLoc(CurBuffer);
382     if (ParentIncludeLoc != SMLoc()) {
383       JumpToLoc(ParentIncludeLoc);
384       tok = &Lexer.Lex();
385     }
386   }
387
388   if (tok->is(AsmToken::Error))
389     Error(Lexer.getErrLoc(), Lexer.getErr());
390
391   return *tok;
392 }
393
394 bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) {
395   // Create the initial section, if requested.
396   if (!NoInitialTextSection)
397     Out.InitSections();
398
399   // Prime the lexer.
400   Lex();
401
402   HadError = false;
403   AsmCond StartingCondState = TheCondState;
404
405   // While we have input, parse each statement.
406   while (Lexer.isNot(AsmToken::Eof)) {
407     if (!ParseStatement()) continue;
408
409     // We had an error, validate that one was emitted and recover by skipping to
410     // the next line.
411     assert(HadError && "Parse statement returned an error, but none emitted!");
412     EatToEndOfStatement();
413   }
414
415   if (TheCondState.TheCond != StartingCondState.TheCond ||
416       TheCondState.Ignore != StartingCondState.Ignore)
417     return TokError("unmatched .ifs or .elses");
418
419   // Check to see there are no empty DwarfFile slots.
420   const std::vector<MCDwarfFile *> &MCDwarfFiles =
421     getContext().getMCDwarfFiles();
422   for (unsigned i = 1; i < MCDwarfFiles.size(); i++) {
423     if (!MCDwarfFiles[i])
424       TokError("unassigned file number: " + Twine(i) + " for .file directives");
425   }
426
427   // Finalize the output stream if there are no errors and if the client wants
428   // us to.
429   if (!HadError && !NoFinalize)
430     Out.Finish();
431
432   return HadError;
433 }
434
435 void AsmParser::CheckForValidSection() {
436   if (!getStreamer().getCurrentSection()) {
437     TokError("expected section directive before assembly directive");
438     Out.SwitchSection(Ctx.getMachOSection(
439                         "__TEXT", "__text",
440                         MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
441                         0, SectionKind::getText()));
442   }
443 }
444
445 /// EatToEndOfStatement - Throw away the rest of the line for testing purposes.
446 void AsmParser::EatToEndOfStatement() {
447   while (Lexer.isNot(AsmToken::EndOfStatement) &&
448          Lexer.isNot(AsmToken::Eof))
449     Lex();
450
451   // Eat EOL.
452   if (Lexer.is(AsmToken::EndOfStatement))
453     Lex();
454 }
455
456 StringRef AsmParser::ParseStringToEndOfStatement() {
457   const char *Start = getTok().getLoc().getPointer();
458
459   while (Lexer.isNot(AsmToken::EndOfStatement) &&
460          Lexer.isNot(AsmToken::Eof))
461     Lex();
462
463   const char *End = getTok().getLoc().getPointer();
464   return StringRef(Start, End - Start);
465 }
466
467 /// ParseParenExpr - Parse a paren expression and return it.
468 /// NOTE: This assumes the leading '(' has already been consumed.
469 ///
470 /// parenexpr ::= expr)
471 ///
472 bool AsmParser::ParseParenExpr(const MCExpr *&Res, SMLoc &EndLoc) {
473   if (ParseExpression(Res)) return true;
474   if (Lexer.isNot(AsmToken::RParen))
475     return TokError("expected ')' in parentheses expression");
476   EndLoc = Lexer.getLoc();
477   Lex();
478   return false;
479 }
480
481 /// ParsePrimaryExpr - Parse a primary expression and return it.
482 ///  primaryexpr ::= (parenexpr
483 ///  primaryexpr ::= symbol
484 ///  primaryexpr ::= number
485 ///  primaryexpr ::= '.'
486 ///  primaryexpr ::= ~,+,- primaryexpr
487 bool AsmParser::ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
488   switch (Lexer.getKind()) {
489   default:
490     return TokError("unknown token in expression");
491   case AsmToken::Exclaim:
492     Lex(); // Eat the operator.
493     if (ParsePrimaryExpr(Res, EndLoc))
494       return true;
495     Res = MCUnaryExpr::CreateLNot(Res, getContext());
496     return false;
497   case AsmToken::Dollar:
498   case AsmToken::String:
499   case AsmToken::Identifier: {
500     EndLoc = Lexer.getLoc();
501
502     StringRef Identifier;
503     if (ParseIdentifier(Identifier))
504       return false;
505
506     // This is a symbol reference.
507     std::pair<StringRef, StringRef> Split = Identifier.split('@');
508     MCSymbol *Sym = getContext().GetOrCreateSymbol(Split.first);
509
510     // Lookup the symbol variant if used.
511     MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
512     if (Split.first.size() != Identifier.size()) {
513       Variant = MCSymbolRefExpr::getVariantKindForName(Split.second);
514       if (Variant == MCSymbolRefExpr::VK_Invalid) {
515         Variant = MCSymbolRefExpr::VK_None;
516         TokError("invalid variant '" + Split.second + "'");
517       }
518     }
519
520     // If this is an absolute variable reference, substitute it now to preserve
521     // semantics in the face of reassignment.
522     if (Sym->isVariable() && isa<MCConstantExpr>(Sym->getVariableValue())) {
523       if (Variant)
524         return Error(EndLoc, "unexpected modifier on variable reference");
525
526       Res = Sym->getVariableValue();
527       return false;
528     }
529
530     // Otherwise create a symbol ref.
531     Res = MCSymbolRefExpr::Create(Sym, Variant, getContext());
532     return false;
533   }
534   case AsmToken::Integer: {
535     SMLoc Loc = getTok().getLoc();
536     int64_t IntVal = getTok().getIntVal();
537     Res = MCConstantExpr::Create(IntVal, getContext());
538     EndLoc = Lexer.getLoc();
539     Lex(); // Eat token.
540     // Look for 'b' or 'f' following an Integer as a directional label
541     if (Lexer.getKind() == AsmToken::Identifier) {
542       StringRef IDVal = getTok().getString();
543       if (IDVal == "f" || IDVal == "b"){
544         MCSymbol *Sym = Ctx.GetDirectionalLocalSymbol(IntVal,
545                                                       IDVal == "f" ? 1 : 0);
546         Res = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None,
547                                       getContext());
548         if(IDVal == "b" && Sym->isUndefined())
549           return Error(Loc, "invalid reference to undefined symbol");
550         EndLoc = Lexer.getLoc();
551         Lex(); // Eat identifier.
552       }
553     }
554     return false;
555   }
556   case AsmToken::Dot: {
557     // This is a '.' reference, which references the current PC.  Emit a
558     // temporary label to the streamer and refer to it.
559     MCSymbol *Sym = Ctx.CreateTempSymbol();
560     Out.EmitLabel(Sym);
561     Res = MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_None, getContext());
562     EndLoc = Lexer.getLoc();
563     Lex(); // Eat identifier.
564     return false;
565   }
566
567   case AsmToken::LParen:
568     Lex(); // Eat the '('.
569     return ParseParenExpr(Res, EndLoc);
570   case AsmToken::Minus:
571     Lex(); // Eat the operator.
572     if (ParsePrimaryExpr(Res, EndLoc))
573       return true;
574     Res = MCUnaryExpr::CreateMinus(Res, getContext());
575     return false;
576   case AsmToken::Plus:
577     Lex(); // Eat the operator.
578     if (ParsePrimaryExpr(Res, EndLoc))
579       return true;
580     Res = MCUnaryExpr::CreatePlus(Res, getContext());
581     return false;
582   case AsmToken::Tilde:
583     Lex(); // Eat the operator.
584     if (ParsePrimaryExpr(Res, EndLoc))
585       return true;
586     Res = MCUnaryExpr::CreateNot(Res, getContext());
587     return false;
588   }
589 }
590
591 bool AsmParser::ParseExpression(const MCExpr *&Res) {
592   SMLoc EndLoc;
593   return ParseExpression(Res, EndLoc);
594 }
595
596 const MCExpr *
597 AsmParser::ApplyModifierToExpr(const MCExpr *E,
598                                MCSymbolRefExpr::VariantKind Variant) {
599   // Recurse over the given expression, rebuilding it to apply the given variant
600   // if there is exactly one symbol.
601   switch (E->getKind()) {
602   case MCExpr::Target:
603   case MCExpr::Constant:
604     return 0;
605
606   case MCExpr::SymbolRef: {
607     const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E);
608
609     if (SRE->getKind() != MCSymbolRefExpr::VK_None) {
610       TokError("invalid variant on expression '" +
611                getTok().getIdentifier() + "' (already modified)");
612       return E;
613     }
614
615     return MCSymbolRefExpr::Create(&SRE->getSymbol(), Variant, getContext());
616   }
617
618   case MCExpr::Unary: {
619     const MCUnaryExpr *UE = cast<MCUnaryExpr>(E);
620     const MCExpr *Sub = ApplyModifierToExpr(UE->getSubExpr(), Variant);
621     if (!Sub)
622       return 0;
623     return MCUnaryExpr::Create(UE->getOpcode(), Sub, getContext());
624   }
625
626   case MCExpr::Binary: {
627     const MCBinaryExpr *BE = cast<MCBinaryExpr>(E);
628     const MCExpr *LHS = ApplyModifierToExpr(BE->getLHS(), Variant);
629     const MCExpr *RHS = ApplyModifierToExpr(BE->getRHS(), Variant);
630
631     if (!LHS && !RHS)
632       return 0;
633
634     if (!LHS) LHS = BE->getLHS();
635     if (!RHS) RHS = BE->getRHS();
636
637     return MCBinaryExpr::Create(BE->getOpcode(), LHS, RHS, getContext());
638   }
639   }
640
641   assert(0 && "Invalid expression kind!");
642   return 0;
643 }
644
645 /// ParseExpression - Parse an expression and return it.
646 ///
647 ///  expr ::= expr +,- expr          -> lowest.
648 ///  expr ::= expr |,^,&,! expr      -> middle.
649 ///  expr ::= expr *,/,%,<<,>> expr  -> highest.
650 ///  expr ::= primaryexpr
651 ///
652 bool AsmParser::ParseExpression(const MCExpr *&Res, SMLoc &EndLoc) {
653   // Parse the expression.
654   Res = 0;
655   if (ParsePrimaryExpr(Res, EndLoc) || ParseBinOpRHS(1, Res, EndLoc))
656     return true;
657
658   // As a special case, we support 'a op b @ modifier' by rewriting the
659   // expression to include the modifier. This is inefficient, but in general we
660   // expect users to use 'a@modifier op b'.
661   if (Lexer.getKind() == AsmToken::At) {
662     Lex();
663
664     if (Lexer.isNot(AsmToken::Identifier))
665       return TokError("unexpected symbol modifier following '@'");
666
667     MCSymbolRefExpr::VariantKind Variant =
668       MCSymbolRefExpr::getVariantKindForName(getTok().getIdentifier());
669     if (Variant == MCSymbolRefExpr::VK_Invalid)
670       return TokError("invalid variant '" + getTok().getIdentifier() + "'");
671
672     const MCExpr *ModifiedRes = ApplyModifierToExpr(Res, Variant);
673     if (!ModifiedRes) {
674       return TokError("invalid modifier '" + getTok().getIdentifier() +
675                       "' (no symbols present)");
676       return true;
677     }
678
679     Res = ModifiedRes;
680     Lex();
681   }
682
683   // Try to constant fold it up front, if possible.
684   int64_t Value;
685   if (Res->EvaluateAsAbsolute(Value))
686     Res = MCConstantExpr::Create(Value, getContext());
687
688   return false;
689 }
690
691 bool AsmParser::ParseParenExpression(const MCExpr *&Res, SMLoc &EndLoc) {
692   Res = 0;
693   return ParseParenExpr(Res, EndLoc) ||
694          ParseBinOpRHS(1, Res, EndLoc);
695 }
696
697 bool AsmParser::ParseAbsoluteExpression(int64_t &Res) {
698   const MCExpr *Expr;
699
700   SMLoc StartLoc = Lexer.getLoc();
701   if (ParseExpression(Expr))
702     return true;
703
704   if (!Expr->EvaluateAsAbsolute(Res))
705     return Error(StartLoc, "expected absolute expression");
706
707   return false;
708 }
709
710 static unsigned getBinOpPrecedence(AsmToken::TokenKind K,
711                                    MCBinaryExpr::Opcode &Kind) {
712   switch (K) {
713   default:
714     return 0;    // not a binop.
715
716     // Lowest Precedence: &&, ||, @
717   case AsmToken::AmpAmp:
718     Kind = MCBinaryExpr::LAnd;
719     return 1;
720   case AsmToken::PipePipe:
721     Kind = MCBinaryExpr::LOr;
722     return 1;
723
724
725     // Low Precedence: |, &, ^
726     //
727     // FIXME: gas seems to support '!' as an infix operator?
728   case AsmToken::Pipe:
729     Kind = MCBinaryExpr::Or;
730     return 2;
731   case AsmToken::Caret:
732     Kind = MCBinaryExpr::Xor;
733     return 2;
734   case AsmToken::Amp:
735     Kind = MCBinaryExpr::And;
736     return 2;
737
738     // Low Intermediate Precedence: ==, !=, <>, <, <=, >, >=
739   case AsmToken::EqualEqual:
740     Kind = MCBinaryExpr::EQ;
741     return 3;
742   case AsmToken::ExclaimEqual:
743   case AsmToken::LessGreater:
744     Kind = MCBinaryExpr::NE;
745     return 3;
746   case AsmToken::Less:
747     Kind = MCBinaryExpr::LT;
748     return 3;
749   case AsmToken::LessEqual:
750     Kind = MCBinaryExpr::LTE;
751     return 3;
752   case AsmToken::Greater:
753     Kind = MCBinaryExpr::GT;
754     return 3;
755   case AsmToken::GreaterEqual:
756     Kind = MCBinaryExpr::GTE;
757     return 3;
758
759     // High Intermediate Precedence: +, -
760   case AsmToken::Plus:
761     Kind = MCBinaryExpr::Add;
762     return 4;
763   case AsmToken::Minus:
764     Kind = MCBinaryExpr::Sub;
765     return 4;
766
767     // Highest Precedence: *, /, %, <<, >>
768   case AsmToken::Star:
769     Kind = MCBinaryExpr::Mul;
770     return 5;
771   case AsmToken::Slash:
772     Kind = MCBinaryExpr::Div;
773     return 5;
774   case AsmToken::Percent:
775     Kind = MCBinaryExpr::Mod;
776     return 5;
777   case AsmToken::LessLess:
778     Kind = MCBinaryExpr::Shl;
779     return 5;
780   case AsmToken::GreaterGreater:
781     Kind = MCBinaryExpr::Shr;
782     return 5;
783   }
784 }
785
786
787 /// ParseBinOpRHS - Parse all binary operators with precedence >= 'Precedence'.
788 /// Res contains the LHS of the expression on input.
789 bool AsmParser::ParseBinOpRHS(unsigned Precedence, const MCExpr *&Res,
790                               SMLoc &EndLoc) {
791   while (1) {
792     MCBinaryExpr::Opcode Kind = MCBinaryExpr::Add;
793     unsigned TokPrec = getBinOpPrecedence(Lexer.getKind(), Kind);
794
795     // If the next token is lower precedence than we are allowed to eat, return
796     // successfully with what we ate already.
797     if (TokPrec < Precedence)
798       return false;
799
800     Lex();
801
802     // Eat the next primary expression.
803     const MCExpr *RHS;
804     if (ParsePrimaryExpr(RHS, EndLoc)) return true;
805
806     // If BinOp binds less tightly with RHS than the operator after RHS, let
807     // the pending operator take RHS as its LHS.
808     MCBinaryExpr::Opcode Dummy;
809     unsigned NextTokPrec = getBinOpPrecedence(Lexer.getKind(), Dummy);
810     if (TokPrec < NextTokPrec) {
811       if (ParseBinOpRHS(Precedence+1, RHS, EndLoc)) return true;
812     }
813
814     // Merge LHS and RHS according to operator.
815     Res = MCBinaryExpr::Create(Kind, Res, RHS, getContext());
816   }
817 }
818
819
820
821
822 /// ParseStatement:
823 ///   ::= EndOfStatement
824 ///   ::= Label* Directive ...Operands... EndOfStatement
825 ///   ::= Label* Identifier OperandList* EndOfStatement
826 bool AsmParser::ParseStatement() {
827   if (Lexer.is(AsmToken::EndOfStatement)) {
828     Out.AddBlankLine();
829     Lex();
830     return false;
831   }
832
833   // Statements always start with an identifier.
834   AsmToken ID = getTok();
835   SMLoc IDLoc = ID.getLoc();
836   StringRef IDVal;
837   int64_t LocalLabelVal = -1;
838   // GUESS allow an integer followed by a ':' as a directional local label
839   if (Lexer.is(AsmToken::Integer)) {
840     LocalLabelVal = getTok().getIntVal();
841     if (LocalLabelVal < 0) {
842       if (!TheCondState.Ignore)
843         return TokError("unexpected token at start of statement");
844       IDVal = "";
845     }
846     else {
847       IDVal = getTok().getString();
848       Lex(); // Consume the integer token to be used as an identifier token.
849       if (Lexer.getKind() != AsmToken::Colon) {
850         if (!TheCondState.Ignore)
851           return TokError("unexpected token at start of statement");
852       }
853     }
854   }
855   else if (ParseIdentifier(IDVal)) {
856     if (!TheCondState.Ignore)
857       return TokError("unexpected token at start of statement");
858     IDVal = "";
859   }
860
861   // Handle conditional assembly here before checking for skipping.  We
862   // have to do this so that .endif isn't skipped in a ".if 0" block for
863   // example.
864   if (IDVal == ".if")
865     return ParseDirectiveIf(IDLoc);
866   if (IDVal == ".elseif")
867     return ParseDirectiveElseIf(IDLoc);
868   if (IDVal == ".else")
869     return ParseDirectiveElse(IDLoc);
870   if (IDVal == ".endif")
871     return ParseDirectiveEndIf(IDLoc);
872
873   // If we are in a ".if 0" block, ignore this statement.
874   if (TheCondState.Ignore) {
875     EatToEndOfStatement();
876     return false;
877   }
878
879   // FIXME: Recurse on local labels?
880
881   // See what kind of statement we have.
882   switch (Lexer.getKind()) {
883   case AsmToken::Colon: {
884     CheckForValidSection();
885
886     // identifier ':'   -> Label.
887     Lex();
888
889     // Diagnose attempt to use a variable as a label.
890     //
891     // FIXME: Diagnostics. Note the location of the definition as a label.
892     // FIXME: This doesn't diagnose assignment to a symbol which has been
893     // implicitly marked as external.
894     MCSymbol *Sym;
895     if (LocalLabelVal == -1)
896       Sym = getContext().GetOrCreateSymbol(IDVal);
897     else
898       Sym = Ctx.CreateDirectionalLocalSymbol(LocalLabelVal);
899     if (!Sym->isUndefined() || Sym->isVariable())
900       return Error(IDLoc, "invalid symbol redefinition");
901
902     // Emit the label.
903     Out.EmitLabel(Sym);
904
905     // Consume any end of statement token, if present, to avoid spurious
906     // AddBlankLine calls().
907     if (Lexer.is(AsmToken::EndOfStatement)) {
908       Lex();
909       if (Lexer.is(AsmToken::Eof))
910         return false;
911     }
912
913     return ParseStatement();
914   }
915
916   case AsmToken::Equal:
917     // identifier '=' ... -> assignment statement
918     Lex();
919
920     return ParseAssignment(IDVal);
921
922   default: // Normal instruction or directive.
923     break;
924   }
925
926   // If macros are enabled, check to see if this is a macro instantiation.
927   if (MacrosEnabled)
928     if (const Macro *M = MacroMap.lookup(IDVal))
929       return HandleMacroEntry(IDVal, IDLoc, M);
930
931   // Otherwise, we have a normal instruction or directive.
932   if (IDVal[0] == '.') {
933     // Assembler features
934     if (IDVal == ".set" || IDVal == ".equ")
935       return ParseDirectiveSet(IDVal);
936
937     // Data directives
938
939     if (IDVal == ".ascii")
940       return ParseDirectiveAscii(IDVal, false);
941     if (IDVal == ".asciz" || IDVal == ".string")
942       return ParseDirectiveAscii(IDVal, true);
943
944     if (IDVal == ".byte")
945       return ParseDirectiveValue(1);
946     if (IDVal == ".short")
947       return ParseDirectiveValue(2);
948     if (IDVal == ".value")
949       return ParseDirectiveValue(2);
950     if (IDVal == ".long")
951       return ParseDirectiveValue(4);
952     if (IDVal == ".quad")
953       return ParseDirectiveValue(8);
954     if (IDVal == ".single")
955       return ParseDirectiveRealValue(APFloat::IEEEsingle);
956     if (IDVal == ".double")
957       return ParseDirectiveRealValue(APFloat::IEEEdouble);
958
959     if (IDVal == ".align") {
960       bool IsPow2 = !getContext().getAsmInfo().getAlignmentIsInBytes();
961       return ParseDirectiveAlign(IsPow2, /*ExprSize=*/1);
962     }
963     if (IDVal == ".align32") {
964       bool IsPow2 = !getContext().getAsmInfo().getAlignmentIsInBytes();
965       return ParseDirectiveAlign(IsPow2, /*ExprSize=*/4);
966     }
967     if (IDVal == ".balign")
968       return ParseDirectiveAlign(/*IsPow2=*/false, /*ExprSize=*/1);
969     if (IDVal == ".balignw")
970       return ParseDirectiveAlign(/*IsPow2=*/false, /*ExprSize=*/2);
971     if (IDVal == ".balignl")
972       return ParseDirectiveAlign(/*IsPow2=*/false, /*ExprSize=*/4);
973     if (IDVal == ".p2align")
974       return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/1);
975     if (IDVal == ".p2alignw")
976       return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/2);
977     if (IDVal == ".p2alignl")
978       return ParseDirectiveAlign(/*IsPow2=*/true, /*ExprSize=*/4);
979
980     if (IDVal == ".org")
981       return ParseDirectiveOrg();
982
983     if (IDVal == ".fill")
984       return ParseDirectiveFill();
985     if (IDVal == ".space")
986       return ParseDirectiveSpace();
987     if (IDVal == ".zero")
988       return ParseDirectiveZero();
989
990     // Symbol attribute directives
991
992     if (IDVal == ".globl" || IDVal == ".global")
993       return ParseDirectiveSymbolAttribute(MCSA_Global);
994     // ELF only? Should it be here?
995     if (IDVal == ".local")
996       return ParseDirectiveSymbolAttribute(MCSA_Local);
997     if (IDVal == ".hidden")
998       return ParseDirectiveSymbolAttribute(MCSA_Hidden);
999     if (IDVal == ".indirect_symbol")
1000       return ParseDirectiveSymbolAttribute(MCSA_IndirectSymbol);
1001     if (IDVal == ".internal")
1002       return ParseDirectiveSymbolAttribute(MCSA_Internal);
1003     if (IDVal == ".lazy_reference")
1004       return ParseDirectiveSymbolAttribute(MCSA_LazyReference);
1005     if (IDVal == ".no_dead_strip")
1006       return ParseDirectiveSymbolAttribute(MCSA_NoDeadStrip);
1007     if (IDVal == ".private_extern")
1008       return ParseDirectiveSymbolAttribute(MCSA_PrivateExtern);
1009     if (IDVal == ".protected")
1010       return ParseDirectiveSymbolAttribute(MCSA_Protected);
1011     if (IDVal == ".reference")
1012       return ParseDirectiveSymbolAttribute(MCSA_Reference);
1013     if (IDVal == ".weak")
1014       return ParseDirectiveSymbolAttribute(MCSA_Weak);
1015     if (IDVal == ".weak_definition")
1016       return ParseDirectiveSymbolAttribute(MCSA_WeakDefinition);
1017     if (IDVal == ".weak_reference")
1018       return ParseDirectiveSymbolAttribute(MCSA_WeakReference);
1019     if (IDVal == ".weak_def_can_be_hidden")
1020       return ParseDirectiveSymbolAttribute(MCSA_WeakDefAutoPrivate);
1021
1022     if (IDVal == ".comm")
1023       return ParseDirectiveComm(/*IsLocal=*/false);
1024     if (IDVal == ".lcomm")
1025       return ParseDirectiveComm(/*IsLocal=*/true);
1026
1027     if (IDVal == ".abort")
1028       return ParseDirectiveAbort();
1029     if (IDVal == ".include")
1030       return ParseDirectiveInclude();
1031
1032     // Look up the handler in the handler table.
1033     std::pair<MCAsmParserExtension*, DirectiveHandler> Handler =
1034       DirectiveMap.lookup(IDVal);
1035     if (Handler.first)
1036       return (*Handler.second)(Handler.first, IDVal, IDLoc);
1037
1038     // Target hook for parsing target specific directives.
1039     if (!getTargetParser().ParseDirective(ID))
1040       return false;
1041
1042     Warning(IDLoc, "ignoring directive for now");
1043     EatToEndOfStatement();
1044     return false;
1045   }
1046
1047   CheckForValidSection();
1048
1049   // Canonicalize the opcode to lower case.
1050   SmallString<128> Opcode;
1051   for (unsigned i = 0, e = IDVal.size(); i != e; ++i)
1052     Opcode.push_back(tolower(IDVal[i]));
1053
1054   SmallVector<MCParsedAsmOperand*, 8> ParsedOperands;
1055   bool HadError = getTargetParser().ParseInstruction(Opcode.str(), IDLoc,
1056                                                      ParsedOperands);
1057
1058   // Dump the parsed representation, if requested.
1059   if (getShowParsedOperands()) {
1060     SmallString<256> Str;
1061     raw_svector_ostream OS(Str);
1062     OS << "parsed instruction: [";
1063     for (unsigned i = 0; i != ParsedOperands.size(); ++i) {
1064       if (i != 0)
1065         OS << ", ";
1066       ParsedOperands[i]->dump(OS);
1067     }
1068     OS << "]";
1069
1070     PrintMessage(IDLoc, OS.str(), "note");
1071   }
1072
1073   // If parsing succeeded, match the instruction.
1074   if (!HadError)
1075     HadError = getTargetParser().MatchAndEmitInstruction(IDLoc, ParsedOperands,
1076                                                          Out);
1077
1078   // Free any parsed operands.
1079   for (unsigned i = 0, e = ParsedOperands.size(); i != e; ++i)
1080     delete ParsedOperands[i];
1081
1082   // Don't skip the rest of the line, the instruction parser is responsible for
1083   // that.
1084   return false;
1085 }
1086
1087 MacroInstantiation::MacroInstantiation(const Macro *M, SMLoc IL, SMLoc EL,
1088                                    const std::vector<std::vector<AsmToken> > &A)
1089   : TheMacro(M), InstantiationLoc(IL), ExitLoc(EL)
1090 {
1091   // Macro instantiation is lexical, unfortunately. We construct a new buffer
1092   // to hold the macro body with substitutions.
1093   SmallString<256> Buf;
1094   raw_svector_ostream OS(Buf);
1095
1096   StringRef Body = M->Body;
1097   while (!Body.empty()) {
1098     // Scan for the next substitution.
1099     std::size_t End = Body.size(), Pos = 0;
1100     for (; Pos != End; ++Pos) {
1101       // Check for a substitution or escape.
1102       if (Body[Pos] != '$' || Pos + 1 == End)
1103         continue;
1104
1105       char Next = Body[Pos + 1];
1106       if (Next == '$' || Next == 'n' || isdigit(Next))
1107         break;
1108     }
1109
1110     // Add the prefix.
1111     OS << Body.slice(0, Pos);
1112
1113     // Check if we reached the end.
1114     if (Pos == End)
1115       break;
1116
1117     switch (Body[Pos+1]) {
1118        // $$ => $
1119     case '$':
1120       OS << '$';
1121       break;
1122
1123       // $n => number of arguments
1124     case 'n':
1125       OS << A.size();
1126       break;
1127
1128        // $[0-9] => argument
1129     default: {
1130       // Missing arguments are ignored.
1131       unsigned Index = Body[Pos+1] - '0';
1132       if (Index >= A.size())
1133         break;
1134
1135       // Otherwise substitute with the token values, with spaces eliminated.
1136       for (std::vector<AsmToken>::const_iterator it = A[Index].begin(),
1137              ie = A[Index].end(); it != ie; ++it)
1138         OS << it->getString();
1139       break;
1140     }
1141     }
1142
1143     // Update the scan point.
1144     Body = Body.substr(Pos + 2);
1145   }
1146
1147   // We include the .endmacro in the buffer as our queue to exit the macro
1148   // instantiation.
1149   OS << ".endmacro\n";
1150
1151   Instantiation = MemoryBuffer::getMemBufferCopy(OS.str(), "<instantiation>");
1152 }
1153
1154 bool AsmParser::HandleMacroEntry(StringRef Name, SMLoc NameLoc,
1155                                  const Macro *M) {
1156   // Arbitrarily limit macro nesting depth, to match 'as'. We can eliminate
1157   // this, although we should protect against infinite loops.
1158   if (ActiveMacros.size() == 20)
1159     return TokError("macros cannot be nested more than 20 levels deep");
1160
1161   // Parse the macro instantiation arguments.
1162   std::vector<std::vector<AsmToken> > MacroArguments;
1163   MacroArguments.push_back(std::vector<AsmToken>());
1164   unsigned ParenLevel = 0;
1165   for (;;) {
1166     if (Lexer.is(AsmToken::Eof))
1167       return TokError("unexpected token in macro instantiation");
1168     if (Lexer.is(AsmToken::EndOfStatement))
1169       break;
1170
1171     // If we aren't inside parentheses and this is a comma, start a new token
1172     // list.
1173     if (ParenLevel == 0 && Lexer.is(AsmToken::Comma)) {
1174       MacroArguments.push_back(std::vector<AsmToken>());
1175     } else {
1176       // Adjust the current parentheses level.
1177       if (Lexer.is(AsmToken::LParen))
1178         ++ParenLevel;
1179       else if (Lexer.is(AsmToken::RParen) && ParenLevel)
1180         --ParenLevel;
1181
1182       // Append the token to the current argument list.
1183       MacroArguments.back().push_back(getTok());
1184     }
1185     Lex();
1186   }
1187
1188   // Create the macro instantiation object and add to the current macro
1189   // instantiation stack.
1190   MacroInstantiation *MI = new MacroInstantiation(M, NameLoc,
1191                                                   getTok().getLoc(),
1192                                                   MacroArguments);
1193   ActiveMacros.push_back(MI);
1194
1195   // Jump to the macro instantiation and prime the lexer.
1196   CurBuffer = SrcMgr.AddNewSourceBuffer(MI->Instantiation, SMLoc());
1197   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer));
1198   Lex();
1199
1200   return false;
1201 }
1202
1203 void AsmParser::HandleMacroExit() {
1204   // Jump to the EndOfStatement we should return to, and consume it.
1205   JumpToLoc(ActiveMacros.back()->ExitLoc);
1206   Lex();
1207
1208   // Pop the instantiation entry.
1209   delete ActiveMacros.back();
1210   ActiveMacros.pop_back();
1211 }
1212
1213 static void MarkUsed(const MCExpr *Value) {
1214   switch (Value->getKind()) {
1215   case MCExpr::Binary:
1216     MarkUsed(static_cast<const MCBinaryExpr*>(Value)->getLHS());
1217     MarkUsed(static_cast<const MCBinaryExpr*>(Value)->getRHS());
1218     break;
1219   case MCExpr::Target:
1220   case MCExpr::Constant:
1221     break;
1222   case MCExpr::SymbolRef: {
1223     static_cast<const MCSymbolRefExpr*>(Value)->getSymbol().setUsed(true);
1224     break;
1225   }
1226   case MCExpr::Unary:
1227     MarkUsed(static_cast<const MCUnaryExpr*>(Value)->getSubExpr());
1228     break;
1229   }
1230 }
1231
1232 bool AsmParser::ParseAssignment(StringRef Name) {
1233   // FIXME: Use better location, we should use proper tokens.
1234   SMLoc EqualLoc = Lexer.getLoc();
1235
1236   const MCExpr *Value;
1237   if (ParseExpression(Value))
1238     return true;
1239
1240   MarkUsed(Value);
1241
1242   if (Lexer.isNot(AsmToken::EndOfStatement))
1243     return TokError("unexpected token in assignment");
1244
1245   // Eat the end of statement marker.
1246   Lex();
1247
1248   // Validate that the LHS is allowed to be a variable (either it has not been
1249   // used as a symbol, or it is an absolute symbol).
1250   MCSymbol *Sym = getContext().LookupSymbol(Name);
1251   if (Sym) {
1252     // Diagnose assignment to a label.
1253     //
1254     // FIXME: Diagnostics. Note the location of the definition as a label.
1255     // FIXME: Diagnose assignment to protected identifier (e.g., register name).
1256     if (Sym->isUndefined() && !Sym->isUsed() && !Sym->isVariable())
1257       ; // Allow redefinitions of undefined symbols only used in directives.
1258     else if (!Sym->isUndefined() && !Sym->isAbsolute())
1259       return Error(EqualLoc, "redefinition of '" + Name + "'");
1260     else if (!Sym->isVariable())
1261       return Error(EqualLoc, "invalid assignment to '" + Name + "'");
1262     else if (!isa<MCConstantExpr>(Sym->getVariableValue()))
1263       return Error(EqualLoc, "invalid reassignment of non-absolute variable '" +
1264                    Name + "'");
1265
1266     // Don't count these checks as uses.
1267     Sym->setUsed(false);
1268   } else
1269     Sym = getContext().GetOrCreateSymbol(Name);
1270
1271   // FIXME: Handle '.'.
1272
1273   // Do the assignment.
1274   Out.EmitAssignment(Sym, Value);
1275
1276   return false;
1277 }
1278
1279 /// ParseIdentifier:
1280 ///   ::= identifier
1281 ///   ::= string
1282 bool AsmParser::ParseIdentifier(StringRef &Res) {
1283   // The assembler has relaxed rules for accepting identifiers, in particular we
1284   // allow things like '.globl $foo', which would normally be separate
1285   // tokens. At this level, we have already lexed so we cannot (currently)
1286   // handle this as a context dependent token, instead we detect adjacent tokens
1287   // and return the combined identifier.
1288   if (Lexer.is(AsmToken::Dollar)) {
1289     SMLoc DollarLoc = getLexer().getLoc();
1290
1291     // Consume the dollar sign, and check for a following identifier.
1292     Lex();
1293     if (Lexer.isNot(AsmToken::Identifier))
1294       return true;
1295
1296     // We have a '$' followed by an identifier, make sure they are adjacent.
1297     if (DollarLoc.getPointer() + 1 != getTok().getLoc().getPointer())
1298       return true;
1299
1300     // Construct the joined identifier and consume the token.
1301     Res = StringRef(DollarLoc.getPointer(),
1302                     getTok().getIdentifier().size() + 1);
1303     Lex();
1304     return false;
1305   }
1306
1307   if (Lexer.isNot(AsmToken::Identifier) &&
1308       Lexer.isNot(AsmToken::String))
1309     return true;
1310
1311   Res = getTok().getIdentifier();
1312
1313   Lex(); // Consume the identifier token.
1314
1315   return false;
1316 }
1317
1318 /// ParseDirectiveSet:
1319 ///   ::= .set identifier ',' expression
1320 bool AsmParser::ParseDirectiveSet(StringRef IDVal) {
1321   StringRef Name;
1322
1323   if (ParseIdentifier(Name))
1324     return TokError("expected identifier after '" + Twine(IDVal) + "'");
1325
1326   if (getLexer().isNot(AsmToken::Comma))
1327     return TokError("unexpected token in '" + Twine(IDVal) + "'");
1328   Lex();
1329
1330   return ParseAssignment(Name);
1331 }
1332
1333 bool AsmParser::ParseEscapedString(std::string &Data) {
1334   assert(getLexer().is(AsmToken::String) && "Unexpected current token!");
1335
1336   Data = "";
1337   StringRef Str = getTok().getStringContents();
1338   for (unsigned i = 0, e = Str.size(); i != e; ++i) {
1339     if (Str[i] != '\\') {
1340       Data += Str[i];
1341       continue;
1342     }
1343
1344     // Recognize escaped characters. Note that this escape semantics currently
1345     // loosely follows Darwin 'as'. Notably, it doesn't support hex escapes.
1346     ++i;
1347     if (i == e)
1348       return TokError("unexpected backslash at end of string");
1349
1350     // Recognize octal sequences.
1351     if ((unsigned) (Str[i] - '0') <= 7) {
1352       // Consume up to three octal characters.
1353       unsigned Value = Str[i] - '0';
1354
1355       if (i + 1 != e && ((unsigned) (Str[i + 1] - '0')) <= 7) {
1356         ++i;
1357         Value = Value * 8 + (Str[i] - '0');
1358
1359         if (i + 1 != e && ((unsigned) (Str[i + 1] - '0')) <= 7) {
1360           ++i;
1361           Value = Value * 8 + (Str[i] - '0');
1362         }
1363       }
1364
1365       if (Value > 255)
1366         return TokError("invalid octal escape sequence (out of range)");
1367
1368       Data += (unsigned char) Value;
1369       continue;
1370     }
1371
1372     // Otherwise recognize individual escapes.
1373     switch (Str[i]) {
1374     default:
1375       // Just reject invalid escape sequences for now.
1376       return TokError("invalid escape sequence (unrecognized character)");
1377
1378     case 'b': Data += '\b'; break;
1379     case 'f': Data += '\f'; break;
1380     case 'n': Data += '\n'; break;
1381     case 'r': Data += '\r'; break;
1382     case 't': Data += '\t'; break;
1383     case '"': Data += '"'; break;
1384     case '\\': Data += '\\'; break;
1385     }
1386   }
1387
1388   return false;
1389 }
1390
1391 /// ParseDirectiveAscii:
1392 ///   ::= ( .ascii | .asciz | .string ) [ "string" ( , "string" )* ]
1393 bool AsmParser::ParseDirectiveAscii(StringRef IDVal, bool ZeroTerminated) {
1394   if (getLexer().isNot(AsmToken::EndOfStatement)) {
1395     CheckForValidSection();
1396
1397     for (;;) {
1398       if (getLexer().isNot(AsmToken::String))
1399         return TokError("expected string in '" + Twine(IDVal) + "' directive");
1400
1401       std::string Data;
1402       if (ParseEscapedString(Data))
1403         return true;
1404
1405       getStreamer().EmitBytes(Data, DEFAULT_ADDRSPACE);
1406       if (ZeroTerminated)
1407         getStreamer().EmitBytes(StringRef("\0", 1), DEFAULT_ADDRSPACE);
1408
1409       Lex();
1410
1411       if (getLexer().is(AsmToken::EndOfStatement))
1412         break;
1413
1414       if (getLexer().isNot(AsmToken::Comma))
1415         return TokError("unexpected token in '" + Twine(IDVal) + "' directive");
1416       Lex();
1417     }
1418   }
1419
1420   Lex();
1421   return false;
1422 }
1423
1424 /// ParseDirectiveValue
1425 ///  ::= (.byte | .short | ... ) [ expression (, expression)* ]
1426 bool AsmParser::ParseDirectiveValue(unsigned Size) {
1427   if (getLexer().isNot(AsmToken::EndOfStatement)) {
1428     CheckForValidSection();
1429
1430     for (;;) {
1431       const MCExpr *Value;
1432       if (ParseExpression(Value))
1433         return true;
1434
1435       // Special case constant expressions to match code generator.
1436       if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value))
1437         getStreamer().EmitIntValue(MCE->getValue(), Size, DEFAULT_ADDRSPACE);
1438       else
1439         getStreamer().EmitValue(Value, Size, DEFAULT_ADDRSPACE);
1440
1441       if (getLexer().is(AsmToken::EndOfStatement))
1442         break;
1443
1444       // FIXME: Improve diagnostic.
1445       if (getLexer().isNot(AsmToken::Comma))
1446         return TokError("unexpected token in directive");
1447       Lex();
1448     }
1449   }
1450
1451   Lex();
1452   return false;
1453 }
1454
1455 /// ParseDirectiveRealValue
1456 ///  ::= (.single | .double) [ expression (, expression)* ]
1457 bool AsmParser::ParseDirectiveRealValue(const fltSemantics &Semantics) {
1458   if (getLexer().isNot(AsmToken::EndOfStatement)) {
1459     CheckForValidSection();
1460
1461     for (;;) {
1462       // We don't truly support arithmetic on floating point expressions, so we
1463       // have to manually parse unary prefixes.
1464       bool IsNeg = false;
1465       if (getLexer().is(AsmToken::Minus)) {
1466         Lex();
1467         IsNeg = true;
1468       } else if (getLexer().is(AsmToken::Plus))
1469         Lex();
1470
1471       if (getLexer().isNot(AsmToken::Integer) &&
1472           getLexer().isNot(AsmToken::Real))
1473         return TokError("unexpected token in directive");
1474
1475       // Convert to an APFloat.
1476       APFloat Value(Semantics);
1477       if (Value.convertFromString(getTok().getString(),
1478                                   APFloat::rmNearestTiesToEven) ==
1479           APFloat::opInvalidOp)
1480         return TokError("invalid floating point literal");
1481       if (IsNeg)
1482         Value.changeSign();
1483
1484       // Consume the numeric token.
1485       Lex();
1486
1487       // Emit the value as an integer.
1488       APInt AsInt = Value.bitcastToAPInt();
1489       getStreamer().EmitIntValue(AsInt.getLimitedValue(),
1490                                  AsInt.getBitWidth() / 8, DEFAULT_ADDRSPACE);
1491
1492       if (getLexer().is(AsmToken::EndOfStatement))
1493         break;
1494
1495       if (getLexer().isNot(AsmToken::Comma))
1496         return TokError("unexpected token in directive");
1497       Lex();
1498     }
1499   }
1500
1501   Lex();
1502   return false;
1503 }
1504
1505 /// ParseDirectiveSpace
1506 ///  ::= .space expression [ , expression ]
1507 bool AsmParser::ParseDirectiveSpace() {
1508   CheckForValidSection();
1509
1510   int64_t NumBytes;
1511   if (ParseAbsoluteExpression(NumBytes))
1512     return true;
1513
1514   int64_t FillExpr = 0;
1515   if (getLexer().isNot(AsmToken::EndOfStatement)) {
1516     if (getLexer().isNot(AsmToken::Comma))
1517       return TokError("unexpected token in '.space' directive");
1518     Lex();
1519
1520     if (ParseAbsoluteExpression(FillExpr))
1521       return true;
1522
1523     if (getLexer().isNot(AsmToken::EndOfStatement))
1524       return TokError("unexpected token in '.space' directive");
1525   }
1526
1527   Lex();
1528
1529   if (NumBytes <= 0)
1530     return TokError("invalid number of bytes in '.space' directive");
1531
1532   // FIXME: Sometimes the fill expr is 'nop' if it isn't supplied, instead of 0.
1533   getStreamer().EmitFill(NumBytes, FillExpr, DEFAULT_ADDRSPACE);
1534
1535   return false;
1536 }
1537
1538 /// ParseDirectiveZero
1539 ///  ::= .zero expression
1540 bool AsmParser::ParseDirectiveZero() {
1541   CheckForValidSection();
1542
1543   int64_t NumBytes;
1544   if (ParseAbsoluteExpression(NumBytes))
1545     return true;
1546
1547   int64_t Val = 0;
1548   if (getLexer().is(AsmToken::Comma)) {
1549     Lex();
1550     if (ParseAbsoluteExpression(Val))
1551       return true;
1552   }
1553
1554   if (getLexer().isNot(AsmToken::EndOfStatement))
1555     return TokError("unexpected token in '.zero' directive");
1556
1557   Lex();
1558
1559   getStreamer().EmitFill(NumBytes, Val, DEFAULT_ADDRSPACE);
1560
1561   return false;
1562 }
1563
1564 /// ParseDirectiveFill
1565 ///  ::= .fill expression , expression , expression
1566 bool AsmParser::ParseDirectiveFill() {
1567   CheckForValidSection();
1568
1569   int64_t NumValues;
1570   if (ParseAbsoluteExpression(NumValues))
1571     return true;
1572
1573   if (getLexer().isNot(AsmToken::Comma))
1574     return TokError("unexpected token in '.fill' directive");
1575   Lex();
1576
1577   int64_t FillSize;
1578   if (ParseAbsoluteExpression(FillSize))
1579     return true;
1580
1581   if (getLexer().isNot(AsmToken::Comma))
1582     return TokError("unexpected token in '.fill' directive");
1583   Lex();
1584
1585   int64_t FillExpr;
1586   if (ParseAbsoluteExpression(FillExpr))
1587     return true;
1588
1589   if (getLexer().isNot(AsmToken::EndOfStatement))
1590     return TokError("unexpected token in '.fill' directive");
1591
1592   Lex();
1593
1594   if (FillSize != 1 && FillSize != 2 && FillSize != 4 && FillSize != 8)
1595     return TokError("invalid '.fill' size, expected 1, 2, 4, or 8");
1596
1597   for (uint64_t i = 0, e = NumValues; i != e; ++i)
1598     getStreamer().EmitIntValue(FillExpr, FillSize, DEFAULT_ADDRSPACE);
1599
1600   return false;
1601 }
1602
1603 /// ParseDirectiveOrg
1604 ///  ::= .org expression [ , expression ]
1605 bool AsmParser::ParseDirectiveOrg() {
1606   CheckForValidSection();
1607
1608   const MCExpr *Offset;
1609   if (ParseExpression(Offset))
1610     return true;
1611
1612   // Parse optional fill expression.
1613   int64_t FillExpr = 0;
1614   if (getLexer().isNot(AsmToken::EndOfStatement)) {
1615     if (getLexer().isNot(AsmToken::Comma))
1616       return TokError("unexpected token in '.org' directive");
1617     Lex();
1618
1619     if (ParseAbsoluteExpression(FillExpr))
1620       return true;
1621
1622     if (getLexer().isNot(AsmToken::EndOfStatement))
1623       return TokError("unexpected token in '.org' directive");
1624   }
1625
1626   Lex();
1627
1628   // FIXME: Only limited forms of relocatable expressions are accepted here, it
1629   // has to be relative to the current section.
1630   getStreamer().EmitValueToOffset(Offset, FillExpr);
1631
1632   return false;
1633 }
1634
1635 /// ParseDirectiveAlign
1636 ///  ::= {.align, ...} expression [ , expression [ , expression ]]
1637 bool AsmParser::ParseDirectiveAlign(bool IsPow2, unsigned ValueSize) {
1638   CheckForValidSection();
1639
1640   SMLoc AlignmentLoc = getLexer().getLoc();
1641   int64_t Alignment;
1642   if (ParseAbsoluteExpression(Alignment))
1643     return true;
1644
1645   SMLoc MaxBytesLoc;
1646   bool HasFillExpr = false;
1647   int64_t FillExpr = 0;
1648   int64_t MaxBytesToFill = 0;
1649   if (getLexer().isNot(AsmToken::EndOfStatement)) {
1650     if (getLexer().isNot(AsmToken::Comma))
1651       return TokError("unexpected token in directive");
1652     Lex();
1653
1654     // The fill expression can be omitted while specifying a maximum number of
1655     // alignment bytes, e.g:
1656     //  .align 3,,4
1657     if (getLexer().isNot(AsmToken::Comma)) {
1658       HasFillExpr = true;
1659       if (ParseAbsoluteExpression(FillExpr))
1660         return true;
1661     }
1662
1663     if (getLexer().isNot(AsmToken::EndOfStatement)) {
1664       if (getLexer().isNot(AsmToken::Comma))
1665         return TokError("unexpected token in directive");
1666       Lex();
1667
1668       MaxBytesLoc = getLexer().getLoc();
1669       if (ParseAbsoluteExpression(MaxBytesToFill))
1670         return true;
1671
1672       if (getLexer().isNot(AsmToken::EndOfStatement))
1673         return TokError("unexpected token in directive");
1674     }
1675   }
1676
1677   Lex();
1678
1679   if (!HasFillExpr)
1680     FillExpr = 0;
1681
1682   // Compute alignment in bytes.
1683   if (IsPow2) {
1684     // FIXME: Diagnose overflow.
1685     if (Alignment >= 32) {
1686       Error(AlignmentLoc, "invalid alignment value");
1687       Alignment = 31;
1688     }
1689
1690     Alignment = 1ULL << Alignment;
1691   }
1692
1693   // Diagnose non-sensical max bytes to align.
1694   if (MaxBytesLoc.isValid()) {
1695     if (MaxBytesToFill < 1) {
1696       Error(MaxBytesLoc, "alignment directive can never be satisfied in this "
1697             "many bytes, ignoring maximum bytes expression");
1698       MaxBytesToFill = 0;
1699     }
1700
1701     if (MaxBytesToFill >= Alignment) {
1702       Warning(MaxBytesLoc, "maximum bytes expression exceeds alignment and "
1703               "has no effect");
1704       MaxBytesToFill = 0;
1705     }
1706   }
1707
1708   // Check whether we should use optimal code alignment for this .align
1709   // directive.
1710   bool UseCodeAlign = getStreamer().getCurrentSection()->UseCodeAlign();
1711   if ((!HasFillExpr || Lexer.getMAI().getTextAlignFillValue() == FillExpr) &&
1712       ValueSize == 1 && UseCodeAlign) {
1713     getStreamer().EmitCodeAlignment(Alignment, MaxBytesToFill);
1714   } else {
1715     // FIXME: Target specific behavior about how the "extra" bytes are filled.
1716     getStreamer().EmitValueToAlignment(Alignment, FillExpr, ValueSize,
1717                                        MaxBytesToFill);
1718   }
1719
1720   return false;
1721 }
1722
1723 /// ParseDirectiveSymbolAttribute
1724 ///  ::= { ".globl", ".weak", ... } [ identifier ( , identifier )* ]
1725 bool AsmParser::ParseDirectiveSymbolAttribute(MCSymbolAttr Attr) {
1726   if (getLexer().isNot(AsmToken::EndOfStatement)) {
1727     for (;;) {
1728       StringRef Name;
1729
1730       if (ParseIdentifier(Name))
1731         return TokError("expected identifier in directive");
1732
1733       MCSymbol *Sym = getContext().GetOrCreateSymbol(Name);
1734
1735       getStreamer().EmitSymbolAttribute(Sym, Attr);
1736
1737       if (getLexer().is(AsmToken::EndOfStatement))
1738         break;
1739
1740       if (getLexer().isNot(AsmToken::Comma))
1741         return TokError("unexpected token in directive");
1742       Lex();
1743     }
1744   }
1745
1746   Lex();
1747   return false;
1748 }
1749
1750 /// ParseDirectiveComm
1751 ///  ::= ( .comm | .lcomm ) identifier , size_expression [ , align_expression ]
1752 bool AsmParser::ParseDirectiveComm(bool IsLocal) {
1753   CheckForValidSection();
1754
1755   SMLoc IDLoc = getLexer().getLoc();
1756   StringRef Name;
1757   if (ParseIdentifier(Name))
1758     return TokError("expected identifier in directive");
1759
1760   // Handle the identifier as the key symbol.
1761   MCSymbol *Sym = getContext().GetOrCreateSymbol(Name);
1762
1763   if (getLexer().isNot(AsmToken::Comma))
1764     return TokError("unexpected token in directive");
1765   Lex();
1766
1767   int64_t Size;
1768   SMLoc SizeLoc = getLexer().getLoc();
1769   if (ParseAbsoluteExpression(Size))
1770     return true;
1771
1772   int64_t Pow2Alignment = 0;
1773   SMLoc Pow2AlignmentLoc;
1774   if (getLexer().is(AsmToken::Comma)) {
1775     Lex();
1776     Pow2AlignmentLoc = getLexer().getLoc();
1777     if (ParseAbsoluteExpression(Pow2Alignment))
1778       return true;
1779
1780     // If this target takes alignments in bytes (not log) validate and convert.
1781     if (Lexer.getMAI().getAlignmentIsInBytes()) {
1782       if (!isPowerOf2_64(Pow2Alignment))
1783         return Error(Pow2AlignmentLoc, "alignment must be a power of 2");
1784       Pow2Alignment = Log2_64(Pow2Alignment);
1785     }
1786   }
1787
1788   if (getLexer().isNot(AsmToken::EndOfStatement))
1789     return TokError("unexpected token in '.comm' or '.lcomm' directive");
1790
1791   Lex();
1792
1793   // NOTE: a size of zero for a .comm should create a undefined symbol
1794   // but a size of .lcomm creates a bss symbol of size zero.
1795   if (Size < 0)
1796     return Error(SizeLoc, "invalid '.comm' or '.lcomm' directive size, can't "
1797                  "be less than zero");
1798
1799   // NOTE: The alignment in the directive is a power of 2 value, the assembler
1800   // may internally end up wanting an alignment in bytes.
1801   // FIXME: Diagnose overflow.
1802   if (Pow2Alignment < 0)
1803     return Error(Pow2AlignmentLoc, "invalid '.comm' or '.lcomm' directive "
1804                  "alignment, can't be less than zero");
1805
1806   if (!Sym->isUndefined())
1807     return Error(IDLoc, "invalid symbol redefinition");
1808
1809   // '.lcomm' is equivalent to '.zerofill'.
1810   // Create the Symbol as a common or local common with Size and Pow2Alignment
1811   if (IsLocal) {
1812     getStreamer().EmitZerofill(Ctx.getMachOSection(
1813                                  "__DATA", "__bss", MCSectionMachO::S_ZEROFILL,
1814                                  0, SectionKind::getBSS()),
1815                                Sym, Size, 1 << Pow2Alignment);
1816     return false;
1817   }
1818
1819   getStreamer().EmitCommonSymbol(Sym, Size, 1 << Pow2Alignment);
1820   return false;
1821 }
1822
1823 /// ParseDirectiveAbort
1824 ///  ::= .abort [... message ...]
1825 bool AsmParser::ParseDirectiveAbort() {
1826   // FIXME: Use loc from directive.
1827   SMLoc Loc = getLexer().getLoc();
1828
1829   StringRef Str = ParseStringToEndOfStatement();
1830   if (getLexer().isNot(AsmToken::EndOfStatement))
1831     return TokError("unexpected token in '.abort' directive");
1832
1833   Lex();
1834
1835   if (Str.empty())
1836     Error(Loc, ".abort detected. Assembly stopping.");
1837   else
1838     Error(Loc, ".abort '" + Str + "' detected. Assembly stopping.");
1839   // FIXME: Actually abort assembly here.
1840
1841   return false;
1842 }
1843
1844 /// ParseDirectiveInclude
1845 ///  ::= .include "filename"
1846 bool AsmParser::ParseDirectiveInclude() {
1847   if (getLexer().isNot(AsmToken::String))
1848     return TokError("expected string in '.include' directive");
1849
1850   std::string Filename = getTok().getString();
1851   SMLoc IncludeLoc = getLexer().getLoc();
1852   Lex();
1853
1854   if (getLexer().isNot(AsmToken::EndOfStatement))
1855     return TokError("unexpected token in '.include' directive");
1856
1857   // Strip the quotes.
1858   Filename = Filename.substr(1, Filename.size()-2);
1859
1860   // Attempt to switch the lexer to the included file before consuming the end
1861   // of statement to avoid losing it when we switch.
1862   if (EnterIncludeFile(Filename)) {
1863     Error(IncludeLoc, "Could not find include file '" + Filename + "'");
1864     return true;
1865   }
1866
1867   return false;
1868 }
1869
1870 /// ParseDirectiveIf
1871 /// ::= .if expression
1872 bool AsmParser::ParseDirectiveIf(SMLoc DirectiveLoc) {
1873   TheCondStack.push_back(TheCondState);
1874   TheCondState.TheCond = AsmCond::IfCond;
1875   if(TheCondState.Ignore) {
1876     EatToEndOfStatement();
1877   }
1878   else {
1879     int64_t ExprValue;
1880     if (ParseAbsoluteExpression(ExprValue))
1881       return true;
1882
1883     if (getLexer().isNot(AsmToken::EndOfStatement))
1884       return TokError("unexpected token in '.if' directive");
1885
1886     Lex();
1887
1888     TheCondState.CondMet = ExprValue;
1889     TheCondState.Ignore = !TheCondState.CondMet;
1890   }
1891
1892   return false;
1893 }
1894
1895 /// ParseDirectiveElseIf
1896 /// ::= .elseif expression
1897 bool AsmParser::ParseDirectiveElseIf(SMLoc DirectiveLoc) {
1898   if (TheCondState.TheCond != AsmCond::IfCond &&
1899       TheCondState.TheCond != AsmCond::ElseIfCond)
1900       Error(DirectiveLoc, "Encountered a .elseif that doesn't follow a .if or "
1901                           " an .elseif");
1902   TheCondState.TheCond = AsmCond::ElseIfCond;
1903
1904   bool LastIgnoreState = false;
1905   if (!TheCondStack.empty())
1906       LastIgnoreState = TheCondStack.back().Ignore;
1907   if (LastIgnoreState || TheCondState.CondMet) {
1908     TheCondState.Ignore = true;
1909     EatToEndOfStatement();
1910   }
1911   else {
1912     int64_t ExprValue;
1913     if (ParseAbsoluteExpression(ExprValue))
1914       return true;
1915
1916     if (getLexer().isNot(AsmToken::EndOfStatement))
1917       return TokError("unexpected token in '.elseif' directive");
1918
1919     Lex();
1920     TheCondState.CondMet = ExprValue;
1921     TheCondState.Ignore = !TheCondState.CondMet;
1922   }
1923
1924   return false;
1925 }
1926
1927 /// ParseDirectiveElse
1928 /// ::= .else
1929 bool AsmParser::ParseDirectiveElse(SMLoc DirectiveLoc) {
1930   if (getLexer().isNot(AsmToken::EndOfStatement))
1931     return TokError("unexpected token in '.else' directive");
1932
1933   Lex();
1934
1935   if (TheCondState.TheCond != AsmCond::IfCond &&
1936       TheCondState.TheCond != AsmCond::ElseIfCond)
1937       Error(DirectiveLoc, "Encountered a .else that doesn't follow a .if or an "
1938                           ".elseif");
1939   TheCondState.TheCond = AsmCond::ElseCond;
1940   bool LastIgnoreState = false;
1941   if (!TheCondStack.empty())
1942     LastIgnoreState = TheCondStack.back().Ignore;
1943   if (LastIgnoreState || TheCondState.CondMet)
1944     TheCondState.Ignore = true;
1945   else
1946     TheCondState.Ignore = false;
1947
1948   return false;
1949 }
1950
1951 /// ParseDirectiveEndIf
1952 /// ::= .endif
1953 bool AsmParser::ParseDirectiveEndIf(SMLoc DirectiveLoc) {
1954   if (getLexer().isNot(AsmToken::EndOfStatement))
1955     return TokError("unexpected token in '.endif' directive");
1956
1957   Lex();
1958
1959   if ((TheCondState.TheCond == AsmCond::NoCond) ||
1960       TheCondStack.empty())
1961     Error(DirectiveLoc, "Encountered a .endif that doesn't follow a .if or "
1962                         ".else");
1963   if (!TheCondStack.empty()) {
1964     TheCondState = TheCondStack.back();
1965     TheCondStack.pop_back();
1966   }
1967
1968   return false;
1969 }
1970
1971 /// ParseDirectiveFile
1972 /// ::= .file [number] string
1973 bool GenericAsmParser::ParseDirectiveFile(StringRef, SMLoc DirectiveLoc) {
1974   // FIXME: I'm not sure what this is.
1975   int64_t FileNumber = -1;
1976   SMLoc FileNumberLoc = getLexer().getLoc();
1977   if (getLexer().is(AsmToken::Integer)) {
1978     FileNumber = getTok().getIntVal();
1979     Lex();
1980
1981     if (FileNumber < 1)
1982       return TokError("file number less than one");
1983   }
1984
1985   if (getLexer().isNot(AsmToken::String))
1986     return TokError("unexpected token in '.file' directive");
1987
1988   StringRef Filename = getTok().getString();
1989   Filename = Filename.substr(1, Filename.size()-2);
1990   Lex();
1991
1992   if (getLexer().isNot(AsmToken::EndOfStatement))
1993     return TokError("unexpected token in '.file' directive");
1994
1995   if (FileNumber == -1)
1996     getStreamer().EmitFileDirective(Filename);
1997   else {
1998     if (getContext().GetDwarfFile(Filename, FileNumber) == 0)
1999       Error(FileNumberLoc, "file number already allocated");
2000     getStreamer().EmitDwarfFileDirective(FileNumber, Filename);
2001   }
2002
2003   return false;
2004 }
2005
2006 /// ParseDirectiveLine
2007 /// ::= .line [number]
2008 bool GenericAsmParser::ParseDirectiveLine(StringRef, SMLoc DirectiveLoc) {
2009   if (getLexer().isNot(AsmToken::EndOfStatement)) {
2010     if (getLexer().isNot(AsmToken::Integer))
2011       return TokError("unexpected token in '.line' directive");
2012
2013     int64_t LineNumber = getTok().getIntVal();
2014     (void) LineNumber;
2015     Lex();
2016
2017     // FIXME: Do something with the .line.
2018   }
2019
2020   if (getLexer().isNot(AsmToken::EndOfStatement))
2021     return TokError("unexpected token in '.line' directive");
2022
2023   return false;
2024 }
2025
2026
2027 /// ParseDirectiveLoc
2028 /// ::= .loc FileNumber [LineNumber] [ColumnPos] [basic_block] [prologue_end]
2029 ///                                [epilogue_begin] [is_stmt VALUE] [isa VALUE]
2030 /// The first number is a file number, must have been previously assigned with
2031 /// a .file directive, the second number is the line number and optionally the
2032 /// third number is a column position (zero if not specified).  The remaining
2033 /// optional items are .loc sub-directives.
2034 bool GenericAsmParser::ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc) {
2035
2036   if (getLexer().isNot(AsmToken::Integer))
2037     return TokError("unexpected token in '.loc' directive");
2038   int64_t FileNumber = getTok().getIntVal();
2039   if (FileNumber < 1)
2040     return TokError("file number less than one in '.loc' directive");
2041   if (!getContext().isValidDwarfFileNumber(FileNumber))
2042     return TokError("unassigned file number in '.loc' directive");
2043   Lex();
2044
2045   int64_t LineNumber = 0;
2046   if (getLexer().is(AsmToken::Integer)) {
2047     LineNumber = getTok().getIntVal();
2048     if (LineNumber < 1)
2049       return TokError("line number less than one in '.loc' directive");
2050     Lex();
2051   }
2052
2053   int64_t ColumnPos = 0;
2054   if (getLexer().is(AsmToken::Integer)) {
2055     ColumnPos = getTok().getIntVal();
2056     if (ColumnPos < 0)
2057       return TokError("column position less than zero in '.loc' directive");
2058     Lex();
2059   }
2060
2061   unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
2062   unsigned Isa = 0;
2063   int64_t Discriminator = 0;
2064   if (getLexer().isNot(AsmToken::EndOfStatement)) {
2065     for (;;) {
2066       if (getLexer().is(AsmToken::EndOfStatement))
2067         break;
2068
2069       StringRef Name;
2070       SMLoc Loc = getTok().getLoc();
2071       if (getParser().ParseIdentifier(Name))
2072         return TokError("unexpected token in '.loc' directive");
2073
2074       if (Name == "basic_block")
2075         Flags |= DWARF2_FLAG_BASIC_BLOCK;
2076       else if (Name == "prologue_end")
2077         Flags |= DWARF2_FLAG_PROLOGUE_END;
2078       else if (Name == "epilogue_begin")
2079         Flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
2080       else if (Name == "is_stmt") {
2081         SMLoc Loc = getTok().getLoc();
2082         const MCExpr *Value;
2083         if (getParser().ParseExpression(Value))
2084           return true;
2085         // The expression must be the constant 0 or 1.
2086         if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
2087           int Value = MCE->getValue();
2088           if (Value == 0)
2089             Flags &= ~DWARF2_FLAG_IS_STMT;
2090           else if (Value == 1)
2091             Flags |= DWARF2_FLAG_IS_STMT;
2092           else
2093             return Error(Loc, "is_stmt value not 0 or 1");
2094         }
2095         else {
2096           return Error(Loc, "is_stmt value not the constant value of 0 or 1");
2097         }
2098       }
2099       else if (Name == "isa") {
2100         SMLoc Loc = getTok().getLoc();
2101         const MCExpr *Value;
2102         if (getParser().ParseExpression(Value))
2103           return true;
2104         // The expression must be a constant greater or equal to 0.
2105         if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
2106           int Value = MCE->getValue();
2107           if (Value < 0)
2108             return Error(Loc, "isa number less than zero");
2109           Isa = Value;
2110         }
2111         else {
2112           return Error(Loc, "isa number not a constant value");
2113         }
2114       }
2115       else if (Name == "discriminator") {
2116         if (getParser().ParseAbsoluteExpression(Discriminator))
2117           return true;
2118       }
2119       else {
2120         return Error(Loc, "unknown sub-directive in '.loc' directive");
2121       }
2122
2123       if (getLexer().is(AsmToken::EndOfStatement))
2124         break;
2125     }
2126   }
2127
2128   getContext().setCurrentDwarfLoc(FileNumber, LineNumber, ColumnPos, Flags,
2129                                   Isa, Discriminator);
2130
2131   return false;
2132 }
2133
2134 /// ParseDirectiveStabs
2135 /// ::= .stabs string, number, number, number
2136 bool GenericAsmParser::ParseDirectiveStabs(StringRef Directive,
2137                                            SMLoc DirectiveLoc) {
2138   return TokError("unsupported directive '" + Directive + "'");
2139 }
2140
2141 /// ParseDirectiveCFIStartProc
2142 /// ::= .cfi_startproc
2143 bool GenericAsmParser::ParseDirectiveCFIStartProc(StringRef,
2144                                                   SMLoc DirectiveLoc) {
2145   return false;
2146 }
2147
2148 /// ParseDirectiveCFIEndProc
2149 /// ::= .cfi_endproc
2150 bool GenericAsmParser::ParseDirectiveCFIEndProc(StringRef, SMLoc DirectiveLoc) {
2151   return false;
2152 }
2153
2154 /// ParseDirectiveCFIDefCfaOffset
2155 /// ::= .cfi_def_cfa_offset offset
2156 bool GenericAsmParser::ParseDirectiveCFIDefCfaOffset(StringRef,
2157                                                      SMLoc DirectiveLoc) {
2158   int64_t Offset = 0;
2159   if (getParser().ParseAbsoluteExpression(Offset))
2160     return true;
2161
2162   return false;
2163 }
2164
2165 /// ParseDirectiveCFIDefCfaRegister
2166 /// ::= .cfi_def_cfa_register register
2167 bool GenericAsmParser::ParseDirectiveCFIDefCfaRegister(StringRef,
2168                                                        SMLoc DirectiveLoc) {
2169   int64_t Register = 0;
2170   if (getParser().ParseAbsoluteExpression(Register))
2171     return true;
2172   return false;
2173 }
2174
2175 /// ParseDirectiveCFIOffset
2176 /// ::= .cfi_off register, offset
2177 bool GenericAsmParser::ParseDirectiveCFIOffset(StringRef, SMLoc DirectiveLoc) {
2178   int64_t Register = 0;
2179   int64_t Offset = 0;
2180   if (getParser().ParseAbsoluteExpression(Register))
2181     return true;
2182
2183   if (getLexer().isNot(AsmToken::Comma))
2184     return TokError("unexpected token in directive");
2185   Lex();
2186
2187   if (getParser().ParseAbsoluteExpression(Offset))
2188     return true;
2189
2190   return false;
2191 }
2192
2193 /// ParseDirectiveCFIPersonalityOrLsda
2194 /// ::= .cfi_personality encoding, [symbol_name]
2195 /// ::= .cfi_lsda encoding, [symbol_name]
2196 bool GenericAsmParser::ParseDirectiveCFIPersonalityOrLsda(StringRef,
2197                                                     SMLoc DirectiveLoc) {
2198   int64_t Encoding = 0;
2199   if (getParser().ParseAbsoluteExpression(Encoding))
2200     return true;
2201   if (Encoding == 255)
2202     return false;
2203
2204   if (getLexer().isNot(AsmToken::Comma))
2205     return TokError("unexpected token in directive");
2206   Lex();
2207
2208   StringRef Name;
2209   if (getParser().ParseIdentifier(Name))
2210     return TokError("expected identifier in directive");
2211   return false;
2212 }
2213
2214 /// ParseDirectiveMacrosOnOff
2215 /// ::= .macros_on
2216 /// ::= .macros_off
2217 bool GenericAsmParser::ParseDirectiveMacrosOnOff(StringRef Directive,
2218                                                  SMLoc DirectiveLoc) {
2219   if (getLexer().isNot(AsmToken::EndOfStatement))
2220     return Error(getLexer().getLoc(),
2221                  "unexpected token in '" + Directive + "' directive");
2222
2223   getParser().MacrosEnabled = Directive == ".macros_on";
2224
2225   return false;
2226 }
2227
2228 /// ParseDirectiveMacro
2229 /// ::= .macro name
2230 bool GenericAsmParser::ParseDirectiveMacro(StringRef Directive,
2231                                            SMLoc DirectiveLoc) {
2232   StringRef Name;
2233   if (getParser().ParseIdentifier(Name))
2234     return TokError("expected identifier in directive");
2235
2236   if (getLexer().isNot(AsmToken::EndOfStatement))
2237     return TokError("unexpected token in '.macro' directive");
2238
2239   // Eat the end of statement.
2240   Lex();
2241
2242   AsmToken EndToken, StartToken = getTok();
2243
2244   // Lex the macro definition.
2245   for (;;) {
2246     // Check whether we have reached the end of the file.
2247     if (getLexer().is(AsmToken::Eof))
2248       return Error(DirectiveLoc, "no matching '.endmacro' in definition");
2249
2250     // Otherwise, check whether we have reach the .endmacro.
2251     if (getLexer().is(AsmToken::Identifier) &&
2252         (getTok().getIdentifier() == ".endm" ||
2253          getTok().getIdentifier() == ".endmacro")) {
2254       EndToken = getTok();
2255       Lex();
2256       if (getLexer().isNot(AsmToken::EndOfStatement))
2257         return TokError("unexpected token in '" + EndToken.getIdentifier() +
2258                         "' directive");
2259       break;
2260     }
2261
2262     // Otherwise, scan til the end of the statement.
2263     getParser().EatToEndOfStatement();
2264   }
2265
2266   if (getParser().MacroMap.lookup(Name)) {
2267     return Error(DirectiveLoc, "macro '" + Name + "' is already defined");
2268   }
2269
2270   const char *BodyStart = StartToken.getLoc().getPointer();
2271   const char *BodyEnd = EndToken.getLoc().getPointer();
2272   StringRef Body = StringRef(BodyStart, BodyEnd - BodyStart);
2273   getParser().MacroMap[Name] = new Macro(Name, Body);
2274   return false;
2275 }
2276
2277 /// ParseDirectiveEndMacro
2278 /// ::= .endm
2279 /// ::= .endmacro
2280 bool GenericAsmParser::ParseDirectiveEndMacro(StringRef Directive,
2281                                            SMLoc DirectiveLoc) {
2282   if (getLexer().isNot(AsmToken::EndOfStatement))
2283     return TokError("unexpected token in '" + Directive + "' directive");
2284
2285   // If we are inside a macro instantiation, terminate the current
2286   // instantiation.
2287   if (!getParser().ActiveMacros.empty()) {
2288     getParser().HandleMacroExit();
2289     return false;
2290   }
2291
2292   // Otherwise, this .endmacro is a stray entry in the file; well formed
2293   // .endmacro directives are handled during the macro definition parsing.
2294   return TokError("unexpected '" + Directive + "' in file, "
2295                   "no current macro definition");
2296 }
2297
2298 bool GenericAsmParser::ParseDirectiveLEB128(StringRef DirName, SMLoc) {
2299   getParser().CheckForValidSection();
2300
2301   const MCExpr *Value;
2302
2303   if (getParser().ParseExpression(Value))
2304     return true;
2305
2306   if (getLexer().isNot(AsmToken::EndOfStatement))
2307     return TokError("unexpected token in directive");
2308
2309   if (DirName[1] == 's')
2310     getStreamer().EmitSLEB128Value(Value);
2311   else
2312     getStreamer().EmitULEB128Value(Value);
2313
2314   return false;
2315 }
2316
2317
2318 /// \brief Create an MCAsmParser instance.
2319 MCAsmParser *llvm::createMCAsmParser(const Target &T, SourceMgr &SM,
2320                                      MCContext &C, MCStreamer &Out,
2321                                      const MCAsmInfo &MAI) {
2322   return new AsmParser(T, SM, C, Out, MAI);
2323 }