From 59d1f5ff86705bb22669a115b1bb81538d24713a Mon Sep 17 00:00:00 2001 From: Yi-Hong Lyu Date: Sun, 13 Sep 2015 01:46:29 +0800 Subject: [PATCH] Handle Floating Point Constant Data Sequentials Because of the imprecision of floating points. Floating Point Constant (Vector/Data Sequential) should be printed as the bit pattern of unsigned value. --- lib/Target/CBackend/CBackend.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 98aea1d..f08325a 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -250,6 +250,8 @@ namespace { void printContainedStructs(Type *Ty, SmallPtrSet &); void printFloatingPointConstants(Function &F); void printFloatingPointConstants(const Constant *C); + void + printFloatingPointConstantDataSequentials(const ConstantDataSequential *CDS); void printFunctionSignature(const Function *F, bool Prototype); bool okayToPrint(BasicBlock *BB); void printFunction(Function &); @@ -2184,8 +2186,13 @@ void CWriter::printFloatingPointConstants(Function &F) { // precision. // for (constant_iterator I = constant_begin(&F), E = constant_end(&F); - I != E; ++I) - printFloatingPointConstants(*I); + I != E; ++I) { + if (const ConstantDataSequential *CDS = dyn_cast(*I)) { + printFloatingPointConstantDataSequentials(CDS); + } else { + printFloatingPointConstants(*I); + } + } Out << '\n'; } @@ -2244,6 +2251,12 @@ void CWriter::printFloatingPointConstants(const Constant *C) { } } +void CWriter::printFloatingPointConstantDataSequentials( + const ConstantDataSequential *CDS) { + for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) { + printFloatingPointConstants(CDS->getElementAsConstant(i)); + } +} /// printSymbolTable - Run through symbol table looking for type names. If a /// type name is found, emit its declaration...