@@ -24,69 +24,92 @@ static cl::opt<bool> EscapeNonPrint(
2424 " Avoid outputting non-printable ascii characters to assembly files." ),
2525 cl::Hidden);
2626
27+ cl::opt<bool > Z80GasStyle (
28+ " z80-gas-style" ,
29+ cl::desc (" Use GAS style assembly syntax instead of FASMG style." ),
30+ cl::NotHidden);
31+
2732void Z80MCAsmInfoELF::anchor () { }
2833
2934Z80MCAsmInfoELF::Z80MCAsmInfoELF (const Triple &T) {
3035 bool Is16Bit = T.isArch16Bit () || T.getEnvironment () == Triple::CODE16;
3136 CodePointerSize = CalleeSaveStackSlotSize = Is16Bit ? 2 : 3 ;
3237 MaxInstLength = 6 ;
33- DollarIsPC = true ;
34- SeparatorString = nullptr ;
38+
39+ // Common to both GAS and fasmg
3540 CommentString = " ;" ;
36- PrivateGlobalPrefix = PrivateLabelPrefix = " " ;
37- Code16Directive = " assume\t adl = 0" ;
38- Code24Directive = " assume\t adl = 1" ;
41+ AscizDirective = nullptr ;
3942 Code32Directive = Code64Directive = nullptr ;
43+ UseIntegratedAssembler = false ;
4044 AssemblerDialect = !Is16Bit;
41- SupportsQuotedNames = false ;
42- ZeroDirective = AscizDirective = nullptr ;
43- BlockSeparator = " dup " ;
44- AsciiDirective = ByteListDirective = Data8bitsDirective = " \t db\t " ;
45- NumberLiteralSyntax = ANLS_PlainDecimal;
46- CharacterLiteralSyntax = ACLS_SingleQuotes;
47- HasPairedDoubleQuoteStringConstants = true ;
48- HasBackslashEscapesInStringConstants = false ;
49- StringConstantsEscapeNonPrint = EscapeNonPrint;
50- StringConstantsRequiredEscapes = {" \n\r\32 " , 4 }; // include null
51- Data16bitsDirective = " \t dw\t " ;
52- Data24bitsDirective = " \t dl\t " ;
53- Data32bitsDirective = " \t dd\t " ;
54- Data64bitsDirective = " \t dq\t " ;
55- DataULEB128Directive = " \t uleb128\t " ;
56- DataSLEB128Directive = " \t sleb128\t " ;
57- SectionDirective = " \t section\t " ;
58- AlwaysChangeSection = true ;
59- GlobalDirective = " \t public\t " ;
60- LGloblDirective = " \t private\t " ;
61- SetDirective = " \t label\t " ;
62- SetSeparator = " at " ;
6345 HasFunctionAlignment = false ;
64- HasDotTypeDotSizeDirective = false ;
65- IdentDirective = " \t ident\t " ;
66- WeakDirective = " \t weak\t " ;
67- UseIntegratedAssembler = false ;
68- UseLogicalShr = false ;
69- HasSingleParameterDotFile = false ;
70- SupportsDebugInformation = SupportsCFI = true ;
7146 ExceptionsType = ExceptionHandling::SjLj;
72- DwarfFileDirective = " \t file\t " ;
73- DwarfLocDirective = " \t loc\t " ;
74- DwarfCFIDirectivePrefix = " \t cfi_" ;
47+
48+ if (Z80GasStyle) {
49+ Code16Directive = " .assume\t ADL = 0" ;
50+ Code24Directive = " .assume\t ADL = 1" ;
51+ AsciiDirective = ByteListDirective = Data8bitsDirective = " \t db\t " ;
52+ Data16bitsDirective = " \t dw\t " ;
53+ Data24bitsDirective = " \t d24\t " ;
54+ Data32bitsDirective = " \t d32\t " ;
55+ StringConstantsEscapeNonPrint = true ;
56+ StringConstantsRequiredEscapes = {" \n\r\32 " , 4 }; // include null
57+ } else {
58+ Code16Directive = " assume\t adl = 0" ;
59+ Code24Directive = " assume\t adl = 1" ;
60+ DollarIsPC = true ;
61+ SeparatorString = nullptr ;
62+ PrivateGlobalPrefix = PrivateLabelPrefix = " " ;
63+ SupportsQuotedNames = false ;
64+ ZeroDirective = nullptr ;
65+ BlockSeparator = " dup " ;
66+ AsciiDirective = ByteListDirective = Data8bitsDirective = " \t db\t " ;
67+ NumberLiteralSyntax = ANLS_PlainDecimal;
68+ CharacterLiteralSyntax = ACLS_SingleQuotes;
69+ HasPairedDoubleQuoteStringConstants = true ;
70+ HasBackslashEscapesInStringConstants = false ;
71+ StringConstantsEscapeNonPrint = EscapeNonPrint;
72+ StringConstantsRequiredEscapes = {" \n\r\32 " , 4 }; // include null
73+ Data16bitsDirective = " \t dw\t " ;
74+ Data24bitsDirective = " \t dl\t " ;
75+ Data32bitsDirective = " \t dd\t " ;
76+ Data64bitsDirective = " \t dq\t " ;
77+ DataULEB128Directive = " \t uleb128\t " ;
78+ DataSLEB128Directive = " \t sleb128\t " ;
79+ SectionDirective = " \t section\t " ;
80+ AlwaysChangeSection = true ;
81+ GlobalDirective = " \t public\t " ;
82+ LGloblDirective = " \t private\t " ;
83+ SetDirective = " \t label\t " ;
84+ SetSeparator = " at " ;
85+ HasDotTypeDotSizeDirective = false ;
86+ IdentDirective = " \t ident\t " ;
87+ WeakDirective = " \t weak\t " ;
88+ UseLogicalShr = false ;
89+ HasSingleParameterDotFile = false ;
90+ SupportsDebugInformation = SupportsCFI = true ;
91+ DwarfFileDirective = " \t file\t " ;
92+ DwarfLocDirective = " \t loc\t " ;
93+ DwarfCFIDirectivePrefix = " \t cfi_" ;
94+ }
7595}
7696
7797MCSection *Z80MCAsmInfoELF::getNonexecutableStackSection (MCContext &Ctx) const {
7898 return nullptr ;
7999}
80100
81101bool Z80MCAsmInfoELF::isAcceptableChar (char C) const {
82- return MCAsmInfo::isAcceptableChar (C) || C == ' %' || C == ' ^' ;
102+ return Z80GasStyle ? MCAsmInfo::isAcceptableChar (C) : ( MCAsmInfo::isAcceptableChar (C) || C == ' %' || C == ' ^' ) ;
83103}
84104
85105bool Z80MCAsmInfoELF::shouldOmitSectionDirective (StringRef SectionName) const {
86106 return false ;
87107}
88108
89109const char *Z80MCAsmInfoELF::getBlockDirective (int64_t Size) const {
110+ if (Z80GasStyle) {
111+ return MCAsmInfoELF::getBlockDirective (Size);
112+ }
90113 switch (Size) {
91114 default : return nullptr ;
92115 case 1 : return " \t db\t " ;
@@ -97,6 +120,9 @@ const char *Z80MCAsmInfoELF::getBlockDirective(int64_t Size) const {
97120}
98121
99122const char *Z80MCAsmInfoELF::getUnaryOperator (unsigned Opc) const {
123+ if (Z80GasStyle) {
124+ return MCAsmInfoELF::getUnaryOperator (Opc);
125+ }
100126 switch (Opc) {
101127 default : llvm_unreachable (" unknown opcode" );
102128 case MCUnaryExpr::LNot: return " ~" ;
@@ -107,6 +133,9 @@ const char *Z80MCAsmInfoELF::getUnaryOperator(unsigned Opc) const {
107133}
108134
109135const char *Z80MCAsmInfoELF::getBinaryOperator (unsigned Opc) const {
136+ if (Z80GasStyle) {
137+ return MCAsmInfoELF::getBinaryOperator (Opc);
138+ }
110139 switch (Opc) {
111140 default : llvm_unreachable (" unknown opcode" );
112141 case MCBinaryExpr::Add: return " +" ;
0 commit comments