From c1cb4ef99aac411af957d6c1c15ab49fc02873c3 Mon Sep 17 00:00:00 2001
From: Yifan Zhao <yifanz16@illinois.edu>
Date: Wed, 7 Jul 2021 23:04:04 -0500
Subject: [PATCH] Fixed a few issues in NVDLA pass

---
 hpvm/cmake/BuildNVDLA.cmake                   | 26 ++++++++++---------
 hpvm/lib/Transforms/HPVM2NVDLA/CMakeLists.txt |  4 +--
 .../Transforms/HPVM2NVDLA/HPVM2NVDLAPass.cpp  | 12 +++------
 3 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/hpvm/cmake/BuildNVDLA.cmake b/hpvm/cmake/BuildNVDLA.cmake
index 12f8237b67..eaff07f658 100644
--- a/hpvm/cmake/BuildNVDLA.cmake
+++ b/hpvm/cmake/BuildNVDLA.cmake
@@ -2,39 +2,43 @@ get_filename_component(NVDLA_DIR ${NVDLA_DIR} ABSOLUTE)
 set(NVDLA_UMD_DIR ${NVDLA_DIR}/umd)
 set(NVDLA_LIB_DIR ${NVDLA_DIR}/lib)
 make_directory(${NVDLA_LIB_DIR})
