Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- PNaClABIVerifyModule.cpp - Verify PNaCl ABI rules --------===// | 1 //===- PNaClABIVerifyModule.cpp - Verify PNaCl ABI rules --------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // Verify module-level PNaCl ABI requirements (specifically those that do not | 10 // Verify module-level PNaCl ABI requirements (specifically those that do not |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 115 Reporter->addError() << GVTypeName << GV->getName() | 115 Reporter->addError() << GVTypeName << GV->getName() |
| 116 << " has disallowed linkage type: " | 116 << " has disallowed linkage type: " |
| 117 << linkageName(GV->getLinkage()) << "\n"; | 117 << linkageName(GV->getLinkage()) << "\n"; |
| 118 } | 118 } |
| 119 if (GV->hasSection()) { | 119 if (GV->hasSection()) { |
| 120 Reporter->addError() << GVTypeName << GV->getName() << | 120 Reporter->addError() << GVTypeName << GV->getName() << |
| 121 " has disallowed \"section\" attribute\n"; | 121 " has disallowed \"section\" attribute\n"; |
| 122 } | 122 } |
| 123 } | 123 } |
| 124 | 124 |
| 125 static bool IntTypeAcceptable(unsigned width, | |
| 126 const ArrayRef<unsigned>& AcceptableSizes) { | |
| 127 for (unsigned i = 0; i < AcceptableSizes.size(); ++i) | |
|
eliben
2013/05/15 23:34:54
Would it be cleaner to iterate over it (it has ite
jvoung (off chromium)
2013/05/16 16:45:00
Done.
| |
| 128 if (AcceptableSizes[i] == width) | |
| 129 return true; | |
| 130 return false; | |
| 131 } | |
| 132 | |
| 133 static bool FunctionHasIntArg1(const Function* F, | |
|
eliben
2013/05/15 23:34:54
The name is not entirely clear... also you may be
jvoung (off chromium)
2013/05/16 16:45:00
Well, I assume I'll be checking parameter types fo
| |
| 134 const ArrayRef<unsigned>& AcceptableSizes) { | |
| 135 FunctionType* FT = F->getFunctionType(); | |
| 136 if (FT->getNumParams() != 1) | |
| 137 return false; | |
| 138 return IntTypeAcceptable(FT->getParamType(0)->getIntegerBitWidth(), | |
| 139 AcceptableSizes); | |
| 140 } | |
| 141 | |
| 125 bool PNaClABIVerifyModule::IsWhitelistedIntrinsic(const Function* F, | 142 bool PNaClABIVerifyModule::IsWhitelistedIntrinsic(const Function* F, |
| 126 unsigned ID) { | 143 unsigned ID) { |
| 127 // Keep 3 categories of intrinsics for now. | 144 // Keep 3 categories of intrinsics for now. |
| 128 // (1) Allowed always | 145 // (1) Allowed always |
| 129 // (2) Never allowed | 146 // (2) Never allowed |
| 130 // (3) "Dev" intrinsics, which may or may not be allowed. | 147 // (3) "Dev" intrinsics, which may or may not be allowed. |
| 131 // "Dev" intrinsics are controlled by the PNaClABIAllowDevIntrinsics flag. | 148 // "Dev" intrinsics are controlled by the PNaClABIAllowDevIntrinsics flag. |
| 132 // Please keep these sorted or grouped in a sensible way, within | 149 // Please keep these sorted or grouped in a sensible way, within |
| 133 // each category. | 150 // each category. |
| 134 switch(ID) { | 151 switch(ID) { |
| 135 // Disallow by default. | 152 // Disallow by default. |
| 136 default: return false; | 153 default: return false; |
| 137 // (1) Always allowed. | 154 // (1) Always allowed. |
| 155 case Intrinsic::bswap: { | |
|
eliben
2013/05/15 23:34:54
I think this would be clearer in a method - isWhit
jvoung (off chromium)
2013/05/16 16:45:00
Done.
| |
| 156 unsigned accepted_sizes[] = { 16, 32, 64 }; | |
| 157 return FunctionHasIntArg1(F, accepted_sizes); | |
| 158 } | |
| 138 case Intrinsic::invariant_end: | 159 case Intrinsic::invariant_end: |
| 139 case Intrinsic::invariant_start: | 160 case Intrinsic::invariant_start: |
| 140 case Intrinsic::lifetime_end: | 161 case Intrinsic::lifetime_end: |
| 141 case Intrinsic::lifetime_start: | 162 case Intrinsic::lifetime_start: |
| 142 case Intrinsic::memcpy: | 163 case Intrinsic::memcpy: |
| 143 case Intrinsic::memmove: | 164 case Intrinsic::memmove: |
| 144 case Intrinsic::memset: | 165 case Intrinsic::memset: |
| 145 case Intrinsic::nacl_read_tp: | 166 case Intrinsic::nacl_read_tp: |
| 146 case Intrinsic::nacl_setjmp: | 167 case Intrinsic::nacl_setjmp: |
| 147 case Intrinsic::nacl_longjmp: | 168 case Intrinsic::nacl_longjmp: |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 172 // Var-args handling is done w/out intrinsics. | 193 // Var-args handling is done w/out intrinsics. |
| 173 case Intrinsic::vacopy: | 194 case Intrinsic::vacopy: |
| 174 case Intrinsic::vaend: | 195 case Intrinsic::vaend: |
| 175 case Intrinsic::vastart: | 196 case Intrinsic::vastart: |
| 176 return false; | 197 return false; |
| 177 | 198 |
| 178 // (3) Dev intrinsics. | 199 // (3) Dev intrinsics. |
| 179 case Intrinsic::dbg_declare: | 200 case Intrinsic::dbg_declare: |
| 180 case Intrinsic::dbg_value: | 201 case Intrinsic::dbg_value: |
| 181 return PNaClABIAllowDevIntrinsics || PNaClABIAllowDebugMetadata; | 202 return PNaClABIAllowDevIntrinsics || PNaClABIAllowDebugMetadata; |
| 182 case Intrinsic::bswap: // Support via compiler_rt if arch doesn't have it? | |
| 183 case Intrinsic::cos: // Rounding not defined: support with fast-math? | 203 case Intrinsic::cos: // Rounding not defined: support with fast-math? |
| 184 case Intrinsic::ctlz: // Support via compiler_rt if arch doesn't have it? | 204 case Intrinsic::ctlz: // Support via compiler_rt if arch doesn't have it? |
| 185 case Intrinsic::ctpop: // Support via compiler_rt if arch doesn't have it? | 205 case Intrinsic::ctpop: // Support via compiler_rt if arch doesn't have it? |
| 186 case Intrinsic::cttz: // Support via compiler_rt if arch doesn't have it? | 206 case Intrinsic::cttz: // Support via compiler_rt if arch doesn't have it? |
| 187 case Intrinsic::exp: // Rounding not defined: support with fast-math? | 207 case Intrinsic::exp: // Rounding not defined: support with fast-math? |
| 188 case Intrinsic::exp2: // Rounding not defined: support with fast-math? | 208 case Intrinsic::exp2: // Rounding not defined: support with fast-math? |
| 189 case Intrinsic::expect: // From __builtin_expect. | 209 case Intrinsic::expect: // From __builtin_expect. |
| 190 case Intrinsic::flt_rounds: | 210 case Intrinsic::flt_rounds: // For FLT_ROUNDS macro from float.h. |
| 211 // We do not have fesetround() in newlib, can we return a | |
| 212 // consistent rounding mode though? | |
| 191 case Intrinsic::log: // Rounding not defined: support with fast-math? | 213 case Intrinsic::log: // Rounding not defined: support with fast-math? |
| 192 case Intrinsic::log2: // Rounding not defined: support with fast-math? | 214 case Intrinsic::log2: // Rounding not defined: support with fast-math? |
| 193 case Intrinsic::log10: // Rounding not defined: support with fast-math? | 215 case Intrinsic::log10: // Rounding not defined: support with fast-math? |
| 194 case Intrinsic::nacl_target_arch: // Used by translator self-build. | 216 case Intrinsic::nacl_target_arch: // Used by translator self-build. |
| 195 case Intrinsic::pow: // Rounding is supposed to be the same as libm. | 217 case Intrinsic::pow: // Rounding is supposed to be the same as libm. |
| 196 case Intrinsic::powi: // Rounding not defined: support with fast-math? | 218 case Intrinsic::powi: // Rounding not defined: support with fast-math? |
| 197 case Intrinsic::prefetch: // Could ignore if target doesn't support? | 219 case Intrinsic::prefetch: // Could ignore if target doesn't support? |
| 198 case Intrinsic::sin: // Rounding not defined: support with fast-math? | 220 case Intrinsic::sin: // Rounding not defined: support with fast-math? |
| 199 case Intrinsic::sqrt: | 221 case Intrinsic::sqrt: // Rounding is defined, but setting errno up to libm. |
| 200 case Intrinsic::stackrestore: // Used to support C99 VLAs. | 222 case Intrinsic::stackrestore: // Used to support C99 VLAs. |
| 201 case Intrinsic::stacksave: | 223 case Intrinsic::stacksave: // Used to support C99 VLAs. |
| 202 // the *_with_overflow return struct types, so we'll need to fix these. | 224 // the *_with_overflow return struct types, so we'll need to fix these. |
| 203 case Intrinsic::sadd_with_overflow: // Introduced by -ftrapv | 225 case Intrinsic::sadd_with_overflow: // Introduced by -ftrapv |
| 204 case Intrinsic::ssub_with_overflow: | 226 case Intrinsic::ssub_with_overflow: |
| 205 case Intrinsic::uadd_with_overflow: | 227 case Intrinsic::uadd_with_overflow: |
| 206 case Intrinsic::usub_with_overflow: | 228 case Intrinsic::usub_with_overflow: |
| 207 case Intrinsic::smul_with_overflow: | 229 case Intrinsic::smul_with_overflow: |
| 208 case Intrinsic::umul_with_overflow: // Introduced by c++ new[x * y]. | 230 case Intrinsic::umul_with_overflow: // Introduced by c++ new[x * y]. |
| 209 return PNaClABIAllowDevIntrinsics; | 231 return PNaClABIAllowDevIntrinsics; |
| 210 } | 232 } |
| 211 } | 233 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 319 } | 341 } |
| 320 | 342 |
| 321 char PNaClABIVerifyModule::ID = 0; | 343 char PNaClABIVerifyModule::ID = 0; |
| 322 INITIALIZE_PASS(PNaClABIVerifyModule, "verify-pnaclabi-module", | 344 INITIALIZE_PASS(PNaClABIVerifyModule, "verify-pnaclabi-module", |
| 323 "Verify module for PNaCl", false, true) | 345 "Verify module for PNaCl", false, true) |
| 324 | 346 |
| 325 ModulePass *llvm::createPNaClABIVerifyModulePass( | 347 ModulePass *llvm::createPNaClABIVerifyModulePass( |
| 326 PNaClABIErrorReporter *Reporter) { | 348 PNaClABIErrorReporter *Reporter) { |
| 327 return new PNaClABIVerifyModule(Reporter); | 349 return new PNaClABIVerifyModule(Reporter); |
| 328 } | 350 } |
| OLD | NEW |