[llvm] b8dcd92 - [AsmParser][SystemZ][z/OS] Introducing HLASM Parser support to AsmParser - Part 2

Anirudh Prasad via llvm-commits llvm-commits at lists.llvm.org
Mon May 31 08:27:14 PDT 2021


Author: Anirudh Prasad
Date: 2021-05-31T11:27:02-04:00
New Revision: b8dcd920ec286d70976521dbc4692dc5f24dabe8

URL: https://github.com/llvm/llvm-project/commit/b8dcd920ec286d70976521dbc4692dc5f24dabe8
DIFF: https://github.com/llvm/llvm-project/commit/b8dcd920ec286d70976521dbc4692dc5f24dabe8.diff

LOG: [AsmParser][SystemZ][z/OS] Introducing HLASM Parser support to AsmParser - Part 2

- This patch is the second (and hopefully final) part of providing HLASM syntax for inline asm statements for z/OS to LLVM (continuing on from https://reviews.llvm.org/D98276)
- This second part deals with providing label support
- As mentioned in https://reviews.llvm.org/D98276, if the first token is not a space we process the first token as a label, and the remaining tokens as a possible machine instruction
- To achieve this, a new `parseAsHLASMLabel` function is introduced. This function processes the first token, validates whether it is an "acceptable" label according to HLASM standards, and then emits it
- After handling and emitting the label, call the `parseAsMachineInstruction` instruction to process the remaining tokens as a machine instruction.

Reviewed By: uweigand

Differential Revision: https://reviews.llvm.org/D103320

Added: 
    

Modified: 
    llvm/lib/MC/MCParser/AsmParser.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index fdde878a194b1..f2e25b9ff5229 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -197,6 +197,11 @@ class AsmParser : public MCAsmParser {
                                              StringRef IDVal, AsmToken ID,
                                              SMLoc IDLoc);
 
+  /// Should we emit DWARF describing this assembler source?  (Returns false if
+  /// the source has .file directives, which means we don't want to generate
+  /// info describing the assembler source itself.)
+  bool enabledGenDwarfForAssembly();
+
 public:
   AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out,
             const MCAsmInfo &MAI, unsigned CB);
@@ -326,11 +331,6 @@ class AsmParser : public MCAsmParser {
   }
   static void DiagHandler(const SMDiagnostic &Diag, void *Context);
 
-  /// Should we emit DWARF describing this assembler source?  (Returns false if
-  /// the source has .file directives, which means we don't want to generate
-  /// info describing the assembler source itself.)
-  bool enabledGenDwarfForAssembly();
-
   /// Enter the specified file. This returns true on failure.
   bool enterIncludeFile(const std::string &Filename);
 
@@ -6170,23 +6170,55 @@ bool AsmParser::parseMSInlineAsm(
   return false;
 }
 
