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

Nick Lewycky nicholas at mxc.ca
Sun Apr 10 23:11:22 PDT 2011


Eli Friedman wrote:
> 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.)

Thanks Eli! Sorry for the mess, I'll look more closely at this tomorrow.

Nick

>
> -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