[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