166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang/* 266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * Copyright 2010, The Android Open Source Project 366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * 466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * you may not use this file except in compliance with the License. 666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * You may obtain a copy of the License at 766a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * 866a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * 1066a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * Unless required by applicable law or agreed to in writing, software 1166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 1266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * See the License for the specific language governing permissions and 1466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang * limitations under the License. 1566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang */ 1666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_METADATA_SPEC_H_ // NOLINT 18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_METADATA_SPEC_H_ 1966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// Design Philosophy: 2166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Expensive encoding but cheap decoding process. 2266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 2366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 1. A string table concatenates ALL strings (including '\0' in t) 2466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 2. A string index table which is an integer array containg the offset 2566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// to access each string in the string table. 2666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 3. All ->name field in RSType/RSVar/RSFunction now refer to an index in the 2766a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// string index table for offset lookup. 2866a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 4. RSType information is encoded as a byte stream like: 2966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 3066a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// [RSType #1][RSType #2] ... [RSType #N] 3166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 3266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// All ->type or ->base_type in RS*Type now becomes an index to RSType array. 3366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 3466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 5. RSVar => an string table index plus RSType array index 3566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// 6. RSFunction => an string table index 3666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 3766a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changnamespace llvm { 3866a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang class Module; 3966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang} 4066a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 4166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Forward declaration 4266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changunion RSType; 4366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 4466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changstruct RSVar { 4566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang const char *name; // variable name 4666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang const union RSType *type; 4766a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang}; 4866a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 4966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changstruct RSFunction { 5066a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang const char *name; // function name 5166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang}; 5266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 5366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Opaque pointer 5466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changtypedef int RSMetadataEncoder; 5566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 5666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Create a context associated with M for encoding metadata. 5766a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr ChangRSMetadataEncoder *CreateRSMetadataEncoder(llvm::Module *M); 5866a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 5966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Encode V as a metadata in M. Return 0 if every thing goes well. 6066a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changint RSEncodeVarMetadata(RSMetadataEncoder *E, const RSVar *V); 6166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Encode F as a metadata in M. Return 0 if every thing goes well. 6266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changint RSEncodeFunctionMetadata(RSMetadataEncoder *E, const RSFunction *F); 6366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 6466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Release the memory allocation of Encoder without flushing things. 6566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changvoid DestroyRSMetadataEncoder(RSMetadataEncoder *E); 6666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 6766a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// Flush metadata in E to its associated module and Destroy it. Return 0 if 6866a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// every thing goes well. This will also call the DestroyRSMetadataEncoder(). 6966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changint FinalizeRSMetadataEncoder(RSMetadataEncoder *E); 7066a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 71e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// TODO(slang): Decoder 7266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Changstruct RSMetadata { 7366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang unsigned num_vars; 7466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang unsigned num_funcs; 7566a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 7666a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang RSVar *vars; 7766a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang RSFunction *funcs; 7866a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 7966a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang void *context; 8066a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang}; 8166a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 8266a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// struct RSMetadata *RSDecodeMetadata(llvm::Module *M); 8366a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang// void RSReleaseMetadata(struct RSMetadata *MD); 8466a1a5abf5f2f771d33d6b70a84a1efd7fb22f23Zonr Chang 85e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_METADATA_SPEC_H_ NOLINT 86