| //===- ReduceModuleData.cpp -----------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements a reduce pass to reduce various module data. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "ReduceModuleData.h" |
| |
| using namespace llvm; |
| |
| static void clearModuleData(std::vector<Chunk> ChunksToKeep, Module *Program) { |
| Oracle O(ChunksToKeep); |
| |
| if (!Program->getModuleIdentifier().empty() && !O.shouldKeep()) |
| Program->setModuleIdentifier(""); |
| if (!Program->getSourceFileName().empty() && !O.shouldKeep()) |
| Program->setSourceFileName(""); |
| if (!Program->getDataLayoutStr().empty() && !O.shouldKeep()) |
| Program->setDataLayout(""); |
| if (!Program->getTargetTriple().empty() && !O.shouldKeep()) |
| Program->setTargetTriple(""); |
| // TODO: clear line by line rather than all at once |
| if (!Program->getModuleInlineAsm().empty() && !O.shouldKeep()) |
| Program->setModuleInlineAsm(""); |
| } |
| |
| static int countModuleData(Module *M) { |
| int Count = 0; |
| if (!M->getModuleIdentifier().empty()) |
| ++Count; |
| if (!M->getSourceFileName().empty()) |
| ++Count; |
| if (!M->getDataLayoutStr().empty()) |
| ++Count; |
| if (!M->getTargetTriple().empty()) |
| ++Count; |
| if (!M->getModuleInlineAsm().empty()) |
| ++Count; |
| return Count; |
| } |
| |
| void llvm::reduceModuleDataDeltaPass(TestRunner &Test) { |
| outs() << "*** Reducing Module Data...\n"; |
| int Count = countModuleData(Test.getProgram()); |
| runDeltaPass(Test, Count, clearModuleData); |
| } |