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!");
349 size_t Len =
Data.size();
359 OS <<
'\'' <<
toHex(Chars) <<
'\'';
367 if (!NumBytes.evaluateAsAbsolute(
Count)) {
375 if (
Count > 0x7FFFFFFF) {
382 OS <<
" DC " <<
Count <<
"XL1'"
403 FixupMap.
resize(Code.size() * 8);
404 for (
unsigned I = 0, E = Code.size() * 8;
I != E; ++
I)
407 for (
unsigned I = 0, E = Fixups.size();
I != E; ++
I) {
411 for (
unsigned J = 0; J != Info.TargetSize; ++J) {
412 unsigned Index =
F.getOffset() * 8 + Info.TargetOffset + J;
413 assert(Index < Code.size() * 8 &&
"Invalid offset in fixup!");
414 FixupMap[Index] = 1 +
I;
419 for (
unsigned I = 0, E = Code.size();
I != E; ++
I) {
424 uint8_t MapEntry = FixupMap[
I * 8 + 0];
425 for (
unsigned J = 1; J != 8; ++J) {
426 if (FixupMap[
I * 8 + J] == MapEntry)
433 if (MapEntry !=
uint8_t(~0U)) {
440 <<
char(
'A' + MapEntry - 1) <<
'\'';
442 OS <<
char(
'A' + MapEntry - 1);
447 for (
unsigned J = 8; J--;) {
448 unsigned Bit = (Code[
I] >> J) & 1;
449 unsigned FixupBit =
I * 8 + (7 - J);
450 if (
uint8_t MapEntry = FixupMap[FixupBit]) {
451 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
452 OS <<
char(
'A' + MapEntry - 1);
460 for (
unsigned I = 0, E = Fixups.size();
I != E; ++
I) {
462 OS <<
" fixup " <<
char(
'A' +
I) <<
" - "
463 <<
"offset: " <<
F.getOffset() <<
", value: ";
464 MAI->printExpr(OS, *
F.getValue());
465 auto Kind =
F.getKind();
467 OS <<
", relocation type: " << Kind;
472 OS <<
"FK_PCRel_" << (Info.TargetSize / 8);
486 InstPrinter->printInst(&Inst, 0,
"", STI, OS);
497 bool EmitLabelAndEntry =
503 if (EmitLabelAndEntry) {
504 OS <<
" ENTRY " << Sym->
getName();
515 if (EmitLabelAndEntry) {
516 OS << Sym->
getName() <<
" DS 0H";
527 Align ByteAlignment) {
530 Symbol->getSectionForCommonSymbol(
getContext(), ByteAlignment);
539 String.consume_back(
"\n");
547 unsigned Size,
bool Parens) {
548 switch (
Value->getKind()) {
551 OS <<
"XL" <<
Size <<
'\''
573 OS <<
'/' << (1 << Const);
592 "Unrecognized HLASM arithmetic expression!");
600 MAI->printExpr(OS, *
Value);
606 MAI->printExpr(OS, *
Value);
617 "Cannot emit contents before setting section!");
627 if (Symbol.isTemporary() || !Symbol.isRegistered() || Symbol.isDefined())
631 OS << Sym.getADA()->getParent()->getExternalName() <<
" CATTR PART("
632 << Sym.getName() <<
")";
635 OS <<
" " << (Sym.isWeak() ?
"WXTRN" :
"EXTRN") <<
" " << Sym.getName();
638 emitXATTR(OS, Sym.getName(), Sym.getADA(), Sym.isIndirect(),
639 Sym.getLinkage(), Sym.getCodeData(), Sym.getBindingScope());
641 if (Sym.hasExternalName())
642 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)
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.
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.
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.
@ 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.