+bool HLASMAsmParser::parseAsHLASMLabel(ParseStatementInfo &Info,
+                                       MCAsmParserSemaCallback *SI) {
+  AsmToken LabelTok = getTok();
+  SMLoc LabelLoc = LabelTok.getLoc();
+  StringRef LabelVal;
+
+  if (parseIdentifier(LabelVal))
+    return Error(LabelLoc, "The HLASM Label has to be an Identifier");
+
+  // We have validated whether the token is an Identifier.
+  // Now we have to validate whether the token is a
+  // valid HLASM Label.
+  if (!getTargetParser().isLabel(LabelTok) || checkForValidSection())
+    return true;
+
+  // Lex leading spaces to get to the next operand.
+  lexLeadingSpaces();
+
+  // We shouldn't emit the label if there is nothing else after the label.
+  // i.e asm("<token>\n")
+  if (getTok().is(AsmToken::EndOfStatement))
+    return Error(LabelLoc,
+                 "Cannot have just a label for an HLASM inline asm statement");
+
+  // FIXME: Later on, ensure emitted labels are case-insensitive.
+  MCSymbol *Sym = getContext().getOrCreateSymbol(LabelVal);
+
+  getTargetParser().doBeforeLabelEmit(Sym);
+
+  // Emit the label.
+  Out.emitLabel(Sym, LabelLoc);
+
+  // If we are generating dwarf for assembly source files then gather the
+  // info to make a dwarf label entry for this label if needed.
+  if (enabledGenDwarfForAssembly())
+    MCGenDwarfLabelEntry::Make(Sym, &getStreamer(), getSourceManager(),
+                               LabelLoc);
+
+  getTargetParser().onLabelParsed(Sym);
+
+  return false;
+}
+
 bool HLASMAsmParser::parseAsMachineInstruction(ParseStatementInfo &Info,
                                                MCAsmParserSemaCallback *SI) {
   AsmToken OperationEntryTok = Lexer.getTok();
   SMLoc OperationEntryLoc = OperationEntryTok.getLoc();
   StringRef OperationEntryVal;
 
-  // If we see a new line or carriage return, emit the new line
-  // and lex it.
-  if (OperationEntryTok.is(AsmToken::EndOfStatement)) {
-    if (getTok().getString().front() == '\n' ||
-        getTok().getString().front() == '\r') {
-      Out.AddBlankLine();
-      Lex();
-      return false;
-    }
-  }
-
   // Attempt to parse the first token as an Identifier
   if (parseIdentifier(OperationEntryVal))
     return Error(OperationEntryLoc, "unexpected token at start of statement");
@@ -6203,8 +6235,8 @@ bool HLASMAsmParser::parseStatement(ParseStatementInfo &Info,
                                     MCAsmParserSemaCallback *SI) {
   assert(!hasPendingError() && "parseStatement started with pending error");
 
-  // Should the first token be interpreted as a machine instruction.
-  bool ShouldParseAsMachineInstruction = false;
+  // Should the first token be interpreted as a HLASM Label.
+  bool ShouldParseAsHLASMLabel = false;
 
   // If a Name Entry exists, it should occur at the very
   // start of the string. In this case, we should parse the
@@ -6212,8 +6244,8 @@ bool HLASMAsmParser::parseStatement(ParseStatementInfo &Info,
   // If the Name entry is missing (i.e. there's some other
   // token), then we attempt to parse the first non-space
   // token as a Machine Instruction.
-  if (getTok().is(AsmToken::Space))
-    ShouldParseAsMachineInstruction = true;
+  if (getTok().isNot(AsmToken::Space))
+    ShouldParseAsHLASMLabel = true;
 
   // If we have an EndOfStatement (which includes the target's comment
   // string) we can appropriately lex it early on)
@@ -6231,13 +6263,28 @@ bool HLASMAsmParser::parseStatement(ParseStatementInfo &Info,
   // first token.
   lexLeadingSpaces();
 
-  if (ShouldParseAsMachineInstruction)
-    return parseAsMachineInstruction(Info, SI);
+  // If we see a new line or carriage return as the first operand,
+  // after lexing leading spaces, emit the new line and lex the
+  // EndOfStatement token.
+  if (Lexer.is(AsmToken::EndOfStatement)) {
+    if (getTok().getString().front() == '\n' ||
+        getTok().getString().front() == '\r') {
+      Out.AddBlankLine();
+      Lex();
+      return false;
+    }
+  }
+
+  // Handle the label first if we have to before processing the rest
+  // of the tokens as a machine instruction.
+  if (ShouldParseAsHLASMLabel) {
+    // If there were any errors while handling and emitting the label,
+    // early return.
+    if (parseAsHLASMLabel(Info, SI))
+      return true;
+  }
 
-  // Label parsing support isn't implemented completely (yet).
-  SMLoc Loc = getTok().getLoc();
-  eatToEndOfStatement();
-  return Error(Loc, "HLASM Label parsing support not yet implemented");
+  return parseAsMachineInstruction(Info, SI);
 }
 
 namespace llvm {


        


More information about the llvm-commits mailing list