BitcodeWrapper.h revision 7cd4c49d575478b2380f129dcd376a4e5e37939c
10164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines/*
27cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Copyright 2011-2012, The Android Open Source Project
30164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines *
40164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * you may not use this file except in compliance with the License.
60164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * You may obtain a copy of the License at
70164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines *
80164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
90164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines *
100164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * Unless required by applicable law or agreed to in writing, software
110164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * See the License for the specific language governing permissions and
140164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines * limitations under the License.
150164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines */
160164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
170164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines#ifndef __ANDROID_BCINFO_BITCODEWRAPPER_H__
180164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines#define __ANDROID_BCINFO_BITCODEWRAPPER_H__
190164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
207cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include "bcinfo/Wrap/BCHeaderField.h"
217cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
220164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines#include <cstddef>
230164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines#include <stdint.h>
240164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
250164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hinesnamespace bcinfo {
260164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
277cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesstruct AndroidBitcodeWrapper {
280164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t Magic;
290164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t Version;
300164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t BitcodeOffset;
310164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t BitcodeSize;
320164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t HeaderVersion;
330164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t TargetAPI;
347cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t PNaClVersion;
357cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint16_t CompilerVersionTag;
367cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint16_t CompilerVersionLen;
377cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t CompilerVersion;
387cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint16_t OptimizationLevelTag;
397cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint16_t OptimizationLevelLen;
407cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t OptimizationLevel;
410164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines};
420164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
430164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hinesenum BCFileType {
440164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  BC_NOT_BC = 0,
450164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  BC_WRAPPER = 1,
460164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  BC_RAW = 2
470164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines};
480164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
490164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hinesclass BitcodeWrapper {
500164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines private:
510164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  enum BCFileType mFileType;
520164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  const char *mBitcode;
530164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  const char *mBitcodeEnd;
540164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  size_t mBitcodeSize;
550164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
567cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t mHeaderVersion;
577cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t mTargetAPI;
587cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t mCompilerVersion;
597cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t mOptimizationLevel;
600164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
610164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines public:
620164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  /**
630164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   * Reads wrapper information from \p bitcode.
640164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   *
650164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   * \param bitcode - input bitcode string.
660164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   * \param bitcodeSize - length of \p bitcode string (in bytes).
670164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   */
680164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  BitcodeWrapper(const char *bitcode, size_t bitcodeSize);
690164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
700164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  ~BitcodeWrapper();
710164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
720164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  /**
737cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines   * Attempt to unwrap the target bitcode. This function is \deprecated.
740164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   *
750164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   * \return true on success and false if an error occurred.
760164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   */
770164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  bool unwrap();
780164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
790164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  /**
800164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   * \return type of bitcode file.
810164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   */
820164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  enum BCFileType getBCFileType() const {
830164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines    return mFileType;
840164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  }
850164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
860164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  /**
877cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines   * \return header version of bitcode wrapper.
880164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   */
890164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t getHeaderVersion() const {
907cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    return mHeaderVersion;
910164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  }
920164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
930164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  /**
947cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines   * \return target API version for this bitcode.
950164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines   */
960164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  uint32_t getTargetAPI() const {
977cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    return mTargetAPI;
987cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
997cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
1007cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  /**
1017cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines   * \return compiler version that generated this bitcode.
1027cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines   */
1037cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t getCompilerVersion() const {
1047cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    return mCompilerVersion;
1057cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
1067cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
1077cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  /**
1087cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines   * \return compiler optimization level for this bitcode.
1097cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines   */
1107cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  uint32_t getOptimizationLevel() const {
1117cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    return mOptimizationLevel;
1120164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines  }
1137cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
1140164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines};
1150164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
1167cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/**
1177cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Helper function to emit just the bitcode wrapper returning the number of
1187cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * bytes that were written.
1197cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines *
1207cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * \param wrapper - where to write header information into.
1217cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * \param bitcodeSize - size of bitcode in bytes.
1227cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * \param targetAPI - target API version for this bitcode.
1237cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * \param compilerVersion - compiler version that generated this bitcode.
1247cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * \param optimizationLevel - compiler optimization level for this bitcode.
1257cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines *
1267cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * \return number of wrapper bytes written into the \p buffer.
1277cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines */
1287cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesstatic inline size_t writeAndroidBitcodeWrapper(AndroidBitcodeWrapper *wrapper,
1297cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    size_t bitcodeSize, uint32_t targetAPI, uint32_t compilerVersion,
1307cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    uint32_t optimizationLevel) {
1317cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  if (!wrapper) {
1327cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    return 0;
1337cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
1347cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
1357cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->Magic = 0x0B17C0DE;
1367cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->Version = 0;
1377cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->BitcodeOffset = sizeof(*wrapper);
1387cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->BitcodeSize = bitcodeSize;
1397cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->HeaderVersion = 0;
1407cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->TargetAPI = targetAPI;
1417cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->PNaClVersion = 0;
1427cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->CompilerVersionTag = BCHeaderField::kAndroidCompilerVersion;
1437cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->CompilerVersionLen = 4;
1447cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->CompilerVersion = compilerVersion;
1457cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->OptimizationLevelTag = BCHeaderField::kAndroidOptimizationLevel;
1467cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->OptimizationLevelLen = 4;
1477cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  wrapper->OptimizationLevel = optimizationLevel;
1487cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
1497cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  return sizeof(*wrapper);
1507cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}
1517cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
1520164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines}  // namespace bcinfo
1530164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines
1540164f4647511a71f5b495a3bef156e3ac4e6c6b3Stephen Hines#endif  // __ANDROID_BCINFO_BITCODEWRAPPER_H__
155