1 /* 2 * Copyright 2011-2012, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef __ANDROID_BCINFO_BITCODEWRAPPER_H__ 18 #define __ANDROID_BCINFO_BITCODEWRAPPER_H__ 19 20 #include "bcinfo/Wrap/BCHeaderField.h" 21 22 #include <cstddef> 23 #include <stdint.h> 24 25 namespace bcinfo { 26 27 struct AndroidBitcodeWrapper { 28 uint32_t Magic; 29 uint32_t Version; 30 uint32_t BitcodeOffset; 31 uint32_t BitcodeSize; 32 uint32_t HeaderVersion; 33 uint32_t TargetAPI; 34 uint32_t PNaClVersion; 35 uint16_t CompilerVersionTag; 36 uint16_t CompilerVersionLen; 37 uint32_t CompilerVersion; 38 uint16_t OptimizationLevelTag; 39 uint16_t OptimizationLevelLen; 40 uint32_t OptimizationLevel; 41 }; 42 43 enum BCFileType { 44 BC_NOT_BC = 0, 45 BC_WRAPPER = 1, 46 BC_RAW = 2 47 }; 48 49 class BitcodeWrapper { 50 private: 51 enum BCFileType mFileType; 52 const char *mBitcode; 53 size_t mBitcodeSize; 54 55 uint32_t mHeaderVersion; 56 uint32_t mTargetAPI; 57 uint32_t mCompilerVersion; 58 uint32_t mOptimizationLevel; 59 60 public: 61 /** 62 * Reads wrapper information from \p bitcode. 63 * 64 * \param bitcode - input bitcode string. 65 * \param bitcodeSize - length of \p bitcode string (in bytes). 66 */ 67 BitcodeWrapper(const char *bitcode, size_t bitcodeSize); 68 69 ~BitcodeWrapper(); 70 71 /** 72 * Attempt to unwrap the target bitcode. This function is \deprecated. 73 * 74 * \return true on success and false if an error occurred. 75 */ 76 bool unwrap(); 77 78 /** 79 * \return type of bitcode file. 80 */ 81 enum BCFileType getBCFileType() const { 82 return mFileType; 83 } 84 85 /** 86 * \return header version of bitcode wrapper. 87 */ 88 uint32_t getHeaderVersion() const { 89 return mHeaderVersion; 90 } 91 92 /** 93 * \return target API version for this bitcode. 94 */ 95 uint32_t getTargetAPI() const { 96 return mTargetAPI; 97 } 98 99 /** 100 * \return compiler version that generated this bitcode. 101 */ 102 uint32_t getCompilerVersion() const { 103 return mCompilerVersion; 104 } 105 106 /** 107 * \return compiler optimization level for this bitcode. 108 */ 109 uint32_t getOptimizationLevel() const { 110 return mOptimizationLevel; 111 } 112 113 }; 114 115 /** 116 * Helper function to emit just the bitcode wrapper returning the number of 117 * bytes that were written. 118 * 119 * \param wrapper - where to write header information into. 120 * \param bitcodeSize - size of bitcode in bytes. 121 * \param targetAPI - target API version for this bitcode. 122 * \param compilerVersion - compiler version that generated this bitcode. 123 * \param optimizationLevel - compiler optimization level for this bitcode. 124 * 125 * \return number of wrapper bytes written into the \p buffer. 126 */ 127 static inline size_t writeAndroidBitcodeWrapper(AndroidBitcodeWrapper *wrapper, 128 size_t bitcodeSize, uint32_t targetAPI, uint32_t compilerVersion, 129 uint32_t optimizationLevel) { 130 if (!wrapper) { 131 return 0; 132 } 133 134 wrapper->Magic = 0x0B17C0DE; 135 wrapper->Version = 0; 136 wrapper->BitcodeOffset = sizeof(*wrapper); 137 wrapper->BitcodeSize = bitcodeSize; 138 wrapper->HeaderVersion = 0; 139 wrapper->TargetAPI = targetAPI; 140 wrapper->PNaClVersion = 0; 141 wrapper->CompilerVersionTag = BCHeaderField::kAndroidCompilerVersion; 142 wrapper->CompilerVersionLen = 4; 143 wrapper->CompilerVersion = compilerVersion; 144 wrapper->OptimizationLevelTag = BCHeaderField::kAndroidOptimizationLevel; 145 wrapper->OptimizationLevelLen = 4; 146 wrapper->OptimizationLevel = optimizationLevel; 147 148 return sizeof(*wrapper); 149 } 150 151 } // namespace bcinfo 152 153 #endif // __ANDROID_BCINFO_BITCODEWRAPPER_H__ 154