aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-08-24 14:44:23 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-08-24 14:44:23 +0000
commit42eb2bae8ee4bf94a50a804149f042f11702c36c (patch)
tree8b759d9a051b77481f9d64c0538a0e3ca95ca83e /lib
parente6f9a91618224dea065a440f3627bbb6c744ccc3 (diff)
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
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/CBackend/CBackend.cpp13
-rw-r--r--lib/Target/CBackend/Writer.cpp13
2 files changed, 18 insertions, 8 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp
index e33622f71f..f4fb7a2458 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<PointerType>(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<ConstantUInt>(*(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<PointerType>(Ptr->getType())->getElementType());
+ Out << "))) / sizeof(";
+ printType(cast<PointerType>(Ptr->getType())->getElementType());
+ Out << ")]";
} else {
Out << ".field" << cast<ConstantUInt>(*I)->getValue();
}
diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp
index e33622f71f..f4fb7a2458 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<PointerType>(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<ConstantUInt>(*(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<PointerType>(Ptr->getType())->getElementType());
+ Out << "))) / sizeof(";
+ printType(cast<PointerType>(Ptr->getType())->getElementType());
+ Out << ")]";
} else {
Out << ".field" << cast<ConstantUInt>(*I)->getValue();
}