+set(LIB_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
 
 # Build Protobuf
 set(PROTOBUF_DIR ${NVDLA_UMD_DIR}/external/protobuf-2.6)
 set(COMPILER_APPS_DIR ${NVDLA_UMD_DIR}/apps/compiler)
 set(COMPILER_CORE_DIR ${NVDLA_UMD_DIR}/core/src/compiler)
 add_custom_command(
-  OUTPUT
+  OUTPUT 
     ${COMPILER_CORE_DIR}/libprotobuf.a ${COMPILER_APPS_DIR}/libprotobuf.a
-    ${NVDLA_LIB_DIR}/libprotobuf.so  # Final product 1
+    ${NVDLA_LIB_DIR}/libprotobuf.so ${LIB_DIR}/libprotobuf.so  # Final product 1
   WORKING_DIRECTORY ${PROTOBUF_DIR}
   COMMAND ./autogen.sh && ./configure && make
   COMMAND cp ./src/.libs/libprotobuf.a ${COMPILER_CORE_DIR}
   COMMAND cp ./src/.libs/libprotobuf.a ${COMPILER_APPS_DIR}
-  # Some versions of OS may need all of these:
+  COMMAND cp ./src/.libs/libprotobuf.a ${LIB_DIR}
   COMMAND mkdir -p ${NVDLA_LIB_DIR}
-  COMMAND cp ./src/.libs/libprotobuf.so ${NVDLA_LIB_DIR}/libprotobuf.so.9.0.1
-  COMMAND ln -s ${NVDLA_LIB_DIR}/libprotobuf.so.9.0.1 ${NVDLA_LIB_DIR}/libprotobuf.so.9
-  COMMAND ln -s ${NVDLA_LIB_DIR}/libprotobuf.so.9 ${NVDLA_LIB_DIR}/libprotobuf.so
+  COMMAND cp ./src/.libs/libprotobuf.so ${NVDLA_LIB_DIR}/libprotobuf.so
+  COMMAND cp ./src/.libs/libprotobuf.so ${LIB_DIR}/libprotobuf.so.9.0.1
+  COMMAND ln -s ${LIB_DIR}/libprotobuf.so.9.0.1 ${LIB_DIR}/libprotobuf.so.9
+  COMMAND ln -s ${LIB_DIR}/libprotobuf.so.9 ${LIB_DIR}/libprotobuf.so
 )
 
 # Build NVDLA library
 add_custom_command(
-  OUTPUT ${COMPILER_APPS_DIR}/libnvdla_compiler.so  # Final product 2
+  OUTPUT ${COMPILER_APPS_DIR}/libnvdla_compiler.so ${LIB_DIR}/libnvdla_compiler.so  # Final product 2
   WORKING_DIRECTORY ${NVDLA_UMD_DIR}
   COMMAND make TOP=${NVDLA_UMD_DIR}
   COMMAND cp ${NVDLA_UMD_DIR}/out/core/src/compiler/libnvdla_compiler/libnvdla_compiler.so ${COMPILER_APPS_DIR}
+  COMMAND cp ${NVDLA_UMD_DIR}/out/core/src/compiler/libnvdla_compiler/libnvdla_compiler.so ${LIB_DIR}
+  DEPENDS ${NVDLA_LIB_DIR}/libprotobuf.so ${COMPILER_CORE_DIR}/libprotobuf.a
 )
 
 # What's funny is Make and Ninja don't see these .so files without a custom target
 # even though the user of these files is right there (NVDLA)
 # So we add these custom target rules here.
-add_custom_target(nvdla-protobuf DEPENDS ${NVDLA_LIB_DIR}/libprotobuf.so)
-add_custom_target(nvdla-compiler DEPENDS ${COMPILER_APPS_DIR}/libnvdla_compiler.so)
+add_custom_target(nvdla-protobuf DEPENDS ${LIB_DIR}/libprotobuf.so)
+add_custom_target(nvdla-compiler DEPENDS ${LIB_DIR}/libnvdla_compiler.so nvdla-protobuf)
 
 add_library(NVDLA INTERFACE)
 target_include_directories(
@@ -46,9 +50,7 @@ target_include_directories(
   $<INSTALL_INTERFACE:include/umd>
 )
 target_link_libraries(
-  NVDLA INTERFACE
-  ${COMPILER_APPS_DIR}/libnvdla_compiler.so
-  ${NVDLA_LIB_DIR}/libprotobuf.so
+  NVDLA INTERFACE ${LIB_DIR}/libnvdla_compiler.so ${LIB_DIR}/libprotobuf.so
 )
 add_dependencies(NVDLA nvdla-protobuf nvdla-compiler)
 
diff --git a/hpvm/lib/Transforms/HPVM2NVDLA/CMakeLists.txt b/hpvm/lib/Transforms/HPVM2NVDLA/CMakeLists.txt
index 33df6f864f..d8b5e13763 100644
--- a/hpvm/lib/Transforms/HPVM2NVDLA/CMakeLists.txt
+++ b/hpvm/lib/Transforms/HPVM2NVDLA/CMakeLists.txt
@@ -2,9 +2,7 @@ if(WIN32 OR CYGWIN)
   set(LLVM_LINK_COMPONENTS Core Support)
 endif()
 
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLLVM_BUILD_DIR=${CMAKE_BINARY_DIR}")
-
-set(LLVM_REQUIRES_EH True)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -DLLVM_BUILD_DIR=${CMAKE_BINARY_DIR}")
 
 add_llvm_library(
   LLVMHPVM2NVDLAPass
diff --git a/hpvm/lib/Transforms/HPVM2NVDLA/HPVM2NVDLAPass.cpp b/hpvm/lib/Transforms/HPVM2NVDLA/HPVM2NVDLAPass.cpp
index 1f5f5be849..6f45ab2256 100644
--- a/hpvm/lib/Transforms/HPVM2NVDLA/HPVM2NVDLAPass.cpp
+++ b/hpvm/lib/Transforms/HPVM2NVDLA/HPVM2NVDLAPass.cpp
@@ -1186,7 +1186,7 @@ void CGT_NVDLA::codeGen(DFLeafNode *N) {
 
   // Get the function associated with the dataflow node
   auto *F = N->getFuncPointer();
-  DEBUG(errs()<<"function name = "<< F->getName()<<"\n");
+  LLVM_DEBUG(errs()<<"function name = "<< F->getName()<<"\n");
 
   // Generate code for every instruction in this node
   for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i) {
@@ -1194,9 +1194,6 @@ void CGT_NVDLA::codeGen(DFLeafNode *N) {
 
     if (BuildDFG::isHPVMIntrinsic(I)) {
       auto *II = dyn_cast<IntrinsicInst>(I);
-      assert((II->getCalledFunction()->getName()).startswith("llvm.hpvm.tensor")
-        && "Only HPVM tensor intrinsics allowed in ApproxHPVM leaf nodes\n");
-
       switch (II->getIntrinsicID()) {
 		  case Intrinsic::hpvm_tensor_convolution:
 		  case Intrinsic::hpvm_tensor_group_convolution:
@@ -1235,7 +1232,8 @@ void CGT_NVDLA::codeGen(DFLeafNode *N) {
 		  case Intrinsic::hpvm_tensor_softmax:
 			  generateSoftMaxLayer(N, II);
 			  break;
-			  
+		  case Intrinsic::hpvm_node_id:
+		      break;
 		  default:
 			llvm_unreachable("Unknown HPVM Intrinsic!");
 			break;
@@ -1456,9 +1454,7 @@ NvDlaError CGT_NVDLA::compileProfile(const TestAppArgs* appArgs, TestInfo* i) {
     // Compile
     DEBUG(NvDlaDebugPrintf("compiling profile \"%s\"... config \"%s\"...\n", profileName.c_str(), targetConfigName.c_str()));
 
-    //PROPAGATE_ERROR_FAIL(compiler->compile(profileName.c_str(), targetConfigName.c_str(), &i->compiledLoadable));
-
-    compiler->compile(profileName.c_str(), targetConfigName.c_str(), &i->compiledLoadable);
+    PROPAGATE_ERROR_FAIL(compiler->compile(profileName.c_str(), targetConfigName.c_str(), &i->compiledLoadable));
     
     // Get loadable buffer and dump it into a file
     PROPAGATE_ERROR_FAIL(compiler->getLoadableImageSize(profileName.c_str(),
-- 
GitLab