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;
84 OS << Name <<
" XATTR ";
89 if (NotUnspecified || IsIndirectReference) {
90 OS << Sep <<
"REFERENCE(";
96 if (IsIndirectReference)
97 OS << SepRef <<
"INDIRECT";
103 OS << Sep <<
"PSECT(" << ADA->
getName() <<
")";
105 OS << Sep <<
"SCOPE(";
106 switch (BindingScope) {
132 OS << Name <<
" CATTR ";
133 OS <<
"ALIGN(" <<
static_cast<unsigned>(Alignment) <<
"),"
134 <<
"FILL(" <<
static_cast<unsigned>(FillByteValue) <<
")";
135 switch (LoadBehavior) {
145 switch (Executable) {
150 OS <<
",NOTEXECUTABLE";
176 OS <<
",PRIORITY(" << SortKey <<
")";
177 if (!PartName.
empty())
178 OS <<
",PART(" << PartName <<
")";
183 OS << Name <<
" ALIAS C'";
184 for (
char C : ExternalName) {
185 if (
C ==
'\'' ||
C ==
'&')
195 auto EmitExternalName = [&Sec,
this]() {
196 if (Sec.hasExternalName())
197 emitALIAS(OS, Sec.getName(), Sec.getExternalName());
199 switch (Sec.getSymbolType()) {
201 OS << Sec.getName() <<
" CSECT\n";
208 if (!Sec.isEmitted()) {
213 if (
auto *BeginSym =
static_cast<MCSymbolGOFF *
>(Sec.getBeginSymbol())) {
214 if (BeginSym->getADA()) {
215 emitXATTR(OS, BeginSym->getName(), BeginSym->getADA(),
224 OS << Sec.getName() <<
" CATTR\n";
230 if (!Sec.isEmitted()) {
247 OS << ED->
getName() <<
" CATTR PART(" << Sec.getName() <<
")\n";
258 std::optional<int64_t>
Value,
260 unsigned MaxBytesToEmit) {
289 OS << MAI->getCommentString() <<
T;
309 assert(Comments.
back() ==
'\n' &&
"Comment array not newline terminated");
312 size_t Position = std::min(InstLimit - 2, Comments.
find(
'\n'));
313 FOS << MAI->getCommentString() <<
' ' << Comments.
substr(0, Position)
316 if (Comments[Position] ==
'\n')
318 Comments = Comments.
substr(Position);
319 }
while (!Comments.
empty());
327 unsigned MaxBytesToEmit) {
333 unsigned MaxBytesToEmit) {
335 if (MAI->getTextAlignFillValue())
344 "Cannot emit contents before setting section!");
345 for (
size_t I = 0, E =
Data.size();
I < E;
I += MaxXLLen) {
347 OS <<
" DC XL" << Chunk.
size() <<
'\'' <<
toHex(Chunk) <<
'\'';
355 if (!NumBytes.evaluateAsAbsolute(
Count)) {
363 if (
Count > 0x7FFFFFFF) {
370 OS <<
" DC " <<
Count <<
"XL1'"
391 FixupMap.
resize(Code.size() * 8);
392 for (
unsigned I = 0, E = Code.size() * 8;
I != E; ++
I)
395 for (
unsigned I = 0, E = Fixups.size();
I != E; ++
I) {
399 for (
unsigned J = 0; J != Info.TargetSize; ++J) {
400 unsigned Index =
F.getOffset() * 8 + Info.TargetOffset + J;
401 assert(Index < Code.size() * 8 &&
"Invalid offset in fixup!");
402 FixupMap[Index] = 1 +
I;
407 for (
unsigned I = 0, E = Code.size();
I != E; ++
I) {
412 uint8_t MapEntry = FixupMap[
I * 8 + 0];
413 for (
unsigned J = 1; J != 8; ++J) {
414 if (FixupMap[
I * 8 + J] == MapEntry)
421 if (MapEntry !=
uint8_t(~0U)) {
428 <<
char(
'A' + MapEntry - 1) <<
'\'';
430 OS <<
char(
'A' + MapEntry - 1);
435 for (
unsigned J = 8; J--;) {
436 unsigned Bit = (Code[
I] >> J) & 1;
437 unsigned FixupBit =
I * 8 + (7 - J);
438 if (
uint8_t MapEntry = FixupMap[FixupBit]) {
439 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
440 OS <<
char(
'A' + MapEntry - 1);
448 for (
unsigned I = 0, E = Fixups.size();
I != E; ++
I) {
450 OS <<
" fixup " <<
char(
'A' +
I) <<
" - "
451 <<
"offset: " <<
F.getOffset() <<
", value: ";
452 MAI->printExpr(OS, *
F.getValue());
453 auto Kind =
F.getKind();
455 OS <<
", relocation type: " << Kind;
460 OS <<
"FK_PCRel_" << (Info.TargetSize / 8);
474 InstPrinter->printInst(&Inst, 0,
"", STI, OS);
485 bool EmitLabelAndEntry =
491 if (EmitLabelAndEntry) {
492 OS <<
" ENTRY " << Sym->
getName();
503 if (EmitLabelAndEntry) {
504 OS << Sym->
getName() <<
" DS 0H";
517 OS <<
"AL" <<
Size <<
'(';
526 Align ByteAlignment) {
529 Symbol->getSectionForCommonSymbol(
getContext(), ByteAlignment);
538 String.consume_back(
"\n");
546 unsigned Size,
bool Parens) {
547 switch (
Value->getKind()) {
550 OS <<
"XL" <<
Size <<
'\''
572 OS <<
'/' << (1 << Const);
591 "Unrecognized HLASM arithmetic expression!");
599 MAI->printExpr(OS, *
Value);
605 MAI->printExpr(OS, *
Value);
616 "Cannot emit contents before setting section!");
623 "(z/OS binder restriction IEW2572E)");
635 if (Symbol.isTemporary() || !Symbol.isRegistered() || Symbol.isDefined())
639 OS << Sym.getADA()->getParent()->getExternalName() <<
" CATTR PART("
640 << Sym.getName() <<
")";
643 OS <<
" " << (Sym.isWeak() ?
"WXTRN" :
"EXTRN") <<
" " << Sym.getName();
646 emitXATTR(OS, Sym.getName(), Sym.getADA(), Sym.isIndirect(),
647 Sym.getLinkage(), Sym.getCodeData(), Sym.getBindingScope());
649 if (Sym.hasExternalName())
650 emitALIAS(OS, Sym.getName(), Sym.getExternalName());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_LIKELY(EXPR)
This file declares the MCSectionGOFF class, which contains all of the necessary machine code sections...
This file contains the MCSymbolGOFF class.
static void emitCATTR(raw_ostream &OS, StringRef Name, GOFF::ESDRmode Rmode, GOFF::ESDAlignment Alignment, GOFF::ESDLoadingBehavior LoadBehavior, GOFF::ESDExecutable Executable, bool IsReadOnly, uint32_t SortKey, uint8_t FillByteValue, StringRef PartName)
static void emitALIAS(raw_ostream &OS, StringRef Name, StringRef ExternalName)
static void emitXATTR(raw_ostream &OS, StringRef Name, MCSectionGOFF *ADA, bool IsIndirectReference, GOFF::ESDLinkageType Linkage, GOFF::ESDExecutable Executable, GOFF::ESDBindingScope BindingScope)
static void printAddrConstPrefix(raw_ostream &OS, unsigned Size)
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...
virtual MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
std::unique_ptr< MCAssembler > Assembler
SmallString< 128 > CommentToEmit
MCAssembler & getAssembler()
raw_ostream & getCommentOS() override
Return a raw_ostream that comments can be written to.
raw_svector_ostream CommentStream
MCCodeEmitter & getEmitter() const
MCAsmBackend & getBackend() const
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.
virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl< char > &CB, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const =0
Encode the given Inst to bytes and append to CB.
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.
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Instances of this class represent a single low-level machine instruction.
GOFF::EDAttr getEDAttributes() const
GOFF::ESDAlignment getEDAlignment() const
MCSectionGOFF * getParent() const
Instances of this class represent a uniqued identifier for a section in the current translation unit.
StringRef getName() const
MCSymbol * getBeginSymbol()
virtual bool popSection()
Restore the current and previous section from the section stack.
virtual MCAssembler * getAssemblerPtr()
MCContext & getContext() const
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
void pushSection()
Save the current and previous section on the section stack.
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to 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.
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
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.
StringRef getExternalName() const
GOFF::ESDExecutable getCodeData() const
bool hasExternalName() const
bool isInEDSection() const
GOFF::ESDBindingScope getBindingScope() const
GOFF::ESDLinkageType getLinkage() const
MCSectionGOFF * getADA() 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.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
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).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
char back() const
Get the last character in the string.
constexpr size_t size() const
Get the string size.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
void emitHLASMValueImpl(const MCExpr *Value, unsigned Size, bool Parens=false)
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc=SMLoc()) override
Emit Size bytes worth of the value specified by FillValue.
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 addEncodingComment(const MCInst &Inst, const MCSubtargetInfo &STI)
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)
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 emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment) override
Emit a common symbol.
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 emitRawComment(const Twine &T, bool TabPrefix=false) override
Print T and prefix it with the comment string (normally #) and optionally a tab.
void emitCodeAlignment(Align Alignment, const MCSubtargetInfo &STI, unsigned MaxBytesToEmit=0) override
Emit nops 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.
constexpr StringLiteral CLASS_WSA
@ ESD_ST_ElementDefinition
@ ESD_ST_SectionDefinition
bool isRelocation(MCFixupKind FixupKind)
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)
FormattedNumber format_hex_no_prefix(uint64_t N, unsigned Width, bool Upper=false)
format_hex_no_prefix - Output N as a fixed width hexadecimal.
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...
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
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.
GOFF::ESDLoadingBehavior LoadBehavior
GOFF::ESDLinkageType Linkage
GOFF::ESDBindingScope BindingScope
GOFF::ESDExecutable Executable
Target independent information on a fixup kind.
const char * Name
A target specific name for the fixup kind.