[llvm-commits] [llvm] r129128 - in /llvm/trunk/lib: CodeGen/ELFWriter.cpp ExecutionEngine/ExecutionEngine.cpp Transforms/IPO/GlobalOpt.cpp VMCore/Verifier.cpp

Eli Friedman eli.friedman at gmail.com
Sat Apr 9 02:20:49 PDT 2011


On Fri, Apr 8, 2011 at 12:30 AM, Nick Lewycky <nicholas at mxc.ca> wrote:
> Author: nicholas
> Date: Fri Apr  8 02:30:21 2011
> New Revision: 129128
>
> URL: http://llvm.org/viewvc/llvm-project?rev=129128&view=rev
> Log:
> llvm.global_[cd]tor is defined to be either external, or appending with an array
> of { i32, void ()* }. Teach the verifier to verify that, deleting copies of
> checks strewn about.

Please take another look at this... see r129207.  (I only looked at
GlobalOpt because it made buildbot turn red.)

-Eli

> Modified:
>    llvm/trunk/lib/CodeGen/ELFWriter.cpp
>    llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
>    llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
>    llvm/trunk/lib/VMCore/Verifier.cpp
>
> Modified: llvm/trunk/lib/CodeGen/ELFWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ELFWriter.cpp?rev=129128&r1=129127&r2=129128&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/ELFWriter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/ELFWriter.cpp Fri Apr  8 02:30:21 2011
> @@ -660,19 +660,17 @@
>  /// EmitXXStructorList - Emit the ctor or dtor list.  This just emits out the
>  /// function pointers, ignoring the init priority.
>  void ELFWriter::EmitXXStructorList(Constant *List, ELFSection &Xtor) {
> -  // Should be an array of '{ int, void ()* }' structs.  The first value is the
> +  // Should be an array of '{ i32, void ()* }' structs.  The first value is the
>   // init priority, which we ignore.
> -  if (!isa<ConstantArray>(List)) return;
>   ConstantArray *InitList = cast<ConstantArray>(List);
> -  for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i)
> -    if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){
> -      if (CS->getNumOperands() != 2) return;  // Not array of 2-element structs.
> -
> -      if (CS->getOperand(1)->isNullValue())
> -        return;  // Found a null terminator, exit printing.
> -      // Emit the function pointer.
> -      EmitGlobalConstant(CS->getOperand(1), Xtor);
> -    }
> +  for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
> +    ConstantStruct *CS = cast<ConstantStruct>(InitList->getOperand(i));
> +
> +    if (CS->getOperand(1)->isNullValue())
> +      return;  // Found a null terminator, exit printing.
> +    // Emit the function pointer.
> +    EmitGlobalConstant(CS->getOperand(1), Xtor);
> +  }
>  }
>
>  bool ELFWriter::runOnMachineFunction(MachineFunction &MF) {
>
> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=129128&r1=129127&r2=129128&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Fri Apr  8 02:30:21 2011
> @@ -313,13 +313,9 @@
>
>   // Should be an array of '{ i32, void ()* }' structs.  The first value is
>   // the init priority, which we ignore.
> -  ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer());
> -  if (!InitList) return;
> +  ConstantArray *InitList = cast<ConstantArray>(GV->getInitializer());
>   for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
> -    ConstantStruct *CS =
> -      dyn_cast<ConstantStruct>(InitList->getOperand(i));
> -    if (!CS) continue;
> -    if (CS->getNumOperands() != 2) return; // Not array of 2-element structs.
> +    ConstantStruct *CS = cast<ConstantStruct>(InitList->getOperand(i));
>
>     Constant *FP = CS->getOperand(1);
>     if (FP->isNullValue())
>
> Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=129128&r1=129127&r2=129128&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Fri Apr  8 02:30:21 2011
> @@ -1944,35 +1944,20 @@
>   return Changed;
>  }
>
> -/// FindGlobalCtors - Find the llvm.globalctors list, verifying that all
> +/// FindGlobalCtors - Find the llvm.global_ctors list, verifying that all
>  /// initializers have an init priority of 65535.
>  GlobalVariable *GlobalOpt::FindGlobalCtors(Module &M) {
>   GlobalVariable *GV = M.getGlobalVariable("llvm.global_ctors");
>   if (GV == 0) return 0;
>
> -  // Found it, verify it's an array of { int, void()* }.
> -  const ArrayType *ATy =dyn_cast<ArrayType>(GV->getType()->getElementType());
> -  if (!ATy) return 0;
> -  const StructType *STy = dyn_cast<StructType>(ATy->getElementType());
> -  if (!STy || STy->getNumElements() != 2 ||
> -      !STy->getElementType(0)->isIntegerTy(32)) return 0;
> -  const PointerType *PFTy = dyn_cast<PointerType>(STy->getElementType(1));
> -  if (!PFTy) return 0;
> -  const FunctionType *FTy = dyn_cast<FunctionType>(PFTy->getElementType());
> -  if (!FTy || !FTy->getReturnType()->isVoidTy() ||
> -      FTy->isVarArg() || FTy->getNumParams() != 0)
> -    return 0;
> -
>   // Verify that the initializer is simple enough for us to handle. We are
>   // only allowed to optimize the initializer if it is unique.
>   if (!GV->hasUniqueInitializer()) return 0;
>
> -  ConstantArray *CA = dyn_cast<ConstantArray>(GV->getInitializer());
> -  if (!CA) return 0;
> +  ConstantArray *CA = cast<ConstantArray>(GV->getInitializer());
>
>   for (User::op_iterator i = CA->op_begin(), e = CA->op_end(); i != e; ++i) {
> -    ConstantStruct *CS = dyn_cast<ConstantStruct>(*i);
> -    if (CS == 0) return 0;
> +    ConstantStruct *CS = cast<ConstantStruct>(*i);
>
>     if (isa<ConstantPointerNull>(CS->getOperand(1)))
>       continue;
> @@ -1982,8 +1967,8 @@
>       return 0;
>
>     // Init priority must be standard.
> -    ConstantInt *CI = dyn_cast<ConstantInt>(CS->getOperand(0));
> -    if (!CI || CI->getZExtValue() != 65535)
> +    ConstantInt *CI = cast<ConstantInt>(CS->getOperand(0));
> +    if (CI->getZExtValue() != 65535)
>       return 0;
>   }
>
>
> Modified: llvm/trunk/lib/VMCore/Verifier.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Verifier.cpp?rev=129128&r1=129127&r2=129128&view=diff
> ==============================================================================
> --- llvm/trunk/lib/VMCore/Verifier.cpp (original)
> +++ llvm/trunk/lib/VMCore/Verifier.cpp Fri Apr  8 02:30:21 2011
> @@ -471,6 +471,23 @@
>             "invalid linkage type for global declaration", &GV);
>   }
>
> +  if (GV.hasName() && (GV.getName() == "llvm.global_ctors" ||
> +                       GV.getName() == "llvm.global_dtors")) {
> +    Assert1(!GV.hasInitializer() || GV.hasAppendingLinkage(),
> +            "invalid linkage for intrinsic global variable", &GV);
> +    // Don't worry about emitting an error for it not being an array,
> +    // visitGlobalValue will complain on appending non-array.
> +    if (const ArrayType *ATy = dyn_cast<ArrayType>(GV.getType())) {
> +      const StructType *STy = dyn_cast<StructType>(ATy->getElementType());
> +      const PointerType *FuncPtrTy =
> +          FunctionType::get(Type::getVoidTy(*Context), false)->getPointerTo();
> +      Assert1(STy && STy->getNumElements() == 2 &&
> +              STy->getTypeAtIndex(0u)->isIntegerTy(32) &&
> +              STy->getTypeAtIndex(1) == FuncPtrTy,
> +              "wrong type for intrinsic global variable", &GV);
> +    }
> +  }
> +
>   visitGlobalValue(GV);
>  }
>
>
>
> _______________________________________________
> 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