xref: /llvm-project/llvm/unittests/Analysis/GraphWriterTest.cpp (revision a811f263356af4fcf5b479c7a32d1bab44ac8954)
17ff377baSTyler Nowicki //===- GraphWriterTest.cpp - GraphWriter unit tests -----------------------===//
27ff377baSTyler Nowicki //
37ff377baSTyler Nowicki // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47ff377baSTyler Nowicki // See https://llvm.org/LICENSE.txt for license information.
57ff377baSTyler Nowicki // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67ff377baSTyler Nowicki //
77ff377baSTyler Nowicki //===----------------------------------------------------------------------===//
87ff377baSTyler Nowicki 
97ff377baSTyler Nowicki #include "llvm/Support/GraphWriter.h"
107ff377baSTyler Nowicki #include "llvm/Analysis/CFGPrinter.h"
117ff377baSTyler Nowicki #include "llvm/AsmParser/Parser.h"
127ff377baSTyler Nowicki #include "llvm/IR/Function.h"
137ff377baSTyler Nowicki #include "llvm/IR/LLVMContext.h"
147ff377baSTyler Nowicki #include "llvm/IR/Module.h"
15*a811f263SDmitri Gribenko #include "llvm/Testing/Support/SupportHelpers.h"
167ff377baSTyler Nowicki #include "llvm/Support/SourceMgr.h"
177ff377baSTyler Nowicki #include "llvm/Support/raw_ostream.h"
187ff377baSTyler Nowicki #include "gtest/gtest.h"
197ff377baSTyler Nowicki #include <string>
207ff377baSTyler Nowicki 
217ff377baSTyler Nowicki #define ASSERT_NO_ERROR(x)                                                     \
227ff377baSTyler Nowicki   if (std::error_code ASSERT_NO_ERROR_ec = x) {                                \
237ff377baSTyler Nowicki     SmallString<128> MessageStorage;                                           \
247ff377baSTyler Nowicki     raw_svector_ostream Message(MessageStorage);                               \
257ff377baSTyler Nowicki     Message << #x ": did not return errc::success.\n"                          \
267ff377baSTyler Nowicki             << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n"          \
277ff377baSTyler Nowicki             << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n";      \
287ff377baSTyler Nowicki     GTEST_FATAL_FAILURE_(MessageStorage.c_str());                              \
297ff377baSTyler Nowicki   } else {                                                                     \
307ff377baSTyler Nowicki   }
317ff377baSTyler Nowicki 
327ff377baSTyler Nowicki namespace llvm {
337ff377baSTyler Nowicki namespace {
347ff377baSTyler Nowicki 
357ff377baSTyler Nowicki class GraphWriterTest : public testing::Test {
367ff377baSTyler Nowicki protected:
377ff377baSTyler Nowicki   LLVMContext C;
387ff377baSTyler Nowicki 
397ff377baSTyler Nowicki   std::unique_ptr<Module> makeLLVMModule() {
407ff377baSTyler Nowicki     const char *ModuleStrig = "define i32 @f(i32 %x) {\n"
417ff377baSTyler Nowicki                               "bb0:\n"
427ff377baSTyler Nowicki                               "  %y1 = icmp eq i32 %x, 0 \n"
437ff377baSTyler Nowicki                               "  br i1 %y1, label %bb1, label %bb2 \n"
447ff377baSTyler Nowicki                               "bb1:\n"
457ff377baSTyler Nowicki                               "  br label %bb3\n"
467ff377baSTyler Nowicki                               "bb2:\n"
477ff377baSTyler Nowicki                               "  br label %bb3\n"
487ff377baSTyler Nowicki                               "bb3:\n"
497ff377baSTyler Nowicki                               "  %y2 = phi i32 [0, %bb1], [1, %bb2] \n"
507ff377baSTyler Nowicki                               "  ret i32 %y2\n"
517ff377baSTyler Nowicki                               "}\n";
527ff377baSTyler Nowicki     SMDiagnostic Err;
537ff377baSTyler Nowicki     return parseAssemblyString(ModuleStrig, Err, C);
547ff377baSTyler Nowicki   }
557ff377baSTyler Nowicki };
567ff377baSTyler Nowicki 
577ff377baSTyler Nowicki static void writeCFGToDotFile(Function &F, std::string Name,
587ff377baSTyler Nowicki                               bool CFGOnly = false) {
597ff377baSTyler Nowicki   std::error_code EC;
60*a811f263SDmitri Gribenko   llvm::unittest::TempDir Tmp("tmpdir", /*Unique=*/true);
61*a811f263SDmitri Gribenko   SmallString<128> FileName(Tmp.path().begin(), Tmp.path().end());
62*a811f263SDmitri Gribenko   sys::path::append(FileName, Name + ".dot");
63*a811f263SDmitri Gribenko   raw_fd_ostream File(FileName, EC, sys::fs::OpenFlags::OF_Text);
647ff377baSTyler Nowicki 
657ff377baSTyler Nowicki   DOTFuncInfo CFGInfo(&F);
667ff377baSTyler Nowicki 
677ff377baSTyler Nowicki   ASSERT_NO_ERROR(EC);
687ff377baSTyler Nowicki   // Test intentionally does not pass BPI, WriteGraph should work without it.
697ff377baSTyler Nowicki   WriteGraph(File, &CFGInfo, CFGOnly);
707ff377baSTyler Nowicki }
717ff377baSTyler Nowicki 
727ff377baSTyler Nowicki TEST_F(GraphWriterTest, WriteCFGDotFileTest) {
737ff377baSTyler Nowicki   auto M = makeLLVMModule();
747ff377baSTyler Nowicki   Function *F = M->getFunction("f");
757ff377baSTyler Nowicki 
767ff377baSTyler Nowicki   writeCFGToDotFile(*F, "test-full");
777ff377baSTyler Nowicki   writeCFGToDotFile(*F, "test-cfg-only", true);
787ff377baSTyler Nowicki }
797ff377baSTyler Nowicki 
807ff377baSTyler Nowicki } // end anonymous namespace
817ff377baSTyler Nowicki } // end namespace llvm
82