51 #include <llvm/ADT/Triple.h> 52 #include <llvm/Bitcode/BitcodeReader.h> 53 #include <llvm/IR/Attributes.h> 54 #include <llvm/IR/DerivedTypes.h> 55 #include <llvm/IR/Instructions.h> 56 #include <llvm/IR/Intrinsics.h> 57 #include <llvm/IR/LLVMContext.h> 58 #include <llvm/IR/Module.h> 59 #include <llvm/IR/Type.h> 60 #include <llvm/Linker/Linker.h> 61 #include <llvm/Support/MemoryBuffer.h> 62 #include <llvm/Target/TargetMachine.h> 65 struct yy_buffer_state;
148 static void lCreateSymbol(
const std::string &name,
const Type *returnType, llvm::SmallVector<const Type *, 8> &argTypes,
149 const llvm::FunctionType *ftype, llvm::Function *func,
SymbolTable *symbolTable) {
151 noPos.
name =
"__stdlib";
155 Debug(noPos,
"Created builtin symbol \"%s\" [%s]\n", name.c_str(), funcType->
GetString().c_str());
158 sym->function = func;
168 noPos.
name =
"__stdlib";
170 const llvm::FunctionType *ftype = func->getFunctionType();
171 std::string name = std::string(func->getName());
173 if (name.size() < 3 || name[0] !=
'_' || name[1] !=
'_')
176 Debug(
SourcePos(),
"Attempting to create ispc symbol for function \"%s\".", name.c_str());
185 llvm::SmallVector<const Type *, 8> argTypes;
200 for (
int i = 0; i < 2; ++i) {
201 bool intAsUnsigned = (i == 1);
204 if (returnType == NULL) {
206 "Failed: return type not representable for " 215 bool anyIntArgs =
false;
216 llvm::SmallVector<const Type *, 8> argTypes;
217 for (
unsigned int j = 0; j < ftype->getNumParams(); ++j) {
218 const llvm::Type *llvmArgType = ftype->getParamType(j);
222 "Failed: type of parameter %d not " 223 "representable for builtin %s",
228 argTypes.push_back(type);
233 if (i == 0 || anyIntArgs ==
true)
234 lCreateSymbol(name, returnType, argTypes, ftype, func, symbolTable);
246 Assert(module->global_empty());
249 llvm::Module::iterator iter;
250 for (iter = module->begin(); iter != module->end(); ++iter) {
251 llvm::Function *func = &*iter;
263 llvm::Module::iterator iter;
264 for (iter = module->begin(); iter != module->end(); ++iter) {
265 llvm::Function *func = &*iter;
266 if (!func->isIntrinsic())
269 const std::string funcName = func->getName().str();
272 if (!strncmp(funcName.c_str(),
"llvm.x86.", 9)) {
273 llvm::Intrinsic::ID
id = (llvm::Intrinsic::ID)func->getIntrinsicID();
275 std::string error_message =
"Intrinsic is not found: ";
276 error_message += funcName;
277 FATAL(error_message.c_str());
279 llvm::Type *intrinsicType = llvm::Intrinsic::getType(*
g->
ctx,
id);
280 intrinsicType = llvm::PointerType::get(intrinsicType, 0);
281 Assert(func->getType() == intrinsicType);
299 const char *names[] = {
302 "__add_uniform_double",
303 "__add_uniform_int32",
304 "__add_uniform_int64",
305 "__add_varying_double",
306 "__add_varying_int32",
307 "__add_varying_int64",
310 "__aos_to_soa3_double",
311 "__aos_to_soa3_double1",
312 "__aos_to_soa3_double16",
313 "__aos_to_soa3_double32",
314 "__aos_to_soa3_double4",
315 "__aos_to_soa3_double64",
316 "__aos_to_soa3_double8",
317 "__aos_to_soa3_float",
318 "__aos_to_soa3_float1",
319 "__aos_to_soa3_float16",
320 "__aos_to_soa3_float32",
321 "__aos_to_soa3_float4",
322 "__aos_to_soa3_float64",
323 "__aos_to_soa3_float8",
324 "__aos_to_soa4_double",
325 "__aos_to_soa4_double1",
326 "__aos_to_soa4_double16",
327 "__aos_to_soa4_double32",
328 "__aos_to_soa4_double4",
329 "__aos_to_soa4_double64",
330 "__aos_to_soa4_double8",
331 "__aos_to_soa4_float",
332 "__aos_to_soa4_float1",
333 "__aos_to_soa4_float16",
334 "__aos_to_soa4_float32",
335 "__aos_to_soa4_float4",
336 "__aos_to_soa4_float64",
337 "__aos_to_soa4_float8",
338 "__atomic_add_int32_global",
339 "__atomic_add_int64_global",
340 "__atomic_add_uniform_int32_global",
341 "__atomic_add_uniform_int64_global",
342 "__atomic_and_int32_global",
343 "__atomic_and_int64_global",
344 "__atomic_and_uniform_int32_global",
345 "__atomic_and_uniform_int64_global",
346 "__atomic_compare_exchange_double_global",
347 "__atomic_compare_exchange_float_global",
348 "__atomic_compare_exchange_int32_global",
349 "__atomic_compare_exchange_int64_global",
350 "__atomic_compare_exchange_uniform_double_global",
351 "__atomic_compare_exchange_uniform_float_global",
352 "__atomic_compare_exchange_uniform_int32_global",
353 "__atomic_compare_exchange_uniform_int64_global",
354 "__atomic_max_uniform_int32_global",
355 "__atomic_max_uniform_int64_global",
356 "__atomic_min_uniform_int32_global",
357 "__atomic_min_uniform_int64_global",
358 "__atomic_or_int32_global",
359 "__atomic_or_int64_global",
360 "__atomic_or_uniform_int32_global",
361 "__atomic_or_uniform_int64_global",
362 "__atomic_sub_int32_global",
363 "__atomic_sub_int64_global",
364 "__atomic_sub_uniform_int32_global",
365 "__atomic_sub_uniform_int64_global",
366 "__atomic_swap_double_global",
367 "__atomic_swap_float_global",
368 "__atomic_swap_int32_global",
369 "__atomic_swap_int64_global",
370 "__atomic_swap_uniform_double_global",
371 "__atomic_swap_uniform_float_global",
372 "__atomic_swap_uniform_int32_global",
373 "__atomic_swap_uniform_int64_global",
374 "__atomic_umax_uniform_uint32_global",
375 "__atomic_umax_uniform_uint64_global",
376 "__atomic_umin_uniform_uint32_global",
377 "__atomic_umin_uniform_uint64_global",
378 "__atomic_xor_int32_global",
379 "__atomic_xor_int64_global",
380 "__atomic_xor_uniform_int32_global",
381 "__atomic_xor_uniform_int64_global",
382 "__broadcast_double",
390 "__cast_mask_to_i16",
391 "__ceil_uniform_double",
392 "__ceil_uniform_float",
393 "__ceil_varying_double",
394 "__ceil_varying_float",
396 "__count_trailing_zeros_i32",
397 "__count_trailing_zeros_i64",
398 "__count_leading_zeros_i32",
399 "__count_leading_zeros_i64",
400 "__delete_uniform_32rt",
401 "__delete_uniform_64rt",
402 "__delete_varying_32rt",
403 "__delete_varying_64rt",
404 "__do_assert_uniform",
405 "__do_assert_varying",
407 "__doublebits_uniform_int64",
408 "__doublebits_varying_int64",
409 "__exclusive_scan_add_double",
410 "__exclusive_scan_add_float",
411 "__exclusive_scan_add_i32",
412 "__exclusive_scan_add_i64",
413 "__exclusive_scan_and_i32",
414 "__exclusive_scan_and_i64",
415 "__exclusive_scan_or_i32",
416 "__exclusive_scan_or_i64",
422 "__extract_mask_low",
425 "__float_to_half_uniform",
426 "__float_to_half_varying",
427 "__floatbits_uniform_int32",
428 "__floatbits_varying_int32",
429 "__floor_uniform_double",
430 "__floor_uniform_float",
431 "__floor_varying_double",
432 "__floor_varying_float",
434 "__half_to_float_uniform",
435 "__half_to_float_varying",
441 "__intbits_uniform_double",
442 "__intbits_uniform_float",
443 "__intbits_varying_double",
444 "__intbits_varying_float",
445 "__max_uniform_double",
446 "__max_uniform_float",
447 "__max_uniform_int32",
448 "__max_uniform_int64",
449 "__max_uniform_uint32",
450 "__max_uniform_uint64",
451 "__max_varying_double",
452 "__max_varying_float",
453 "__max_varying_int32",
454 "__max_varying_int64",
455 "__max_varying_uint32",
456 "__max_varying_uint64",
464 "__min_uniform_double",
465 "__min_uniform_float",
466 "__min_uniform_int32",
467 "__min_uniform_int64",
468 "__min_uniform_uint32",
469 "__min_uniform_uint64",
470 "__min_varying_double",
471 "__min_varying_float",
472 "__min_varying_int32",
473 "__min_varying_int64",
474 "__min_varying_uint32",
475 "__min_varying_uint64",
477 "__new_uniform_32rt",
478 "__new_uniform_64rt",
479 "__new_varying32_32rt",
480 "__new_varying32_64rt",
481 "__new_varying64_64rt",
484 "__packed_load_active",
485 "__packed_store_active",
486 "__packed_store_active2",
493 "__prefetch_read_uniform_1",
494 "__prefetch_read_uniform_2",
495 "__prefetch_read_uniform_3",
496 "__prefetch_read_uniform_nt",
497 "__pseudo_prefetch_read_varying_1",
498 "__pseudo_prefetch_read_varying_2",
499 "__pseudo_prefetch_read_varying_3",
500 "__pseudo_prefetch_read_varying_nt",
505 "__rcp_fast_uniform_float",
506 "__rcp_uniform_float",
507 "__rcp_fast_varying_float",
508 "__rcp_varying_float",
509 "__rcp_uniform_double",
510 "__rcp_varying_double",
514 "__reduce_add_double",
515 "__reduce_add_float",
517 "__reduce_add_int16",
518 "__reduce_add_int32",
519 "__reduce_add_int64",
520 "__reduce_equal_double",
521 "__reduce_equal_float",
522 "__reduce_equal_int32",
523 "__reduce_equal_int64",
524 "__reduce_max_double",
525 "__reduce_max_float",
526 "__reduce_max_int32",
527 "__reduce_max_int64",
528 "__reduce_max_uint32",
529 "__reduce_max_uint64",
530 "__reduce_min_double",
531 "__reduce_min_float",
532 "__reduce_min_int32",
533 "__reduce_min_int64",
534 "__reduce_min_uint32",
535 "__reduce_min_uint64",
542 "__round_uniform_double",
543 "__round_uniform_float",
544 "__round_varying_double",
545 "__round_varying_float",
546 "__rsqrt_fast_varying_float",
547 "__rsqrt_uniform_float",
548 "__rsqrt_fast_uniform_float",
549 "__rsqrt_varying_float",
550 "__rsqrt_uniform_double",
551 "__rsqrt_varying_double",
553 "__sext_uniform_bool",
554 "__sext_varying_bool",
573 "__soa_to_aos3_double",
574 "__soa_to_aos3_double1",
575 "__soa_to_aos3_double16",
576 "__soa_to_aos3_double32",
577 "__soa_to_aos3_double4",
578 "__soa_to_aos3_double64",
579 "__soa_to_aos3_double8",
580 "__soa_to_aos3_float",
581 "__soa_to_aos3_float1",
582 "__soa_to_aos3_float16",
583 "__soa_to_aos3_float32",
584 "__soa_to_aos3_float4",
585 "__soa_to_aos3_float64",
586 "__soa_to_aos3_float8",
587 "__soa_to_aos4_double",
588 "__soa_to_aos4_double1",
589 "__soa_to_aos4_double16",
590 "__soa_to_aos4_double32",
591 "__soa_to_aos4_double4",
592 "__soa_to_aos4_double64",
593 "__soa_to_aos4_double8",
594 "__soa_to_aos4_float",
595 "__soa_to_aos4_float1",
596 "__soa_to_aos4_float16",
597 "__soa_to_aos4_float32",
598 "__soa_to_aos4_float4",
599 "__soa_to_aos4_float64",
600 "__soa_to_aos4_float8",
601 "__sqrt_uniform_double",
602 "__sqrt_uniform_float",
603 "__sqrt_varying_double",
604 "__sqrt_varying_float",
626 "__streaming_load_uniform_double",
627 "__streaming_load_uniform_float",
628 "__streaming_load_uniform_i8",
629 "__streaming_load_uniform_i16",
630 "__streaming_load_uniform_i32",
631 "__streaming_load_uniform_i64",
632 "__streaming_load_varying_double",
633 "__streaming_load_varying_float",
634 "__streaming_load_varying_i8",
635 "__streaming_load_varying_i16",
636 "__streaming_load_varying_i32",
637 "__streaming_load_varying_i64",
638 "__streaming_store_uniform_double",
639 "__streaming_store_uniform_float",
640 "__streaming_store_uniform_i8",
641 "__streaming_store_uniform_i16",
642 "__streaming_store_uniform_i32",
643 "__streaming_store_uniform_i64",
644 "__streaming_store_varying_double",
645 "__streaming_store_varying_float",
646 "__streaming_store_varying_i8",
647 "__streaming_store_varying_i16",
648 "__streaming_store_varying_i32",
649 "__streaming_store_varying_i64",
672 "__log_uniform_float",
673 "__log_varying_float",
674 "__exp_uniform_float",
675 "__exp_varying_float",
676 "__pow_uniform_float",
677 "__pow_varying_float",
678 "__log_uniform_double",
679 "__log_varying_double",
680 "__exp_uniform_double",
681 "__exp_varying_double",
682 "__pow_uniform_double",
683 "__pow_varying_double",
684 "__sin_varying_float",
685 "__asin_varying_float",
686 "__cos_varying_float",
687 "__acos_varying_float",
688 "__sincos_varying_float",
689 "__tan_varying_float",
690 "__atan_varying_float",
691 "__atan2_varying_float",
692 "__sin_uniform_float",
693 "__asin_uniform_float",
694 "__cos_uniform_float",
695 "__acos_uniform_float",
696 "__sincos_uniform_float",
697 "__tan_uniform_float",
698 "__atan_uniform_float",
699 "__atan2_uniform_float",
700 "__sin_varying_double",
701 "__asin_varying_double",
702 "__cos_varying_double",
703 "__acos_varying_double",
704 "__sincos_varying_double",
705 "__tan_varying_double",
706 "__atan_varying_double",
707 "__atan2_varying_double",
708 "__sin_uniform_double",
709 "__asin_uniform_double",
710 "__cos_uniform_double",
711 "__acos_uniform_double",
712 "__sincos_uniform_double",
713 "__tan_uniform_double",
714 "__atan_uniform_double",
715 "__atan2_uniform_double",
727 int count =
sizeof(names) /
sizeof(names[0]);
728 for (
int i = 0; i < count; ++i) {
729 llvm::Function *f = module->getFunction(names[i]);
730 if (f != NULL && f->empty() ==
false) {
731 f->setLinkage(llvm::GlobalValue::InternalLinkage);
747 llvm::StringRef sb = llvm::StringRef((
const char *)lib->
getLib(), lib->
getSize());
748 llvm::MemoryBufferRef bcBuf = llvm::MemoryBuffer::getMemBuffer(sb)->getMemBufferRef();
750 llvm::Expected<std::unique_ptr<llvm::Module>> ModuleOrErr = llvm::parseBitcodeFile(bcBuf, *
g->
ctx);
752 Error(
SourcePos(),
"Error parsing stdlib bitcode: %s", toString(ModuleOrErr.takeError()).c_str());
754 llvm::Module *bcModule = ModuleOrErr.get().release();
763 llvm::Triple mTriple(
m->
module->getTargetTriple());
764 llvm::Triple bcTriple(bcModule->getTargetTriple());
765 Debug(
SourcePos(),
"module triple: %s\nbitcode triple: %s\n", mTriple.str().c_str(), bcTriple.str().c_str());
770 Assert(bcTriple.getArch() == llvm::Triple::UnknownArch || mTriple.getArch() == bcTriple.getArch());
771 Assert(bcTriple.getVendor() == llvm::Triple::UnknownVendor ||
772 mTriple.getVendor() == bcTriple.getVendor());
782 "Module DataLayout is incompatible with " 783 "library DataLayout:\n" 786 module->getDataLayoutStr().c_str(), bcModule->getDataLayoutStr().c_str());
791 bcModule->setTargetTriple(mTriple.str());
792 bcModule->setDataLayout(module->getDataLayout());
798 for (llvm::Function &f : *bcModule) {
799 if (f.isDeclaration()) {
801 if (f.getNumUses() > 0)
803 module->getOrInsertFunction(f.getName(), f.getFunctionType(), f.getAttributes());
807 std::unique_ptr<llvm::Module> M(bcModule);
808 if (llvm::Linker::linkModules(*module, std::move(M))) {
813 if (symbolTable != NULL)
823 std::vector<llvm::Constant *> &dbg_sym) {
828 auto GV =
new llvm::GlobalVariable(*module, ltype,
true, llvm::GlobalValue::InternalLinkage, linit, name);
829 dbg_sym.push_back(GV);
840 llvm::GlobalVariable *sym_GV_storagePtr = llvm::dyn_cast<llvm::GlobalVariable>(sym->
storagePtr);
841 llvm::DIGlobalVariableExpression *var =
842 m->
diBuilder->createGlobalVariableExpression(cu, name, name, file, 0 , diType,
true );
843 sym_GV_storagePtr->addDebugInfo(var);
853 std::vector<llvm::Constant *> &dbg_sym) {
854 llvm::SmallVector<const Type *, 8> args;
858 llvm::Function *func = module->getFunction(name);
859 dbg_sym.push_back(func);
861 func->addFnAttr(llvm::Attribute::AlwaysInline);
862 llvm::BasicBlock *bblock = llvm::BasicBlock::Create(*
g->
ctx,
"entry", func, 0);
870 std::vector<llvm::Constant *> &dbg_sym) {
882 new llvm::GlobalVariable(*module, ltype,
true, llvm::GlobalValue::InternalLinkage, linit, sym->
name.c_str());
883 dbg_sym.push_back(GV);
891 llvm::GlobalVariable *sym_GV_storagePtr = llvm::dyn_cast<llvm::GlobalVariable>(sym->
storagePtr);
892 llvm::DIGlobalVariableExpression *var =
m->
diBuilder->createGlobalVariableExpression(
893 cu, sym->
name.c_str(), sym->
name.c_str(), file, 0 , diType,
false );
894 sym_GV_storagePtr->addDebugInfo(var);
903 static void emitLLVMUsed(llvm::Module &module, std::vector<llvm::Constant *> &list) {
905 llvm::SmallVector<llvm::Constant *, 8> UsedArray;
906 UsedArray.reserve(list.size());
907 for (
auto c : list) {
908 UsedArray.push_back(llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(llvm::cast<llvm::Constant>(c),
914 auto *GV =
new llvm::GlobalVariable(module, ATy,
false, llvm::GlobalValue::AppendingLinkage,
915 llvm::ConstantArray::get(ATy, UsedArray),
"llvm.used");
917 GV->setSection(
"llvm.metadata");
924 std::vector<llvm::Constant *> debug_symbols;
971 llvm::GlobalVariable *alignment = module->getGlobalVariable(
"memory_alignment",
true);
979 if (includeStdlibISPC) {
983 extern const char stdlib_mask1_code[], stdlib_mask8_code[];
984 extern const char stdlib_mask16_code[], stdlib_mask32_code[], stdlib_mask64_code[];
1005 FATAL(
"Unhandled mask bit size for stdlib.ispc");
static const AtomicType * VaryingInt32
static llvm::Type * FloatType
static bool lCreateISPCSymbol(llvm::Function *func, SymbolTable *symbolTable)
static const AtomicType * VaryingInt16
llvm::Function * function
static llvm::Type * Int32VectorPointerType
void DefineStdlib(SymbolTable *symbolTable, llvm::LLVMContext *ctx, llvm::Module *module, bool includeStdlibISPC)
Declaration of the FunctionEmitContext class
TargetLibRegistry * target_registry
bool AddFunction(Symbol *symbol)
static void lDefineConstantInt(const char *name, int val, llvm::Module *module, SymbolTable *symbolTable, std::vector< llvm::Constant *> &dbg_sym)
static const AtomicType * VaryingUInt64
static llvm::Type * DoubleType
static void lCheckModuleIntrinsics(llvm::Module *module)
bool AddVariable(Symbol *symbol)
static const AtomicType * VaryingDouble
Expression representing a compile-time constant value.
static llvm::Type * BoolType
Symbol table that holds all known symbols during parsing and compilation.
static void lDefineConstantIntFunc(const char *name, int val, llvm::Module *module, SymbolTable *symbolTable, std::vector< llvm::Constant *> &dbg_sym)
const BitcodeLib * getISPCTargetLib(ISPCTarget target, TargetOS os, Arch arch) const
static llvm::VectorType * Int32VectorType
int getMaskBitCount() const
static const AtomicType * UniformUInt32
static llvm::Type * FloatVectorPointerType
Declarations of functions related to builtins and the standard library.
static llvm::Type * Int8PointerType
static llvm::Type * Int32PointerType
static llvm::Type * Int16VectorPointerType
static llvm::Type * Int16Type
static llvm::Type * DoubleVectorPointerType
static const AtomicType * UniformUInt16
static void lSetInternalFunctions(llvm::Module *module)
static PointerType * GetUniform(const Type *t, bool isSlice=false)
bool VerifyDataLayoutCompatibility(const std::string &module_dl, const std::string &lib_dl)
header file with declarations for symbol and symbol table classes.
static const AtomicType * UniformBool
virtual llvm::DIType * GetDIType(llvm::DIScope *scope) const =0
static llvm::Type * VoidType
static void lDefineProgramIndex(llvm::Module *module, SymbolTable *symbolTable, std::vector< llvm::Constant *> &dbg_sym)
static llvm::Type * Int8VectorPointerType
static const AtomicType * UniformUInt64
static llvm::VectorType * Int8VectorType
llvm::Constant * LLVMInt32Vector(int32_t ival)
static llvm::VectorType * FloatVectorType
static llvm::Type * Int64Type
static llvm::Type * Int8Type
static llvm::VectorType * Int64VectorType
Header file with declarations for various LLVM utility stuff.
static llvm::Type * Int64PointerType
static llvm::Type * FloatPointerType
static void lAddModuleSymbols(llvm::Module *module, SymbolTable *symbolTable)
Representation of a range of positions in a source file.
static llvm::Type * Int16PointerType
bool generateDebuggingSymbols
const unsigned char * getLib() const
llvm::ConstantInt * LLVMInt32(int32_t ival)
static const AtomicType * VaryingBool
bool hasTranscendentals() const
const BitcodeLib * getBuiltinsCLib(TargetOS os, Arch arch) const
static const AtomicType * VaryingInt64
void Error(SourcePos p, const char *fmt,...)
int getVectorWidth() const
static const AtomicType * UniformUInt8
static llvm::Type * Int64VectorPointerType
static llvm::Type * Int32Type
static llvm::Type * DoublePointerType
static bool Equal(const Type *a, const Type *b)
static const AtomicType * VaryingUInt16
bool hasTrigonometry() const
static const AtomicType * VaryingInt8
static const AtomicType * UniformFloat
static const AtomicType * UniformInt32
Type representing a function (return type + argument types)
Representation of a program symbol.
Interface class that defines the type abstraction.
static const AtomicType * UniformDouble
Expr abstract base class and expression implementations.
static const AtomicType * Void
void AddBitcodeToModule(const BitcodeLib *lib, llvm::Module *module, SymbolTable *symbolTable, bool warn)
static llvm::VectorType * MaskType
llvm::DICompileUnit * diCompileUnit
void Debug(SourcePos p, const char *fmt,...)
ISPCTarget getISPCTarget() const
yy_buffer_state * yy_scan_string(const char *)
static llvm::VectorType * DoubleVectorType
static llvm::VectorType * Int16VectorType
static const AtomicType * VaryingUInt8
Declaration of the Module class, which is the ispc-side representation of the results of compiling a ...
static const AtomicType * UniformInt64
static void emitLLVMUsed(llvm::Module &module, std::vector< llvm::Constant *> &list)
static const AtomicType * UniformInt16
llvm::DIBuilder * diBuilder
std::string GetString() const
void Warning(SourcePos p, const char *fmt,...)
const size_t getSize() const
static const Type * lLLVMTypeToISPCType(const llvm::Type *t, bool intAsUnsigned)
static const AtomicType * VaryingUInt32
static const AtomicType * VaryingFloat
static void lCreateSymbol(const std::string &name, const Type *returnType, llvm::SmallVector< const Type *, 8 > &argTypes, const llvm::FunctionType *ftype, llvm::Function *func, SymbolTable *symbolTable)
static const AtomicType * UniformInt8
File with declarations for classes related to type representation.