Ignore:
Timestamp:
Apr 24, 2017, 2:58:47 PM (2 years ago)
Author:
cameron
Message:

lz4d - LZ4 decompressor - initial check-in

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/IR_Gen/CBuilder.cpp

    r5421 r5422  
    116116    }
    117117    return printf;
     118}
     119
     120Function * CBuilder::GetDprintf() {
     121    Function * dprintf = mMod->getFunction("dprintf");
     122    if (dprintf == nullptr) {
     123        FunctionType * fty = FunctionType::get(getInt32Ty(), {getInt32Ty(), getInt8PtrTy()}, true);
     124        dprintf = Function::Create(fty, Function::ExternalLinkage, "dprintf", mMod);
     125    }
     126    return dprintf;
    118127}
    119128
     
    149158    assert (num->getType()->isIntegerTy());
    150159    CreateCall(printRegister, {GetString(name.c_str()), num});
     160}
     161
     162void CBuilder::CallPrintIntToStderr(const std::string & name, Value * const value) {
     163    Constant * printRegister = mMod->getFunction("PrintIntToStderr");
     164    if (LLVM_UNLIKELY(printRegister == nullptr)) {
     165        FunctionType *FT = FunctionType::get(getVoidTy(), { PointerType::get(getInt8Ty(), 0), getSizeTy() }, false);
     166        Function * function = Function::Create(FT, Function::InternalLinkage, "PrintIntToStderr", mMod);
     167        auto arg = function->arg_begin();
     168        std::string out = "%-40s = %" PRIx64 "\n";
     169        BasicBlock * entry = BasicBlock::Create(mMod->getContext(), "entry", function);
     170        IRBuilder<> builder(entry);
     171        std::vector<Value *> args;
     172        args.push_back(getInt32(2));    // fd 2 (stderr)
     173        args.push_back(GetString(out.c_str()));
     174        Value * const name = &*(arg++);
     175        name->setName("name");
     176        args.push_back(name);
     177        Value * value = &*arg;
     178        value->setName("value");
     179        args.push_back(value);
     180        builder.CreateCall(GetDprintf(), args);
     181        builder.CreateRetVoid();
     182
     183        printRegister = function;
     184    }
     185    Value * num = nullptr;
     186    if (value->getType()->isPointerTy()) {
     187        num = CreatePtrToInt(value, getSizeTy());
     188    } else {
     189        num = CreateZExtOrBitCast(value, getSizeTy());
     190    }
     191    assert (num->getType()->isIntegerTy());
     192    CreateCall(printRegister, {GetString(name.c_str()), num});
     193}
     194
     195void CBuilder::CallPrintMsgToStderr(const std::string & message) {
     196    Constant * printMsg = mMod->getFunction("PrintMsgToStderr");
     197    if (LLVM_UNLIKELY(printMsg == nullptr)) {
     198        FunctionType *FT = FunctionType::get(getVoidTy(), { PointerType::get(getInt8Ty(), 0) }, false);
     199        Function * function = Function::Create(FT, Function::InternalLinkage, "PrintMsgToStderr", mMod);
     200        auto arg = function->arg_begin();
     201        std::string out = "%s\n";
     202        BasicBlock * entry = BasicBlock::Create(mMod->getContext(), "entry", function);
     203        IRBuilder<> builder(entry);
     204        std::vector<Value *> args;
     205        args.push_back(getInt32(2));    // fd 2 (stderr)
     206        args.push_back(GetString(out.c_str()));
     207        Value * const msg = &*(arg++);
     208        msg->setName("msg");
     209        args.push_back(msg);
     210        builder.CreateCall(GetDprintf(), args);
     211        builder.CreateRetVoid();
     212
     213        printMsg = function;
     214    }
     215    CreateCall(printMsg, {GetString(message.c_str())});
    151216}
    152217
Note: See TracChangeset for help on using the changeset viewer.