1474cbd2fde362e63375f7a5099ca38b5c67835cfLogan/*
2474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * Copyright 2010, The Android Open Source Project
3474cbd2fde362e63375f7a5099ca38b5c67835cfLogan *
4474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * Licensed under the Apache License, Version 2.0 (the "License");
5474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * you may not use this file except in compliance with the License.
6474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * You may obtain a copy of the License at
7474cbd2fde362e63375f7a5099ca38b5c67835cfLogan *
8474cbd2fde362e63375f7a5099ca38b5c67835cfLogan *     http://www.apache.org/licenses/LICENSE-2.0
9474cbd2fde362e63375f7a5099ca38b5c67835cfLogan *
10474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * Unless required by applicable law or agreed to in writing, software
11474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * distributed under the License is distributed on an "AS IS" BASIS,
12474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * See the License for the specific language governing permissions and
14474cbd2fde362e63375f7a5099ca38b5c67835cfLogan * limitations under the License.
15474cbd2fde362e63375f7a5099ca38b5c67835cfLogan */
16474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
17474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#ifndef BCC_SOURCEINFO_H
18474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#define BCC_SOURCEINFO_H
19474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
20474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include "Config.h"
21474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
22474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include <llvm/ADT/OwningPtr.h>
23474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include <llvm/Module.h>
24474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
25474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#include <stddef.h>
26474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
27474cbd2fde362e63375f7a5099ca38b5c67835cfLogannamespace bcc {
28474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  class ScriptCompiled;
29474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
30474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  namespace SourceKind {
31474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    enum SourceType {
32474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      File,
33474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      Buffer,
34474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      Module,
35474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    };
36474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  }
37474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
38474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  class SourceInfo {
39474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  private:
40474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    SourceKind::SourceType type;
41474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
42474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    llvm::OwningPtr<llvm::Module> module;
43474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    // Note: module should not be a part of union.  Since, we are going to
44474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    // use module to store the pointer to parsed bitcode.
45474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
46474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    union {
47474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      struct {
48474cbd2fde362e63375f7a5099ca38b5c67835cfLogan        char const *resName;
49474cbd2fde362e63375f7a5099ca38b5c67835cfLogan        char const *bitcode;
50474cbd2fde362e63375f7a5099ca38b5c67835cfLogan        size_t bitcodeSize;
51474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      } buffer;
52474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
53474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      struct {
54474cbd2fde362e63375f7a5099ca38b5c67835cfLogan        char const *path;
55474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      } file;
56474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    };
57474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
58474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    unsigned long flags;
59474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
60474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#if USE_CACHE
61474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    unsigned char sha1[20];
62474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#endif
63474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
64474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  private:
65474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    SourceInfo() { }
66474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
67474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  public:
68474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    static SourceInfo *createFromBuffer(char const *resName,
69474cbd2fde362e63375f7a5099ca38b5c67835cfLogan                                        char const *bitcode,
70474cbd2fde362e63375f7a5099ca38b5c67835cfLogan                                        size_t bitcodeSize,
71474cbd2fde362e63375f7a5099ca38b5c67835cfLogan                                        unsigned long flags);
72474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
73474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    static SourceInfo *createFromFile(char const *path,
74474cbd2fde362e63375f7a5099ca38b5c67835cfLogan                                      unsigned long flags);
75474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
76474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    static SourceInfo *createFromModule(llvm::Module *module,
77474cbd2fde362e63375f7a5099ca38b5c67835cfLogan                                        unsigned long flags);
78474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
79474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    llvm::Module *takeModule() {
80474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      return module.take();
81474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    }
82474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
83474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    llvm::Module *getModule() const {
84474cbd2fde362e63375f7a5099ca38b5c67835cfLogan      return module.get();
85474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    }
86474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
87474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    int prepareModule(ScriptCompiled *);
88474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
89474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#if USE_CACHE
90474cbd2fde362e63375f7a5099ca38b5c67835cfLogan    template <typename T> void introDependency(T &checker);
91474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#endif
92474cbd2fde362e63375f7a5099ca38b5c67835cfLogan  };
93474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
94474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
95474cbd2fde362e63375f7a5099ca38b5c67835cfLogan} // namespace bcc
96474cbd2fde362e63375f7a5099ca38b5c67835cfLogan
97474cbd2fde362e63375f7a5099ca38b5c67835cfLogan#endif // BCC_SOURCEINFO_H
98