[llvm-commits] [llvm-gcc-4.2] r41487 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-internal.h
Duncan Sands
baldrick at free.fr
Mon Aug 27 09:11:09 PDT 2007
Author: baldrick
Date: Mon Aug 27 11:11:09 2007
New Revision: 41487
URL: http://llvm.org/viewvc/llvm-project?rev=41487&view=rev
Log:
Filters are now specified using the number of type infos
plus one. If an eh.selector call isn't guaranteed to
match, append a catch-all. Also, some trivial cleanups.
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-internal.h
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=41487&r1=41486&r2=41487&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Mon Aug 27 11:11:09 2007
@@ -1757,18 +1757,6 @@
}
-/// getLandingPad - Return the landing pad for the given exception handling
-/// region, creating it if necessary.
-BasicBlock *TreeToLLVM::getLandingPad(unsigned RegionNo) {
- LandingPads.grow(RegionNo);
- BasicBlock *&LandingPad = LandingPads[RegionNo];
-
- if (!LandingPad)
- LandingPad = new BasicBlock("lpad");
-
- return LandingPad;
-}
-
/// getPostPad - Return the post landing pad for the given exception handling
/// region, creating it if necessary.
BasicBlock *TreeToLLVM::getPostPad(unsigned RegionNo) {
@@ -1829,7 +1817,7 @@
tree TypeList = get_eh_type_list(region);
unsigned Length = list_length(TypeList);
Args.reserve(Args.size() + Length + 1);
- Args.push_back(ConstantInt::get(Type::Int32Ty, Length));
+ Args.push_back(ConstantInt::get(Type::Int32Ty, Length + 1));
// Add the type infos.
for (; TypeList; TypeList = TREE_CHAIN(TypeList)) {
@@ -1855,6 +1843,13 @@
}
}
+ if (can_throw_external_1(i, false))
+ // Some exceptions from this region may not be caught by any handler.
+ // Since invokes are required to branch to the unwind label no matter
+ // what exception is being unwound, append a catch-all.
+ // FIXME: The use of null as catch-all is C++ specific.
+ Args.push_back(Constant::getNullValue(PointerType::get(Type::Int8Ty)));
+
// Emit the selector call.
Value *Select = Builder.CreateCall(FuncEHSelector, Args.begin(), Args.end(),
"eh_select");
@@ -2250,12 +2245,23 @@
if (!NoUnwind) {
int RegionNo = lookup_stmt_eh_region(exp);
+ // Is the call contained in an exception handling region?
if (RegionNo > 0) {
- if (can_throw_internal_1(RegionNo, false))
+ // Are there any exception handlers for this region?
+ if (can_throw_internal_1(RegionNo, false)) {
// Turn the call into an invoke.
- LandingPad = getLandingPad(RegionNo);
- else
+ LandingPads.grow(RegionNo);
+ BasicBlock *&ThisPad = LandingPads[RegionNo];
+
+ // Create a landing pad if one didn't exist already.
+ if (!ThisPad)
+ ThisPad = new BasicBlock("lpad");
+
+ LandingPad = ThisPad;
+ } else {
+ // Can this call unwind out of the current function?
NoUnwind = !can_throw_external_1(RegionNo, false);
+ }
}
}
}
Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=41487&r1=41486&r2=41487&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Mon Aug 27 11:11:09 2007
@@ -242,8 +242,6 @@
bool isBitfield() const { return BitStart != 255; }
};
-typedef IndexedMap<BasicBlock *> RegionMapType;
-
/// TreeToLLVM - An instance of this class is created and used to convert the
/// body of each function to LLVM.
///
@@ -268,10 +266,10 @@
//===---------------------- Exception Handling --------------------------===//
/// LandingPads - The landing pad for a given EH region.
- RegionMapType LandingPads;
+ IndexedMap<BasicBlock *> LandingPads;
/// PostPads - The post landing pad for a given EH region.
- RegionMapType PostPads;
+ IndexedMap<BasicBlock *> PostPads;
/// ExceptionValue - Is the local to receive the current exception.
Value *ExceptionValue;
@@ -421,10 +419,6 @@
/// handling.
void CreateExceptionValues();
- /// getLandingPad - Return the landing pad for the given exception handling
- /// region, creating it if necessary.
- BasicBlock *getLandingPad(unsigned RegionNo);
-
/// getPostPad - Return the post landing pad for the given exception handling
/// region, creating it if necessary.
BasicBlock *getPostPad(unsigned RegionNo);
More information about the llvm-commits
mailing list