From 42eb2bae8ee4bf94a50a804149f042f11702c36c Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Sat, 24 Aug 2002 14:44:23 +0000 Subject: [PATCH] Sign-extend array index expressions to work correctly on non-32 bit machines. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3496 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/CBackend/CBackend.cpp | 13 +++++++++---- lib/Target/CBackend/Writer.cpp | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index e33622f71f3..f4fb7a24585 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -210,7 +210,8 @@ ostream &CWriter::printType(const Type *Ty, const string &NameSoFar, case Type::PointerTyID: { const PointerType *PTy = cast(Ty); - return printType(PTy->getElementType(), "(*" + NameSoFar + ")"); + std::string ptrName = NameSoFar.length()? "(*"+NameSoFar+")" : string("*"); + return printType(PTy->getElementType(), ptrName); } case Type::ArrayTyID: { @@ -844,16 +845,20 @@ void CWriter::printIndexingExpression(Value *Ptr, User::op_iterator I, Out << (HasImplicitAddress ? "." : "->"); Out << "field" << cast(*(I+1))->getValue(); I += 2; - } else { // Performing array indexing. Just skip the 0 + } else { // First array index of 0: Just skip it ++I; } } for (; I != E; ++I) if ((*I)->getType() == Type::UIntTy) { - Out << "["; + Out << "[((int) ("; // sign-extend from 32 (to 64) bits writeOperand(*I); - Out << "]"; + Out << " * sizeof("; + printType(cast(Ptr->getType())->getElementType()); + Out << "))) / sizeof("; + printType(cast(Ptr->getType())->getElementType()); + Out << ")]"; } else { Out << ".field" << cast(*I)->getValue(); } diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index e33622f71f3..f4fb7a24585 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -210,7 +210,8 @@ ostream &CWriter::printType(const Type *Ty, const string &NameSoFar, case Type::PointerTyID: { const PointerType *PTy = cast(Ty); - return printType(PTy->getElementType(), "(*" + NameSoFar + ")"); + std::string ptrName = NameSoFar.length()? "(*"+NameSoFar+")" : string("*"); + return printType(PTy->getElementType(), ptrName); } case Type::ArrayTyID: { @@ -844,16 +845,20 @@ void CWriter::printIndexingExpression(Value *Ptr, User::op_iterator I, Out << (HasImplicitAddress ? "." : "->"); Out << "field" << cast(*(I+1))->getValue(); I += 2; - } else { // Performing array indexing. Just skip the 0 + } else { // First array index of 0: Just skip it ++I; } } for (; I != E; ++I) if ((*I)->getType() == Type::UIntTy) { - Out << "["; + Out << "[((int) ("; // sign-extend from 32 (to 64) bits writeOperand(*I); - Out << "]"; + Out << " * sizeof("; + printType(cast(Ptr->getType())->getElementType()); + Out << "))) / sizeof("; + printType(cast(Ptr->getType())->getElementType()); + Out << ")]"; } else { Out << ".field" << cast(*I)->getValue(); }