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