diff --git a/clang/lib/CodeGen/CGCUDANV.cpp b/clang/lib/CodeGen/CGCUDANV.cpp --- a/clang/lib/CodeGen/CGCUDANV.cpp +++ b/clang/lib/CodeGen/CGCUDANV.cpp @@ -88,10 +88,11 @@ llvm::Constant *makeConstantString(const std::string &Str, const std::string &Name = "", const std::string &SectionName = "", - unsigned Alignment = 0) { + unsigned Alignment = 0, + bool AddNull = true) { llvm::Constant *Zeros[] = {llvm::ConstantInt::get(SizeTy, 0), llvm::ConstantInt::get(SizeTy, 0)}; - auto ConstStr = CGM.GetAddrOfConstantCString(Str, Name.c_str()); + auto ConstStr = CGM.GetAddrOfConstantCString(Str, Name.c_str(), AddNull); llvm::GlobalVariable *GV = cast(ConstStr.getPointer()); if (!SectionName.empty()) { @@ -744,9 +745,9 @@ // If fatbin is available from early finalization, create a string // literal containing the fat binary loaded from the given file. const unsigned HIPCodeObjectAlign = 4096; - FatBinStr = - makeConstantString(std::string(CudaGpuBinary->getBuffer()), "", - FatbinConstantName, HIPCodeObjectAlign); + FatBinStr = makeConstantString(std::string(CudaGpuBinary->getBuffer()), + "", FatbinConstantName, HIPCodeObjectAlign, + /*AddNull=*/false); } else { // If fatbin is not available, create an external symbol // __hip_fatbin in section .hip_fatbin. The external symbol is supposed @@ -781,7 +782,7 @@ // For CUDA, create a string literal containing the fat binary loaded from // the given file. FatBinStr = makeConstantString(std::string(CudaGpuBinary->getBuffer()), "", - FatbinConstantName, 8); + FatbinConstantName, 8, /*AddNull=*/false); FatMagic = CudaFatMagic; } diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -1020,14 +1020,14 @@ ConstantAddress GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *); - /// Returns a pointer to a character array containing the literal and a - /// terminating '\0' character. The result has pointer to array type. + /// Returns a pointer to a character array containing the literal and an + /// optional terminating '\0' character. The result has pointer to array type. /// /// \param GlobalName If provided, the name to use for the global (if one is /// created). - ConstantAddress - GetAddrOfConstantCString(const std::string &Str, - const char *GlobalName = nullptr); + ConstantAddress GetAddrOfConstantCString(const std::string &Str, + const char *GlobalName = nullptr, + bool AddNull = true); /// Returns a pointer to a constant global variable for the given file-scope /// compound literal expression. diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -5879,16 +5879,16 @@ } /// GetAddrOfConstantCString - Returns a pointer to a character array containing -/// the literal and a terminating '\0' character. +/// the literal and an optional terminating '\0' character. /// The result has pointer to array type. -ConstantAddress CodeGenModule::GetAddrOfConstantCString( - const std::string &Str, const char *GlobalName) { - StringRef StrWithNull(Str.c_str(), Str.size() + 1); +ConstantAddress CodeGenModule::GetAddrOfConstantCString(const std::string &Str, + const char *GlobalName, + bool AddNull) { CharUnits Alignment = getContext().getAlignOfGlobalVarInChars(getContext().CharTy); llvm::Constant *C = - llvm::ConstantDataArray::getString(getLLVMContext(), StrWithNull, false); + llvm::ConstantDataArray::getString(getLLVMContext(), Str, AddNull); // Don't share any string literals if strings aren't constant. llvm::GlobalVariable **Entry = nullptr; diff --git a/clang/test/CodeGenCUDA/device-stub.cu b/clang/test/CodeGenCUDA/device-stub.cu --- a/clang/test/CodeGenCUDA/device-stub.cu +++ b/clang/test/CodeGenCUDA/device-stub.cu @@ -1,4 +1,4 @@ -// RUN: echo "GPU binary would be here" > %t +// RUN: echo -n "GPU binary would be here." > %t // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-linux-gnu -emit-llvm %s \ // RUN: -target-sdk-version=8.0 -fcuda-include-gpubinary %t -o - \ // RUN: | FileCheck -allow-deprecated-dag-overlap %s \ @@ -159,8 +159,8 @@ // ALL: @3 = private unnamed_addr constant [19 x i8] c"ext_device_var_def\00" // ALL: @4 = private unnamed_addr constant [21 x i8] c"ext_constant_var_def\00" // * constant unnamed string with GPU binary -// CUDA: @[[FATBIN:.*]] = private constant{{.*GPU binary would be here.*}}\00", -// HIPEF: @[[FATBIN:.*]] = private constant{{.*GPU binary would be here.*}}\00",{{.*}}align 4096 +// CUDA: @[[FATBIN:.*]] = private constant{{.*}} c"GPU binary would be here.", +// HIPEF: @[[FATBIN:.*]] = private constant{{.*}} c"GPU binary would be here.",{{.*}}align 4096 // HIPNEF: @[[FATBIN:__hip_fatbin]] = external constant i8, section ".hip_fatbin" // CUDANORDC-SAME: section ".nv_fatbin", align 8 // CUDARDC-SAME: section "__nv_relfatbin", align 8