implement .include in the lexer/parser instead of passing it into the streamer.
authorChris Lattner <sabre@nondot.org>
Thu, 16 Jul 2009 06:14:39 +0000 (06:14 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 16 Jul 2009 06:14:39 +0000 (06:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75896 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCStreamer.h
lib/MC/MCAsmStreamer.cpp
test/MC/AsmParser/directive_include.s
tools/llvm-mc/AsmLexer.cpp
tools/llvm-mc/AsmLexer.h
tools/llvm-mc/AsmParser.cpp

index 8daa2464821a0600271ee2a361e5c404a9178f59..b8f1b2659d8430f5e3dee79a0537b12e1adff5db 100644 (file)
@@ -160,12 +160,6 @@ namespace llvm {
     /// @param AbortReason - The reason assembly is terminated, if non-NULL.
     virtual void AbortAssembly(const char *AbortReason) = 0;
 
-    /// SwitchInputAssemblyFile - Assemble the contents of the specified file in
-    /// @param FileName at this point in the assembly.
-    ///
-    /// @param FileName - The file to assemble at this point
-    virtual void SwitchInputAssemblyFile(const char *FileName) = 0;
-
     /// DumpSymbolsandMacros - Dump to the specified file in @param FileName all
     /// symbols and macros at this point in the assembly.
     ///
index 8ce3325c66fd09046756ba43c6d2445603e3081d..691694978d418a5e7d81ded8abc26f5871d9e45f 100644 (file)
@@ -57,8 +57,6 @@ namespace {
 
     virtual void AbortAssembly(const char *AbortReason = NULL);
 
-    virtual void SwitchInputAssemblyFile(const char *FileName);
-
     virtual void DumpSymbolsandMacros(const char *FileName);
 
     virtual void LoadSymbolsandMacros(const char *FileName);
@@ -143,10 +141,6 @@ void MCAsmStreamer::AbortAssembly(const char *AbortReason) {
   
 }
 
-void MCAsmStreamer::SwitchInputAssemblyFile(const char *FileName) {
-  OS << ".include" << ' ' << FileName << '\n';
-}
-
 void MCAsmStreamer::DumpSymbolsandMacros(const char *FileName) {
   OS << ".dump" << ' ' << FileName << '\n';
 }
index 8c35d2a142a118b655370237d2fcfacf8b7cfabb..2721fee035e8b495c95616e495b244646cd54a7e 100644 (file)
@@ -1,8 +1,9 @@
-# RUN: llvm-mc %s | FileCheck %s
+# RUN: llvm-mc %s -I  %p | FileCheck %s
 
+# CHECK: TESTA:
 # CHECK: TEST0:
-# CHECK: .include "some/include/file"
-# CHECK: .include "mary had a little lamb"
-TEST0:  
-       .include       "some/include/file"
- .include  "mary had a little lamb"
+# CHECK: .set a, 0
+# CHECK: TESTB:
+TESTA:  
+       .include       "directive_set.s"
+TESTB:
index 7b744fbde65ac8288e4d162a53d26521caaa2eaa..6ee91455b7193a3b5c2fd65d6a26fea950d01b37 100644 (file)
@@ -54,6 +54,21 @@ asmtok::TokKind AsmLexer::ReturnError(const char *Loc, const std::string &Msg) {
   return asmtok::Error;
 }
 
+/// EnterIncludeFile - Enter the specified file.  This prints an error and
+/// returns true on failure.
+bool AsmLexer::EnterIncludeFile(const std::string &Filename) {
+  int NewBuf = SrcMgr.AddIncludeFile(Filename, SMLoc::getFromPointer(CurPtr));
+  if (NewBuf == -1)
+    return true;
+  
+  // Save the line number and lex buffer of the includer.
+  CurBuffer = NewBuf;
+  CurBuf = SrcMgr.getMemoryBuffer(CurBuffer);
+  CurPtr = CurBuf->getBufferStart();
+  return false;
+}
+
+
 int AsmLexer::getNextChar() {
   char CurChar = *CurPtr++;
   switch (CurChar) {
@@ -72,6 +87,10 @@ int AsmLexer::getNextChar() {
       CurBuffer = SrcMgr.FindBufferContainingLoc(ParentIncludeLoc);
       CurBuf = SrcMgr.getMemoryBuffer(CurBuffer);
       CurPtr = ParentIncludeLoc.getPointer();
+      
+      // Reset the token start pointer to the start of the new file.
+      TokStart = CurPtr;
+      
       return getNextChar();
     }
     
index 6360b1280ce2c263997f90edf4d98c5e5f8e4f19..5d59d0ad7751365ca66665a6f7d360699989653f 100644 (file)
@@ -97,6 +97,9 @@ public:
   
   SMLoc getLoc() const;
   
+  /// EnterIncludeFile - Enter the specified file. This returns true on failure.
+  bool EnterIncludeFile(const std::string &Filename);
+  
   void PrintMessage(SMLoc Loc, const std::string &Msg, const char *Type) const;
   
 private:
index cb21a93bb1d0b1c4272f641b40a89482f906bc3f..68eb9d56c07b8ab0a6f98d70e84a2373e402bd95 100644 (file)
@@ -1168,21 +1168,27 @@ bool AsmParser::ParseDirectiveDarwinLsym() {
 /// ParseDirectiveInclude
 ///  ::= .include "filename"
 bool AsmParser::ParseDirectiveInclude() {
-  const char *Str;
-
   if (Lexer.isNot(asmtok::String))
     return TokError("expected string in '.include' directive");
   
-  Str = Lexer.getCurStrVal();
-
+  std::string Filename = Lexer.getCurStrVal();
+  SMLoc IncludeLoc = Lexer.getLoc();
   Lexer.Lex();
 
   if (Lexer.isNot(asmtok::EndOfStatement))
     return TokError("unexpected token in '.include' directive");
   
-  Lexer.Lex();
-
-  Out.SwitchInputAssemblyFile(Str);
+  // Strip the quotes.
+  Filename = Filename.substr(1, Filename.size()-2);
+  
+  // Attempt to switch the lexer to the included file before consuming the end
+  // of statement to avoid losing it when we switch.
+  if (Lexer.EnterIncludeFile(Filename)) {
+    Lexer.PrintMessage(IncludeLoc,
+                       "Could not find include file '" + Filename + "'",
+                       "error");
+    return true;
+  }
 
   return false;
 }