diff options
author | Justin Lebar <jlebar@google.com> | 2016-01-30 01:07:38 +0000 |
---|---|---|
committer | Justin Lebar <jlebar@google.com> | 2016-01-30 01:07:38 +0000 |
commit | ead59f4765dbac58c3a3fbbda405ac05b5289ad2 (patch) | |
tree | 072d53ad18be7c555ce8dc8acd5dc60c00a3923d /llvm | |
parent | 433c43cd857fa722584b674151b269c5b0dbe4b7 (diff) | |
download | bcm5719-llvm-ead59f4765dbac58c3a3fbbda405ac05b5289ad2.tar.gz bcm5719-llvm-ead59f4765dbac58c3a3fbbda405ac05b5289ad2.zip |
[CUDA] Die if we ask the NVPTX backend to emit a global ctor/dtor.
Summary: Previously we'd just silently skip these.
Reviewers: tra, jholewinski
Subscribers: llvm-commits, jhen, echristo,
Differential Revision: http://reviews.llvm.org/D16739
llvm-svn: 259279
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp | 17 | ||||
-rw-r--r-- | llvm/test/CodeGen/NVPTX/global-ctor-empty.ll | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/NVPTX/global-ctor.ll | 9 | ||||
-rw-r--r-- | llvm/test/CodeGen/NVPTX/global-dtor.ll | 9 |
4 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp index ebeeedaec69..37ee942b4cc 100644 --- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -802,6 +802,13 @@ void NVPTXAsmPrinter::recordAndEmitFilenames(Module &M) { } } +static bool isEmptyXXStructor(GlobalVariable *GV) { + if (!GV) return true; + const ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); + if (!InitList) return true; // Not an array; we don't know how to parse. + return InitList->getNumOperands() == 0; +} + bool NVPTXAsmPrinter::doInitialization(Module &M) { // Construct a default subtarget off of the TargetMachine defaults. The // rest of NVPTX isn't friendly to change subtargets per function and @@ -816,6 +823,16 @@ bool NVPTXAsmPrinter::doInitialization(Module &M) { report_fatal_error("Module has aliases, which NVPTX does not support."); return true; // error } + if (!isEmptyXXStructor(M.getNamedGlobal("llvm.global_ctors"))) { + report_fatal_error( + "Module has a nontrivial global ctor, which NVPTX does not support."); + return true; // error + } + if (!isEmptyXXStructor(M.getNamedGlobal("llvm.global_dtors"))) { + report_fatal_error( + "Module has a nontrivial global dtor, which NVPTX does not support."); + return true; // error + } SmallString<128> Str1; raw_svector_ostream OS1(Str1); diff --git a/llvm/test/CodeGen/NVPTX/global-ctor-empty.ll b/llvm/test/CodeGen/NVPTX/global-ctor-empty.ll new file mode 100644 index 00000000000..10ca0168b30 --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/global-ctor-empty.ll @@ -0,0 +1,5 @@ +; RUN: llc < %s -march=nvptx -mcpu=sm_20 2>&1 + +; Check that llc doesn't die when given an empty global ctor / dtor. +@llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] [] +@llvm.global_dtors = appending global [0 x { i32, void ()*, i8* }] [] diff --git a/llvm/test/CodeGen/NVPTX/global-ctor.ll b/llvm/test/CodeGen/NVPTX/global-ctor.ll new file mode 100644 index 00000000000..89155db08ea --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/global-ctor.ll @@ -0,0 +1,9 @@ +; RUN: not llc < %s -march=nvptx -mcpu=sm_20 2>&1 | FileCheck %s + +; Check that llc dies when given a nonempty global ctor. +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @foo, i8* null }] + +; CHECK: ERROR: Module has a nontrivial global ctor +define internal void @foo() { + ret void +} diff --git a/llvm/test/CodeGen/NVPTX/global-dtor.ll b/llvm/test/CodeGen/NVPTX/global-dtor.ll new file mode 100644 index 00000000000..9d01f9bd387 --- /dev/null +++ b/llvm/test/CodeGen/NVPTX/global-dtor.ll @@ -0,0 +1,9 @@ +; RUN: not llc < %s -march=nvptx -mcpu=sm_20 2>&1 | FileCheck %s + +; Check that llc dies when given a nonempty global dtor. +@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @foo, i8* null }] + +; CHECK: ERROR: Module has a nontrivial global dtor +define internal void @foo() { + ret void +} |