[LLVMbugs] [Bug 11315] New: Bug in clang with throwing exceptions with noreturn functions?
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Fri Nov 4 16:56:51 PDT 2011
http://llvm.org/bugs/show_bug.cgi?id=11315
Bug #: 11315
Summary: Bug in clang with throwing exceptions with noreturn
functions?
Product: clang
Version: 2.9
Platform: PC
OS/Version: Windows NT
Status: NEW
Severity: normal
Priority: P
Component: C++
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: mamaich at pisem.net
CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
Classification: Unclassified
The following program:
#include <stdio.h>
int main()
{
try {
throw "hello world";
}
catch(const char *aaa)
{
puts(aaa);
}
catch(...)
{
puts("unknown exception");
}
}
when compiled with GCC on MinGW outputs "hello world". While when compiled with
"clang++.exe prog.cpp" - it crashes with the error "terminate called after
throwing an instance of 'char const*'".
I've examined the code obtained with "llc -march=c prog.o" from a generated
LLVM code:
unsigned int main(void) {
unsigned int llvm_cbe_tmp__1; /* Address-exposed local */
unsigned char *llvm_cbe_tmp__2; /* Address-exposed local */
unsigned char *llvm_cbe_aaa; /* Address-exposed local */
unsigned char *llvm_cbe_tmp__3;
CODE_FOR_MAIN();
*(&llvm_cbe_tmp__1) = 0u;
llvm_cbe_tmp__3 = __cxa_allocate_exception(4u);
*(((unsigned char **)llvm_cbe_tmp__3)) = ((&_OC_str.array[((signed int
)0u)]));
__cxa_throw(llvm_cbe_tmp__3, ((unsigned char *)(&_ZTIPKc)), ((unsigned char
*)/*NULL*/0));
/*UNREACHABLE*/;
}
there is no "catch" block code at all.
LLVM code seems to be corect (i'm not familiar with it):
define i32 @main() {
%1 = alloca i32, align 4
%2 = alloca i8*
%aaa = alloca i8*, align 4
store i32 0, i32* %1
%3 = call i8* @__cxa_allocate_exception(i32 4) nounwind
%4 = bitcast i8* %3 to i8**
store i8* getelementptr inbounds ([18 x i8]* @.str, i32 0, i32 0), i8** %4
invoke void @__cxa_throw(i8* %3, i8* bitcast (i8** @_ZTIPKc to i8*), i8*
null) noreturn
to label %22 unwind label %5
; <label>:5 ; preds = %0
%6 = call i8* @llvm.eh.exception() nounwind
store i8* %6, i8** %2
%7 = call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %6, i8* bitcast (i32
(...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIPKc to i8*), i8*
null) nounwind
%8 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIPKc to i8*))
nounwind
%9 = icmp eq i32 %7, %8
br i1 %9, label %11, label %10
... and so on ...
Probably compiler thinks that "__cxa_throw" has a noreturn flag and stops
generating further code in main() as it thinks that it would never be reached.
Though it is not true, as there are exception handlers after __cxa_throw that
may be executed.
The same problem may arise also with other "noreturn" functions that can throw
exceptions.
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list