2015-05-14 7 views
5

ich LLVM lerne @printf. Ich verstehe, dass thre eine Reihe von nützlichen C-Funktionen sind, die bereits als intrinsische in LLVM vorgesehen sind. Also versuche ich die @ printf Funktion von meinem Code aus aufzurufen.Wie Aufruf LLVM durch das Modul Builder-System

fand ich die entsprechenden Teile in dem LLVM-Referenzhandbuch, das den IR-Code beschreibt, dass zu tun, das ist relativ klar:

declare i32 @printf(i8* noalias nocapture, ...) 
call i32 (i8*, ...)* @printf(i8* %msg, i32 12, i8 42) 

usw. Aber ich bin nicht finden kann, wie das die Verwendung zu tun IRBuilder <> Klasse. Ich überprüfte die Klasse, aber ich konnte nichts herausfinden.

Ich will keine Lust Variablen übergeben, im Grunde nur so etwas wie

printf("%lu", variable_64_bit); 

in C oder so ähnlich.

Könnte jemand geben Sie mir eine Idee, was ich muss die printf Funktion durch den Erbauer nennen tun.

Vielen Dank im Voraus

+0

Haben Sie die 'IRBuilder' bedeuten? –

+0

Ja sorry, ich richtig meine Fragen zu dieser –

Antwort

2

fand ich an anderer Stelle answer to this problem ein. In der Tat geht es etwas über meine ursprüngliche Frage, aber es war für mich hilfreich und hoffentlich wird es jemand anderes auch helfen.

2
void kprintf(Module *mod, BasicBlock *bb, const char *format, ...) 
{ 
    Function *func_printf = mod->getFunction("printf"); 
    if (!func_printf) { 
     PointerType *Pty = PointerType::get(IntegerType::get(mod->getContext(), 8), 0); 
     FunctionType *FuncTy9 = FunctionType::get(IntegerType::get(mod->getContext(), 32), true); 

     func_printf = Function::Create(FuncTy9, GlobalValue::ExternalLinkage, "printf", mod); 
     func_printf->setCallingConv(CallingConv::C); 

     AttrListPtr func_printf_PAL; 
     func_printf->setAttributes(func_printf_PAL); 
    } 

    IRBuilder <> builder(mod->getContext()); 
    builder.SetInsertPoint(bb); 

    Value *str = builder.CreateGlobalStringPtr(format); 
    std::vector <Value *> int32_call_params; 
    int32_call_params.push_back(str); 

    va_list ap; 
    va_start(ap, format); 

    char *str_ptr = va_arg(ap, char*); 
    Value *format_ptr = builder.CreateGlobalStringPtr(str_ptr); 
    int32_call_params.push_back(format_ptr); 

    std::vector<llvm::Value*> extra; 
    do { 
     llvm::Value *op = va_arg(ap, llvm::Value*); 
     if (op) { 
      int32_call_params.push_back(op); 
     } else { 
      break; 
     } 
    } while (1); 
    va_end(ap); 

    CallInst * int32_call = CallInst::Create(func_printf, int32_call_params, "call", bb); 
} 
#define oprintf(...) kprintf(__VA_ARGS__) 
#define llvm_printf(...) oprintf(mod, bb, __VA_ARGS__, NULL) 

llvm_printf("Output: 0x%08X %f %d\n", 0x12345678, 3.1415926, 12345); 

Hoffnung zu sein, Ihnen behilflich zu

+0

enthält Hinzufügen und kompilieren Befehle wäre super-hilfreich. – jbcoe