From e99941a931ba1c956af5da9bb3be18937fa62387 Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Thu, 22 Aug 2002 02:58:36 +0000 Subject: [PATCH] Add AsmPrinter::ConstantExprToString, which writes out a ConstantExpr as an expression. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3442 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SparcV9/SparcV9AsmPrinter.cpp | 75 +++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp index 0a7f5ea7bf8..680e7d20b52 100644 --- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp +++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp @@ -185,6 +185,74 @@ public: assert(0 && "Unexpected type of GlobalValue!"); return ""; } + + // ConstantExprToString() - Convert a ConstantExpr to a C expression, and + // return this as a string. + // + std::string ConstantExprToString(const ConstantExpr* CE, + const TargetMachine& target) { + std::string S(""); + + switch(CE->getOpcode()) { + case Instruction::GetElementPtr: + { + const Value* ptrVal = CE->getOperand(0); + valToExprString(ptrVal, target, S); + std::vector idxVec = CE->copyOperands(); + idxVec.erase(idxVec.begin()); + uint64_t byteOffset = target.DataLayout.getIndexedOffset(ptrVal->getType(), + idxVec); + uint64_t eltSize = target.DataLayout.getTypeSize( + cast(ptrVal->getType())->getElementType()); + S += " + " + utostr(byteOffset / eltSize); + break; + } + + default: + assert(0 && "Unsupported operator in ConstantExprToString()"); + break; + } + + return S; + } + + // valToExprString - Helper function for ConstantExprToString(). + // Appends result to argument string S. + // + void valToExprString(const Value* V, const TargetMachine& target, + std::string& S) { + bool failed = false; + if (const Constant* CV = dyn_cast(V)) { // symbolic or known + + if (const ConstantBool *CB = dyn_cast(CV)) + S += std::string(CB == ConstantBool::True ? "1" : "0"); + else if (const ConstantSInt *CI = dyn_cast(CV)) + S += itostr(CI->getValue()); + else if (const ConstantUInt *CI = dyn_cast(CV)) + S += utostr(CI->getValue()); + else if (const ConstantFP *CFP = dyn_cast(CV)) + S += ftostr(CFP->getValue()); + else if (isa(CV)) + S += "0"; + else if (const ConstantPointerRef *CPR = dyn_cast(CV)) + valToExprString(CPR->getValue(), target, S); + else if (const ConstantExpr *CE = dyn_cast(CV)) + S += ConstantExprToString(CE, target); + else + failed = true; + + } else if (const GlobalValue* GV = dyn_cast(V)) { + S += getID(GV); + } + else + failed = true; + + if (failed) { + assert(0 && "Cannot convert value to string"); + S += ""; + } + } + }; @@ -546,6 +614,7 @@ ArrayTypeIsString(const ArrayType* arrayType) arrayType->getElementType() == Type::SByteTy); } + inline const string TypeToDataDirective(const Type* type) { @@ -670,9 +739,13 @@ SparcModuleAsmPrinter::printSingleConstant(const Constant* CV) toAsm << getID(CPR->getValue()) << "\n"; } else if (isa(CV)) - { + { // Null pointer value toAsm << "0\n"; } + else if (const ConstantExpr* CE = dyn_cast(CV)) + { // Constant expression built from operators, constants, and symbolic addrs + toAsm << ConstantExprToString(CE, Target) << "\n"; + } else { assert(0 && "Unknown elementary type for constant"); -- 2.34.1