Index: lib/Transforms/NaCl/FlattenGlobals.cpp |
diff --git a/lib/Transforms/NaCl/FlattenGlobals.cpp b/lib/Transforms/NaCl/FlattenGlobals.cpp |
index 9b90cb2d4d911cf4835c6ede1b59c965c9df9654..3633be8c363f2fc58f90d80f0db27721116a004c 100644 |
--- a/lib/Transforms/NaCl/FlattenGlobals.cpp |
+++ b/lib/Transforms/NaCl/FlattenGlobals.cpp |
@@ -350,13 +350,16 @@ static void ExpandConstant(const DataLayout *DL, Constant *Val, |
*ResultOffset = 0; |
} else if (ConstantInt *CI = dyn_cast<ConstantInt>(Val)) { |
*ResultGlobal = NULL; |
- *ResultOffset = CI->getZExtValue(); |
+ *ResultOffset = CI->getSExtValue(); |
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Val)) { |
ExpandConstant(DL, CE->getOperand(0), ResultGlobal, ResultOffset); |
if (CE->getOpcode() == Instruction::GetElementPtr) { |
SmallVector<Value *, 8> Indexes(CE->op_begin() + 1, CE->op_end()); |
*ResultOffset += DL->getIndexedOffset(CE->getOperand(0)->getType(), |
Indexes); |
+ } else if (CE->getOpcode() == Instruction::Add && |
+ isa<ConstantInt>(CE->getOperand(1))) { |
+ *ResultOffset += cast<ConstantInt>(CE->getOperand(1))->getSExtValue(); |
} else if (CE->getOpcode() == Instruction::BitCast || |
CE->getOpcode() == Instruction::IntToPtr) { |
// Nothing more to do. |