diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 00b00ab9a82..5da8367a11a 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -517,8 +517,19 @@ void CInstPrintVisitor::visitFreeInst(FreeInst *I) { void CInstPrintVisitor::printIndexingExpr(MemAccessInst *MAI) { CW.writeOperand(MAI->getPointerOperand()); - for (MemAccessInst::op_iterator I = MAI->idx_begin(), E = MAI->idx_end(); - I != E; ++I) + MemAccessInst::op_iterator I = MAI->idx_begin(), E = MAI->idx_end(); + if (I == E) return; + + // Print out the -> operator if possible... + Constant *CI = dyn_cast(*I); + if (CI && CI->isNullValue() && I+1 != E && + (*(I+1))->getType() == Type::UByteTy) { + ++I; + Out << "->field" << cast(*I)->getValue(); + ++I; + } + + for (; I != E; ++I) if ((*I)->getType() == Type::UIntTy) { Out << "["; CW.writeOperand(*I); diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index 00b00ab9a82..5da8367a11a 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -517,8 +517,19 @@ void CInstPrintVisitor::visitFreeInst(FreeInst *I) { void CInstPrintVisitor::printIndexingExpr(MemAccessInst *MAI) { CW.writeOperand(MAI->getPointerOperand()); - for (MemAccessInst::op_iterator I = MAI->idx_begin(), E = MAI->idx_end(); - I != E; ++I) + MemAccessInst::op_iterator I = MAI->idx_begin(), E = MAI->idx_end(); + if (I == E) return; + + // Print out the -> operator if possible... + Constant *CI = dyn_cast(*I); + if (CI && CI->isNullValue() && I+1 != E && + (*(I+1))->getType() == Type::UByteTy) { + ++I; + Out << "->field" << cast(*I)->getValue(); + ++I; + } + + for (; I != E; ++I) if ((*I)->getType() == Type::UIntTy) { Out << "["; CW.writeOperand(*I);