Support printing control characters in standard C/assembly style,

if you specify useCSyntax = true.  The old style is still the default.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1011 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vikram S. Adve 2001-10-28 21:48:05 +00:00
parent 94e40ef064
commit c750c29f28

View File

@ -144,28 +144,24 @@ ConstPoolPointerRef::ConstPoolPointerRef(GlobalValue *GV)
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// getStrValue implementations // getStrValue implementations
string ConstPoolBool::getStrValue() const { string ConstPoolBool::getStrValue(bool useCSyntax) const {
return Val ? "true" : "false"; return Val ? "true" : "false";
} }
string ConstPoolSInt::getStrValue() const { string ConstPoolSInt::getStrValue(bool useCSyntax) const {
return itostr(Val.Signed); return itostr(Val.Signed);
} }
string ConstPoolUInt::getStrValue() const { string ConstPoolUInt::getStrValue(bool useCSyntax) const {
return utostr(Val.Unsigned); return utostr(Val.Unsigned);
} }
string ConstPoolFP::getStrValue() const { string ConstPoolFP::getStrValue(bool useCSyntax) const {
return ftostr(Val); return ftostr(Val);
} }
string ConstPoolArray::getStrValue() const { // Treat the array as a string if it is an array of ubytes or non-neg sbytes
string Result; bool ConstPoolArray::isString() const {
// As a special case, print the array as a string if it is an array of
// ubytes or an array of sbytes with positive values.
//
const Type *ETy = cast<ArrayType>(getType())->getElementType(); const Type *ETy = cast<ArrayType>(getType())->getElementType();
bool isString = (ETy == Type::SByteTy || ETy == Type::UByteTy); bool isString = (ETy == Type::SByteTy || ETy == Type::UByteTy);
for (unsigned i = 0; i < Operands.size(); ++i) for (unsigned i = 0; i < Operands.size(); ++i)
@ -174,9 +170,22 @@ string ConstPoolArray::getStrValue() const {
isString = false; isString = false;
break; break;
} }
return isString;
}
if (isString) { inline string toRawString(unsigned char C) {
Result = "c\""; string result = "\\";
result += ( C/16 < 10) ? ( C/16 +'0') : ( C/16 -10+'A');
result += ((C&15) < 10) ? ((C&15)+'0') : ((C&15)-10+'A');
return result;
}
string ConstPoolArray::getStrValue(bool useCSyntax) const {
string Result;
if (this->isString()) {
const Type *ETy = cast<ArrayType>(getType())->getElementType();
Result = (useCSyntax)? "\"" : "c\"";
for (unsigned i = 0; i < Operands.size(); ++i) { for (unsigned i = 0; i < Operands.size(); ++i) {
unsigned char C = (ETy == Type::SByteTy) ? unsigned char C = (ETy == Type::SByteTy) ?
(unsigned char)cast<ConstPoolSInt>(Operands[i])->getValue() : (unsigned char)cast<ConstPoolSInt>(Operands[i])->getValue() :
@ -184,10 +193,20 @@ string ConstPoolArray::getStrValue() const {
if (isprint(C)) { if (isprint(C)) {
Result += C; Result += C;
} else { } else if (! useCSyntax) {
Result += '\\'; Result += toRawString(C);
Result += ( C/16 < 10) ? ( C/16 +'0') : ( C/16 -10+'A'); }
Result += ((C&15) < 10) ? ((C&15)+'0') : ((C&15)-10+'A'); else {
switch(C) {
case '\a': Result += "\\a"; break;
case '\b': Result += "\\n"; break;
case '\f': Result += "\\n"; break;
case '\n': Result += "\\n"; break;
case '\r': Result += "\\n"; break;
case '\t': Result += "\\t"; break;
case '\v': Result += "\\v"; break;
default: Result += toRawString(C); break;
}
} }
} }
Result += "\""; Result += "\"";
@ -196,10 +215,10 @@ string ConstPoolArray::getStrValue() const {
Result = "["; Result = "[";
if (Operands.size()) { if (Operands.size()) {
Result += " " + Operands[0]->getType()->getDescription() + Result += " " + Operands[0]->getType()->getDescription() +
" " + cast<ConstPoolVal>(Operands[0])->getStrValue(); " " + cast<ConstPoolVal>(Operands[0])->getStrValue(useCSyntax);
for (unsigned i = 1; i < Operands.size(); i++) for (unsigned i = 1; i < Operands.size(); i++)
Result += ", " + Operands[i]->getType()->getDescription() + Result += ", " + Operands[i]->getType()->getDescription() +
" " + cast<ConstPoolVal>(Operands[i])->getStrValue(); " " + cast<ConstPoolVal>(Operands[i])->getStrValue(useCSyntax);
} }
Result += " ]"; Result += " ]";
} }
@ -207,24 +226,24 @@ string ConstPoolArray::getStrValue() const {
return Result; return Result;
} }
string ConstPoolStruct::getStrValue() const { string ConstPoolStruct::getStrValue(bool useCSyntax) const {
string Result = "{"; string Result = "{";
if (Operands.size()) { if (Operands.size()) {
Result += " " + Operands[0]->getType()->getDescription() + Result += " " + Operands[0]->getType()->getDescription() +
" " + cast<ConstPoolVal>(Operands[0])->getStrValue(); " " + cast<ConstPoolVal>(Operands[0])->getStrValue(useCSyntax);
for (unsigned i = 1; i < Operands.size(); i++) for (unsigned i = 1; i < Operands.size(); i++)
Result += ", " + Operands[i]->getType()->getDescription() + Result += ", " + Operands[i]->getType()->getDescription() +
" " + cast<ConstPoolVal>(Operands[i])->getStrValue(); " " + cast<ConstPoolVal>(Operands[i])->getStrValue(useCSyntax);
} }
return Result + " }"; return Result + " }";
} }
string ConstPoolPointerNull::getStrValue() const { string ConstPoolPointerNull::getStrValue(bool useCSyntax) const {
return "null"; return "null";
} }
string ConstPoolPointerRef::getStrValue() const { string ConstPoolPointerRef::getStrValue(bool useCSyntax) const {
const GlobalValue *V = getValue(); const GlobalValue *V = getValue();
if (V->hasName()) return "%" + V->getName(); if (V->hasName()) return "%" + V->getName();