Skip to content

Commit 5267b77

Browse files
committed
Add more LLVM library bindings to rustc.
1 parent bc0d1fb commit 5267b77

File tree

1 file changed

+350
-2
lines changed

1 file changed

+350
-2
lines changed

src/comp/lib/llvm.rs

Lines changed: 350 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ native mod llvm = "libLLVM-2.7.so" {
2020
type PassManagerRef;
2121
type UseRef;
2222

23+
/* FIXME: These are enums in the C header. Represent them how, in rust? */
24+
type Linkage;
25+
type Attribute;
26+
type Visibility;
27+
type CallConv;
28+
type IntPredicate;
29+
type RealPredicate;
30+
type Opcode;
2331

2432
/* Create and destroy contexts. */
2533
fn ContextCreate() -> ContextRef;
@@ -29,7 +37,7 @@ native mod llvm = "libLLVM-2.7.so" {
2937
fn GetMDKindID(sbuf Name, uint SLen) -> uint;
3038

3139
/* Create and destroy modules. */
32-
fn ModuleCreateWithName(sbuf ModuleID) -> ModuleRef;
40+
fn ModuleCreateWithNameInContext(sbuf ModuleID, ContextRef C) -> ModuleRef;
3341
fn DisposeModule(ModuleRef M);
3442

3543
/** Data layout. See Module::getDataLayout. */
@@ -274,4 +282,344 @@ native mod llvm = "libLLVM-2.7.so" {
274282
Bool HasSideEffects, Bool IsAlignStack) -> ValueRef;
275283
fn BlockAddress(ValueRef F, BasicBlockRef BB) -> ValueRef;
276284

277-
}
285+
286+
287+
/* Operations on global variables, functions, and aliases (globals) */
288+
fn GetGlobalParent(ValueRef Global) -> ModuleRef;
289+
fn IsDeclaration(ValueRef Global) -> Bool;
290+
fn GetLinkage(ValueRef Global) -> Linkage;
291+
fn SetLinkage(ValueRef Global, Linkage Link);
292+
fn GetSection(ValueRef Global) -> sbuf;
293+
fn SetSection(ValueRef Global, sbuf Section);
294+
fn GetVisibility(ValueRef Global) -> Visibility;
295+
fn SetVisibility(ValueRef Global, Visibility Viz);
296+
fn GetAlignment(ValueRef Global) -> uint;
297+
fn SetAlignment(ValueRef Global, uint Bytes);
298+
299+
300+
/* Operations on global variables */
301+
fn AddGlobal(ModuleRef M, TypeRef Ty, sbuf Name) -> ValueRef;
302+
fn AddGlobalInAddressSpace(ModuleRef M, TypeRef Ty,
303+
sbuf Name,
304+
uint AddressSpace) -> ValueRef;
305+
fn GetNamedGlobal(ModuleRef M, sbuf Name) -> ValueRef;
306+
fn GetFirstGlobal(ModuleRef M) -> ValueRef;
307+
fn GetLastGlobal(ModuleRef M) -> ValueRef;
308+
fn GetNextGlobal(ValueRef GlobalVar) -> ValueRef;
309+
fn GetPreviousGlobal(ValueRef GlobalVar) -> ValueRef;
310+
fn DeleteGlobal(ValueRef GlobalVar);
311+
fn GetInitializer(ValueRef GlobalVar) -> ValueRef;
312+
fn SetInitializer(ValueRef GlobalVar, ValueRef ConstantVal);
313+
fn IsThreadLocal(ValueRef GlobalVar) -> Bool;
314+
fn SetThreadLocal(ValueRef GlobalVar, Bool IsThreadLocal);
315+
fn IsGlobalConstant(ValueRef GlobalVar) -> Bool;
316+
fn SetGlobalConstant(ValueRef GlobalVar, Bool IsConstant);
317+
318+
/* Operations on aliases */
319+
fn AddAlias(ModuleRef M, TypeRef Ty, ValueRef Aliasee,
320+
sbuf Name) -> ValueRef;
321+
322+
/* Operations on functions */
323+
fn AddFunction(ModuleRef M, sbuf Name,
324+
TypeRef FunctionTy) -> ValueRef;
325+
fn GetNamedFunction(ModuleRef M, sbuf Name) -> ValueRef;
326+
fn GetFirstFunction(ModuleRef M) -> ValueRef;
327+
fn GetLastFunction(ModuleRef M) -> ValueRef;
328+
fn GetNextFunction(ValueRef Fn) -> ValueRef;
329+
fn GetPreviousFunction(ValueRef Fn) -> ValueRef;
330+
fn DeleteFunction(ValueRef Fn);
331+
fn GetIntrinsicID(ValueRef Fn) -> uint;
332+
fn GetFunctionCallConv(ValueRef Fn) -> uint;
333+
fn SetFunctionCallConv(ValueRef Fn, uint CC);
334+
fn GetGC(ValueRef Fn) -> sbuf;
335+
fn SetGC(ValueRef Fn, sbuf Name);
336+
fn AddFunctionAttr(ValueRef Fn, Attribute PA);
337+
fn GetFunctionAttr(ValueRef Fn) -> Attribute;
338+
fn RemoveFunctionAttr(ValueRef Fn, Attribute PA);
339+
340+
/* Operations on parameters */
341+
fn CountParams(ValueRef Fn) -> uint;
342+
fn GetParams(ValueRef Fn, vbuf Params);
343+
fn GetParam(ValueRef Fn, uint Index) -> ValueRef;
344+
fn GetParamParent(ValueRef Inst) -> ValueRef;
345+
fn GetFirstParam(ValueRef Fn) -> ValueRef;
346+
fn GetLastParam(ValueRef Fn) -> ValueRef;
347+
fn GetNextParam(ValueRef Arg) -> ValueRef;
348+
fn GetPreviousParam(ValueRef Arg) -> ValueRef;
349+
fn AddAttribute(ValueRef Arg, Attribute PA);
350+
fn RemoveAttribute(ValueRef Arg, Attribute PA);
351+
fn GetAttribute(ValueRef Arg) -> Attribute;
352+
fn SetParamAlignment(ValueRef Arg, uint align);
353+
354+
/* Operations on basic blocks */
355+
fn BasicBlockAsValue(BasicBlockRef BB) -> ValueRef;
356+
fn ValueIsBasicBlock(ValueRef Val) -> Bool;
357+
fn ValueAsBasicBlock(ValueRef Val) -> BasicBlockRef;
358+
fn GetBasicBlockParent(BasicBlockRef BB) -> ValueRef;
359+
fn CountBasicBlocks(ValueRef Fn) -> uint;
360+
fn GetBasicBlocks(ValueRef Fn, vbuf BasicBlocks);
361+
fn GetFirstBasicBlock(ValueRef Fn) -> BasicBlockRef;
362+
fn GetLastBasicBlock(ValueRef Fn) -> BasicBlockRef;
363+
fn GetNextBasicBlock(BasicBlockRef BB) -> BasicBlockRef;
364+
fn GetPreviousBasicBlock(BasicBlockRef BB) -> BasicBlockRef;
365+
fn GetEntryBasicBlock(ValueRef Fn) -> BasicBlockRef;
366+
367+
fn AppendBasicBlockInContext(ContextRef C, ValueRef Fn,
368+
sbuf Name) -> BasicBlockRef;
369+
fn InsertBasicBlockInContext(ContextRef C, BasicBlockRef BB,
370+
sbuf Name) -> BasicBlockRef;
371+
372+
fn AppendBasicBlock(ValueRef Fn, sbuf Name) -> BasicBlockRef;
373+
fn InsertBasicBlock(BasicBlockRef InsertBeforeBB,
374+
sbuf Name) -> BasicBlockRef;
375+
fn DeleteBasicBlock(BasicBlockRef BB);
376+
377+
/* Operations on instructions */
378+
fn GetInstructionParent(ValueRef Inst) -> BasicBlockRef;
379+
fn GetFirstInstruction(BasicBlockRef BB) -> ValueRef;
380+
fn GetLastInstruction(BasicBlockRef BB) -> ValueRef;
381+
fn GetNextInstruction(ValueRef Inst) -> ValueRef;
382+
fn GetPreviousInstruction(ValueRef Inst) -> ValueRef;
383+
384+
/* Operations on call sites */
385+
fn SetInstructionCallConv(ValueRef Instr, uint CC);
386+
fn GetInstructionCallConv(ValueRef Instr) -> uint;
387+
fn AddInstrAttribute(ValueRef Instr, uint index, Attribute IA);
388+
fn RemoveInstrAttribute(ValueRef Instr, uint index, Attribute IA);
389+
fn SetInstrParamAlignment(ValueRef Instr, uint index, uint align);
390+
391+
/* Operations on call instructions (only) */
392+
fn IsTailCall(ValueRef CallInst) -> Bool;
393+
fn SetTailCall(ValueRef CallInst, Bool IsTailCall);
394+
395+
/* Operations on phi nodes */
396+
fn AddIncoming(ValueRef PhiNode, vbuf IncomingValues,
397+
vbuf IncomingBlocks, uint Count);
398+
fn CountIncoming(ValueRef PhiNode) -> uint;
399+
fn GetIncomingValue(ValueRef PhiNode, uint Index) -> ValueRef;
400+
fn GetIncomingBlock(ValueRef PhiNode, uint Index) -> BasicBlockRef;
401+
402+
/* Instruction builders */
403+
fn CreateBuilderInContext(ContextRef C) -> BuilderRef;
404+
fn CreateBuilder() -> BuilderRef;
405+
fn PositionBuilder(BuilderRef Builder, BasicBlockRef Block,
406+
ValueRef Instr);
407+
fn PositionBuilderBefore(BuilderRef Builder, ValueRef Instr);
408+
fn PositionBuilderAtEnd(BuilderRef Builder, BasicBlockRef Block);
409+
fn GetInsertBlock(BuilderRef Builder) -> BasicBlockRef;
410+
fn ClearInsertionPosition(BuilderRef Builder);
411+
fn InsertIntoBuilder(BuilderRef Builder, ValueRef Instr);
412+
fn InsertIntoBuilderWithName(BuilderRef Builder, ValueRef Instr,
413+
sbuf Name);
414+
fn DisposeBuilder(BuilderRef Builder);
415+
416+
/* Metadata */
417+
fn SetCurrentDebugLocation(BuilderRef Builder, ValueRef L);
418+
fn GetCurrentDebugLocation(BuilderRef Builder) -> ValueRef;
419+
fn SetInstDebugLocation(BuilderRef Builder, ValueRef Inst);
420+
421+
/* Terminators */
422+
fn BuildRetVoid(BuilderRef B) -> ValueRef;
423+
fn BuildRet(BuilderRef B, ValueRef V) -> ValueRef;
424+
fn BuildAggregateRet(BuilderRef B, vbuf RetVals,
425+
uint N) -> ValueRef;
426+
fn BuildBr(BuilderRef B, BasicBlockRef Dest) -> ValueRef;
427+
fn BuildCondBr(BuilderRef B, ValueRef If,
428+
BasicBlockRef Then, BasicBlockRef Else) -> ValueRef;
429+
fn BuildSwitch(BuilderRef B, ValueRef V,
430+
BasicBlockRef Else, uint NumCases) -> ValueRef;
431+
fn BuildIndirectBr(BuilderRef B, ValueRef Addr,
432+
uint NumDests) -> ValueRef;
433+
fn BuildInvoke(BuilderRef B, ValueRef Fn,
434+
vbuf Args, uint NumArgs,
435+
BasicBlockRef Then, BasicBlockRef Catch,
436+
sbuf Name) -> ValueRef;
437+
fn BuildUnwind(BuilderRef B) -> ValueRef;
438+
fn BuildUnreachable(BuilderRef B) -> ValueRef;
439+
440+
/* Add a case to the switch instruction */
441+
fn AddCase(ValueRef Switch, ValueRef OnVal,
442+
BasicBlockRef Dest);
443+
444+
/* Add a destination to the indirectbr instruction */
445+
fn AddDestination(ValueRef IndirectBr, BasicBlockRef Dest);
446+
447+
/* Arithmetic */
448+
fn BuildAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
449+
sbuf Name) -> ValueRef;
450+
fn BuildNSWAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
451+
sbuf Name) -> ValueRef;
452+
fn BuildNUWAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
453+
sbuf Name) -> ValueRef;
454+
fn BuildFAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
455+
sbuf Name) -> ValueRef;
456+
fn BuildSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
457+
sbuf Name) -> ValueRef;
458+
fn BuildNSWSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
459+
sbuf Name) -> ValueRef;
460+
fn BuildNUWSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
461+
sbuf Name) -> ValueRef;
462+
fn BuildFSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
463+
sbuf Name) -> ValueRef;
464+
fn BuildMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
465+
sbuf Name) -> ValueRef;
466+
fn BuildNSWMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
467+
sbuf Name) -> ValueRef;
468+
fn BuildNUWMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
469+
sbuf Name) -> ValueRef;
470+
fn BuildFMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
471+
sbuf Name) -> ValueRef;
472+
fn BuildUDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
473+
sbuf Name) -> ValueRef;
474+
fn BuildSDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
475+
sbuf Name) -> ValueRef;
476+
fn BuildExactSDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
477+
sbuf Name) -> ValueRef;
478+
fn BuildFDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
479+
sbuf Name) -> ValueRef;
480+
fn BuildURem(BuilderRef B, ValueRef LHS, ValueRef RHS,
481+
sbuf Name) -> ValueRef;
482+
fn BuildSRem(BuilderRef B, ValueRef LHS, ValueRef RHS,
483+
sbuf Name) -> ValueRef;
484+
fn BuildFRem(BuilderRef B, ValueRef LHS, ValueRef RHS,
485+
sbuf Name) -> ValueRef;
486+
fn BuildShl(BuilderRef B, ValueRef LHS, ValueRef RHS,
487+
sbuf Name) -> ValueRef;
488+
fn BuildLShr(BuilderRef B, ValueRef LHS, ValueRef RHS,
489+
sbuf Name) -> ValueRef;
490+
fn BuildAShr(BuilderRef B, ValueRef LHS, ValueRef RHS,
491+
sbuf Name) -> ValueRef;
492+
fn BuildAnd(BuilderRef B, ValueRef LHS, ValueRef RHS,
493+
sbuf Name) -> ValueRef;
494+
fn BuildOr(BuilderRef B, ValueRef LHS, ValueRef RHS,
495+
sbuf Name) -> ValueRef;
496+
fn BuildXor(BuilderRef B, ValueRef LHS, ValueRef RHS,
497+
sbuf Name) -> ValueRef;
498+
fn BuildBinOp(BuilderRef B, Opcode Op,
499+
ValueRef LHS, ValueRef RHS,
500+
sbuf Name) -> ValueRef;
501+
fn BuildNeg(BuilderRef B, ValueRef V, sbuf Name) -> ValueRef;
502+
fn BuildNSWNeg(BuilderRef B, ValueRef V,
503+
sbuf Name) -> ValueRef;
504+
fn BuildNUWNeg(BuilderRef B, ValueRef V,
505+
sbuf Name) -> ValueRef;
506+
fn BuildFNeg(BuilderRef B, ValueRef V, sbuf Name) -> ValueRef;
507+
fn BuildNot(BuilderRef B, ValueRef V, sbuf Name) -> ValueRef;
508+
509+
/* Memory */
510+
fn BuildMalloc(BuilderRef B, TypeRef Ty, sbuf Name) -> ValueRef;
511+
fn BuildArrayMalloc(BuilderRef B, TypeRef Ty,
512+
ValueRef Val, sbuf Name) -> ValueRef;
513+
fn BuildAlloca(BuilderRef B, TypeRef Ty, sbuf Name) -> ValueRef;
514+
fn BuildArrayAlloca(BuilderRef B, TypeRef Ty,
515+
ValueRef Val, sbuf Name) -> ValueRef;
516+
fn BuildFree(BuilderRef B, ValueRef PointerVal) -> ValueRef;
517+
fn BuildLoad(BuilderRef B, ValueRef PointerVal,
518+
sbuf Name) -> ValueRef;
519+
fn BuildStore(BuilderRef B, ValueRef Val, ValueRef Ptr) -> ValueRef;
520+
fn BuildGEP(BuilderRef B, ValueRef Pointer,
521+
vbuf Indices, uint NumIndices,
522+
sbuf Name) -> ValueRef;
523+
fn BuildInBoundsGEP(BuilderRef B, ValueRef Pointer,
524+
vbuf Indices, uint NumIndices,
525+
sbuf Name) -> ValueRef;
526+
fn BuildStructGEP(BuilderRef B, ValueRef Pointer,
527+
uint Idx, sbuf Name) -> ValueRef;
528+
fn BuildGlobalString(BuilderRef B, sbuf Str,
529+
sbuf Name) -> ValueRef;
530+
fn BuildGlobalStringPtr(BuilderRef B, sbuf Str,
531+
sbuf Name) -> ValueRef;
532+
533+
/* Casts */
534+
fn BuildTrunc(BuilderRef B, ValueRef Val,
535+
TypeRef DestTy, sbuf Name) -> ValueRef;
536+
fn BuildZExt(BuilderRef B, ValueRef Val,
537+
TypeRef DestTy, sbuf Name) -> ValueRef;
538+
fn BuildSExt(BuilderRef B, ValueRef Val,
539+
TypeRef DestTy, sbuf Name) -> ValueRef;
540+
fn BuildFPToUI(BuilderRef B, ValueRef Val,
541+
TypeRef DestTy, sbuf Name) -> ValueRef;
542+
fn BuildFPToSI(BuilderRef B, ValueRef Val,
543+
TypeRef DestTy, sbuf Name) -> ValueRef;
544+
fn BuildUIToFP(BuilderRef B, ValueRef Val,
545+
TypeRef DestTy, sbuf Name) -> ValueRef;
546+
fn BuildSIToFP(BuilderRef B, ValueRef Val,
547+
TypeRef DestTy, sbuf Name) -> ValueRef;
548+
fn BuildFPTrunc(BuilderRef B, ValueRef Val,
549+
TypeRef DestTy, sbuf Name) -> ValueRef;
550+
fn BuildFPExt(BuilderRef B, ValueRef Val,
551+
TypeRef DestTy, sbuf Name) -> ValueRef;
552+
fn BuildPtrToInt(BuilderRef B, ValueRef Val,
553+
TypeRef DestTy, sbuf Name) -> ValueRef;
554+
fn BuildIntToPtr(BuilderRef B, ValueRef Val,
555+
TypeRef DestTy, sbuf Name) -> ValueRef;
556+
fn BuildBitCast(BuilderRef B, ValueRef Val,
557+
TypeRef DestTy, sbuf Name) -> ValueRef;
558+
fn BuildZExtOrBitCast(BuilderRef B, ValueRef Val,
559+
TypeRef DestTy, sbuf Name) -> ValueRef;
560+
fn BuildSExtOrBitCast(BuilderRef B, ValueRef Val,
561+
TypeRef DestTy, sbuf Name) -> ValueRef;
562+
fn BuildTruncOrBitCast(BuilderRef B, ValueRef Val,
563+
TypeRef DestTy, sbuf Name) -> ValueRef;
564+
fn BuildCast(BuilderRef B, Opcode Op, ValueRef Val,
565+
TypeRef DestTy, sbuf Name) -> ValueRef;
566+
fn BuildPointerCast(BuilderRef B, ValueRef Val,
567+
TypeRef DestTy, sbuf Name) -> ValueRef;
568+
fn BuildIntCast(BuilderRef B, ValueRef Val,
569+
TypeRef DestTy, sbuf Name) -> ValueRef;
570+
fn BuildFPCast(BuilderRef B, ValueRef Val,
571+
TypeRef DestTy, sbuf Name) -> ValueRef;
572+
573+
/* Comparisons */
574+
fn BuildICmp(BuilderRef B, IntPredicate Op,
575+
ValueRef LHS, ValueRef RHS,
576+
sbuf Name) -> ValueRef;
577+
fn BuildFCmp(BuilderRef B, RealPredicate Op,
578+
ValueRef LHS, ValueRef RHS,
579+
sbuf Name) -> ValueRef;
580+
581+
/* Miscellaneous instructions */
582+
fn BuildPhi(BuilderRef B, TypeRef Ty, sbuf Name) -> ValueRef;
583+
fn BuildCall(BuilderRef B, ValueRef Fn,
584+
vbuf Args, uint NumArgs,
585+
sbuf Name) -> ValueRef;
586+
fn BuildSelect(BuilderRef B, ValueRef If,
587+
ValueRef Then, ValueRef Else,
588+
sbuf Name) -> ValueRef;
589+
fn BuildVAArg(BuilderRef B, ValueRef List, TypeRef Ty,
590+
sbuf Name) -> ValueRef;
591+
fn BuildExtractElement(BuilderRef B, ValueRef VecVal,
592+
ValueRef Index, sbuf Name) -> ValueRef;
593+
fn BuildInsertElement(BuilderRef B, ValueRef VecVal,
594+
ValueRef EltVal, ValueRef Index,
595+
sbuf Name) -> ValueRef;
596+
fn BuildShuffleVector(BuilderRef B, ValueRef V1,
597+
ValueRef V2, ValueRef Mask,
598+
sbuf Name) -> ValueRef;
599+
fn BuildExtractValue(BuilderRef B, ValueRef AggVal,
600+
uint Index, sbuf Name) -> ValueRef;
601+
fn BuildInsertValue(BuilderRef B, ValueRef AggVal,
602+
ValueRef EltVal, uint Index,
603+
sbuf Name) -> ValueRef;
604+
605+
fn BuildIsNull(BuilderRef B, ValueRef Val,
606+
sbuf Name) -> ValueRef;
607+
fn BuildIsNotNull(BuilderRef B, ValueRef Val,
608+
sbuf Name) -> ValueRef;
609+
fn BuildPtrDiff(BuilderRef B, ValueRef LHS,
610+
ValueRef RHS, sbuf Name) -> ValueRef;
611+
612+
613+
614+
}
615+
616+
//
617+
// Local Variables:
618+
// mode: rust
619+
// fill-column: 78;
620+
// indent-tabs-mode: nil
621+
// c-basic-offset: 4
622+
// buffer-file-coding-system: utf-8-unix
623+
// compile-command: "make -k -C ../.. 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
624+
// End:
625+
//

0 commit comments

Comments
 (0)