From 806bbc49dc07465eddc883b09d48dd93fb64d147 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Mon, 21 Feb 2022 10:07:37 -0500 Subject: [PATCH] [OpenMP] Try to embed offloading objects after codegen Currently we use the `-fembed-offload-object` option to embed a binary file into the host as a named section. This is currently only used as a codegen action, meaning we only handle this option correctly when the input is a bitcode file. This patch adds the same handling to embed an offloading object after we complete code generation. This allows us to embed the object correctly if the input file is source or bitcode. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D120270 --- clang/lib/CodeGen/CodeGenModule.cpp | 4 ++++ clang/test/Frontend/embed-object.c | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 clang/test/Frontend/embed-object.c diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index ad52c0d..3da5126 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -43,6 +43,7 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/Version.h" +#include "clang/CodeGen/BackendUtil.h" #include "clang/CodeGen/ConstantInitBuilder.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "llvm/ADT/StringSwitch.h" @@ -876,6 +877,9 @@ void CodeGenModule::Release() { EmitBackendOptionsMetadata(getCodeGenOpts()); + // If there is device offloading code embed it in the host now. + EmbedObject(&getModule(), CodeGenOpts, getDiags()); + // Set visibility from DLL storage class // We do this at the end of LLVM IR generation; after any operation // that might affect the DLL storage class or the visibility, and diff --git a/clang/test/Frontend/embed-object.c b/clang/test/Frontend/embed-object.c new file mode 100644 index 0000000..f438aa3 --- /dev/null +++ b/clang/test/Frontend/embed-object.c @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -x c -triple x86_64-unknown-linux-gnu -emit-llvm -fembed-offload-object=%S/Inputs/empty.h,section + +// CHECK: @[[OBJECT:.+]] = private constant [0 x i8] zeroinitializer, section ".llvm.offloading.section" +// CHECK: @llvm.compiler.used = appending global [3 x i8*] [i8* getelementptr inbounds ([0 x i8], [0 x i8]* @[[OBJECT1]]], section "llvm.metadata" + +void foo(void) {} -- 2.7.4