mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-07 21:43:33 +00:00
104 lines
4.5 KiB
Nim
Executable File
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
|