Fix some column padding bugs, reorganize things as suggested by Chris

and eliminate complexity.  Yay!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78243 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene 2009-08-05 21:00:52 +00:00
parent cafbdc5c09
commit a5bb59f856
4 changed files with 31 additions and 30 deletions

View File

@ -327,6 +327,12 @@ namespace llvm {
void EmitComments(const MCInst &MI) const; void EmitComments(const MCInst &MI) const;
protected: protected:
/// getOperandColumn - Return the output column number (zero-based)
/// for operand % "operand." If TargetAsmInfo has FirstOperandColumn
/// == 0 or MaxOperandLength == 0, return 0, meaning column alignment
/// is disabled.
unsigned getOperandColumn(int operand) const;
/// PadToColumn - This gets called every time a tab is emitted. If /// PadToColumn - This gets called every time a tab is emitted. If
/// column padding is turned on, we replace the tab with the /// column padding is turned on, we replace the tab with the
/// appropriate amount of padding. If not, we replace the tab with a /// appropriate amount of padding. If not, we replace the tab with a

View File

@ -361,8 +361,11 @@ namespace llvm {
const char *getCommentString() const { const char *getCommentString() const {
return CommentString; return CommentString;
} }
unsigned getOperandColumn(int operand) const { unsigned getFirstOperandColumn() const {
return FirstOperandColumn + (MaxOperandLength+1)*(operand-1); return FirstOperandColumn;
}
unsigned getMaxOperandLength() const {
return MaxOperandLength;
} }
const char *getGlobalPrefix() const { const char *getGlobalPrefix() const {
return GlobalPrefix; return GlobalPrefix;

View File

@ -782,6 +782,20 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
} }
O << '\n'; O << '\n';
} }
/// getOperandColumn - Return the output column number (zero-based)
/// for operand % "operand." If TargetAsmInfo has FirstOperandColumn
/// == 0 or MaxOperandLength == 0, return 0, meaning column alignment
/// is disabled.
unsigned AsmPrinter::getOperandColumn(int operand) const {
if (TAI->getFirstOperandColumn() > 0 && TAI->getMaxOperandLength() > 0) {
return TAI->getFirstOperandColumn()
+ (TAI->getMaxOperandLength()+1)*(operand-1);
}
else {
return 0;
}
}
/// PadToColumn - This gets called every time a tab is emitted. If /// PadToColumn - This gets called every time a tab is emitted. If
/// column padding is turned on, we replace the tab with the /// column padding is turned on, we replace the tab with the
@ -789,8 +803,8 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
/// space, except for the first operand so that initial operands are /// space, except for the first operand so that initial operands are
/// always lined up by tabs. /// always lined up by tabs.
void AsmPrinter::PadToColumn(unsigned Operand) const { void AsmPrinter::PadToColumn(unsigned Operand) const {
if (TAI->getOperandColumn(Operand) > 0) { if (getOperandColumn(Operand) > 0) {
O.PadToColumn(TAI->getOperandColumn(Operand), 1); O.PadToColumn(getOperandColumn(Operand), 1);
} }
else { else {
if (Operand == 1) { if (Operand == 1) {

View File

@ -148,8 +148,6 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) {
// Emit a constant string fragment. // Emit a constant string fragment.
// TODO: Recognize an operand separator to determine when to pad
// to the next operator.
if (DollarPos != LastEmitted) { if (DollarPos != LastEmitted) {
if (CurVariant == Variant || CurVariant == ~0U) { if (CurVariant == Variant || CurVariant == ~0U) {
for (; LastEmitted != DollarPos; ++LastEmitted) for (; LastEmitted != DollarPos; ++LastEmitted)
@ -727,30 +725,10 @@ void AsmWriterEmitter::run(raw_ostream &O) {
O << " // Emit the opcode for the instruction.\n" O << " // Emit the opcode for the instruction.\n"
<< " unsigned Bits = OpInfo[MI->getOpcode()];\n" << " unsigned Bits = OpInfo[MI->getOpcode()];\n"
<< " if (Bits == 0) return false;\n\n"; << " if (Bits == 0) return false;\n"
<< " O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n\n";
O << " unsigned OperandColumn = 1;\n\n"
<< " if (TAI->getOperandColumn(1) > 0) {\n" O << " unsigned OperandColumn = 1;\n\n";
<< " // Don't emit trailing whitespace, let the column padding do it. This\n"
<< " // guarantees that a stray long opcode + tab won't upset the alignment.\n"
<< " // We need to handle this special case here because sometimes the initial\n"
<< " // mnemonic string includes a tab or space and sometimes it doesn't.\n"
<< " unsigned OpLength = std::strlen(AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "));\n"
<< " if (OpLength > 0 &&\n"
<< " ((AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == ' ' ||\n"
<< " (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == '\\t')) {\n"
<< " do {\n"
<< " --OpLength;\n"
<< " } while ((AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == ' ' ||\n"
<< " (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == '\\t');\n"
<< " for (unsigned Idx = 0; Idx < OpLength; ++Idx)\n"
<< " O << (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[Idx];\n"
<< " O.PadToColumn(TAI->getOperandColumn(OperandColumn++), 1);\n"
<< " }\n"
<< " } else {\n"
<< " O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n"
<< " }\n\n";
// Output the table driven operand information. // Output the table driven operand information.
BitsLeft = 32-AsmStrBits; BitsLeft = 32-AsmStrBits;