blob: 3a04444c1e3c32238089ae2a512e3918f54e2cd9 [file] [log] [blame]
/*
* Copyright 2010-2012, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_ // NOLINT
#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_
#include "slang.h"
#include <list>
#include <string>
#include <utility>
#include <vector>
#include "llvm/ADT/StringMap.h"
#include "slang_rs_reflect_utils.h"
#include "slang_version.h"
namespace slang {
class RSCCOptions;
class RSContext;
class RSExportRecordType;
class SlangRS : public Slang {
private:
// Context for Renderscript
RSContext *mRSContext;
bool mAllowRSPrefix;
unsigned int mTargetAPI;
bool mVerbose;
bool mIsFilterscript;
// Custom diagnostic identifiers
unsigned mDiagErrorInvalidOutputDepParameter;
unsigned mDiagErrorODR;
unsigned mDiagErrorTargetAPIRange;
// Collect generated filenames (without the .java) for dependency generation
std::vector<std::string> mGeneratedFileNames;
// FIXME: Should be std::list<RSExportable *> here. But currently we only
// check ODR on record type.
//
// ReflectedDefinitions maps record type name to a pair:
// <its RSExportRecordType instance,
// the first file contains this record type definition>
typedef std::pair<RSExportRecordType*, const char*> ReflectedDefinitionTy;
typedef llvm::StringMap<ReflectedDefinitionTy> ReflectedDefinitionListTy;
ReflectedDefinitionListTy ReflectedDefinitions;
bool generateJavaBitcodeAccessor(const std::string &OutputPathBase,
const std::string &PackageName,
const std::string *LicenseNote);
// CurInputFile is the pointer to a char array holding the input filename
// and is valid before compile() ends.
bool checkODR(const char *CurInputFile);
// Returns true if this is a Filterscript file.
static bool isFilterscript(const char *Filename);
protected:
virtual void initDiagnostic();
virtual void initPreprocessor();
virtual void initASTContext();
virtual clang::ASTConsumer
*createBackend(const clang::CodeGenOptions& CodeGenOpts,
llvm::raw_ostream *OS,
Slang::OutputType OT);
public:
static bool IsRSHeaderFile(const char *File);
// FIXME: Determine whether a location is in RS header (i.e., one of the RS
// built-in APIs) should only need its names (we need a "list" of RS
// built-in APIs).
static bool IsLocInRSHeaderFile(const clang::SourceLocation &Loc,
const clang::SourceManager &SourceMgr);
SlangRS();
// Compile bunch of RS files given in the llvm-rs-cc arguments. Return true if
// all given input files are successfully compiled without errors.
//
// @IOFiles - List of pairs of <input file path, output file path>.
//
// @DepFiles - List of pairs of <output dep. file path, dependent bitcode
// target>. If @OutputDep is true, this parameter must be given
// with the same number of pairs given in @IOFiles.
//
// @Opts - Selection of options defined from invoking llvm-rs-cc
bool compile(const std::list<std::pair<const char*, const char*> > &IOFiles64,
const std::list<std::pair<const char*, const char*> > &IOFiles32,
const std::list<std::pair<const char*, const char*> > &DepFiles,
const RSCCOptions &Opts);
virtual void reset();
virtual ~SlangRS();
virtual void makeModuleVisible(clang::Module *Mod,
clang::Module::NameVisibilityKind Visibility,
clang::SourceLocation ImportLoc,
bool Complain = false) { }
virtual clang::GlobalModuleIndex *loadGlobalModuleIndex(
clang::SourceLocation TriggerLoc) { }
virtual bool lookupMissingImports(llvm::StringRef Name,
clang::SourceLocation TriggerLoc) { }
};
} // namespace slang
#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_H_ NOLINT