using namespace llvm;
-#define DEBUG_TYPE "use-list-order"
+#define DEBUG_TYPE "uselistorder"
static cl::opt<std::string> InputFilename(cl::Positional,
cl::desc("<input bitcode file>"),
bool TempFile::init(const std::string &Ext) {
SmallVector<char, 64> Vector;
DEBUG(dbgs() << " - create-temp-file\n");
- if (auto EC = sys::fs::createTemporaryFile("use-list-order", Ext, Vector)) {
- (void)EC;
- DEBUG(dbgs() << "error: " << EC.message() << "\n");
+ if (auto EC = sys::fs::createTemporaryFile("uselistorder", Ext, Vector)) {
+ errs() << "verify-uselistorder: error: " << EC.message() << "\n";
return true;
}
assert(!Vector.empty());
Filename.assign(Vector.data(), Vector.data() + Vector.size());
Remover.setFile(Filename, !SaveTemps);
- DEBUG(dbgs() << " - filename = " << Filename << "\n");
+ if (SaveTemps)
+ outs() << " - filename = " << Filename << "\n";
return false;
}
std::error_code EC;
raw_fd_ostream OS(Filename, EC, sys::fs::F_None);
if (EC) {
- DEBUG(dbgs() << "error: " << EC.message() << "\n");
+ errs() << "verify-uselistorder: error: " << EC.message() << "\n";
return true;
}
- WriteBitcodeToFile(&M, OS);
+ WriteBitcodeToFile(&M, OS, /* ShouldPreserveUseListOrder */ true);
return false;
}
std::error_code EC;
raw_fd_ostream OS(Filename, EC, sys::fs::F_Text);
if (EC) {
- DEBUG(dbgs() << "error: " << EC.message() << "\n");
+ errs() << "verify-uselistorder: error: " << EC.message() << "\n";
return true;
}
- OS << M;
+ M.print(OS, nullptr, /* ShouldPreserveUseListOrder */ true);
return false;
}
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOr =
MemoryBuffer::getFile(Filename);
if (!BufferOr) {
- DEBUG(dbgs() << "error: " << BufferOr.getError().message() << "\n");
+ errs() << "verify-uselistorder: error: " << BufferOr.getError().message()
+ << "\n";
return nullptr;
}
MemoryBuffer *Buffer = BufferOr.get().get();
- ErrorOr<Module *> ModuleOr =
+ ErrorOr<std::unique_ptr<Module>> ModuleOr =
parseBitcodeFile(Buffer->getMemBufferRef(), Context);
if (!ModuleOr) {
- DEBUG(dbgs() << "error: " << ModuleOr.getError().message() << "\n");
+ errs() << "verify-uselistorder: error: " << ModuleOr.getError().message()
+ << "\n";
return nullptr;
}
- return std::unique_ptr<Module>(ModuleOr.get());
+ return std::move(ModuleOr.get());
}
std::unique_ptr<Module> TempFile::readAssembly(LLVMContext &Context) const {
SMDiagnostic Err;
std::unique_ptr<Module> M = parseAssemblyFile(Filename, Err, Context);
if (!M.get())
- DEBUG(dbgs() << "error: "; Err.print("verify-use-list-order", dbgs()));
+ Err.print("verify-uselistorder", errs());
return M;
}
map(F.getPrefixData());
if (F.hasPrologueData())
map(F.getPrologueData());
+ if (F.hasPersonalityFn())
+ map(F.getPersonalityFn());
}
// Function bodies.
if (!matches(ValueMapping(M), ValueMapping(*OtherM)))
report_fatal_error("use-list order changed");
}
+
static void verifyBitcodeUseListOrder(const Module &M) {
- errs() << "*** verify-use-list-order: bitcode ***\n";
TempFile F;
if (F.init("bc"))
report_fatal_error("failed to initialize bitcode file");
}
static void verifyAssemblyUseListOrder(const Module &M) {
- errs() << "*** verify-use-list-order: assembly ***\n";
TempFile F;
if (F.init("ll"))
report_fatal_error("failed to initialize assembly file");
}
static void verifyUseListOrder(const Module &M) {
+ outs() << "verify bitcode\n";
verifyBitcodeUseListOrder(M);
+ outs() << "verify assembly\n";
verifyAssemblyUseListOrder(M);
}
changeValueUseList(F.getPrefixData());
if (F.hasPrologueData())
changeValueUseList(F.getPrologueData());
+ if (F.hasPersonalityFn())
+ changeValueUseList(F.getPersonalityFn());
}
// Function bodies.
}
static void shuffleUseLists(Module &M, unsigned SeedOffset) {
- errs() << "*** shuffle-use-lists ***\n";
std::minstd_rand0 Gen(std::minstd_rand0::default_seed + SeedOffset);
DenseSet<Value *> Seen;
changeUseLists(M, [&](Value *V) { shuffleValueUseLists(V, Gen, Seen); });
}
static void reverseUseLists(Module &M) {
- errs() << "*** reverse-use-lists ***\n";
DenseSet<Value *> Seen;
changeUseLists(M, [&](Value *V) { reverseValueUseLists(V, Seen); });
DEBUG(dbgs() << "\n");
Err.print(argv[0], errs());
return 1;
}
- if (verifyModule(*M, &errs()))
- report_fatal_error("verification failed");
-
- errs() << "*** verify-use-list-order ***\n";
- // Can't verify if order isn't preserved.
- if (!shouldPreserveBitcodeUseListOrder()) {
- errs() << "warning: forcing -preserve-bc-use-list-order\n";
- setPreserveBitcodeUseListOrder(true);
- }
- if (!shouldPreserveAssemblyUseListOrder()) {
- errs() << "warning: forcing -preserve-ll-use-list-order\n";
- setPreserveAssemblyUseListOrder(true);
+ if (verifyModule(*M, &errs())) {
+ errs() << argv[0] << ": " << InputFilename
+ << ": error: input module is broken!\n";
+ return 1;
}
// Verify the use lists now and after reversing them.
+ outs() << "*** verify-uselistorder ***\n";
verifyUseListOrder(*M);
+ outs() << "reverse\n";
reverseUseLists(*M);
verifyUseListOrder(*M);
for (unsigned I = 0, E = NumShuffles; I != E; ++I) {
- errs() << "*** shuffle iteration: " << I + 1 << " of " << E << " ***\n";
+ outs() << "\n";
// Shuffle with a different (deterministic) seed each time.
+ outs() << "shuffle (" << I + 1 << " of " << E << ")\n";
shuffleUseLists(*M, I);
// Verify again before and after reversing.
verifyUseListOrder(*M);
+ outs() << "reverse\n";
reverseUseLists(*M);
verifyUseListOrder(*M);
}