Ignore:
Timestamp:
Dec 8, 2018, 10:35:24 AM (6 months ago)
Author:
cameron
Message:

Trace facility initial check-in

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/toolchain/cpudriver.cpp

    r6209 r6220  
    1111#include <llvm/InitializePasses.h>                 // for initializeCodeGencd .
    1212#include <llvm/PassRegistry.h>                     // for PassRegistry
     13#include <llvm/Support/raw_ostream.h>              // for errs()
    1314#include <llvm/Support/CodeGen.h>                  // for Level, Level::None
    1415#include <llvm/Support/Compiler.h>                 // for LLVM_UNLIKELY
     
    198199        PM.add(createCFGSimplificationPass());
    199200    }
     201    if (LLVM_UNLIKELY(!codegen::TraceOption.empty())) {
     202        PM.add(createTracePass(iBuilder.get(), codegen::TraceOption));
     203    }
    200204    if (LLVM_UNLIKELY(codegen::ShowIROption != codegen::OmittedOption)) {
    201205        if (LLVM_LIKELY(mIROutputStream == nullptr)) {
     
    222226    }
    223227    #endif
     228
    224229    return PM;
    225230}
     
    314319    delete mTarget;
    315320}
     321
     322
     323class TracePass : public ModulePass {
     324public:
     325    static char ID;
     326    TracePass(kernel::KernelBuilder * kb, StringRef to_trace) : ModulePass(ID), iBuilder(kb), mToTrace(to_trace) { }
     327   
     328    virtual bool runOnModule(Module &M) override;
     329private:
     330    kernel::KernelBuilder * iBuilder;
     331    StringRef mToTrace;
     332};
     333
     334char TracePass::ID = 0;
     335
     336bool TracePass::runOnModule(Module & M) {
     337    Module * saveModule = iBuilder->getModule();
     338    iBuilder->setModule(&M);
     339    bool modified = false;
     340    for (auto & F : M) {
     341        for (auto & B : F) {
     342            for (BasicBlock::iterator i = B.begin(); i != B.end(); ) {
     343                auto i0 = i;
     344                ++i;
     345                if (!isa<Value>(*i0)) continue;
     346                StringRef theName = (*i0).getName();
     347                if (theName.startswith(mToTrace)) {
     348                    //errs() << theName << "\n";
     349                    Type * t = (*i0).getType();
     350                    //t->dump();
     351                    if (t == iBuilder->getBitBlockType()) {
     352                        iBuilder->SetInsertPoint(&B, i);
     353                        iBuilder->CallPrintRegister(theName, &*i0);
     354                        modified = true;
     355                    }
     356                    else if (t == iBuilder->getInt64Ty()) {
     357                        iBuilder->SetInsertPoint(&B, i);
     358                        iBuilder->CallPrintInt(theName, &*i0);
     359                        modified = true;
     360                    }
     361                }
     362            }
     363        }
     364    }
     365    //if (modified) M.dump();
     366    iBuilder->setModule(saveModule);
     367    return modified;
     368}
     369
     370ModulePass * CPUDriver::createTracePass(kernel::KernelBuilder * kb, StringRef to_trace) {
     371    return new TracePass(iBuilder.get(), to_trace);
     372}
     373                   
Note: See TracChangeset for help on using the changeset viewer.