diff options
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/driver/rustc.rs | 14 | ||||
| -rw-r--r-- | src/comp/fe/lexer.rs | 20 | ||||
| -rw-r--r-- | src/comp/lib/llvm.rs | 277 | ||||
| -rw-r--r-- | src/comp/rustc.rc | 4 |
4 files changed, 315 insertions, 0 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index 077bf70d..e5a614ba 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -1,8 +1,22 @@ // -*- rust -*- fn main(vec[str] args) -> () { + log "This is the rust 'self-hosted' compiler."; log "The one written in rust."; log "It does nothing yet, it's a placeholder."; log "You want rustboot, the compiler next door."; + + auto i = 0; + for (str filename in args) { + if (i > 0) { + auto br = std._io.new_buf_reader(filename); + log "opened file: " + filename; + for (u8 b in br.read()) { + log b; + } + } + i += 1; + } + } diff --git a/src/comp/fe/lexer.rs b/src/comp/fe/lexer.rs index e69de29b..37684c22 100644 --- a/src/comp/fe/lexer.rs +++ b/src/comp/fe/lexer.rs @@ -0,0 +1,20 @@ +import std._io.buf_reader; + +iter buffers(buf_reader rdr) -> vec[u8] { + while (true) { + let vec[u8] v = rdr.read(); + if (std._vec.len[u8](v) == uint(0)) { + ret; + } + put v; + } +} + +iter bytes(buf_reader rdr) -> u8 { + for each (vec[u8] buf in buffers(rdr)) { + for (u8 b in buf) { + // FIXME: doesn't compile at the moment. + // put b; + } + } +} diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs new file mode 100644 index 00000000..da748bf3 --- /dev/null +++ b/src/comp/lib/llvm.rs @@ -0,0 +1,277 @@ +import std._str.rustrt.sbuf; +import std._vec.rustrt.vbuf; + +type ULongLong = u64; +type LongLong = i64; +type Long = i32; +type Bool = int; + +native mod llvm = "libLLVM-2.7.so" { + + type ModuleRef; + type ContextRef; + type TypeRef; + type TypeHandleRef; + type ValueRef; + type BasicBlockRef; + type BuilderRef; + type ModuleProviderRef; + type MemoryBufferRef; + type PassManagerRef; + type UseRef; + + + /* Create and destroy contexts. */ + fn ContextCreate() -> ContextRef; + fn GetGlobalContext() -> ContextRef; + fn ContextDispose(ContextRef C); + fn GetMDKindIDInContext(ContextRef C, sbuf Name, uint SLen) -> uint; + fn GetMDKindID(sbuf Name, uint SLen) -> uint; + + /* Create and destroy modules. */ + fn ModuleCreateWithName(sbuf ModuleID) -> ModuleRef; + fn DisposeModule(ModuleRef M); + + /** Data layout. See Module::getDataLayout. */ + fn GetDataLayout(ModuleRef M) -> sbuf; + fn SetDataLayout(ModuleRef M, sbuf Triple); + + /** Target triple. See Module::getTargetTriple. */ + fn GetTarget(ModuleRef M) -> sbuf; + fn SetTarget(ModuleRef M, sbuf Triple); + + /** See Module::addTypeName. */ + fn AddTypeName(ModuleRef M, sbuf Name, TypeRef Ty) -> Bool; + fn DeleteTypeName(ModuleRef M, sbuf Name); + fn GetTypeByName(ModuleRef M, sbuf Name) -> TypeRef; + + /** See Module::dump. */ + fn DumpModule(ModuleRef M); + + /** See Module::setModuleInlineAsm. */ + fn SetModuleInlineAsm(ModuleRef M, sbuf Asm); + + /** See llvm::LLVMType::getContext. */ + fn GetTypeContext(TypeRef Ty) -> ContextRef; + + /* Operations on integer types */ + fn Int1TypeInContext(ContextRef C) -> TypeRef; + fn Int8TypeInContext(ContextRef C) -> TypeRef; + fn Int16TypeInContext(ContextRef C) -> TypeRef; + fn Int32TypeInContext(ContextRef C) -> TypeRef; + fn Int64TypeInContext(ContextRef C) -> TypeRef; + fn IntTypeInContext(ContextRef C, uint NumBits) -> TypeRef; + + fn Int1Type() -> TypeRef; + fn Int8Type() -> TypeRef; + fn Int16Type() -> TypeRef; + fn Int32Type() -> TypeRef; + fn Int64Type() -> TypeRef; + fn IntType(uint NumBits) -> TypeRef; + fn GetIntTypeWidth(TypeRef IntegerTy) -> uint; + + /* Operations on real types */ + fn FloatTypeInContext(ContextRef C) -> TypeRef; + fn DoubleTypeInContext(ContextRef C) -> TypeRef; + fn X86FP80TypeInContext(ContextRef C) -> TypeRef; + fn FP128TypeInContext(ContextRef C) -> TypeRef; + fn PPCFP128TypeInContext(ContextRef C) -> TypeRef; + + fn FloatType() -> TypeRef; + fn DoubleType() -> TypeRef; + fn X86FP80Type() -> TypeRef; + fn FP128Type() -> TypeRef; + fn PPCFP128Type() -> TypeRef; + + /* Operations on function types */ + fn FunctionType(TypeRef ReturnType, vbuf ParamTypes, + uint ParamCount, Bool IsVarArg) -> TypeRef; + fn IsFunctionVarArg(TypeRef FunctionTy) -> Bool; + fn GetReturnType(TypeRef FunctionTy) -> TypeRef; + fn CountParamTypes(TypeRef FunctionTy) -> uint; + fn GetParamTypes(TypeRef FunctionTy, vbuf Dest); + + /* Operations on struct types */ + fn StructTypeInContext(ContextRef C, vbuf ElementTypes, + uint ElementCount, Bool Packed) -> TypeRef; + fn StructType(vbuf ElementTypes, uint ElementCount, + Bool Packed) -> TypeRef; + fn CountStructElementTypes(TypeRef StructTy) -> uint; + fn GetStructElementTypes(TypeRef StructTy, vbuf Dest); + fn IsPackedStruct(TypeRef StructTy) -> Bool; + + /* Operations on union types */ + fn UnionTypeInContext(ContextRef C, vbuf ElementTypes, + uint ElementCount) -> TypeRef; + fn UnionType(vbuf ElementTypes, uint ElementCount) -> TypeRef; + fn CountUnionElementTypes(TypeRef UnionTy) -> uint; + fn GetUnionElementTypes(TypeRef UnionTy, vbuf Dest); + + /* Operations on array, pointer, and vector types (sequence types) */ + fn ArrayType(TypeRef ElementType, uint ElementCount) -> TypeRef; + fn PointerType(TypeRef ElementType, uint AddressSpace) -> TypeRef; + fn VectorType(TypeRef ElementType, uint ElementCount) -> TypeRef; + + fn GetElementType(TypeRef Ty) -> TypeRef; + fn GetArrayLength(TypeRef ArrayTy) -> uint; + fn GetPointerAddressSpace(TypeRef PointerTy) -> uint; + fn GetVectorSize(TypeRef VectorTy) -> uint; + + /* Operations on other types */ + fn VoidTypeInContext(ContextRef C) -> TypeRef; + fn LabelTypeInContext(ContextRef C) -> TypeRef; + fn OpaqueTypeInContext(ContextRef C) -> TypeRef; + + fn VoidType() -> TypeRef; + fn LabelType() -> TypeRef; + fn OpaqueType() -> TypeRef; + + /* Operations on type handles */ + fn CreateTypeHandle(TypeRef PotentiallyAbstractTy) -> TypeHandleRef; + fn RefineType(TypeRef AbstractTy, TypeRef ConcreteTy); + fn ResolveTypeHandle(TypeHandleRef TypeHandle) -> TypeRef; + fn DisposeTypeHandle(TypeHandleRef TypeHandle); + + /* Operations on all values */ + fn TypeOf(ValueRef Val) -> TypeRef; + fn GetValueName(ValueRef Val) -> sbuf; + fn SetValueName(ValueRef Val, sbuf Name); + fn DumpValue(ValueRef Val); + fn ReplaceAllUsesWith(ValueRef OldVal, ValueRef NewVal); + fn HasMetadata(ValueRef Val) -> int; + fn GetMetadata(ValueRef Val, uint KindID) -> ValueRef; + fn SetMetadata(ValueRef Val, uint KindID, ValueRef Node); + + /* Operations on Uses */ + fn GetFirstUse(ValueRef Val) -> UseRef; + fn GetNextUse(UseRef U) -> UseRef; + fn GetUser(UseRef U) -> ValueRef; + fn GetUsedValue(UseRef U) -> ValueRef; + + /* Operations on Users */ + fn GetOperand(ValueRef Val, uint Index) -> ValueRef; + + /* Operations on constants of any type */ + fn ConstNull(TypeRef Ty) -> ValueRef; /* all zeroes */ + fn ConstAllOnes(TypeRef Ty) -> ValueRef; /* only for int/vector */ + fn GetUndef(TypeRef Ty) -> ValueRef; + fn IsConstant(ValueRef Val) -> Bool; + fn IsNull(ValueRef Val) -> Bool; + fn IsUndef(ValueRef Val) -> Bool; + fn ConstPointerNull(TypeRef Ty) -> ValueRef; + + /* Operations on metadata */ + fn MDStringInContext(ContextRef C, sbuf Str, uint SLen) -> ValueRef; + fn MDString(sbuf Str, uint SLen) -> ValueRef; + fn MDNodeInContext(ContextRef C, vbuf Vals, uint Count) -> ValueRef; + fn MDNode(vbuf Vals, uint Count) -> ValueRef; + + /* Operations on scalar constants */ + fn ConstInt(TypeRef IntTy, ULongLong N, Bool SignExtend) -> ValueRef; + fn ConstIntOfString(TypeRef IntTy, sbuf Text, u8 Radix) -> ValueRef; + fn ConstIntOfStringAndSize(TypeRef IntTy, sbuf Text, + uint SLen, u8 Radix) -> ValueRef; + fn ConstReal(TypeRef RealTy, f64 N) -> ValueRef; + fn ConstRealOfString(TypeRef RealTy, sbuf Text) -> ValueRef; + fn ConstRealOfStringAndSize(TypeRef RealTy, sbuf Text, + uint SLen) -> ValueRef; + fn ConstIntGetZExtValue(ValueRef ConstantVal) -> ULongLong; + fn ConstIntGetSExtValue(ValueRef ConstantVal) -> LongLong; + + + /* Operations on composite constants */ + fn ConstStringInContext(ContextRef C, sbuf Str, + uint Length, Bool DontNullTerminate) -> ValueRef; + fn ConstStructInContext(ContextRef C, vbuf ConstantVals, + uint Count, Bool Packed) -> ValueRef; + + fn ConstString(sbuf Str, uint Length, Bool DontNullTerminate) -> ValueRef; + fn ConstArray(TypeRef ElementTy, + vbuf ConstantVals, uint Length) -> ValueRef; + fn ConstStruct(vbuf ConstantVals, uint Count, Bool Packed) -> ValueRef; + fn ConstVector(vbuf ScalarConstantVals, uint Size) -> ValueRef; + fn ConstUnion(TypeRef Ty, ValueRef Val) -> ValueRef; + + /* Constant expressions */ + fn AlignOf(TypeRef Ty) -> ValueRef; + fn SizeOf(TypeRef Ty) -> ValueRef; + fn ConstNeg(ValueRef ConstantVal) -> ValueRef; + fn ConstNSWNeg(ValueRef ConstantVal) -> ValueRef; + fn ConstNUWNeg(ValueRef ConstantVal) -> ValueRef; + fn ConstFNeg(ValueRef ConstantVal) -> ValueRef; + fn ConstNot(ValueRef ConstantVal) -> ValueRef; + fn ConstAdd(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstNSWAdd(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstNUWAdd(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstFAdd(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstSub(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstNSWSub(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstNUWSub(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstFSub(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstMul(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstNSWMul(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstNUWMul(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstFMul(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstUDiv(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstSDiv(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstExactSDiv(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstFDiv(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstURem(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstSRem(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstFRem(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstAnd(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstOr(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstXor(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstShl(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstLShr(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstAShr(ValueRef LHSConstant, ValueRef RHSConstant) -> ValueRef; + fn ConstGEP(ValueRef ConstantVal, + vbuf ConstantIndices, uint NumIndices) -> ValueRef; + fn ConstInBoundsGEP(ValueRef ConstantVal, + vbuf ConstantIndices, + uint NumIndices) -> ValueRef; + fn ConstTrunc(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstSExt(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstZExt(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstFPTrunc(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstFPExt(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstUIToFP(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstSIToFP(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstFPToUI(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstFPToSI(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstPtrToInt(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstIntToPtr(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstBitCast(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstZExtOrBitCast(ValueRef ConstantVal, + TypeRef ToType) -> ValueRef; + fn ConstSExtOrBitCast(ValueRef ConstantVal, + TypeRef ToType) -> ValueRef; + fn ConstTruncOrBitCast(ValueRef ConstantVal, + TypeRef ToType) -> ValueRef; + fn ConstPointerCast(ValueRef ConstantVal, + TypeRef ToType) -> ValueRef; + fn ConstIntCast(ValueRef ConstantVal, TypeRef ToType, + Bool isSigned) -> ValueRef; + fn ConstFPCast(ValueRef ConstantVal, TypeRef ToType) -> ValueRef; + fn ConstSelect(ValueRef ConstantCondition, + ValueRef ConstantIfTrue, + ValueRef ConstantIfFalse) -> ValueRef; + fn ConstExtractElement(ValueRef VectorConstant, + ValueRef IndexConstant) -> ValueRef; + fn ConstInsertElement(ValueRef VectorConstant, + ValueRef ElementValueConstant, + ValueRef IndexConstant) -> ValueRef; + fn ConstShuffleVector(ValueRef VectorAConstant, + ValueRef VectorBConstant, + ValueRef MaskConstant) -> ValueRef; + fn ConstExtractValue(ValueRef AggConstant, vbuf IdxList, + uint NumIdx) -> ValueRef; + fn ConstInsertValue(ValueRef AggConstant, + ValueRef ElementValueConstant, + vbuf IdxList, uint NumIdx) -> ValueRef; + fn ConstInlineAsm(TypeRef Ty, + sbuf AsmString, sbuf Constraints, + Bool HasSideEffects, Bool IsAlignStack) -> ValueRef; + fn BlockAddress(ValueRef F, BasicBlockRef BB) -> ValueRef; + +}
\ No newline at end of file diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc index 3bf3bbcc..7b1f9236 100644 --- a/src/comp/rustc.rc +++ b/src/comp/rustc.rc @@ -12,6 +12,10 @@ mod driver { mod rustc; } +mod lib { + mod llvm; +} + // Local Variables: // fill-column: 78; // indent-tabs-mode: nil |