Commit 77c7831f authored by Adéla Štěpková's avatar Adéla Štěpková
Browse files

clone module header into the reversed module

parent e7670577
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ private:

    void runPreprocessingPasses();

    void cloneModuleHeader(Module* revModule);

    /// @brief Create a module with a single main function that only returns 0. To be used if the
    /// module to reverse contains no asserts.
    /// @return empty module
+20 −8
Original line number Diff line number Diff line
@@ -26,7 +26,8 @@
// includes based on version
#endif

void ModuleReverser::runPreprocessingPasses() {
void ModuleReverser::runPreprocessingPasses()
{
    // PassDriver driver(*origModule);
    // driver.simplifyCFG();
}
@@ -89,7 +90,10 @@ ReversedModule ModuleReverser::reverse(Module& revModule)
    initReversedFunctions(mod);

    bool assertFound = findAsserts(mod);
    assert(assertFound); // this should be handled in the initial assert scan
    if (!assertFound) {
        outs() << "WARNING: no assert found in the module, no error will be added to the end of "
                  "main, and the main function will have a reversed type\n";
    }

    // outs() << mod.revModule;
    initReversedBlocks(mod);
@@ -160,18 +164,25 @@ std::unique_ptr<Module> ModuleReverser::reverseAndCustomSimplify()
    return std::move(revModule);
}

void ModuleReverser::cloneModuleHeader(Module* revModule) {
    revModule->setTargetTriple(origModule->getTargetTriple());
    revModule->setDataLayout(origModule->getDataLayout());
    revModule->setSourceFileName(origModule->getSourceFileName());
    revModule->setModuleInlineAsm(origModule->getModuleInlineAsm());
}

std::unique_ptr<Module> ModuleReverser::run()
{
    if (!areFeaturesSupported(*origModule)) {
        return nullptr;
    }

    if (!scanForAsserts(*origModule)) {
        if (options.printStatus) {
            outs() << "WARNING: no assert found in the module, skipping reversing\n";
        }
        return createEmptyModule();
    }
    // if (!scanForAsserts(*origModule)) {
    //     if (options.printStatus) {
    //         outs() << "WARNING: no assert found in the module, skipping reversing\n";
    //     }
    //     return createEmptyModule();
    // }

    preprocessOrigModule();

@@ -184,6 +195,7 @@ std::unique_ptr<Module> ModuleReverser::run()
    }

    auto revModule = reverseAndCustomSimplify();
    cloneModuleHeader(revModule.get());

    // verify before the LLVM passes
    bool broken = verifyModule(*revModule, &errs());