23 Assembler->registerSymbol(Sym);
31 std::istringstream Stream(Str);
34 while (std::getline(Stream, Line,
'\n'))
35 Lines.push_back(Line);
37 for (
auto S : Lines) {
38 if (
LLVM_LIKELY(S.length() < ContIndicatorColumn)) {
41 FOS.PadToColumn(InstLimit);
50 std::string TmpSubStr = S.substr(0, ContIndicatorColumn);
51 if (!TmpSubStr.compare(ContIndicatorColumn - 1, 1,
" "))
52 TmpSubStr.replace(ContIndicatorColumn - 1, 1,
"X");
55 FOS.PadToColumn(InstLimit);
58 size_t Emitted = ContIndicatorColumn - 1;
60 while (Emitted < S.length()) {
61 if ((S.length() - Emitted) < ContLen)
62 TmpSubStr = S.substr(Emitted, S.length());
64 TmpSubStr = S.substr(Emitted, ContLen);
65 if (!TmpSubStr.compare(ContLen - 1, 1,
" "))
66 TmpSubStr.replace(ContLen - 1, 1,
"X");
68 FOS.PadToColumn(ContStartColumn);
70 FOS.PadToColumn(InstLimit);
72 Emitted += ContLen - 1;
81 MAI->printSwitchToSection(*Section, Subsection,
88 std::optional<int64_t>
Value,
90 unsigned MaxBytesToEmit) {
122 T.toVector(CommentToEmit);
125 CommentToEmit.push_back(
'\n');
129 if (CommentToEmit.empty() && CommentStream.GetNumBytesInBuffer() == 0)
134 assert(Comments.
back() ==
'\n' &&
"Comment array not newline terminated");
137 size_t Position = std::min(InstLimit - 2, Comments.
find(
'\n'));
138 FOS << MAI->getCommentString() <<
' ' << Comments.
substr(0, Position)
141 if (Comments[Position] ==
'\n')
143 Comments = Comments.
substr(Position);
144 }
while (!Comments.
empty());
146 CommentToEmit.clear();
152 unsigned MaxBytesToEmit) {
158 unsigned MaxBytesToEmit) {
160 if (MAI->getTextAlignFillValue())
169 "Cannot emit contents before setting section!");
174 size_t Len =
Data.size();
184 OS <<
'\'' <<
toHex(Chars) <<
'\'';
192 InstPrinter->printInst(&Inst, 0,
"", STI, OS);
201 OS << Name <<
" XATTR ";
205 OS << Sep <<
"REFERENCE("
208 OS << Sep <<
"SCOPE(";
209 switch (BindingScope) {
236 bool EmitEntry =
true;
242 OS <<
" ENTRY " << Sym->
getName();
253 OS << Sym->
getName() <<
" DS 0H";
267 String.consume_back(
"\n");
275 unsigned Size,
bool Parens) {
276 switch (
Value->getKind()) {
278 OS <<
"XL" <<
Size <<
'\'';
279 MAI->printExpr(OS, *
Value);
301 OS <<
'/' << (1 << Const);
320 "Unrecognized HLASM arithmetic expression!");
328 MAI->printExpr(OS, *
Value);
334 MAI->printExpr(OS, *
Value);
345 "Cannot emit contents before setting section!");
355 if (Symbol.isTemporary() || !Symbol.isRegistered() || Symbol.isDefined())
358 OS <<
" " << (Sym.isWeak() ?
"WXTRN" :
"EXTRN") <<
" " << Sym.
getName();
360 emitXATTR(OS, Sym.getName(), Sym.getLinkage(), Sym.getCodeData(),
361 Sym.getBindingScope());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_LIKELY(EXPR)
static void emitXATTR(raw_ostream &OS, StringRef Name, GOFF::ESDLinkageType Linkage, GOFF::ESDExecutable Executable, GOFF::ESDBindingScope BindingScope)
This file contains the MCSymbolGOFF class.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
A helper class to return the specified delimiter string after the first invocation of operator String...
Binary assembler expressions.
const MCExpr * getLHS() const
Get the left-hand side expression of the binary operator.
const MCExpr * getRHS() const
Get the right-hand side expression of the binary operator.
Opcode getOpcode() const
Get the kind of this binary expression.
@ LShr
Logical shift right.
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
Base class for the full range of assembler expressions which are needed for parsing.
@ Constant
Constant expressions.
@ Target
Target specific expression.
@ Binary
Binary expressions.
Instances of this class represent a single low-level machine instruction.
MCSectionGOFF * getParent() const
Instances of this class represent a uniqued identifier for a section in the current translation unit.
StringRef getName() const
MCContext & getContext() const
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
MCSection * getCurrentSectionOnly() const
virtual void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
Emit the expression Value into the output as a native integer of the given Size bytes.
virtual void changeSection(MCSection *, uint32_t)
This is called by popSection and switchSection, if the current section changes.
Generic base class for all target subtargets.
GOFF::ESDExecutable getCodeData() const
bool isInEDSection() const
GOFF::ESDBindingScope getBindingScope() const
GOFF::ESDLinkageType getLinkage() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
StringRef getName() const
getName - Get the symbol name.
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
bool isTemporary() const
isTemporary - Check if this is an assembler temporary symbol.
Represents a location in source code.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
constexpr bool empty() const
empty - Check if the string is empty.
char back() const
back - Get the last character in the string.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0) override
Emit nops until the byte alignment ByteAlignment is reached.
void emitHLASMValueImpl(const MCExpr *Value, unsigned Size, bool Parens=false)
void emitRawTextImpl(StringRef String) override
EmitRawText - If this file is backed by an assembly streamer, this dumps the specified string in the ...
void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override
Emit the expression Value into the output as a native integer of the given Size bytes.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
void emitAlignmentDS(uint64_t ByteAlignment, std::optional< int64_t > Value, unsigned ValueSize, unsigned MaxBytesToEmit)
MCAssembler & getAssembler()
void finishImpl() override
Streamer specific finalization.
void visitUsedSymbol(const MCSymbol &Sym) override
void AddComment(const Twine &T, bool EOL=true) override
Add a comment that can be emitted to the generated .s file to make the output of the compiler more re...
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override
Emit the given Instruction into the current section.
void emitValueToAlignment(Align Alignment, int64_t Fill, uint8_t FillLen, unsigned MaxBytesToEmit) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
void changeSection(MCSection *Section, uint32_t Subsection) override
This is called by popSection and switchSection, if the current section changes.
void emitLabel(MCSymbol *Symbol, SMLoc Loc) override
Emit a label for Symbol into the current section.
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override
Add the given Attribute to Symbol.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
void toHex(ArrayRef< uint8_t > Input, bool LowerCase, SmallVectorImpl< char > &Output)
Convert buffer Input to its hexadecimal representation. The returned string is double the size of Inp...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.