slang_rs_context.cpp revision 3f8b44dba57685b437cecc208f2a20a4ed93ed36
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang.hpp"
2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp"
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_reflection.hpp"
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_var.hpp"
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_func.hpp"
6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_type.hpp"
7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_pragma_handler.hpp"
8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/AST/Type.h"             /* for class clang::QualType */
10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/AST/Decl.h"             /* for class clang::*Decl */
11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/Index/Utils.h"          /* for class clang::idx::ResolveLocationInAST() */
12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/AST/DeclBase.h"         /* for class clang::Decl and clang::DeclContext */
13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/AST/ASTContext.h"       /* for class clang::ASTContext */
14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/Basic/TargetInfo.h"     /* for class clang::TargetInfo */
15e3756aa450b690cf5d18c0ea572ef7563de97bb3Victor Hsieh#include "clang/Basic/Linkage.h"        /* for class clang::Linkage */
16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/Index/ASTLocation.h"    /* for class clang::idx::ASTLocation */
17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/LLVMContext.h"           /* for function llvm::getGlobalContext() */
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/Target/TargetData.h"     /* for class llvm::TargetData */
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing namespace clang::idx;
22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
25001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei LiaoRSContext::RSContext(Preprocessor* PP, ASTContext* Ctx, const TargetInfo* Target) :
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mPP(PP),
27001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liao    mCtx(Ctx),
28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mTarget(Target),
29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mTargetData(NULL),
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mLLVMContext(llvm::getGlobalContext()),
31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mRSExportVarPragma(NULL),
32c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    mRSExportVarAllPragma(NULL),
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mRSExportFuncPragma(NULL),
34c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    mRSExportFuncAllPragma(NULL),
35537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    mRSExportTypePragma(NULL),
36c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    mRSJavaPackageNamePragma(NULL),
37d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    mRSReflectLicensePragma(NULL),
38a50704238e06bc72a7ea3e8282fb5d350f88fd08Victor Hsieh    mExportAllNonStaticVars(false),
394c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao    mExportAllNonStaticFuncs(false),
404c9f742efa36b1037acc640184681d421aa0f6baShih-wei Liao    mLicenseNote(NULL)
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao{
42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* For #pragma rs export_var */
43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mRSExportVarPragma = RSPragmaHandler::CreatePragmaExportVarHandler(this);
44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(mRSExportVarPragma != NULL)
45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        PP->AddPragmaHandler("rs", mRSExportVarPragma);
46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
47c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    /* For #pragma rs export_var_all */
48c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    mRSExportVarAllPragma = RSPragmaHandler::CreatePragmaExportVarAllHandler(this);
49c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    if(mRSExportVarAllPragma != NULL)
50c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh        PP->AddPragmaHandler("rs", mRSExportVarAllPragma);
51c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* For #pragma rs export_func */
53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mRSExportFuncPragma = RSPragmaHandler::CreatePragmaExportFuncHandler(this);
54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(mRSExportFuncPragma != NULL)
55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        PP->AddPragmaHandler("rs", mRSExportFuncPragma);
56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
57c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    /* For #pragma rs export_func_all */
58c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    mRSExportFuncAllPragma = RSPragmaHandler::CreatePragmaExportFuncAllHandler(this);
59c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh    if(mRSExportFuncAllPragma != NULL)
60c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh        PP->AddPragmaHandler("rs", mRSExportFuncAllPragma);
61c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh
62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* For #pragma rs export_type */
63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mRSExportTypePragma = RSPragmaHandler::CreatePragmaExportTypeHandler(this);
64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(mRSExportTypePragma != NULL)
65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        PP->AddPragmaHandler("rs", mRSExportTypePragma);
66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
67537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    /* For #pragma rs java_package_name */
68537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    mRSJavaPackageNamePragma = RSPragmaHandler::CreatePragmaJavaPackageNameHandler(this);
69537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    if(mRSJavaPackageNamePragma != NULL)
70537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao        PP->AddPragmaHandler("rs", mRSJavaPackageNamePragma);
71537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
72d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    /* For #pragma rs set_reflect_license */
73d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    mRSReflectLicensePragma = RSPragmaHandler::RSPragmaHandler::CreatePragmaReflectLicenseHandler(this);
74d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    if (mRSReflectLicensePragma != NULL)
75d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh        PP->AddPragmaHandler("rs", mRSReflectLicensePragma);
76d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh
77001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liao    /* Prepare target data */
78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    mTargetData = new llvm::TargetData(Slang::TargetDescription);
79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSContext::processExportVar(const VarDecl* VD) {
84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert(!VD->getName().empty() && "Variable name should not be empty");
85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* TODO: some check on variable */
87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    RSExportType* ET = RSExportType::CreateFromDecl(this, VD);
89537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    if(!ET)
90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    RSExportVar* EV = new RSExportVar(this, VD, ET);
93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(EV == NULL)
94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mExportVars.push_back(EV);
97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSContext::processExportFunc(const FunctionDecl* FD) {
102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert(!FD->getName().empty() && "Function name should not be empty");
103537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!FD->isThisDeclarationADefinition())
105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(FD->getStorageClass() != FunctionDecl::None) {
108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        printf("RSContext::processExportFunc : cannot export extern or static function '%s'\n", FD->getName().str().c_str());
109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    RSExportFunc* EF = RSExportFunc::Create(this, FD);
113462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(EF == NULL)
114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    else
116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        mExportFuncs.push_back(EF);
117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return true;
119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
122001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liaobool RSContext::processExportType(const llvm::StringRef& Name) {
123001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liao    TranslationUnitDecl* TUDecl = mCtx->getTranslationUnitDecl();
124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    assert(TUDecl != NULL && "Translation unit declaration (top-level declaration) is null object");
126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
127462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    const IdentifierInfo* II = mPP->getIdentifierInfo(Name);
128462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(II == NULL)
129462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        /* TODO: error: identifier @Name mark as an exportable type cannot be found */
130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    DeclContext::lookup_const_result R = TUDecl->lookup(II);
133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    bool Done = false;
134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    RSExportType* ET = NULL;
135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
136001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liao    RSExportPointerType::IntegerType = mCtx->IntTy.getTypePtr();
137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    for(DeclContext::lookup_const_iterator I = R.first;
139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        I != R.second;
140537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao        I++)
141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    {
142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        NamedDecl* const ND = *I;
143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        ASTLocation* LastLoc = new ASTLocation(ND);
144001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liao        ASTLocation AL = ResolveLocationInAST(*mCtx, ND->getLocStart(), LastLoc);
145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        delete LastLoc;
147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        if(AL.isDecl()) {
148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            Decl* D = AL.dyn_AsDecl();
149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            const Type* T = NULL;
150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            switch(D->getKind()) {
152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                case Decl::Typedef:
153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    T = static_cast<const TypedefDecl*>(D)->getCanonicalDecl()->getUnderlyingType().getTypePtr();
154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                break;
155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                case Decl::Record:
157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    T = static_cast<const RecordDecl*>(D)->getTypeForDecl();
158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                break;
159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                default:
161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                    /* unsupported, skip */
162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                break;
163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            }
164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            if(T != NULL)
166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao                ET = RSExportType::Create(this, T);
167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    RSExportPointerType::IntegerType = NULL;
171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return (ET != NULL);
173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
175001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liaovoid RSContext::processExport() {
17628cf66d9a9f82dc4bd4708db905423d14e101ed6Shih-wei Liao    if (mNeedExportVars.empty() && mNeedExportFuncs.empty() && !mExportAllNonStaticVars && !mExportAllNonStaticFuncs) {
17728cf66d9a9f82dc4bd4708db905423d14e101ed6Shih-wei Liao        printf("note: No reflection because there are no #pragma rs export_var(...), #pragma rs export_func(...), #pragma rs export_var_all, or #pragma rs export_func_all\n");
17828cf66d9a9f82dc4bd4708db905423d14e101ed6Shih-wei Liao        //mExportAllNonStaticVars = true;
17928cf66d9a9f82dc4bd4708db905423d14e101ed6Shih-wei Liao        //mExportAllNonStaticFuncs = true;
180ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao    }
181001fb6dddbf1cc794532eeb6a55f7b500eab1abcShih-wei Liao    TranslationUnitDecl* TUDecl = mCtx->getTranslationUnitDecl();
182ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao    for (DeclContext::decl_iterator DI = TUDecl->decls_begin();
183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        DI != TUDecl->decls_end();
184ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao        DI++) {
185d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh        if (DI->getKind() == Decl::Var) {
186ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao            /* Export variables */
187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            VarDecl* VD = (VarDecl*) (*DI);
188e3756aa450b690cf5d18c0ea572ef7563de97bb3Victor Hsieh            if (mExportAllNonStaticVars && VD->getLinkage() == ExternalLinkage) {
189c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                if (!processExportVar(VD)) {
190d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh                    printf("RSContext::processExport : failed to export var '%s'\n", VD->getNameAsCString());
191c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                }
192c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh            } else {
193c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                NeedExportVarSet::iterator EI = mNeedExportVars.find(VD->getName());
194ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao                if (EI != mNeedExportVars.end() && processExportVar(VD)) {
195c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                    mNeedExportVars.erase(EI);
196ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao                }
197c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh            }
198d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh        } else if (DI->getKind() == Decl::Function) {
199ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao            /* Export functions */
200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao            FunctionDecl* FD = (FunctionDecl*) (*DI);
201e3756aa450b690cf5d18c0ea572ef7563de97bb3Victor Hsieh            if (mExportAllNonStaticFuncs && FD->getLinkage() == ExternalLinkage) {
202c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                if (!processExportFunc(FD)) {
203d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh                    printf("RSContext::processExport : failed to export func '%s'\n", FD->getNameAsCString());
204c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                }
205c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh            } else {
206c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                NeedExportFuncSet::iterator EI = mNeedExportFuncs.find(FD->getName());
207ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao                if (EI != mNeedExportFuncs.end() && processExportFunc(FD))
208c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh                    mNeedExportFuncs.erase(EI);
209c6718b312b793ea76ac6b61479090c33ba9f2ba6Victor Hsieh            }
210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        }
211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    /* Finally, export type forcely set to be exported by user */
214ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao    for (NeedExportTypeSet::const_iterator EI = mNeedExportTypes.begin();
215ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao         EI != mNeedExportTypes.end();
216ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao         EI++) {
217ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao      if (!processExportType(EI->getKey())) {
218ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao        printf("RSContext::processExport : failed to export type '%s'\n", EI->getKey().str().c_str());
219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
220ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao      }
221ac91815eb4918b9307ec876f34f2b60adf28c78bShih-wei Liao    }
222537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return;
224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
226462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSContext::insertExportType(const llvm::StringRef& TypeName, RSExportType* ET) {
227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    ExportTypeMap::value_type* NewItem = ExportTypeMap::value_type::Create(TypeName.begin(), TypeName.end(), mExportTypes.getAllocator(), ET);
228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(mExportTypes.insert(NewItem)) {
230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return true;
231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    } else {
232c81dd70ab201ba13033004d36107ed96a6ad8036Shih-wei Liao        free(NewItem);
233462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        return false;
234462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
235462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
236462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2373f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wangbool RSContext::reflectToJava(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName, char realPackageName[], int bSize) {
2383f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    if (realPackageName != NULL) {
2393f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang        *realPackageName = 0;
2403f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    }
2413f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang
2423f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    if(OutputPackageName == NULL) {
2433f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang        if(!mReflectJavaPackageName.empty()) {
244537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao            OutputPackageName = mReflectJavaPackageName.c_str();
2453f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang        } else {
246537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao            return true; /* no package name, just return */
2473f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang        }
2483f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    }
2493f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang
2503f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    // Copy back the really applied package name
2513f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    if (realPackageName != NULL) {
2523f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang        strncpy(realPackageName, OutputPackageName, bSize - 1);
2533f8b44dba57685b437cecc208f2a20a4ed93ed36Ying Wang    }
254537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao
255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    RSReflection* R = new RSReflection(this);
256537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    bool ret = R->reflect(OutputPackageName, InputFileName, OutputBCFileName);
257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    if(!ret)
258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao        printf("RSContext::reflectToJava : failed to do reflection (%s)\n", R->getLastError());
259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    delete R;
260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    return ret;
261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2636de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liaobool RSContext::reflectToJavaPath(const char* OutputPathName) {
2646de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    if(OutputPathName == NULL)
2656de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao        return true; /* no path name, just return */
2666de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
2676de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    setReflectJavaPathName(std::string(OutputPathName));
2686de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao    return true;
2696de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao}
2706de89272b00a31f2a73e2f56edf9cc511df46265Shih-wei Liao
271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoRSContext::~RSContext() {
272f83d3c396d5d7eacd97cf0a5d3b6a01d75535b67Shih-wei Liao  /*    delete mRSExportVarPragma;  // These are deleted by mPP.reset() that was invoked at the end of Slang::compile(). Doing it again in ~RSContext here will cause seg-faults
273537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    delete mRSExportFuncPragma;
274537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    delete mRSExportTypePragma;
275537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    delete mRSJavaPackageNamePragma;
276d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    delete mRSReflectLicensePragma;
277f83d3c396d5d7eacd97cf0a5d3b6a01d75535b67Shih-wei Liao  */
278d8a0d186a362739f385f1a4af35360d5da69e47bVictor Hsieh    delete mLicenseNote;
279537446c9542fdda458920876ed8a020a97ddf7a4Shih-wei Liao    delete mTargetData;
280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}   /* namespace slang */
283