Chromium Code Reviews| Index: lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp |
| diff --git a/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp b/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp |
| index 3f84857feae7e2e8337affef7f6fffabdc09d02b..e3cd46ebbe46af69bd4d87930654d2f2c13276a4 100644 |
| --- a/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp |
| +++ b/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp |
| @@ -39,6 +39,12 @@ ReportWarningsAsErrors( |
| cl::desc("Report warnings as errors."), |
| cl::init(false)); |
| +static cl::opt<bool> |
| +NoDumpFinalizeRules( |
|
jvoung (off chromium)
2014/12/17 23:36:38
I'm a bit confused about where this is used.
Karl
2014/12/17 23:53:00
One would use this as a command-line argument on a
jvoung (off chromium)
2014/12/18 00:05:40
Hmm but does tool work with non-finalized pexes?
Karl
2014/12/18 16:56:05
You are correct that we require the overall struct
jvoung (off chromium)
2014/12/18 17:10:22
Okay, I see. Yes it's very easy to do a hand-writt
jvoung (off chromium)
2014/12/18 17:18:56
Another way to look at it is the load/store align
Karl
2014/12/18 18:56:19
Renamed to IgnorePNaClABIChecks (cl flag "-ignore-
|
| + "no-pnacl-dump-finalize-rules", |
| + cl::desc("Don't dump finalized-only PNaCl bitcode violations"), |
| + cl::init(false)); |
| + |
| /// Class to handle sign rotations in a human readable form. That is, |
| /// the sign is in the low bit. The two special cases are: |
| /// 1) -1 is true for i1. |
| @@ -942,7 +948,8 @@ public: |
| // Checks the Alignment for loading/storing a value of type Ty. If |
| // invalid, generates an appropriate error message. |
| void VerifyMemoryAccessAlignment(const char *Op, Type *Ty, |
| - uint64_t Alignment) { |
| + unsigned Alignment) { |
| + if (NoDumpFinalizeRules) return; |
| if (!PNaClABIProps::isAllowedAlignment(&DL, Alignment, Ty)) { |
| if (unsigned Expected = NaClGetExpectedLoadStoreAlignment(DL, Ty)) { |
| Errors() << Op << ": Illegal alignment for " << *Ty |
| @@ -2546,6 +2553,11 @@ private: |
| << " out of range. Not in [1," << ExpectedNumBbs << "]\n"; |
| } |
| } |
| + |
| + /// Convert alignment exponent (i.e. power of two (or zero)) to the |
| + /// corresponding alignment to use. If alignment is too large, it generates |
| + /// an error message and returns 0. |
| + unsigned getAlignmentValue(uint64_t Exponent); |
| }; |
| NaClDisFunctionParser::NaClDisFunctionParser( |
| @@ -2766,6 +2778,23 @@ const char *NaClDisFunctionParser::GetFcmpPredicate(uint32_t Opcode) { |
| } |
| } |
| +namespace { |
| + |
| +static const unsigned MaxAlignmentExponent = 29; |
| +static_assert( |
| + (1u << MaxAlignmentExponent) == Value::MaximumAlignment, |
| + "Inconsistency between Value.MaxAlignment and PNaCl alignment limit"); |
| +} |
| + |
| +unsigned NaClDisFunctionParser::getAlignmentValue(uint64_t Exponent) { |
| + if (Exponent > MaxAlignmentExponent + 1) { |
| + Errors() << "Alignment can't be greater than 2**" << MaxAlignmentExponent |
| + << ". Found: 2**" << (Exponent - 1) << "\n"; |
| + return 0; |
| + } |
| + return (1 << static_cast<unsigned>(Exponent)) >> 1; |
| +} |
| + |
| bool NaClDisFunctionParser::ParseBlock(unsigned BlockID) { |
| ObjDumpSetRecordBitAddress(GetBlock().GetStartBit()); |
| switch (BlockID) { |
| @@ -2995,7 +3024,7 @@ void NaClDisFunctionParser::ProcessRecord() { |
| uint32_t SizeOp = RelativeToAbsId(Values[0]); |
| Type* SizeType = GetValueType(SizeOp); |
| BitcodeId SizeId(GetBitcodeId(SizeOp)); |
| - uint64_t Alignment = (1 << Values[1]) >> 1; |
| + unsigned Alignment = getAlignmentValue(Values[1]); |
| if (!PNaClABIProps::isAllocaSizeType(SizeType)) |
| Errors() << PNaClABIProps::ExpectedAllocaSizeType() << "\n"; |
| // TODO(kschimpf) Are there any constraints on alignment? |
| @@ -3015,7 +3044,7 @@ void NaClDisFunctionParser::ProcessRecord() { |
| << Values.size() << "\n"; |
| break; |
| } |
| - uint64_t Alignment = (1 << Values[1]) >> 1; |
| + unsigned Alignment = getAlignmentValue(Values[1]); |
| Type *LoadType = GetType(Values[2]); |
| VerifyScalarOrVectorOp("load", LoadType); |
| Context->VerifyMemoryAccessAlignment("load", LoadType, Alignment); |
| @@ -3035,7 +3064,7 @@ void NaClDisFunctionParser::ProcessRecord() { |
| << Values.size() << "\n"; |
| break; |
| } |
| - uint64_t Alignment = (1 << Values[2]) >> 1; |
| + unsigned Alignment = getAlignmentValue(Values[2]); |
| uint32_t Val = RelativeToAbsId(Values[1]); |
| Type *ValType = GetValueType(Val); |
| VerifyScalarOrVectorOp("store", ValType); |