aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms/NaCl/ReplacePtrsWithInts.cpp
AgeCommit message (Collapse)Author
2013-07-18Merge remote-tracking branch 'origin/master'Eli Bendersky
2013-07-18More safeguarding of Attr->getKindAsEnum by checking for isEnumAttributeEli Bendersky
first
2013-07-13Concurrency support for PNaCl ABIJF Bastien
Add portable support for concurrency in PNaCl's ABI: - Promote volatile to atomic. - Promote all memory ordering to sequential consistency. - Rewrite all atomic operations to frozen NaCl intrinsics for pexe. - Rewrite atomic intrinsics to LLVM instructions for translation. This change also adds documentation to the PNaCl language reference, as well as tests where it makes sense. A future CL could clean up more of our code which mentions atomics, volatiles, memory orderings. Multiple reviewers because this is a big patch: - eliben: LLVM-fu and ResolvePNaClIntrinsics. - dschuff: ABI stability. - mseaborn: ABI stability. - sehr: Tron-duty (fight for the user's programs to work). BUG= https://code.google.com/p/nativeclient/issues/detail?id=3475 R=dschuff@chromium.org, eliben@chromium.org, sehr@google.com TEST= (cd ./pnacl/build/llvm_x86_64; ninja check-all) && ./pnacl/test.sh test-x86-32 && ./pnacl/test.sh test-x86-64 && ./pnacl/test.sh test-arm && ./pnacl/test.sh test-x86-32-sbtc && ./pnacl/test.sh test-x86-64-sbtc && ./pnacl/test.sh test-arm-sbtc Review URL: https://codereview.chromium.org/17777004
2013-06-25PNaCl: Fix removal of dead function prototypes in ABI simplificationMark Seaborn
The use of StripDeadPrototypes in PNaClABISimplify.cpp wasn't always having an effect: it doesn't work if there are dead constant references remaining to a function declaration. ReplacePtrsWithInts was leaving some of these references behind, so fix it. BUG=none TEST=llvm-lit tests Review URL: https://codereview.chromium.org/17636006
2013-06-25PNaCl ABI: Disallow various operations on the i1 typeMark Seaborn
Disallow i1 on loads/stores and require the conversions to i8 to be explicit. Add a pass, PromoteI1Ops, that adds the conversions. (Load/store on i1 occur in practice in small_tests for some boolean globals.) Disallow i1 for most arithmetic/comparison operations since these aren't very useful and it's a nuisance for a code generator to have to support these. I haven't seen these occur in practice, but PromoteI1Ops nevertheless expands them. We still allow and/or/xor on i1 because these do occur in practice, and they're less of a nuisance to handle because they never overflow: no truncation to 1 bit is required, unlike with adds. Restrict the type of alloca's argument. Clang always uses i32 here. Disallow i1 in switch instructions. Clang doesn't generate i1 switches for booleans. Move CopyLoadOrStoreAttrs() helper into a header to reuse. BUG=https://code.google.com/p/nativeclient/issues/detail?id=3490 TEST=PNaCl toolchain trybots + GCC torture tests + Spec2k Review URL: https://codereview.chromium.org/17356011
2013-06-24PNaCl ABI: Disallow built-in multiplication in "alloca" instructionsMark Seaborn
Simplify the set of "alloca" instructions the ABI verifier allows. Before this change, we used i8 arrays, such as: alloca [8 x i8] After this change, we will just use i8 with an explicit size value, so that becomes: alloca i8, i32 8 Allocation of variable-length arrays will require an explicit multiply instruction. This means that the code generator no longer has to handle an implicit multiplication in "alloca", reducing the burden on fast-and-simple code generators a little. This means the PNaCl ABI doesn't need to specify whether alloca's implicit multiplication checks for overflow. This doesn't affect what the backend generates. See lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp, which handles constant-size AllocaInsts (by filling out StaticAllocaMap) and which is uses for both -O2 (SelectionDAG) and -O0 (FastISel) translation. BUG=https://code.google.com/p/nativeclient/issues/detail?id=3343 TEST=*.ll tests + PNaCl toolchain trybots Review URL: https://codereview.chromium.org/17631004
2013-06-03PNaCl: Fix ReplacePtrsWithInts so that ptrtoint always casts to i32Mark Seaborn
The normal form introduced by ReplacePtrsWithInts (as documented in the comments) is intended to have the property that ptrtoint and inttoptr only convert to/from i32, not other size types. Using IRBuilder's CreateZExtOrTrunc() broke that, though, because it performs some constant folding on global variable references. Fix this by creating CastInsts directly. I found this via the ABI checks I've been writing, which gave this error when building the sandboxed translator: non-i32 ptrtoint: %expanded1 = ptrtoint void ()* @ARMCompilationCallback to i8 LLVM ERROR: PNaCl ABI verification failed BUG=https://code.google.com/p/nativeclient/issues/detail?id=3343 TEST=*.ll tests + tested full PNaCl build with ABI checks applied too Review URL: https://codereview.chromium.org/15955012
2013-05-31PNaCl: Remove and disallow llvm.invariant.start/end intrinsicsMark Seaborn
These markers work in a similar way to llvm.lifetime.start/end, so we should remove them for similar reasons: it's not very well defined how one marker cancels out the effects of the other. Arguably, invariant.start/end are less useful than lifetime.start/end. They are ignored by the backend. They are generated in fewer places: invariant.start is generated by Clang (at -O1 or higher) when a const global is initialised with a non-POD initialiser. invariant.end is apparently not generated at all. Do the stripping in ReplacePtrsWithInts for consistency with the existing lifetime.start/end stripping. BUG=https://code.google.com/p/nativeclient/issues/detail?id=3443 TEST=PNaCl toolchain trybots Review URL: https://codereview.chromium.org/15995004
2013-05-29PNaCl: Add ExpandSmallArguments pass to widen parameters to 32 bitsMark Seaborn
This widens i1, i8 and i16 function arguments and return types. Factor out RecreateFunction() helper function from existing PNaCl passes since this is a reoccurring code fragment. BUG=https://code.google.com/p/nativeclient/issues/detail?id=3342 TEST=*.ll tests + PNaCl toolchain trybots + GCC torture tests + LLVM test suite Review URL: https://codereview.chromium.org/15971007
2013-05-24PNaCl: Fix ReplacePtrsWithInts to handle some corner cases correctlyMark Seaborn
Running the LLVM test suite with the ReplacePtrsWithInts pass enabled produced a single failure (in MultiSource/Applications/SPASS), revealing a corner case in which a mixture of forward and backward references plus a bitcast causes the pass to fail (see @forwards_reference() in the test). The problem was that we were doing replaceAllUsesWith() on a placeholder value too early. RewriteMap was mapping a bitcast to a placeholder P, but RewriteMap's reference to P didn't get updated by P->replaceAllUsesWith() and P became a dangling pointer. The fix is: * Change convert() to strip off casts first, so that RewriteMap isn't used for mapping casts to converted values. * Defer the replaceAllUsesWith() calls until after creating all the replacement instructions. This makes the pass more robust against instruction ordering in the input. This requires debug instrinsics to be updated in a separate pass, because replaceAllUsesWith() doesn't work for references by metadata nodes. This also fixes some pathological corner cases of cyclic references in unreachable blocks. Fix indentation in one place. BUG=https://code.google.com/p/nativeclient/issues/detail?id=3343 TEST=replace-ptrs-with-ints.ll + LLVM test suite Review URL: https://codereview.chromium.org/15761003
2013-05-22PNaCl: Add ReplacePtrsWithInts pass for stripping out pointer typesMark Seaborn
ReplacePtrsWithInts converts IR to a normal form in which functions don't reference any aggregate pointer types and pointer types only appear inside a few instructions. Change BlockAddress::replaceUsesOfWithOnConstant() to handle changing a function's type by replacing a function with a bitcast ConstantExpr of a new function. BUG=https://code.google.com/p/nativeclient/issues/detail?id=3343 TEST=replace-ptrs-with-ints.ll + PNaCl toolchain trybots, torture tests, etc. Review URL: https://codereview.chromium.org/14262011