[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