blob: 44f46635877253ced2f394d246e179db0498db8a [file] [log] [blame]
Shih-wei Liaocecdab22011-01-10 02:10:29 -08001===============================================================
2libbcc: A Versatile Bitcode Execution Engine for Mobile Devices
3===============================================================
Logan36fafd92011-01-08 22:55:19 +08004
5
6Introduction
7------------
8
Shih-wei Liao7fff2282011-01-09 13:57:01 -08009libbcc is an LLVM bitcode execution engine that compiles the bitcode
Shih-wei Liaocecdab22011-01-10 02:10:29 -080010to an in-memory executable. libbcc is versatile because:
11
12* it implements both AOT (Ahead-of-Time) and JIT (Just-in-Time) compilation.
13
Shih-wei Liao0dc51b12011-01-10 03:41:58 -080014* Android devices demand fast start-up time, small size, and high performance
Stephen Hines5ddcae52011-01-10 11:30:26 -080015 *at the same time*. libbcc attempts to address these design constraints.
Shih-wei Liao7fff2282011-01-09 13:57:01 -080016
17libbcc provides:
18
Shih-wei Liaocecdab22011-01-10 02:10:29 -080019* a *just-in-time bitcode compiler*, which translates the bitcode into
Shih-wei Liao7fff2282011-01-09 13:57:01 -080020 machine code
21
22* a *caching mechanism*, which can:
23
Shih-wei Liaocecdab22011-01-10 02:10:29 -080024 * after each compilation, serialize the in-memory executable into a cache file.
Shih-wei Liao7fff2282011-01-09 13:57:01 -080025 Note that the compilation is triggered by a cache miss.
26 * load from the cache file upon cache-hit.
27
Shih-wei Liao0dc51b12011-01-10 03:41:58 -080028Highlights of libbcc are:
Logan36fafd92011-01-08 22:55:19 +080029
Shih-wei Liao7fff2282011-01-09 13:57:01 -080030* libbcc supports bitcode from various language frontends, such as
Logan36fafd92011-01-08 22:55:19 +080031 RenderScript, GLSL.
32
33* libbcc strives to balance between library size, launch time and
34 steady-state performance:
35
Shih-wei Liao7fff2282011-01-09 13:57:01 -080036 * The size of libbcc is aggressively reduced for mobile devices.
Shih-wei Liaocecdab22011-01-10 02:10:29 -080037 We customize and we don't use the default Execution Engine from upstream.
Logan36fafd92011-01-08 22:55:19 +080038
39 * To reduce launch time, we support caching of binaries.
40
41 * For steady-state performance, we enable VFP3 and aggressive
42 optimizations.
43
Shih-wei Liao0d4984b2011-01-09 04:39:00 -080044* Currently we disable Lazy JITting.
45
Logan36fafd92011-01-08 22:55:19 +080046
47
48API
49---
50
Shih-wei Liao7fff2282011-01-09 13:57:01 -080051**Basic:**
Logan36fafd92011-01-08 22:55:19 +080052
53* **bccCreateScript** - Create new bcc script
54
55* **bccRegisterSymbolCallback** - Register the callback function for external
56 symbol lookup
57
58* **bccReadBC** - Set the source bitcode for compilation
59
60* **bccReadModule** - Set the llvm::Module for compilation
61
62* **bccLinkBC** - Set the library bitcode for linking
63
Shih-wei Liao7fff2282011-01-09 13:57:01 -080064* **bccPrepareExecutable** - Create the in-memory executable by either
Logan36fafd92011-01-08 22:55:19 +080065 just-in-time compilation or cache loading
66
Loganf340bf72011-01-14 17:51:40 +080067* **bccGetFuncAddr** - Get the entry address of the function
Logan36fafd92011-01-08 22:55:19 +080068
Loganf340bf72011-01-14 17:51:40 +080069* **bccDisposeScript** - Destroy bcc script and release the resources
Logan36fafd92011-01-08 22:55:19 +080070
Loganf340bf72011-01-14 17:51:40 +080071* **bccGetError** - *deprecated* - Don't use this
Logan36fafd92011-01-08 22:55:19 +080072
73
Shih-wei Liao7fff2282011-01-09 13:57:01 -080074**Reflection:**
Logan36fafd92011-01-08 22:55:19 +080075
Loganf340bf72011-01-14 17:51:40 +080076* **bccGetExportVarCount** - Get the count of exported variables
Logan36fafd92011-01-08 22:55:19 +080077
Loganf340bf72011-01-14 17:51:40 +080078* **bccGetExportVarList** - Get the addresses of exported variables
Logan36fafd92011-01-08 22:55:19 +080079
Loganf340bf72011-01-14 17:51:40 +080080* **bccGetExportFuncCount** - Get the count of exported functions
81
82* **bccGetExportFuncList** - Get the addresses of exported functions
83
84* **bccGetPragmaCount** - Get the count of pragmas
85
86* **bccGetPragmaList** - Get the pragmas
Logan36fafd92011-01-08 22:55:19 +080087
88
Shih-wei Liao7fff2282011-01-09 13:57:01 -080089**Debug:**
Logan36fafd92011-01-08 22:55:19 +080090
Loganf340bf72011-01-14 17:51:40 +080091* **bccGetFuncCount** - Get the count of functions (including non-exported)
Logan36fafd92011-01-08 22:55:19 +080092
Loganf340bf72011-01-14 17:51:40 +080093* **bccGetFuncInfoList** - Get the function information (name, base, size)
Logan36fafd92011-01-08 22:55:19 +080094
95
96
97Cache File Format
98-----------------
99
Shih-wei Liao0d4984b2011-01-09 04:39:00 -0800100A cache file (denoted as \*.oBCC) for libbcc consists of several sections:
Logan36fafd92011-01-08 22:55:19 +0800101header, string pool, dependencies table, relocation table, exported
102variable list, exported function list, pragma list, function information
103table, and bcc context. Every section should be aligned to a word size.
Shih-wei Liao0d4984b2011-01-09 04:39:00 -0800104Here is the brief description of each sections:
Logan36fafd92011-01-08 22:55:19 +0800105
Shih-wei Liao0d4984b2011-01-09 04:39:00 -0800106* **Header** (OBCC_Header) - The header of a cache file. It contains the
Shih-wei Liaocecdab22011-01-10 02:10:29 -0800107 magic word, version, machine integer type information (the endianness,
108 the size of off_t, size_t, and ptr_t), and the size
109 and offset of other sections. The header section is guaranteed
Logan36fafd92011-01-08 22:55:19 +0800110 to be at the beginning of the cache file.
111
Shih-wei Liao0d4984b2011-01-09 04:39:00 -0800112* **String Pool** (OBCC_StringPool) - A collection of serialized variable
Logan36fafd92011-01-08 22:55:19 +0800113 length strings. The strp_index in the other part of the cache file
114 represents the index of such string in this string pool.
115
116* **Dependencies Table** (OBCC_DependencyTable) - The dependencies table.
Shih-wei Liao8538dfa2011-01-09 15:42:28 -0800117 This table stores the resource name (or file path), the resource
Logan36fafd92011-01-08 22:55:19 +0800118 type (rather in APK or on the file system), and the SHA1 checksum.
119
Shih-wei Liao0d4984b2011-01-09 04:39:00 -0800120* **Relocation Table** (OBCC_RelocationTable) - *not enabled*
Logan36fafd92011-01-08 22:55:19 +0800121
Shih-wei Liaoac4e4582011-01-10 02:59:54 -0800122* **Exported Variable List** (OBCC_ExportVarList) -
123 The list of the addresses of exported variables.
124
125* **Exported Function List** (OBCC_ExportFuncList) -
126 The list of the addresses of exported functions.
Logan36fafd92011-01-08 22:55:19 +0800127
128* **Pragma List** (OBCC_PragmaList) - The list of pragma key-value pair.
129
130* **Function Information Table** (OBCC_FuncTable) - This is a table of
131 function information, such as function name, function entry address,
132 and function binary size. Besides, the table should be ordered by
133 function name.
134
135* **Context** - The context of the in-memory executable, including
136 the code and the data. The offset of context should aligned to
Shih-wei Liao0dc51b12011-01-10 03:41:58 -0800137 a page size, so that we can mmap the context directly into memory.
Logan36fafd92011-01-08 22:55:19 +0800138
139For furthur information, you may read `bcc_cache.h <include/bcc/bcc_cache.h>`_,
140`CacheReader.cpp <lib/bcc/CacheReader.cpp>`_, and
141`CacheWriter.cpp <lib/bcc/CacheWriter.cpp>`_ for details.
142
143
144
145JIT'ed Code Calling Conventions
146-------------------------------
147
1481. Calls from Execution Environment or from/to within script:
149
150 On ARM, the first 4 arguments will go into r0, r1, r2, and r3, in that order.
151 The remaining (if any) will go through stack.
152
153 For ext_vec_types such as float2, a set of registers will be used. In the case
154 of float2, a register pair will be used. Specifically, if float2 is the first
155 argument in the function prototype, float2.x will go into r0, and float2.y,
156 r1.
157
158 Note: stack will be aligned to the coarsest-grained argument. In the case of
159 float2 above as an argument, parameter stack will be aligned to an 8-byte
160 boundary (if the sizes of other arguments are no greater than 8.)
161
1622. Calls from/to a separate compilation unit: (E.g., calls to Execution
163 Environment if those runtime library callees are not compiled using LLVM.)
164
165 On ARM, we use hardfp. Note that double will be placed in a register pair.