Index: include/clang/Basic/LangOptions.def =================================================================== --- include/clang/Basic/LangOptions.def +++ include/clang/Basic/LangOptions.def @@ -185,6 +185,7 @@ LANGOPT(OpenMP , 1, 0, "OpenMP support") LANGOPT(OpenMPUseTLS , 1, 0, "Use TLS for threadprivates or runtime calls") LANGOPT(OpenMPIsDevice , 1, 0, "Generate code only for OpenMP target device") +LANGOPT(Renderscript , 1, 0, "RenderScript") LANGOPT(CUDAIsDevice , 1, 0, "compiling for CUDA device") LANGOPT(CUDAAllowVariadicFunctions, 1, 0, "allowing variadic functions in CUDA device code") Index: include/clang/Driver/Types.def =================================================================== --- include/clang/Driver/Types.def +++ include/clang/Driver/Types.def @@ -53,6 +53,7 @@ TYPE("objective-c++-cpp-output", PP_ObjCXX, INVALID, "mii", "u") TYPE("objc++-cpp-output", PP_ObjCXX_Alias, INVALID, "mii", "u") TYPE("objective-c++", ObjCXX, PP_ObjCXX, "mm", "u") +TYPE("renderscript", Renderscript, PP_C, "rs", "u") // C family input files to precompile. TYPE("c-header-cpp-output", PP_CHeader, INVALID, "i", "p") Index: include/clang/Frontend/FrontendOptions.h =================================================================== --- include/clang/Frontend/FrontendOptions.h +++ include/clang/Frontend/FrontendOptions.h @@ -75,7 +75,8 @@ IK_CUDA, IK_PreprocessedCuda, IK_AST, - IK_LLVM_IR + IK_LLVM_IR, + IK_Renderscript }; Index: lib/Basic/TargetInfo.cpp =================================================================== --- lib/Basic/TargetInfo.cpp +++ lib/Basic/TargetInfo.cpp @@ -318,6 +318,14 @@ FloatFormat = &llvm::APFloat::IEEEsingle; LongDoubleFormat = &llvm::APFloat::IEEEquad; } + + if (Opts.Renderscript) { + // In RenderScript, long types are always 8 bytes wide and aligned to + // 8-byte boundary. + if (PointerWidth == 32) { + LongWidth = LongAlign = 64; + } + } } bool TargetInfo::initFeatureMap( Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1242,6 +1242,7 @@ .Case("objective-c++-header", IK_ObjCXX) .Cases("ast", "pcm", IK_AST) .Case("ir", IK_LLVM_IR) + .Case("renderscript", IK_Renderscript) .Default(IK_None); if (DashX == IK_None) Diags.Report(diag::err_drv_invalid_value) @@ -1445,6 +1446,9 @@ case IK_PreprocessedObjCXX: LangStd = LangStandard::lang_gnucxx98; break; + case IK_Renderscript: + LangStd = LangStandard::lang_c99; + break; } } @@ -1487,6 +1491,8 @@ Opts.CUDA = IK == IK_CUDA || IK == IK_PreprocessedCuda || LangStd == LangStandard::lang_cuda; + Opts.Renderscript = IK == IK_Renderscript; + // OpenCL and C++ both have bool, true, false keywords. Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; Index: lib/Frontend/FrontendActions.cpp =================================================================== --- lib/Frontend/FrontendActions.cpp +++ lib/Frontend/FrontendActions.cpp @@ -735,6 +735,7 @@ case IK_PreprocessedObjCXX: case IK_AST: case IK_LLVM_IR: + case IK_Renderscript: // We can't do anything with these. return; } Index: test/CodeGen/renderscript.c =================================================================== --- /dev/null +++ test/CodeGen/renderscript.c @@ -0,0 +1,5 @@ +// RUN: %clang -target arm-linux-androideabi -DLONG_SIZE_AND_ALIGN=4 -fsyntax-only %s +// RUN: %clang -target arm-linux-androideabi -x renderscript -DLONG_SIZE_AND_ALIGN=8 -fsyntax-only %s + +_Static_assert(sizeof(long) == LONG_SIZE_AND_ALIGN, "sizeof long is wrong"); +_Static_assert(_Alignof(long) == LONG_SIZE_AND_ALIGN, "alignof long is wrong");