Index: llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp =================================================================== --- llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp +++ 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" @@ -477,6 +478,7 @@ 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 +1596,45 @@ return MatchOperand_Success; } +bool SystemZAsmParser::isLabel(AsmToken &Token) { + if (getMAIAssemblerDialect() == AD_HLASM) { + // HLASM Labels are ordinary symbols + // An HLASM always starts at column 1. + // An ordinary symbol syntax is laid out as follows: + // Rules: + // 1. Starts with an alphabetic character, followed by 62-alphanumberic + // characters + // Exception: "_" is treated as an alphabetical character + // 2. Maximum length of the symbol is 63 characters + // 3. Labels are case insiginficant . Eg. "lab123", "LAB123", "lAb123" etc. + // are all treated as the same symbols. However the processing for the case + // will not be done in this function. + StringRef RawLabel = Token.getString(); + SMLoc Loc = Token.getLoc(); + + // 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 or '_' + // '_' is treated as an alphabetic character. + if (!isalpha(RawLabel[0]) && 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 an alphabet. + // Check whether remaining string is alphanumeric. + for (unsigned I = 1; I < RawLabel.size(); I++) + if (!isalnum(RawLabel[I]) && RawLabel[I] != '_') + return !Error(Loc, "HLASM Label has to be alphanumeric"); + + return true; + } + + return true; +} + // Force static initialization. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSystemZAsmParser() { RegisterMCAsmParser X(getTheSystemZTarget()); Index: llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h =================================================================== --- llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h +++ llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.h @@ -14,6 +14,7 @@ namespace llvm { class Triple; +enum AsmDialect { AD_ATT = 0, AD_HLASM = 1 }; class SystemZMCAsmInfo : public MCAsmInfoELF { public: Index: llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp =================================================================== --- llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmInfo.cpp +++ 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;