[llvm] 7a46d34 - [SystemZ][z/OS] Add support to validate a HLASM Label.
Kai Nacke via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 8 06:56:05 PST 2021
Author: Anirudh Prasad
Date: 2021-03-08T09:55:39-05:00
New Revision: 7a46d34a1953625f03b71494c0f33fe00316e4ba
URL: https://github.com/llvm/llvm-project/commit/7a46d34a1953625f03b71494c0f33fe00316e4ba
DIFF: https://github.com/llvm/llvm-project/commit/7a46d34a1953625f03b71494c0f33fe00316e4ba.diff
LOG: [SystemZ][z/OS] Add support to validate a HLASM Label.
- This patch adds in support to determine whether a particular label
is valid for the hlasm variant
- The label syntax being checked is that of an ordinary HLASM symbol
(Reference, Chapter 2 (Coding and Structure) - Terms, Literals and
Expressions - Terms - Symbols - Ordinary Symbol)
- To achieve this, the virtual function isLabel defined in
MCTargetAsmParser.h is made use of
- The isLabel function is overridden in SystemZAsmParser for the
hlasm variant, and the syntax is checked appropriately
- Things remain unchanged for the att variant
- Further patches will add in support to emit the label. These future
patches will make use of this isLabel function
Reviewed By: uweigand, Kai
Differential Revision: https://reviews.llvm.org/D97748
Added:
Modified:
llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp
llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
index 92a35e22007e..c600842c7f44 100644
--- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
+++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/SystemZInstPrinter.h"
+#include "MCTargetDesc/SystemZMCAsmInfo.h"
#include "MCTargetDesc/SystemZMCTargetDesc.h"
#include "TargetInfo/SystemZTargetInfo.h"
#include "llvm/ADT/STLExtras.h"
@@ -450,6 +451,15 @@ class SystemZAsmParser : public MCTargetAsmParser {
return Parser.getContext().getAsmInfo()->getAssemblerDialect();
}
+ // An alphabetic character in HLASM is a letter from 'A' through 'Z',
+ // or from 'a' through 'z', or '$', '_','#', or '@'.
+ inline bool isHLASMAlpha(char C) {
+ return isAlpha(C) || llvm::is_contained("_@#$", C);
+ }
+
+ // A digit in HLASM is a number from 0 to 9.
+ inline bool isHLASMAlnum(char C) { return isHLASMAlpha(C) || isDigit(C); }
+
public:
SystemZAsmParser(const MCSubtargetInfo &sti, MCAsmParser &parser,
const MCInstrInfo &MII,
@@ -477,6 +487,7 @@ class SystemZAsmParser : public MCTargetAsmParser {
OperandVector &Operands, MCStreamer &Out,
uint64_t &ErrorInfo,
bool MatchingInlineAsm) override;
+ bool isLabel(AsmToken &Token) override;
// Used by the TableGen code to parse particular operand types.
OperandMatchResultTy parseGR32(OperandVector &Operands) {
@@ -1594,6 +1605,47 @@ SystemZAsmParser::parsePCRel(OperandVector &Operands, int64_t MinVal,
return MatchOperand_Success;
}
+bool SystemZAsmParser::isLabel(AsmToken &Token) {
+ if (getMAIAssemblerDialect() == AD_ATT)
+ return true;
+
+ // HLASM labels are ordinary symbols.
+ // An HLASM label always starts at column 1.
+ // An ordinary symbol syntax is laid out as follows:
+ // Rules:
+ // 1. Has to start with an "alphabetic character". Can be followed by up to
+ // 62 alphanumeric characters. An "alphabetic character", in this scenario,
+ // is a letter from 'A' through 'Z', or from 'a' through 'z',
+ // or '$', '_', '#', or '@'
+ // 2. Labels are case-insensitive. E.g. "lab123", "LAB123", "lAb123", etc.
+ // are all treated as the same symbol. However, the processing for the case
+ // folding will not be done in this function.
+ StringRef RawLabel = Token.getString();
+ SMLoc Loc = Token.getLoc();
+
+ // An HLASM label cannot be empty.
+ if (!RawLabel.size())
+ return !Error(Loc, "HLASM Label cannot be empty");
+
+ // An HLASM label cannot exceed greater than 63 characters.
+ if (RawLabel.size() > 63)
+ return !Error(Loc, "Maximum length for HLASM Label is 63 characters");
+
+ // A label must start with an "alphabetic character".
+ if (!isHLASMAlpha(RawLabel[0]))
+ return !Error(Loc, "HLASM Label has to start with an alphabetic "
+ "character or the underscore character");
+
+ // Now, we've established that the length is valid
+ // and the first character is alphabetic.
+ // Check whether remaining string is alphanumeric.
+ for (unsigned I = 1; I < RawLabel.size(); ++I)
+ if (!isHLASMAlnum(RawLabel[I]))
+ return !Error(Loc, "HLASM Label has to be alphanumeric");
+
+ return true;
+}
+
// Force static initialization.
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSystemZAsmParser() {
RegisterMCAsmParser<SystemZAsmParser> X(getTheSystemZTarget());
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp
index d0330b9cf40f..c537020cdee8 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp
@@ -12,8 +12,6 @@
using namespace llvm;
-enum AsmDialect { AD_ATT = 0, AD_HLASM = 1 };
-
SystemZMCAsmInfo::SystemZMCAsmInfo(const Triple &TT) {
CodePointerSize = 8;
CalleeSaveStackSlotSize = 8;
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h
index b8818a65f9e3..8b42dea1303d 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h
@@ -14,6 +14,7 @@
namespace llvm {
class Triple;
+enum SystemZAsmDialect { AD_ATT = 0, AD_HLASM = 1 };
class SystemZMCAsmInfo : public MCAsmInfoELF {
public:
More information about the llvm-commits
mailing list