diff options
| author | David Greene <greened@obbligato.org> | 2009-08-05 21:00:52 +0000 |
|---|---|---|
| committer | David Greene <greened@obbligato.org> | 2009-08-05 21:00:52 +0000 |
| commit | fdd2519eb5cb5615d25bd61817020f75845d7f77 (patch) | |
| tree | 3bdcb64d20b639bd9126e2428862c98552e3ebca | |
| parent | 39fb546b9e2296abf69d5a61007b7bbf656a3270 (diff) | |
| download | bcm5719-llvm-fdd2519eb5cb5615d25bd61817020f75845d7f77.tar.gz bcm5719-llvm-fdd2519eb5cb5615d25bd61817020f75845d7f77.zip | |
Fix some column padding bugs, reorganize things as suggested by Chris
and eliminate complexity. Yay!
llvm-svn: 78243
| -rw-r--r-- | llvm/include/llvm/CodeGen/AsmPrinter.h | 6 | ||||
| -rw-r--r-- | llvm/include/llvm/Target/TargetAsmInfo.h | 7 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 18 | ||||
| -rw-r--r-- | llvm/utils/TableGen/AsmWriterEmitter.cpp | 30 |
4 files changed, 31 insertions, 30 deletions
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h index 847c9452664..0ab780b0ab0 100644 --- a/llvm/include/llvm/CodeGen/AsmPrinter.h +++ b/llvm/include/llvm/CodeGen/AsmPrinter.h @@ -327,6 +327,12 @@ namespace llvm { void EmitComments(const MCInst &MI) const; 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 /// column padding is turned on, we replace the tab with the /// appropriate amount of padding. If not, we replace the tab with a diff --git a/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h index e24302b84ef..b5c1796e393 100644 --- a/llvm/include/llvm/Target/TargetAsmInfo.h +++ b/llvm/include/llvm/Target/TargetAsmInfo.h @@ -361,8 +361,11 @@ namespace llvm { const char *getCommentString() const { return CommentString; } - unsigned getOperandColumn(int operand) const { - return FirstOperandColumn + (MaxOperandLength+1)*(operand-1); + unsigned getFirstOperandColumn() const { + return FirstOperandColumn; + } + unsigned getMaxOperandLength() const { + return MaxOperandLength; } const char *getGlobalPrefix() const { return GlobalPrefix; diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 3102bdae017..ec62822e627 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -782,6 +782,20 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, } 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 /// 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 /// always lined up by tabs. void AsmPrinter::PadToColumn(unsigned Operand) const { - if (TAI->getOperandColumn(Operand) > 0) { - O.PadToColumn(TAI->getOperandColumn(Operand), 1); + if (getOperandColumn(Operand) > 0) { + O.PadToColumn(getOperandColumn(Operand), 1); } else { if (Operand == 1) { diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp index 5f1d3257681..de4ec226fc1 100644 --- a/llvm/utils/TableGen/AsmWriterEmitter.cpp +++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp @@ -148,8 +148,6 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) { // Emit a constant string fragment. - // TODO: Recognize an operand separator to determine when to pad - // to the next operator. if (DollarPos != LastEmitted) { if (CurVariant == Variant || CurVariant == ~0U) { for (; LastEmitted != DollarPos; ++LastEmitted) @@ -727,30 +725,10 @@ void AsmWriterEmitter::run(raw_ostream &O) { O << " // Emit the opcode for the instruction.\n" << " unsigned Bits = OpInfo[MI->getOpcode()];\n" - << " if (Bits == 0) return false;\n\n"; - - O << " unsigned OperandColumn = 1;\n\n" - << " if (TAI->getOperandColumn(1) > 0) {\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"; - + << " if (Bits == 0) return false;\n" + << " O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n\n"; + + O << " unsigned OperandColumn = 1;\n\n"; // Output the table driven operand information. BitsLeft = 32-AsmStrBits; |

