aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
diff options
context:
space:
mode:
authorKarl Schimpf <kschimpf@google.com>2013-08-05 08:47:19 -0700
committerKarl Schimpf <kschimpf@google.com>2013-08-05 08:47:19 -0700
commitb6846e1a64c3a56be80f1b7bd2d5bf10cfabc36f (patch)
treeb734d0ec39b4cdf6beb905f31a7d6272089252b8 /lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
parent39bd1f66ebd83185944cf08903d8abf80321c17d (diff)
Fix handling of the volatile bit of loads/stores in PNaCl bitcode files.
Fixes so that the volatile bit is no longer put into the bitcode file, since the volatile bit is not in the PNaCl ABI. BUG= https://code.google.com/p/nativeclient/issues/detail?id=3610 R=jvoung@chromium.org Review URL: https://codereview.chromium.org/21949006
Diffstat (limited to 'lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp')
-rw-r--r--lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp37
1 files changed, 23 insertions, 14 deletions
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
index 33ad03a246..f9d479767b 100644
--- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
+++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp
@@ -1644,41 +1644,50 @@ bool NaClBitcodeReader::ParseFunctionBody(Function *F) {
}
case naclbitc::FUNC_CODE_INST_LOAD: {
// PNaCl version 1: LOAD: [op, align, vol]
- // PNaCl version 2: LOAD: [op, align, vol, ty]
+ // PNaCl version 2: LOAD: [op, align, ty]
unsigned OpNum = 0;
Value *Op;
- if (popValue(Record, &OpNum, NextValueNo, &Op))
+ if (popValue(Record, &OpNum, NextValueNo, &Op) ||
+ Record.size() != 3)
return Error("Invalid LOAD record");
switch (GetPNaClVersion()) {
case 1:
- if (Record.size() != 3)
- return Error("Invalid LOAD record");
+ I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1);
break;
case 2: {
- if (Record.size() != 4)
- return Error("Invalid LOAD record");
// Add pointer cast to op.
- Type *T = getTypeByID(Record[3]);
+ Type *T = getTypeByID(Record[2]);
if (T == 0)
return Error("Invalid type for load instruction");
Op = ConvertOpToType(Op, T->getPointerTo(), CurBB);
if (Op == 0) return true;
+ I = new LoadInst(Op, "", false, (1 << Record[OpNum]) >> 1);
break;
}
}
- I = new LoadInst(Op, "", Record[OpNum+1], (1 << Record[OpNum]) >> 1);
break;
}
- case naclbitc::FUNC_CODE_INST_STORE: { // STORE: [ptr, val, align, vol]
+ case naclbitc::FUNC_CODE_INST_STORE: {
+ // PNaCl version 1: STORE: [ptr, val, align, vol]
+ // PNaCl version 2: STORE: [ptr, val, align]
unsigned OpNum = 0;
Value *Val, *Ptr;
if (popValue(Record, &OpNum, NextValueNo, &Ptr) ||
- popValue(Record, &OpNum, NextValueNo, &Val) ||
- OpNum+2 != Record.size())
+ popValue(Record, &OpNum, NextValueNo, &Val))
return Error("Invalid STORE record");
- // Note: In version 1, the following statement is a noop.
- Ptr = ConvertOpToType(Ptr, Val->getType()->getPointerTo(), CurBB);
- I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1);
+ switch (GetPNaClVersion()) {
+ case 1:
+ if (OpNum+2 != Record.size())
+ return Error("Invalid STORE record");
+ I = new StoreInst(Val, Ptr, Record[OpNum+1], (1 << Record[OpNum]) >> 1);
+ break;
+ case 2:
+ if (OpNum+1 != Record.size())
+ return Error("Invalid STORE record");
+ Ptr = ConvertOpToType(Ptr, Val->getType()->getPointerTo(), CurBB);
+ I = new StoreInst(Val, Ptr, false, (1 << Record[OpNum]) >> 1);
+ break;
+ }
break;
}
case naclbitc::FUNC_CODE_INST_CALL: {