[llvm-commits] [llvm-gcc-4.2] r138991 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Andrew Trick atrick at apple.com
Thu Sep 1 18:58:03 PDT 2011


Thanks. I really don't understand why this causes the build failures, but it's good to rule this out because of the high likelihood that I'm wrong about how the builders work.
-Andy

On Sep 1, 2011, at 6:35 PM, Bill Wendling wrote:
> Author: void
> Date: Thu Sep  1 20:35:31 2011
> New Revision: 138991
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=138991&view=rev
> Log:
> Specutively revert r138984. The builders were failing around the time I put this in.
> 
> Modified:
>    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
> 
> 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=138991&r1=138990&r2=138991&view=diff
> ==============================================================================
> --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
> +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Thu Sep  1 20:35:31 2011
> @@ -2205,19 +2205,9 @@
> 
> /// EmitLandingPads - Emit EH landing pads.
> void TreeToLLVM::EmitLandingPads() {
> +  std::vector<Value*> Args;
>   std::vector<struct eh_region *> Handlers;
> 
> -  Constant *CatchAllVal = 0;
> -  tree catch_all_type = lang_eh_catch_all();
> -  if (catch_all_type == NULL_TREE)
> -    // Use a C++ style null catch-all object.
> -    CatchAllVal = Constant::getNullValue(Type::getInt8PtrTy(Context));
> -  else
> -    // This language has a type that catches all others.
> -    CatchAllVal = cast<Constant>(Emit(catch_all_type, 0));
> -
> -  Type *UnwindDataTy = StructType::get(Builder.getInt8PtrTy(),
> -                                       Builder.getInt32Ty(), NULL);
>   for (unsigned i = 1; i < LandingPads.size(); ++i) {
>     BasicBlock *LandingPad = LandingPads[i];
> 
> @@ -2235,19 +2225,11 @@
>     // Fetch and store the exception selector.
> 
>     // The exception and the personality function.
> +    Args.push_back(Builder.CreateLoad(ExceptionValue, "eh_ptr"));
>     assert(llvm_eh_personality_libfunc
>            && "no exception handling personality function!");
> -    LandingPadInst *LPadInst =
> -      Builder.CreateLandingPad(UnwindDataTy,
> -                               BitCastToType(DECL_LLVM(llvm_eh_personality_libfunc),
> -                                             Type::getInt8PtrTy(Context)),
> -                               0, "exc");
> -
> -    Value *ExcPtr = Builder.CreateExtractValue(LPadInst, 0, "exc_ptr");
> -    Builder.CreateStore(ExcPtr, ExceptionValue);
> -
> -    Value *Select = Builder.CreateExtractValue(LPadInst, 1, "filter");
> -    Builder.CreateStore(Select, ExceptionSelectorValue);
> +    Args.push_back(BitCastToType(DECL_LLVM(llvm_eh_personality_libfunc),
> +                                 Type::getInt8PtrTy(Context)));
> 
>     // Add selections for each handler.
>     foreach_reachable_handler(i, false, AddHandler, &Handlers);
> @@ -2264,33 +2246,31 @@
> 
>       int RegionKind = classify_eh_handler(region);
>       if (RegionKind < 0) {
> -        // Filter.
> +        // Filter - note the length.
>         tree TypeList = get_eh_type_list(region);
> +        unsigned Length = list_length(TypeList);
> +        Args.reserve(Args.size() + Length + 1);
> +        Args.push_back(ConstantInt::get(Type::getInt32Ty(Context), Length + 1));
> 
>         // Add the type infos.
> -        std::vector<Constant*> TypeInfos;
>         for (; TypeList; TypeList = TREE_CHAIN(TypeList)) {
>           tree TType = lookup_type_for_runtime(TREE_VALUE(TypeList));
> -          TypeInfos.push_back(cast<Constant>(Emit(TType, 0)));
> +          Args.push_back(Emit(TType, 0));
>         }
> -
> -        // Add the list of typeinfos as a filter clause.
> -        ArrayType *FilterTy = ArrayType::get(Builder.getInt8PtrTy(),
> -                                             TypeInfos.size());
> -        LPadInst->addClause(ConstantArray::get(FilterTy, TypeInfos));
>       } else if (RegionKind > 0) {
>         // Catch.
>         tree TypeList = get_eh_type_list(region);
> 
>         if (!TypeList) {
>           // Catch-all - push the catch-all object.
> -          LPadInst->addClause(CatchAllVal);
> +          assert(CatchAll && "Language did not define lang_eh_catch_all?");
> +          Args.push_back(CatchAll);
>           HasCatchAll = true;
>         } else {
>           // Add the type infos.
>           for (; TypeList; TypeList = TREE_CHAIN(TypeList)) {
>             tree TType = lookup_type_for_runtime(TREE_VALUE(TypeList));
> -            LPadInst->addClause(Emit(TType, 0));
> +            Args.push_back(Emit(TType, 0));
>           }
>         }
>       } else {
> @@ -2301,26 +2281,30 @@
> 
>     if (can_throw_external_1(i, false)) {
>       if (HasCleanup) {
> -        if (LPadInst->getNumClauses() == 0 || USING_SJLJ_EXCEPTIONS || !lang_eh_catch_all) {
> +        if (Args.size() == 2 || USING_SJLJ_EXCEPTIONS || !lang_eh_catch_all) {
>           // Insert the sentinal indicating that this is a cleanup-only
>           // selector.  It may also be the representation of a catch-all for
>           // some languages.
> -          LPadInst->setCleanup(true);
> +          Args.push_back(ConstantInt::get(Type::getInt32Ty(Context), 0));
>         } else if (!HasCatchAll) {
>           // 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.
> -          assert(CatchAllVal && "Language did not define lang_eh_catch_all?");
> -          LPadInst->addClause(CatchAllVal);
> +          assert(CatchAll && "Language did not define lang_eh_catch_all?");
> +          Args.push_back(CatchAll);
>         }
>       }
>     }
> 
> +    // Emit the selector call.
> +    Value *Select = Builder.CreateCall(FuncEHSelector, Args, "eh_select");
> +    Builder.CreateStore(Select, ExceptionSelectorValue);
>     // Branch to the post landing pad for the first reachable handler.
>     assert(!Handlers.empty() && "Landing pad but no handler?");
>     Builder.CreateBr(getPostPad(get_eh_region_number(*Handlers.begin())));
> 
>     Handlers.clear();
> +    Args.clear();
>   }
> }
> 
> @@ -2440,19 +2424,29 @@
> 
> /// EmitUnwindBlock - Emit the lazily created EH unwind block.
> void TreeToLLVM::EmitUnwindBlock() {
> -  if (!UnwindBB) return;
> -
> -  CreateExceptionValues();
> -  EmitBlock(UnwindBB);
> +  if (UnwindBB) {
> +    CreateExceptionValues();
> +    EmitBlock(UnwindBB);
> +    // Fetch and store exception handler.
> +    Value *Arg = Builder.CreateLoad(ExceptionValue, "eh_ptr");
> +    assert(llvm_unwind_resume_libfunc && "no unwind resume function!");
> +
> +    // As we're emitting a naked call (not an expression) going through
> +    // EmitCallOf would be wasteful and incorrect. Manually adjust
> +    // the calling convention for this call here if necessary.
> +#ifdef TARGET_ADJUST_LLVM_CC
> +    tree fntype = TREE_TYPE(llvm_unwind_resume_libfunc);
> +    CallingConv::ID CallingConvention = CallingConv::C;
> 
> -  Value *ExcPtr = Builder.CreateLoad(ExceptionValue, "eh_ptr");
> -  Value *Filter = Builder.CreateLoad(ExceptionSelectorValue, "eh_sel");
> -  Type *UnwindDataTy = StructType::get(Builder.getInt8PtrTy(),
> -                                       Builder.getInt32Ty(), NULL);
> -  Value *UnwindData = UndefValue::get(UnwindDataTy);
> -  UnwindData = Builder.CreateInsertValue(UnwindData, ExcPtr, 0, "exc_ptr");
> -  UnwindData = Builder.CreateInsertValue(UnwindData, Filter, 1, "filter");
> -  Builder.CreateResume(UnwindData);
> +    TARGET_ADJUST_LLVM_CC(CallingConvention, fntype);
> +    CallInst *Call = Builder.CreateCall(DECL_LLVM(llvm_unwind_resume_libfunc),
> +                                        Arg);
> +    Call->setCallingConv(CallingConvention);
> +#else
> +    Builder.CreateCall(DECL_LLVM(llvm_unwind_resume_libfunc), Arg);
> +#endif
> +    Builder.CreateUnreachable();
> +  }
> }
> 
> //===----------------------------------------------------------------------===//
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list