Files
Nim/rod/llvmdata.nim
2009-12-07 01:23:19 +01:00

104 lines
4.5 KiB
Nim
Executable File

#
#
# The Nimrod Compiler
# (c) Copyright 2009 Andreas Rumpf
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
#
# this module implements data structures for emitting LLVM.
import
ast, astalgo, idents, lists, passes
type
VTypeKind* = enum
VoidTyID, #/< 0: type with no size
FloatTyID, #/< 1: 32 bit floating point type
DoubleTyID, #/< 2: 64 bit floating point type
X86_FP80TyID, #/< 3: 80 bit floating point type (X87)
FP128TyID, #/< 4: 128 bit floating point type (112-bit mantissa)
PPC_FP128TyID, #/< 5: 128 bit floating point type (two 64-bits)
LabelTyID, #/< 6: Labels
MetadataTyID, #/< 7: Metadata
# Derived types... see DerivedTypes.h file...
# Make sure FirstDerivedTyID stays up to date!!!
IntegerTyID, #/< 8: Arbitrary bit width integers
FunctionTyID, #/< 9: Functions
StructTyID, #/< 10: Structures
ArrayTyID, #/< 11: Arrays
PointerTyID, #/< 12: Pointers
OpaqueTyID, #/< 13: Opaque: type with unknown structure
VectorTyID #/< 14: SIMD 'packed' format, or other vector type
VType* = ref VTypeDesc
VTypeSeq* = seq[VType]
VTypeDesc* = object of TIdObj
k*: VTypeKind
s*: VTypeSeq
arrayLen*: int
name*: string
VInstrKind* = enum
iNone, iAdd, iSub, iMul, iDiv, iMod
VLocalVar*{.final.} = object
VInstr*{.final.} = object #/ This represents a single basic block in LLVM. A basic block is simply a
#/ container of instructions that execute sequentially. Basic blocks are Values
#/ because they are referenced by instructions such as branches and switch
#/ tables. The type of a BasicBlock is "Type::LabelTy" because the basic block
#/ represents a label to which a branch can jump.
#/
k*: VInstrKind
VBlock* = ref VBlockDesc
VBlockDesc*{.final.} = object # LLVM basic block
# list of instructions
VLinkage* = enum
ExternalLinkage, # Externally visible function
LinkOnceLinkage, # Keep one copy of function when linking (inline)
WeakLinkage, # Keep one copy of function when linking (weak)
AppendingLinkage, # Special purpose, only applies to global arrays
InternalLinkage, # Rename collisions when linking (static functions)
DLLImportLinkage, # Function to be imported from DLL
DLLExportLinkage, # Function to be accessible from DLL
ExternalWeakLinkage, # ExternalWeak linkage description
GhostLinkage # Stand-in functions for streaming fns from bitcode
VVisibility* = enum
DefaultVisibility, # The GV is visible
HiddenVisibility, # The GV is hidden
ProtectedVisibility # The GV is protected
TLLVMCallConv* = enum
CCallConv = 0, FastCallConv = 8, ColdCallConv = 9, X86StdcallCallConv = 64,
X86FastcallCallConv = 65
VProc* = ref VProcDesc
VProcDesc*{.final.} = object
b*: VBlock
name*: string
sym*: PSym # proc that is generated
linkage*: VLinkage
vis*: VVisibility
callConv*: VCallConv
next*: VProc
VModule* = ref VModuleDesc
VModuleDesc* = object of TPassContext # represents a C source file
sym*: PSym
filename*: string
typeCache*: TIdTable # cache the generated types
forwTypeCache*: TIdTable # cache for forward declarations of types
declaredThings*: TIntSet # things we have declared in this file
declaredProtos*: TIntSet # prototypes we have declared in this file
headerFiles*: TLinkedList # needed headers to include
typeInfoMarker*: TIntSet # needed for generating type information
initProc*: VProc # code for init procedure
typeStack*: TTypeSeq # used for type generation
dataCache*: TNodeTable
forwardedProcs*: TSymSeq # keep forwarded procs here
typeNodes*, nimTypes*: int # used for type info generation
typeNodesName*, nimTypesName*: PRope # used for type info generation
labels*: natural # for generating unique module-scope names
next*: VModule # to stack modules
# implementation