1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* 27cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Copyright 2011-2012, The Android Open Source Project 3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * you may not use this file except in compliance with the License. 6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * You may obtain a copy of the License at 7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Unless required by applicable law or agreed to in writing, software 11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * See the License for the specific language governing permissions and 14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * limitations under the License. 15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "bcinfo/BitcodeTranslator.h" 18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 197cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include "bcinfo/BitcodeWrapper.h" 207cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "BitReader_2_7/BitReader_2_7.h" 22c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien#include "BitReader_3_0/BitReader_3_0.h" 23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 248dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines#include "BitWriter_3_2/ReaderWriter_3_2.h" 258dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines 26bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross#include "StripUnkAttr/strip_unknown_attributes.h" 27bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define LOG_TAG "bcinfo" 29d5c690148285e5c3a396ff0a48a3c20bdd833dd5Mark Salyzyn#include <log/log.h> 30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/BitstreamWriter.h" 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 33b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/LLVMContext.h" 34b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Module.h" 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/MemoryBuffer.h" 36c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao#include "llvm/Support/raw_ostream.h" 37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstdlib> 39881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes#include <climits> 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo { 42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/** 44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Define minimum and maximum target API versions. These correspond to the 45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * same API levels used by the standard Android SDK. 46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 47c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * LLVM 2.7 48c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 11 - Honeycomb 49c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 12 - Honeycomb MR1 50c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 13 - Honeycomb MR2 51c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 52c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * LLVM 3.0 53c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 14 - Ice Cream Sandwich 54c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 15 - Ice Cream Sandwich MR1 55c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 56c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * LLVM 3.1 57c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * 16 - Ice Cream Sandwich MR2 58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 59881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kMinimumAPIVersion = 11; 60881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kMaximumAPIVersion = RS_VERSION; 61881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kCurrentAPIVersion = 10000; 62881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kDevelopmentAPIVersion = UINT_MAX; 63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/** 65932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * The minimum version which does not require translation (i.e. is already 66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * compatible with LLVM's default bitcode reader). 67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 68c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienstatic const unsigned int kMinimumUntranslatedVersion = 16; 69c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienstatic const unsigned int kMinimumCompatibleVersion_LLVM_3_0 = 14; 70c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienstatic const unsigned int kMinimumCompatibleVersion_LLVM_2_7 = 11; 71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 73bcb03e5437a811eeaf1dfa895bfe93d841e76660David Grossstatic void stripUnknownAttributes(llvm::Module *M) { 74bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross for (llvm::Function &F : *M) 75bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross slang::stripUnknownAttributes(F); 76bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross} 77bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross 78932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesBitcodeTranslator::BitcodeTranslator(const char *bitcode, size_t bitcodeSize, 79932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines unsigned int version) 80900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes : mBitcode(bitcode), mBitcodeSize(bitcodeSize), mTranslatedBitcode(nullptr), 81932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mTranslatedBitcodeSize(0), mVersion(version) { 82932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 83932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 84932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesBitcodeTranslator::~BitcodeTranslator() { 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (mVersion < kMinimumUntranslatedVersion) { 88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // We didn't actually do a translation in the alternate case, so deleting 89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // the bitcode would be improper. 90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines delete [] mTranslatedBitcode; 91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 92900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes mTranslatedBitcode = nullptr; 93932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 94932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 95932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 96932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 97932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool BitcodeTranslator::translate() { 98932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!mBitcode || !mBitcodeSize) { 9910c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Invalid/empty bitcode"); 100932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 101932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 102932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 1037cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines BitcodeWrapper BCWrapper(mBitcode, mBitcodeSize); 1047cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (BCWrapper.getTargetAPI() != mVersion) { 1057cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines ALOGE("Bitcode wrapper (%u) and translator (%u) disagree about target API", 1067cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines BCWrapper.getTargetAPI(), mVersion); 1077cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 1087cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 109881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes if ((mVersion != kDevelopmentAPIVersion) && 110881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes (mVersion != kCurrentAPIVersion) && 111881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes ((mVersion < kMinimumAPIVersion) || 112881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes (mVersion > kMaximumAPIVersion))) { 11310c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Invalid API version: %u is out of range ('%u' - '%u')", mVersion, 114932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines kMinimumAPIVersion, kMaximumAPIVersion); 115932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 116932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 117932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 118932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // We currently don't need to transcode any API version higher than 14 or 119932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // the current API version (i.e. 10000) 120932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (mVersion >= kMinimumUntranslatedVersion) { 121932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mTranslatedBitcode = mBitcode; 122932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mTranslatedBitcodeSize = mBitcodeSize; 123932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 124932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 125932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 126932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // Do the actual transcoding by invoking a 2.7-era bitcode reader that can 127932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines // then write the bitcode back out in a more modern (acceptable) version. 128d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines std::unique_ptr<llvm::LLVMContext> mContext(new llvm::LLVMContext()); 129d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines std::unique_ptr<llvm::MemoryBuffer> MEM( 130932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines llvm::MemoryBuffer::getMemBuffer( 131e708ffe612f4566bea20334d2c9dac34db508e6eStephen Hines llvm::StringRef(mBitcode, mBitcodeSize), "", false)); 132932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::string error; 133579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines llvm::ErrorOr<llvm::MemoryBufferRef> MBOrErr = MEM->getMemBufferRef(); 134932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 135579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines llvm::ErrorOr<llvm::Module *> MOrErr(nullptr); 136c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 137c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien if (mVersion >= kMinimumCompatibleVersion_LLVM_3_0) { 138579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines MOrErr = llvm_3_0::parseBitcodeFile(*MBOrErr, *mContext); 139c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien } else if (mVersion >= kMinimumCompatibleVersion_LLVM_2_7) { 140579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines MOrErr = llvm_2_7::parseBitcodeFile(*MBOrErr, *mContext); 141c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien } else { 14210c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("No compatible bitcode reader for API version %d", mVersion); 143c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien return false; 144c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien } 145c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien 146579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines if (std::error_code EC = MOrErr.getError()) { 14710c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block ALOGE("Could not parse bitcode file"); 148579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines ALOGE("%s", EC.message().c_str()); 149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return false; 150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 151932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 152579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines // Module ownership is handled by the context, so we don't need to free it. 153579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines llvm::Module *module = MOrErr.get(); 154579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines 155bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross stripUnknownAttributes(module); 156bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross 157c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao std::string Buffer; 158c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao 159c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao llvm::raw_string_ostream OS(Buffer); 1608dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines // Use the LLVM 3.2 bitcode writer, instead of the top-of-tree version. 1618dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines llvm_3_2::WriteBitcodeToFile(module, OS); 162c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao OS.flush(); 163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 1647cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines AndroidBitcodeWrapper wrapper; 1657cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines size_t actualWrapperLen = writeAndroidBitcodeWrapper( 166dc31b1cf67e4997f511eb22d6589a45e3e57209dStephen Hines &wrapper, Buffer.size(), kMinimumUntranslatedVersion, 1677cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines BCWrapper.getCompilerVersion(), BCWrapper.getOptimizationLevel()); 1687cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (!actualWrapperLen) { 1697cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines ALOGE("Couldn't produce bitcode wrapper!"); 1707cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return false; 1717cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 1727cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 1737cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines mTranslatedBitcodeSize = actualWrapperLen + Buffer.size(); 1747cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines char *c = new char[mTranslatedBitcodeSize]; 1757cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines memcpy(c, &wrapper, actualWrapperLen); 176e9c850f5d85f3aa31b6e841478ea52e82d76c261Stephen Hines memcpy(c + actualWrapperLen, Buffer.c_str(), Buffer.size()); 177932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 178932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mTranslatedBitcode = c; 179932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 180932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return true; 181932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 182932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 183932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} // namespace bcinfo 184