From anton at korobeynikov.info Mon Nov 29 01:06:38 2010 From: anton at korobeynikov.info (Anton Korobeynikov) Date: Mon, 29 Nov 2010 10:06:38 +0300 Subject: [llvm-commits] [llvm] r120225 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h lib/Target/X86/X86InstrCompiler.td test/CodeGen/X86/2009-04-24.ll test/CodeGen/X86/2009-12-11-TLSNoRedZone.ll test/CodeGen/X86/tls Message-ID: >> ? ? MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI, >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MachineBasicBlock *BB) const; >> >> + ? ?MachineBasicBlock *emitLoweredTLSAddr(MachineInstr *MI, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MachineBasicBlock *BB) const; > > BTW: I think what Anton was talking about was the upper to lower case > difference between these two functions not matching. Yeah, exactly. Sorry I was not clear enough :) -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University From geek4civic at gmail.com Mon Nov 29 01:58:32 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Mon, 29 Nov 2010 07:58:32 -0000 Subject: [llvm-commits] [llvm] r120282 - in /llvm/trunk/test: Analysis/Profiling/profiling-tool-chain.ll BugPoint/crash-narrowfunctiontest.ll BugPoint/metadata.ll BugPoint/remove_arguments_test.ll Feature/load_module.ll Message-ID: <20101129075833.04F592A6C12D@llvm.org> Author: chapuni Date: Mon Nov 29 01:58:32 2010 New Revision: 120282 URL: http://llvm.org/viewvc/llvm-project?rev=120282&view=rev Log: test: Check the feature 'loadable_module' with load modules in %llvmshlibdir. %llvmshlibdir should be 'bin' on Cygming. Modified: llvm/trunk/test/Analysis/Profiling/profiling-tool-chain.ll llvm/trunk/test/BugPoint/crash-narrowfunctiontest.ll llvm/trunk/test/BugPoint/metadata.ll llvm/trunk/test/BugPoint/remove_arguments_test.ll llvm/trunk/test/Feature/load_module.ll Modified: llvm/trunk/test/Analysis/Profiling/profiling-tool-chain.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/Profiling/profiling-tool-chain.ll?rev=120282&r1=120281&r2=120282&view=diff ============================================================================== --- llvm/trunk/test/Analysis/Profiling/profiling-tool-chain.ll (original) +++ llvm/trunk/test/Analysis/Profiling/profiling-tool-chain.ll Mon Nov 29 01:58:32 2010 @@ -9,8 +9,8 @@ ; Test the creation, reading and displaying of profile ; RUX: rm -f llvmprof.out -; RUX: lli -load %llvmlibsdir/profile_rt%shlibext %t2 -; RUX: lli -load %llvmlibsdir/profile_rt%shlibext %t2 1 2 +; RUX: lli -load %llvmshlibdir/profile_rt%shlibext %t2 +; RUX: lli -load %llvmshlibdir/profile_rt%shlibext %t2 1 2 ; RUX: llvm-prof -print-all-code %t1 | FileCheck --check-prefix=PROF %s ; Test the loaded profile also with verifier. Modified: llvm/trunk/test/BugPoint/crash-narrowfunctiontest.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/BugPoint/crash-narrowfunctiontest.ll?rev=120282&r1=120281&r2=120282&view=diff ============================================================================== --- llvm/trunk/test/BugPoint/crash-narrowfunctiontest.ll (original) +++ llvm/trunk/test/BugPoint/crash-narrowfunctiontest.ll Mon Nov 29 01:58:32 2010 @@ -1,8 +1,7 @@ ; Test that bugpoint can narrow down the testcase to the important function -; FIXME: This likely fails on windows ; -; RUN: bugpoint -load %llvmlibsdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes > /dev/null -; XFAIL: mingw +; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes > /dev/null +; REQUIRES: loadable_module define i32 @foo() { ret i32 1 } Modified: llvm/trunk/test/BugPoint/metadata.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/BugPoint/metadata.ll?rev=120282&r1=120281&r2=120282&view=diff ============================================================================== --- llvm/trunk/test/BugPoint/metadata.ll (original) +++ llvm/trunk/test/BugPoint/metadata.ll Mon Nov 29 01:58:32 2010 @@ -1,6 +1,6 @@ -; RUN: bugpoint -load %llvmlibsdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes > /dev/null +; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes > /dev/null ; RUN: llvm-dis %t-reduced-simplified.bc -o - | FileCheck %s -; XFAIL: mingw +; REQUIRES: loadable_module ; Bugpoint should keep the call's metadata attached to the call. Modified: llvm/trunk/test/BugPoint/remove_arguments_test.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/BugPoint/remove_arguments_test.ll?rev=120282&r1=120281&r2=120282&view=diff ============================================================================== --- llvm/trunk/test/BugPoint/remove_arguments_test.ll (original) +++ llvm/trunk/test/BugPoint/remove_arguments_test.ll Mon Nov 29 01:58:32 2010 @@ -1,7 +1,6 @@ -; FIXME: This likely fails on windows -; RUN: bugpoint -load %llvmlibsdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes +; RUN: bugpoint -load %llvmshlibdir/BugpointPasses%shlibext %s -output-prefix %t -bugpoint-crashcalls -silence-passes ; RUN: llvm-dis %t-reduced-simplified.bc -o - | FileCheck %s -; XFAIL: mingw +; REQUIRES: loadable_module ; Test to make sure that arguments are removed from the function if they are ; unnecessary. And clean up any types that that frees up too. Modified: llvm/trunk/test/Feature/load_module.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Feature/load_module.ll?rev=120282&r1=120281&r2=120282&view=diff ============================================================================== --- llvm/trunk/test/Feature/load_module.ll (original) +++ llvm/trunk/test/Feature/load_module.ll Mon Nov 29 01:58:32 2010 @@ -1,6 +1,8 @@ ; PR1318 -; RUN: opt < %s -load=%llvmlibsdir/LLVMHello%shlibext -hello \ +; RUN: opt < %s -load=%llvmshlibdir/LLVMHello%shlibext -hello \ ; RUN: -disable-output |& grep Hello +; REQUIRES: loadable_module +; FIXME: On Cygming, it might fail without building LLVMHello manually. @junk = global i32 0 From geek4civic at gmail.com Mon Nov 29 02:03:06 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Mon, 29 Nov 2010 17:03:06 +0900 Subject: [llvm-commits] [Review request] test: Add the new feature "loadable_module" In-Reply-To: References: Message-ID: Hello Daniel, I committed patches below as r120273 to r120276, and r120282, thank you. * 0001-test-Add-the-new-feature-loadable_module.patch * 0002-test-Use-SharedLibDir-for-loadable-modules.-On-Cygmi.patch * 0004-tools-Makefile-Enable-building-lto-edis-and-bugpoint.patch * 0005-test-Check-the-feature-loadable_module-with-load-mod.patch * 0006-tools-Makefile-Fix-indentation.patch I expect they would reduce a failure on xp-msvc9. Indeed, "LLVMHello" might be so hacked. A patche is pending. * 0003-Makefile-Change-the-order-of-building-lib-Transforms.patch I have tried to tweak test/Feature/load_module.ll to use BugpointPasses instead of LLVMHello, and then I knew it might be redundant; test/Feature/load_module.ll examines functionality of loading module, grabbing option, and executing pass. On ToT, they are done by test/BugPoint/. When test/BugPoint(s) pass, Feature/load_module must pass. My suggestion: May I remove test/Feature/load_module.ll ? Then, we could move lib/Transforms/Hello to examples :) ...Takumi From baldrick at free.fr Mon Nov 29 02:20:55 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 29 Nov 2010 09:20:55 +0100 Subject: [llvm-commits] [llvm] r120253 - /llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp In-Reply-To: <20101128180053.C495E2A6C12C@llvm.org> References: <20101128180053.C495E2A6C12C@llvm.org> Message-ID: <4CF36267.8010408@free.fr> > When emitting a single function with cppgen=function, you don't want to emit > initializers of global variables used in the function. > Also make sure to emit the operands of a constant. Testcase? Ciao, Duncan. From baldrick at free.fr Mon Nov 29 02:44:40 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 29 Nov 2010 09:44:40 +0100 Subject: [llvm-commits] [llvm] r120281 - /llvm/trunk/lib/Analysis/InstructionSimplify.cpp In-Reply-To: <20101129014113.A2B5B2A6C12D@llvm.org> References: <20101129014113.A2B5B2A6C12D@llvm.org> Message-ID: <4CF367F8.8020802@free.fr> Hi Chandler, > Add some dead stores to pacify my least favorite GCC warning: may be > uninitialized. The warning is terrible, has incorrect source locations, and has > a huge false positive rate such as *all* of these. > > If anyone has a better solution, please let me know. Alternatively, I'll > happily add -Wno-uninitialized to the -Werror build mode. Maybe I can even do > it *only* when building with GCC instead of Clang. thanks for fixing this. This issue with pattern matching resulting in "may be used uninitialized" warnings has come up before with recent versions of gcc, and indeed seems to be bogus. How about opening a gcc bug report about this? Ciao, Duncan. From geek4civic at gmail.com Mon Nov 29 02:58:11 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Mon, 29 Nov 2010 08:58:11 -0000 Subject: [llvm-commits] [llvm] r120283 - /llvm/trunk/tools/Makefile Message-ID: <20101129085811.5F7E02A6C12F@llvm.org> Author: chapuni Date: Mon Nov 29 02:58:11 2010 New Revision: 120283 URL: http://llvm.org/viewvc/llvm-project?rev=120283&view=rev Log: tools/Makefile: Don't look into $(TARGET_OS), but $(HOST_OS), to inspect availability of loadable module! The last commit made run.build.step.test_llvm_1 to fail. Modified: llvm/trunk/tools/Makefile Modified: llvm/trunk/tools/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/Makefile?rev=120283&r1=120282&r2=120283&view=diff ============================================================================== --- llvm/trunk/tools/Makefile (original) +++ llvm/trunk/tools/Makefile Mon Nov 29 02:58:11 2010 @@ -60,7 +60,7 @@ # On Win32, loadable modules can be built with ENABLE_SHARED. ifneq ($(ENABLE_SHARED),1) - ifneq (,$(filter $(TARGET_OS), Cygwin MingW)) + ifneq (,$(filter $(HOST_OS), Cygwin MingW)) PARALLEL_DIRS := $(filter-out bugpoint-passes, \ $(PARALLEL_DIRS)) endif From kalle.raiskila at nokia.com Mon Nov 29 03:36:26 2010 From: kalle.raiskila at nokia.com (Kalle Raiskila) Date: Mon, 29 Nov 2010 09:36:26 -0000 Subject: [llvm-commits] [llvm] r120284 - /llvm/trunk/lib/Target/CellSPU/SPUISelDAGToDAG.cpp Message-ID: <20101129093626.5D4BF2A6C12D@llvm.org> Author: kraiskil Date: Mon Nov 29 03:36:26 2010 New Revision: 120284 URL: http://llvm.org/viewvc/llvm-project?rev=120284&view=rev Log: Add missing i128 case. Modified: llvm/trunk/lib/Target/CellSPU/SPUISelDAGToDAG.cpp Modified: llvm/trunk/lib/Target/CellSPU/SPUISelDAGToDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUISelDAGToDAG.cpp?rev=120284&r1=120283&r2=120284&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPUISelDAGToDAG.cpp (original) +++ llvm/trunk/lib/Target/CellSPU/SPUISelDAGToDAG.cpp Mon Nov 29 03:36:26 2010 @@ -596,6 +596,9 @@ case MVT::i64: return CurDAG->getTargetConstant(SPU::R64CRegClass.getID(), MVT::i32); break; + case MVT::i128: + return CurDAG->getTargetConstant(SPU::GPRCRegClass.getID(), MVT::i32); + break; case MVT::v16i8: case MVT::v8i16: case MVT::v4i32: From kalle.raiskila at nokia.com Mon Nov 29 04:08:09 2010 From: kalle.raiskila at nokia.com (Kalle Raiskila) Date: Mon, 29 Nov 2010 10:08:09 -0000 Subject: [llvm-commits] [llvm] r120285 - in /llvm/trunk/lib/Target/CellSPU: SPUISelLowering.h SPUInstrInfo.td Message-ID: <20101129100809.7D2D92A6C12D@llvm.org> Author: kraiskil Date: Mon Nov 29 04:08:09 2010 New Revision: 120285 URL: http://llvm.org/viewvc/llvm-project?rev=120285&view=rev Log: Allow machine LICM to do its job on SPU. -return a sensible value for register pressure -add pattern to 'ila' instrucion Modified: llvm/trunk/lib/Target/CellSPU/SPUISelLowering.h llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td Modified: llvm/trunk/lib/Target/CellSPU/SPUISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUISelLowering.h?rev=120285&r1=120284&r2=120285&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPUISelLowering.h (original) +++ llvm/trunk/lib/Target/CellSPU/SPUISelLowering.h Mon Nov 29 04:08:09 2010 @@ -181,6 +181,14 @@ virtual bool isLegalAddressingMode(const AddrMode &AM, const Type *Ty) const; + + /// After allocating this many registers, the allocator should feel + /// register pressure. The value is a somewhat random guess, based on the + /// number of non callee saved registers in the C calling convention. + virtual unsigned getRegPressureLimit( const TargetRegisterClass *RC, + MachineFunction &MF) const{ + return 50; + } }; } Modified: llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td?rev=120285&r1=120284&r2=120285&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td (original) +++ llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td Mon Nov 29 04:08:09 2010 @@ -416,7 +416,7 @@ def lo: ILARegInst; def lsa: ILAInst<(outs R32C:$rT), (ins symbolLSA:$val), - [/* no pattern */]>; + [(set R32C:$rT, imm18:$val)]>; } defm ILA : ImmLoadAddress; From kalle.raiskila at nokia.com Mon Nov 29 04:30:26 2010 From: kalle.raiskila at nokia.com (Kalle Raiskila) Date: Mon, 29 Nov 2010 10:30:26 -0000 Subject: [llvm-commits] [llvm] r120286 - in /llvm/trunk: lib/Target/CellSPU/SPUSubtarget.cpp lib/Target/CellSPU/SPUSubtarget.h test/CodeGen/CellSPU/sext128.ll test/CodeGen/CellSPU/shuffles.ll Message-ID: <20101129103026.172DA2A6C12D@llvm.org> Author: kraiskil Date: Mon Nov 29 04:30:25 2010 New Revision: 120286 URL: http://llvm.org/viewvc/llvm-project?rev=120286&view=rev Log: Enable PostRA scheduling for SPU. This speeds up selected test cases with up to 5% - no slowdowns observed. Modified: llvm/trunk/lib/Target/CellSPU/SPUSubtarget.cpp llvm/trunk/lib/Target/CellSPU/SPUSubtarget.h llvm/trunk/test/CodeGen/CellSPU/sext128.ll llvm/trunk/test/CodeGen/CellSPU/shuffles.ll Modified: llvm/trunk/lib/Target/CellSPU/SPUSubtarget.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUSubtarget.cpp?rev=120286&r1=120285&r2=120286&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPUSubtarget.cpp (original) +++ llvm/trunk/lib/Target/CellSPU/SPUSubtarget.cpp Mon Nov 29 04:30:25 2010 @@ -14,6 +14,8 @@ #include "SPUSubtarget.h" #include "SPU.h" #include "SPUGenSubtarget.inc" +#include "llvm/ADT/SmallVector.h" +#include "SPURegisterInfo.h" using namespace llvm; @@ -34,3 +36,22 @@ /// producing code for the JIT. void SPUSubtarget::SetJITMode() { } + +/// Enable PostRA scheduling for optimization levels -O2 and -O3. +bool SPUSubtarget::enablePostRAScheduler( + CodeGenOpt::Level OptLevel, + TargetSubtarget::AntiDepBreakMode& Mode, + RegClassVector& CriticalPathRCs) const { + Mode = TargetSubtarget::ANTIDEP_CRITICAL; + // CriticalPathsRCs seems to be the set of + // RegisterClasses that antidep breakings are performed for. + // Do it for all register classes + CriticalPathRCs.clear(); + CriticalPathRCs.push_back(&SPU::R8CRegClass); + CriticalPathRCs.push_back(&SPU::R16CRegClass); + CriticalPathRCs.push_back(&SPU::R32CRegClass); + CriticalPathRCs.push_back(&SPU::R32FPRegClass); + CriticalPathRCs.push_back(&SPU::R64CRegClass); + CriticalPathRCs.push_back(&SPU::VECREGRegClass); + return OptLevel >= CodeGenOpt::Default; +} Modified: llvm/trunk/lib/Target/CellSPU/SPUSubtarget.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUSubtarget.h?rev=120286&r1=120285&r2=120286&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPUSubtarget.h (original) +++ llvm/trunk/lib/Target/CellSPU/SPUSubtarget.h Mon Nov 29 04:30:25 2010 @@ -84,6 +84,10 @@ "-i16:16:128-i8:8:128-i1:8:128-a:0:128-v64:64:128-v128:128:128" "-s:128:128-n32:64"; } + + bool enablePostRAScheduler(CodeGenOpt::Level OptLevel, + TargetSubtarget::AntiDepBreakMode& Mode, + RegClassVector& CriticalPathRCs) const; }; } // End llvm namespace Modified: llvm/trunk/test/CodeGen/CellSPU/sext128.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/CellSPU/sext128.ll?rev=120286&r1=120285&r2=120286&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/CellSPU/sext128.ll (original) +++ llvm/trunk/test/CodeGen/CellSPU/sext128.ll Mon Nov 29 04:30:25 2010 @@ -13,8 +13,8 @@ ; CHECK: long 66051 ; CHECK: long 67438087 ; CHECK-NOT: rotqmbyi -; CHECK: rotmai ; CHECK: lqa +; CHECK: rotmai ; CHECK: shufb } @@ -27,8 +27,8 @@ ; CHECK: long 269488144 ; CHECK: long 66051 ; CHECK-NOT: rotqmbyi -; CHECK: rotmai ; CHECK: lqa +; CHECK: rotmai ; CHECK: shufb } @@ -42,8 +42,8 @@ ; CHECK: long 269488144 ; CHECK: long 66051 ; CHECK-NOT: rotqmbyi -; CHECK: rotmai ; CHECK: lqa +; CHECK: rotmai ; CHECK: shufb } Modified: llvm/trunk/test/CodeGen/CellSPU/shuffles.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/CellSPU/shuffles.ll?rev=120286&r1=120285&r2=120286&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/CellSPU/shuffles.ll (original) +++ llvm/trunk/test/CodeGen/CellSPU/shuffles.ll Mon Nov 29 04:30:25 2010 @@ -1,4 +1,4 @@ -; RUN: llc --march=cellspu < %s | FileCheck %s +; RUN: llc -O1 --march=cellspu < %s | FileCheck %s define <4 x float> @shuffle(<4 x float> %param1, <4 x float> %param2) { ; CHECK: cwd {{\$.}}, 0($sp) From jay.foad at gmail.com Mon Nov 29 04:51:03 2010 From: jay.foad at gmail.com (Jay Foad) Date: Mon, 29 Nov 2010 10:51:03 +0000 Subject: [llvm-commits] [PATCH] Bug 5207: make APInt set(), clear() and flip() return void Message-ID: http://llvm.org/bugs/show_bug.cgi?id=5207 The bug says, among other things, that APInt methods "that update in place should return void to make it really clear that they do not return a new APInt". The attached patch does this for the methods set(), clear() and flip(). It passes "make check". I don't think any changes are needed in cfe/trunk/ or llvm-gcc-4.2/trunk/. This does make some code more long-winded, e.g.: static APInt getMaxValue(unsigned numBits) { - return APInt(numBits, 0).set(); + APInt API(numBits, 0); + API.set(); + return API; } Do you still think it's a good idea? If so, OK to commit? Thanks, Jay. -------------- next part -------------- A non-text attachment was scrubbed... Name: setclearflip.diff Type: text/x-patch Size: 6128 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/dac9005a/attachment.bin From rafael.espindola at gmail.com Mon Nov 29 06:09:22 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Mon, 29 Nov 2010 07:09:22 -0500 Subject: [llvm-commits] [llvm] r120225 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h lib/Target/X86/X86InstrCompiler.td test/CodeGen/X86/2009-04-24.ll test/CodeGen/X86/2009-12-11-TLSNoRedZone.ll test/CodeGen/X86/tls Message-ID: On 29 November 2010 00:46, Eric Christopher wrote: > > On Nov 27, 2010, at 12:43 PM, Rafael Espindola wrote: > >> ? ? MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI, >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MachineBasicBlock *BB) const; >> >> + ? ?MachineBasicBlock *emitLoweredTLSAddr(MachineInstr *MI, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MachineBasicBlock *BB) const; > > BTW: I think what Anton was talking about was the upper to lower case > difference between these two functions not matching. > > Since we don't have a final dictate for the time being can you make > various bits of code match the same file? :) Sure. This particular one got fixed by moving the lowering to the MC level. > -eric > Cheers, Rafael From foldr at codedgers.com Mon Nov 29 08:20:46 2010 From: foldr at codedgers.com (Mikhail Glushenkov) Date: Mon, 29 Nov 2010 15:20:46 +0100 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> Message-ID: <20101129142046.GA2741@localhost.localdomain> Hi Eric, On Sun, Nov 28, 2010 at 09:41:47PM -0800, Eric Christopher wrote: > > [...] > > I'm not particularly happy with this direction at the moment. Ideally I > think that if we want to support the full set of gcc command line options > (in particular the abomination that is the arm version) we'll need to > explicitly factor the backends to support them instead of trying to translate > each march option (which is, tbh, what we really support at the moment) > into a set of mattr flags. We would then need, at least a: > > a) target processor compiled for > b) target cpu family compiled for (arm only afaik) > c) target processor tuned for > > in order to support -march, -mcpu, and -mtune (in that order). How difficult of an undertaking would that be for someone who never worked on a LLVM backend? I'm not very fond of the current solution, but backend hacking is an uncharted territory for me. > In particular the implementation that you have here won't work for any > other processor that I know of at the moment. Yes, it is incomplete. -- () ascii ribbon campaign - against html e-mail /\ www.asciiribbon.org - against proprietary attachments From kalle.raiskila at nokia.com Mon Nov 29 08:44:28 2010 From: kalle.raiskila at nokia.com (Kalle Raiskila) Date: Mon, 29 Nov 2010 14:44:28 -0000 Subject: [llvm-commits] [llvm] r120288 - in /llvm/trunk: lib/Target/CellSPU/SPUInstrInfo.td test/CodeGen/CellSPU/shift_ops.ll Message-ID: <20101129144428.B885C2A6C12D@llvm.org> Author: kraiskil Date: Mon Nov 29 08:44:28 2010 New Revision: 120288 URL: http://llvm.org/viewvc/llvm-project?rev=120288&view=rev Log: Handle lshr for i128 correctly on SPU also when shiftamount > 7. Modified: llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td llvm/trunk/test/CodeGen/CellSPU/shift_ops.ll Modified: llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td?rev=120288&r1=120287&r2=120288&view=diff ============================================================================== --- llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td (original) +++ llvm/trunk/lib/Target/CellSPU/SPUInstrInfo.td Mon Nov 29 08:44:28 2010 @@ -2727,6 +2727,8 @@ def v8i16: ROTQMBYBIVecInst; def v4i32: ROTQMBYBIVecInst; def v2i64: ROTQMBYBIVecInst; + def r128: ROTQMBYBIInst<(outs GPRC:$rT), (ins GPRC:$rA, R32C:$rB), + [/*no pattern*/]>; } defm ROTQMBYBI: RotateMaskQuadByBitCount; @@ -2762,8 +2764,9 @@ defm ROTQMBI: RotateMaskQuadByBits; def : Pat<(srl GPRC:$rA, R32C:$rB), - (ROTQMBIr128 GPRC:$rA, - (SFIr32 R32C:$rB, 0))>; + (ROTQMBYBIr128 (ROTQMBIr128 GPRC:$rA, + (SFIr32 R32C:$rB, 0)), + (SFIr32 R32C:$rB, 0))>; //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ Modified: llvm/trunk/test/CodeGen/CellSPU/shift_ops.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/CellSPU/shift_ops.ll?rev=120288&r1=120287&r2=120288&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/CellSPU/shift_ops.ll (original) +++ llvm/trunk/test/CodeGen/CellSPU/shift_ops.ll Mon Nov 29 08:44:28 2010 @@ -10,11 +10,12 @@ ; RUN: grep {rotqmbyi } %t1.s | count 1 ; RUN: grep {rotqmbii } %t1.s | count 2 ; RUN: grep {rotqmby } %t1.s | count 1 -; RUN: grep {rotqmbi } %t1.s | count 1 +; RUN: grep {rotqmbi } %t1.s | count 2 ; RUN: grep {rotqbyi } %t1.s | count 1 ; RUN: grep {rotqbii } %t1.s | count 2 ; RUN: grep {rotqbybi } %t1.s | count 1 -; RUN: grep {sfi } %t1.s | count 3 +; RUN: grep {sfi } %t1.s | count 4 +; RUN: cat %t1.s | FileCheck %s target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128" target triple = "spu" @@ -281,3 +282,14 @@ %2 = trunc i64 %1 to i32 ret i32 %2 } + +; some random tests +define i128 @test_lshr_i128( i128 %val ) { + ;CHECK: test_lshr_i128 + ;CHECK: sfi + ;CHECK: rotqmbi + ;CHECK: rotqmbybi + ;CHECK: bi $lr + %rv = lshr i128 %val, 64 + ret i128 %rv +} From Micah.Villmow at amd.com Mon Nov 29 10:27:11 2010 From: Micah.Villmow at amd.com (Villmow, Micah) Date: Mon, 29 Nov 2010 10:27:11 -0600 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: References: Message-ID: Ping. Anyone? From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Villmow, Micah Sent: Tuesday, November 23, 2010 1:39 PM To: llvm-commits Subject: [llvm-commits] Patch for Bug7696 Reposting bug report here, any chance that it can get reviewed? Patch that adds a boolean where a backend can specify whether to disable certain optimizations because jumps are expensive. The selection dag builder has an 'optimization' added into the visitBr function which makes assumptions that are not valid on all architectures. The problem is this. The following function kernel void cf_test(global int* a, int b, int c, int e) { int d = 0; if (!b && c < e) { d = a + b; } *a = d; } Is transformed into something equivalent to this: Kernel void cf_test(global int* a, int b, int c, int e) { Int d; If (b) { d = 0; } else { if (c < e) { d = a + b; } else { d = 0; } } *a = d; } by the visitBr code found in SelectionDAGBuilder::visitBr():1188. However, if jumps are expensive or jumps are not supported and high level flow control needs to be reconstructed. This is extremely inefficient. For example on AMD GPU's, a single flow control instruction can take 40 cycles to execute, but an bit instruction, can be executed every cycle. So obviously the assumptions made by this block of code are inefficient on AMD hardware. Increasing control flow has a direct impact on performance and removing the extra 'and' or 'or' in order to short circuit the conditional evaluation does not work for our target. So in order to make this type of instruction rely more on target specific information. I've added a new Boolean to the TargetLoweringInfo class called JumpIsExpensive along with accessor functions. Please review the patch and apply if acceptable. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/159758b1/attachment.html From ofv at wanadoo.es Mon Nov 29 11:01:52 2010 From: ofv at wanadoo.es (=?utf-8?Q?=C3=93scar?= Fuentes) Date: Mon, 29 Nov 2010 18:01:52 +0100 Subject: [llvm-commits] [PATCH] CMake/tests: adding dependencies to "check" "check-all" (and "clang-test") In-Reply-To: (NAKAMURA Takumi's message of "Mon, 29 Nov 2010 11:58:53 +0900") References: Message-ID: <87sjykrrlr.fsf@telefonica.net> Hello Takumi. NAKAMURA Takumi writes: > I committed "check-all" in clang r120280. > > As the next patch, I propose to add dependencies to "check" > "check-all" and "clang-test". > > I think it would be a good idea "check" and "check-all" could have > *right* dependencies on CMake, > though, they do not have any dependencies on autoconf make. Although the idea sounds like the Right Thing, in practice it slows down "make check" because it must ensure that all required dependencies are satisfied before running the tests. On some platforms (Windows/Visual Studio) that's a lot of time and even on fast Linux machines can be annoying. As I don't use "make check" too often, I'll left the final word to those who actually care. [snip] From bigcheesegs at gmail.com Mon Nov 29 12:03:12 2010 From: bigcheesegs at gmail.com (Michael Spencer) Date: Mon, 29 Nov 2010 13:03:12 -0500 Subject: [llvm-commits] [PATCH] Merge System into Support Message-ID: I ran into circular dependencies with the ADT parts of Support while implementing sys::path. Chris said to just merge System and Support, so here it is. Attached are patches for both LLVM and clang. This does not remove the namespace, it only moves the files, updates includes, and fixes the build system. I'm not sure that I correctly fixed GNU Build, however, it does work on Linux. This is going to be a major change for almost every project that uses LLVM. Should we keep headers in System that forward to Support for a little bit? - Michael Spencer -------------- next part -------------- A non-text attachment was scrubbed... Name: merge-system-support-llvm.patch Type: application/octet-stream Size: 938807 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/7dc768bc/attachment-0002.obj -------------- next part -------------- A non-text attachment was scrubbed... Name: merge-system-support-clang.patch Type: application/octet-stream Size: 23085 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/7dc768bc/attachment-0003.obj From anton at korobeynikov.info Mon Nov 29 12:13:04 2010 From: anton at korobeynikov.info (Anton Korobeynikov) Date: Mon, 29 Nov 2010 21:13:04 +0300 Subject: [llvm-commits] [PATCH] Merge System into Support In-Reply-To: References: Message-ID: > This is going to be a major change for almost every project that uses > LLVM. Should we keep headers in System that forward to Support for a > little bit? This sounds like a sane idea at least for 2.9 -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University From bigcheesegs at gmail.com Mon Nov 29 12:16:11 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 18:16:11 -0000 Subject: [llvm-commits] [llvm] r120298 - in /llvm/trunk: ./ autoconf/ cmake/ include/llvm-c/ include/llvm/ include/llvm/ADT/ include/llvm/Analysis/ include/llvm/Bitcode/ include/llvm/CodeGen/ include/llvm/CompilerDriver/ include/llvm/ExecutionEngine/ include/llvm/MC/ include/llvm/MC/MCParser/ include/llvm/Object/ include/llvm/Support/ include/llvm/System/ include/llvm/Target/ lib/Analysis/ lib/Archive/ lib/Bitcode/Writer/ lib/CodeGen/ lib/CodeGen/AsmPrinter/ lib/CodeGen/SelectionDAG/ lib/ExecutionEngine/ lib/ExecutionEngine/Int... Message-ID: <20101129181614.5ADCF2A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 12:16:10 2010 New Revision: 120298 URL: http://llvm.org/viewvc/llvm-project?rev=120298&view=rev Log: Merge System into Support. Added: llvm/trunk/include/llvm/Support/AIXDataTypesFix.h - copied, changed from r120288, llvm/trunk/include/llvm/System/AIXDataTypesFix.h llvm/trunk/include/llvm/Support/Alarm.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Alarm.h llvm/trunk/include/llvm/Support/Atomic.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Atomic.h llvm/trunk/include/llvm/Support/DataTypes.h.cmake - copied, changed from r120288, llvm/trunk/include/llvm/System/DataTypes.h.cmake llvm/trunk/include/llvm/Support/DataTypes.h.in - copied, changed from r120288, llvm/trunk/include/llvm/System/DataTypes.h.in llvm/trunk/include/llvm/Support/Disassembler.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Disassembler.h llvm/trunk/include/llvm/Support/DynamicLibrary.h - copied, changed from r120288, llvm/trunk/include/llvm/System/DynamicLibrary.h llvm/trunk/include/llvm/Support/Errno.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Errno.h llvm/trunk/include/llvm/Support/FEnv.h - copied, changed from r120288, llvm/trunk/include/llvm/System/FEnv.h llvm/trunk/include/llvm/Support/Host.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Host.h llvm/trunk/include/llvm/Support/IncludeFile.h - copied, changed from r120288, llvm/trunk/include/llvm/System/IncludeFile.h llvm/trunk/include/llvm/Support/LICENSE.TXT - copied, changed from r120288, llvm/trunk/include/llvm/System/LICENSE.TXT llvm/trunk/include/llvm/Support/Memory.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Memory.h llvm/trunk/include/llvm/Support/Mutex.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Mutex.h llvm/trunk/include/llvm/Support/Path.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Path.h llvm/trunk/include/llvm/Support/PathV2.h - copied, changed from r120288, llvm/trunk/include/llvm/System/PathV2.h llvm/trunk/include/llvm/Support/Process.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Process.h llvm/trunk/include/llvm/Support/Program.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Program.h llvm/trunk/include/llvm/Support/RWMutex.h - copied, changed from r120288, llvm/trunk/include/llvm/System/RWMutex.h llvm/trunk/include/llvm/Support/Signals.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Signals.h llvm/trunk/include/llvm/Support/Solaris.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Solaris.h llvm/trunk/include/llvm/Support/SwapByteOrder.h - copied, changed from r120288, llvm/trunk/include/llvm/System/SwapByteOrder.h llvm/trunk/include/llvm/Support/ThreadLocal.h - copied, changed from r120288, llvm/trunk/include/llvm/System/ThreadLocal.h llvm/trunk/include/llvm/Support/Threading.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Threading.h llvm/trunk/include/llvm/Support/TimeValue.h - copied, changed from r120288, llvm/trunk/include/llvm/System/TimeValue.h llvm/trunk/include/llvm/Support/Valgrind.h - copied, changed from r120288, llvm/trunk/include/llvm/System/Valgrind.h llvm/trunk/include/llvm/Support/system_error.h - copied, changed from r120288, llvm/trunk/include/llvm/System/system_error.h llvm/trunk/lib/Support/Alarm.cpp - copied, changed from r120288, llvm/trunk/lib/System/Alarm.cpp llvm/trunk/lib/Support/Atomic.cpp - copied, changed from r120288, llvm/trunk/lib/System/Atomic.cpp llvm/trunk/lib/Support/Disassembler.cpp - copied, changed from r120288, llvm/trunk/lib/System/Disassembler.cpp llvm/trunk/lib/Support/DynamicLibrary.cpp - copied, changed from r120288, llvm/trunk/lib/System/DynamicLibrary.cpp llvm/trunk/lib/Support/Errno.cpp - copied, changed from r120288, llvm/trunk/lib/System/Errno.cpp llvm/trunk/lib/Support/Host.cpp - copied, changed from r120288, llvm/trunk/lib/System/Host.cpp llvm/trunk/lib/Support/IncludeFile.cpp - copied, changed from r120288, llvm/trunk/lib/System/IncludeFile.cpp llvm/trunk/lib/Support/Memory.cpp - copied, changed from r120288, llvm/trunk/lib/System/Memory.cpp llvm/trunk/lib/Support/Mutex.cpp - copied, changed from r120288, llvm/trunk/lib/System/Mutex.cpp llvm/trunk/lib/Support/Path.cpp - copied, changed from r120288, llvm/trunk/lib/System/Path.cpp llvm/trunk/lib/Support/Process.cpp - copied, changed from r120288, llvm/trunk/lib/System/Process.cpp llvm/trunk/lib/Support/Program.cpp - copied, changed from r120288, llvm/trunk/lib/System/Program.cpp llvm/trunk/lib/Support/README.txt.system - copied, changed from r120288, llvm/trunk/lib/System/README.txt llvm/trunk/lib/Support/RWMutex.cpp - copied, changed from r120288, llvm/trunk/lib/System/RWMutex.cpp llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp - copied, changed from r120288, llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp llvm/trunk/lib/Support/Signals.cpp - copied, changed from r120288, llvm/trunk/lib/System/Signals.cpp llvm/trunk/lib/Support/ThreadLocal.cpp - copied, changed from r120288, llvm/trunk/lib/System/ThreadLocal.cpp llvm/trunk/lib/Support/Threading.cpp - copied, changed from r120288, llvm/trunk/lib/System/Threading.cpp llvm/trunk/lib/Support/TimeValue.cpp - copied, changed from r120288, llvm/trunk/lib/System/TimeValue.cpp llvm/trunk/lib/Support/Unix/ llvm/trunk/lib/Support/Unix/Alarm.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Alarm.inc llvm/trunk/lib/Support/Unix/Host.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Host.inc llvm/trunk/lib/Support/Unix/Memory.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Memory.inc llvm/trunk/lib/Support/Unix/Mutex.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Mutex.inc llvm/trunk/lib/Support/Unix/Path.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Path.inc llvm/trunk/lib/Support/Unix/Process.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Process.inc llvm/trunk/lib/Support/Unix/Program.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Program.inc llvm/trunk/lib/Support/Unix/README.txt - copied, changed from r120288, llvm/trunk/lib/System/Unix/README.txt llvm/trunk/lib/Support/Unix/RWMutex.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/RWMutex.inc llvm/trunk/lib/Support/Unix/Signals.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/Signals.inc llvm/trunk/lib/Support/Unix/ThreadLocal.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/ThreadLocal.inc llvm/trunk/lib/Support/Unix/TimeValue.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/TimeValue.inc llvm/trunk/lib/Support/Unix/Unix.h - copied, changed from r120288, llvm/trunk/lib/System/Unix/Unix.h llvm/trunk/lib/Support/Unix/system_error.inc - copied, changed from r120288, llvm/trunk/lib/System/Unix/system_error.inc llvm/trunk/lib/Support/Valgrind.cpp - copied, changed from r120288, llvm/trunk/lib/System/Valgrind.cpp llvm/trunk/lib/Support/Windows/ llvm/trunk/lib/Support/Windows/Alarm.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Alarm.inc llvm/trunk/lib/Support/Windows/DynamicLibrary.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/DynamicLibrary.inc llvm/trunk/lib/Support/Windows/Host.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Host.inc llvm/trunk/lib/Support/Windows/Memory.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Memory.inc llvm/trunk/lib/Support/Windows/Mutex.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Mutex.inc llvm/trunk/lib/Support/Windows/Path.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Path.inc llvm/trunk/lib/Support/Windows/Process.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Process.inc llvm/trunk/lib/Support/Windows/Program.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Program.inc llvm/trunk/lib/Support/Windows/RWMutex.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/RWMutex.inc llvm/trunk/lib/Support/Windows/Signals.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/Signals.inc llvm/trunk/lib/Support/Windows/ThreadLocal.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/ThreadLocal.inc llvm/trunk/lib/Support/Windows/TimeValue.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/TimeValue.inc llvm/trunk/lib/Support/Windows/Windows.h - copied, changed from r120288, llvm/trunk/lib/System/Win32/Win32.h llvm/trunk/lib/Support/Windows/system_error.inc - copied, changed from r120288, llvm/trunk/lib/System/Win32/system_error.inc llvm/trunk/lib/Support/system_error.cpp - copied, changed from r120288, llvm/trunk/lib/System/system_error.cpp Removed: llvm/trunk/include/llvm/System/AIXDataTypesFix.h llvm/trunk/include/llvm/System/Alarm.h llvm/trunk/include/llvm/System/Atomic.h llvm/trunk/include/llvm/System/DataTypes.h.cmake llvm/trunk/include/llvm/System/DataTypes.h.in llvm/trunk/include/llvm/System/Disassembler.h llvm/trunk/include/llvm/System/DynamicLibrary.h llvm/trunk/include/llvm/System/Errno.h llvm/trunk/include/llvm/System/FEnv.h llvm/trunk/include/llvm/System/Host.h llvm/trunk/include/llvm/System/IncludeFile.h llvm/trunk/include/llvm/System/LICENSE.TXT llvm/trunk/include/llvm/System/Memory.h llvm/trunk/include/llvm/System/Mutex.h llvm/trunk/include/llvm/System/Path.h llvm/trunk/include/llvm/System/PathV2.h llvm/trunk/include/llvm/System/Process.h llvm/trunk/include/llvm/System/Program.h llvm/trunk/include/llvm/System/RWMutex.h llvm/trunk/include/llvm/System/Signals.h llvm/trunk/include/llvm/System/Solaris.h llvm/trunk/include/llvm/System/SwapByteOrder.h llvm/trunk/include/llvm/System/ThreadLocal.h llvm/trunk/include/llvm/System/Threading.h llvm/trunk/include/llvm/System/TimeValue.h llvm/trunk/include/llvm/System/Valgrind.h llvm/trunk/include/llvm/System/system_error.h llvm/trunk/lib/System/Alarm.cpp llvm/trunk/lib/System/Atomic.cpp llvm/trunk/lib/System/CMakeLists.txt llvm/trunk/lib/System/Disassembler.cpp llvm/trunk/lib/System/DynamicLibrary.cpp llvm/trunk/lib/System/Errno.cpp llvm/trunk/lib/System/Host.cpp llvm/trunk/lib/System/IncludeFile.cpp llvm/trunk/lib/System/Makefile llvm/trunk/lib/System/Memory.cpp llvm/trunk/lib/System/Mutex.cpp llvm/trunk/lib/System/Path.cpp llvm/trunk/lib/System/Process.cpp llvm/trunk/lib/System/Program.cpp llvm/trunk/lib/System/README.txt llvm/trunk/lib/System/RWMutex.cpp llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp llvm/trunk/lib/System/Signals.cpp llvm/trunk/lib/System/ThreadLocal.cpp llvm/trunk/lib/System/Threading.cpp llvm/trunk/lib/System/TimeValue.cpp llvm/trunk/lib/System/Unix/Alarm.inc llvm/trunk/lib/System/Unix/Host.inc llvm/trunk/lib/System/Unix/Memory.inc llvm/trunk/lib/System/Unix/Mutex.inc llvm/trunk/lib/System/Unix/Path.inc llvm/trunk/lib/System/Unix/Process.inc llvm/trunk/lib/System/Unix/Program.inc llvm/trunk/lib/System/Unix/README.txt llvm/trunk/lib/System/Unix/RWMutex.inc llvm/trunk/lib/System/Unix/Signals.inc llvm/trunk/lib/System/Unix/ThreadLocal.inc llvm/trunk/lib/System/Unix/TimeValue.inc llvm/trunk/lib/System/Unix/Unix.h llvm/trunk/lib/System/Unix/system_error.inc llvm/trunk/lib/System/Valgrind.cpp llvm/trunk/lib/System/Win32/Alarm.inc llvm/trunk/lib/System/Win32/DynamicLibrary.inc llvm/trunk/lib/System/Win32/Host.inc llvm/trunk/lib/System/Win32/Memory.inc llvm/trunk/lib/System/Win32/Mutex.inc llvm/trunk/lib/System/Win32/Path.inc llvm/trunk/lib/System/Win32/Process.inc llvm/trunk/lib/System/Win32/Program.inc llvm/trunk/lib/System/Win32/RWMutex.inc llvm/trunk/lib/System/Win32/Signals.inc llvm/trunk/lib/System/Win32/ThreadLocal.inc llvm/trunk/lib/System/Win32/TimeValue.inc llvm/trunk/lib/System/Win32/Win32.h llvm/trunk/lib/System/Win32/system_error.inc llvm/trunk/lib/System/system_error.cpp Modified: llvm/trunk/CMakeLists.txt llvm/trunk/Makefile llvm/trunk/Makefile.rules llvm/trunk/autoconf/configure.ac llvm/trunk/cmake/config-ix.cmake llvm/trunk/configure llvm/trunk/include/llvm-c/EnhancedDisassembly.h llvm/trunk/include/llvm/ADT/EquivalenceClasses.h llvm/trunk/include/llvm/ADT/FoldingSet.h llvm/trunk/include/llvm/ADT/ImmutableList.h llvm/trunk/include/llvm/ADT/ImmutableSet.h llvm/trunk/include/llvm/ADT/SmallPtrSet.h llvm/trunk/include/llvm/ADT/SparseBitVector.h llvm/trunk/include/llvm/ADT/Statistic.h llvm/trunk/include/llvm/ADT/StringExtras.h llvm/trunk/include/llvm/ADT/Twine.h llvm/trunk/include/llvm/ADT/ValueMap.h llvm/trunk/include/llvm/Analysis/CallGraph.h llvm/trunk/include/llvm/Analysis/DIBuilder.h llvm/trunk/include/llvm/Analysis/ScalarEvolution.h llvm/trunk/include/llvm/Analysis/ValueTracking.h llvm/trunk/include/llvm/BasicBlock.h llvm/trunk/include/llvm/Bitcode/Archive.h llvm/trunk/include/llvm/Bitcode/BitCodes.h llvm/trunk/include/llvm/CodeGen/AsmPrinter.h llvm/trunk/include/llvm/CodeGen/BinaryObject.h llvm/trunk/include/llvm/CodeGen/JITCodeEmitter.h llvm/trunk/include/llvm/CodeGen/MachORelocation.h llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h llvm/trunk/include/llvm/CodeGen/MachineCodeInfo.h llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h llvm/trunk/include/llvm/CodeGen/MachineOperand.h llvm/trunk/include/llvm/CodeGen/MachineRelocation.h llvm/trunk/include/llvm/CodeGen/PostRAHazardRecognizer.h llvm/trunk/include/llvm/CodeGen/RegisterCoalescer.h llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h llvm/trunk/include/llvm/CodeGen/ValueTypes.h llvm/trunk/include/llvm/CompilerDriver/CompilationGraph.h llvm/trunk/include/llvm/CompilerDriver/Tool.h llvm/trunk/include/llvm/DerivedTypes.h llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h llvm/trunk/include/llvm/ExecutionEngine/GenericValue.h llvm/trunk/include/llvm/ExecutionEngine/JITEventListener.h llvm/trunk/include/llvm/ExecutionEngine/JITMemoryManager.h llvm/trunk/include/llvm/LinkAllVMCore.h llvm/trunk/include/llvm/MC/EDInstInfo.h llvm/trunk/include/llvm/MC/MCAssembler.h llvm/trunk/include/llvm/MC/MCDisassembler.h llvm/trunk/include/llvm/MC/MCExpr.h llvm/trunk/include/llvm/MC/MCFixup.h llvm/trunk/include/llvm/MC/MCInst.h llvm/trunk/include/llvm/MC/MCObjectWriter.h llvm/trunk/include/llvm/MC/MCParser/AsmLexer.h llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h llvm/trunk/include/llvm/MC/MCStreamer.h llvm/trunk/include/llvm/MC/MCValue.h llvm/trunk/include/llvm/Module.h llvm/trunk/include/llvm/Object/MachOFormat.h llvm/trunk/include/llvm/Object/ObjectFile.h llvm/trunk/include/llvm/PassSupport.h llvm/trunk/include/llvm/Support/Allocator.h llvm/trunk/include/llvm/Support/COFF.h llvm/trunk/include/llvm/Support/ConstantRange.h llvm/trunk/include/llvm/Support/ELF.h llvm/trunk/include/llvm/Support/Endian.h llvm/trunk/include/llvm/Support/FileUtilities.h llvm/trunk/include/llvm/Support/GraphWriter.h llvm/trunk/include/llvm/Support/MachO.h llvm/trunk/include/llvm/Support/ManagedStatic.h llvm/trunk/include/llvm/Support/MathExtras.h llvm/trunk/include/llvm/Support/MemoryBuffer.h llvm/trunk/include/llvm/Support/MemoryObject.h llvm/trunk/include/llvm/Support/MutexGuard.h llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h llvm/trunk/include/llvm/Support/Timer.h llvm/trunk/include/llvm/Support/raw_ostream.h llvm/trunk/include/llvm/Target/SubtargetFeature.h llvm/trunk/include/llvm/Target/TargetAsmBackend.h llvm/trunk/include/llvm/Target/TargetData.h llvm/trunk/include/llvm/Target/TargetInstrDesc.h llvm/trunk/include/llvm/Target/TargetJITInfo.h llvm/trunk/include/llvm/TypeSymbolTable.h llvm/trunk/include/llvm/ValueSymbolTable.h llvm/trunk/lib/Analysis/ConstantFolding.cpp llvm/trunk/lib/Archive/Archive.cpp llvm/trunk/lib/Archive/ArchiveInternals.h llvm/trunk/lib/Archive/ArchiveWriter.cpp llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp llvm/trunk/lib/CodeGen/ELF.h llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h llvm/trunk/lib/ExecutionEngine/JIT/Intercept.cpp llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.cpp llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.h llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp llvm/trunk/lib/ExecutionEngine/JIT/JITMemoryManager.cpp llvm/trunk/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp llvm/trunk/lib/ExecutionEngine/MCJIT/TargetSelect.cpp llvm/trunk/lib/Linker/LinkItems.cpp llvm/trunk/lib/Linker/LinkModules.cpp llvm/trunk/lib/Linker/Linker.cpp llvm/trunk/lib/MC/MCAsmInfo.cpp llvm/trunk/lib/MC/MCDisassembler/EDDisassembler.h llvm/trunk/lib/MC/MCDisassembler/EDInst.h llvm/trunk/lib/MC/MCDisassembler/EDOperand.h llvm/trunk/lib/MC/MCDisassembler/EDToken.h llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp llvm/trunk/lib/Object/MachOObject.cpp llvm/trunk/lib/Object/ObjectFile.cpp llvm/trunk/lib/Support/Allocator.cpp llvm/trunk/lib/Support/CMakeLists.txt llvm/trunk/lib/Support/CommandLine.cpp llvm/trunk/lib/Support/CrashRecoveryContext.cpp llvm/trunk/lib/Support/Debug.cpp llvm/trunk/lib/Support/ErrorHandling.cpp llvm/trunk/lib/Support/FileUtilities.cpp llvm/trunk/lib/Support/FoldingSet.cpp llvm/trunk/lib/Support/GraphWriter.cpp llvm/trunk/lib/Support/Makefile llvm/trunk/lib/Support/ManagedStatic.cpp llvm/trunk/lib/Support/MemoryBuffer.cpp llvm/trunk/lib/Support/PluginLoader.cpp llvm/trunk/lib/Support/PrettyStackTrace.cpp llvm/trunk/lib/Support/Statistic.cpp llvm/trunk/lib/Support/SystemUtils.cpp llvm/trunk/lib/Support/TargetRegistry.cpp llvm/trunk/lib/Support/Timer.cpp llvm/trunk/lib/Support/ToolOutputFile.cpp llvm/trunk/lib/Support/raw_ostream.cpp llvm/trunk/lib/Target/TargetData.cpp llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h llvm/trunk/lib/Target/X86/X86JITInfo.cpp llvm/trunk/lib/Target/X86/X86Subtarget.cpp llvm/trunk/lib/VMCore/Attributes.cpp llvm/trunk/lib/VMCore/Function.cpp llvm/trunk/lib/VMCore/LeakDetector.cpp llvm/trunk/lib/VMCore/PassManager.cpp llvm/trunk/lib/VMCore/PassRegistry.cpp llvm/trunk/lib/VMCore/Type.cpp llvm/trunk/tools/bugpoint/BugDriver.cpp llvm/trunk/tools/bugpoint/ExtractFunction.cpp llvm/trunk/tools/bugpoint/OptimizerDriver.cpp llvm/trunk/tools/bugpoint/ToolRunner.cpp llvm/trunk/tools/bugpoint/ToolRunner.h llvm/trunk/tools/bugpoint/bugpoint.cpp llvm/trunk/tools/llc/llc.cpp llvm/trunk/tools/lli/lli.cpp llvm/trunk/tools/llvm-ar/llvm-ar.cpp llvm/trunk/tools/llvm-as/llvm-as.cpp llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp llvm/trunk/tools/llvm-dis/llvm-dis.cpp llvm/trunk/tools/llvm-extract/llvm-extract.cpp llvm/trunk/tools/llvm-ld/Optimize.cpp llvm/trunk/tools/llvm-ld/llvm-ld.cpp llvm/trunk/tools/llvm-link/llvm-link.cpp llvm/trunk/tools/llvm-mc/llvm-mc.cpp llvm/trunk/tools/llvm-nm/llvm-nm.cpp llvm/trunk/tools/llvm-prof/llvm-prof.cpp llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp llvm/trunk/tools/opt/opt.cpp llvm/trunk/unittests/ADT/StringMapTest.cpp llvm/trunk/unittests/CMakeLists.txt llvm/trunk/unittests/Makefile llvm/trunk/unittests/Support/EndianTest.cpp llvm/trunk/unittests/Support/SwapByteOrderTest.cpp llvm/trunk/unittests/System/Makefile llvm/trunk/unittests/System/Path.cpp llvm/trunk/unittests/System/TimeValue.cpp llvm/trunk/utils/FileCheck/CMakeLists.txt llvm/trunk/utils/FileCheck/FileCheck.cpp llvm/trunk/utils/FileCheck/Makefile llvm/trunk/utils/FileUpdate/CMakeLists.txt llvm/trunk/utils/FileUpdate/Makefile llvm/trunk/utils/KillTheDoctor/CMakeLists.txt llvm/trunk/utils/KillTheDoctor/KillTheDoctor.cpp llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp llvm/trunk/utils/TableGen/CMakeLists.txt llvm/trunk/utils/TableGen/Makefile llvm/trunk/utils/TableGen/Record.cpp llvm/trunk/utils/TableGen/TableGen.cpp llvm/trunk/utils/fpcmp/Makefile llvm/trunk/utils/not/CMakeLists.txt llvm/trunk/utils/not/Makefile llvm/trunk/utils/not/not.cpp llvm/trunk/utils/unittest/UnitTestMain/TestMain.cpp Modified: llvm/trunk/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/CMakeLists.txt (original) +++ llvm/trunk/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -276,7 +276,7 @@ include_directories( ${LLVM_BINARY_DIR}/include ${LLVM_MAIN_INCLUDE_DIR}) if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) - SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/System/Solaris.h") + SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include llvm/Support/Solaris.h") endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS ) include(AddLLVM) @@ -292,9 +292,8 @@ endif() add_subdirectory(lib/Support) -add_subdirectory(lib/System) -# Everything else depends on Support and System: +# Everything else depends on Support: set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} ${LLVM_LIBS} ) set(LLVM_TABLEGEN "tblgen" CACHE @@ -346,7 +345,7 @@ set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} ) file(GLOB asmp_file "${td}/*AsmPrinter.cpp") if( asmp_file ) - set(LLVM_ENUM_ASM_PRINTERS + set(LLVM_ENUM_ASM_PRINTERS "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n") endif() if( EXISTS ${td}/InstPrinter/CMakeLists.txt ) @@ -354,7 +353,7 @@ endif() if( EXISTS ${td}/AsmParser/CMakeLists.txt ) add_subdirectory(lib/Target/${t}/AsmParser) - set(LLVM_ENUM_ASM_PARSERS + set(LLVM_ENUM_ASM_PARSERS "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n") endif() if( EXISTS ${td}/Disassembler/CMakeLists.txt ) Modified: llvm/trunk/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/Makefile (original) +++ llvm/trunk/Makefile Mon Nov 29 12:16:10 2010 @@ -10,7 +10,7 @@ LEVEL := . # Top-Level LLVM Build Stages: -# 1. Build lib/System and lib/Support, which are used by utils (tblgen). +# 1. Build lib/Support, which is used by utils (tblgen). # 2. Build utils, which is used by VMCore. # 3. Build VMCore, which builds the Intrinsics.inc file used by libs. # 4. Build libs, which are needed by llvm-config. @@ -27,10 +27,10 @@ ifneq ($(findstring llvmCore, $(RC_ProjectName)),llvmCore) # Normal build (not "Apple-style"). ifeq ($(BUILD_DIRS_ONLY),1) - DIRS := lib/System lib/Support utils + DIRS := lib/Support utils OPTIONAL_DIRS := else - DIRS := lib/System lib/Support utils lib/VMCore lib tools/llvm-shlib \ + DIRS := lib/Support utils lib/VMCore lib tools/llvm-shlib \ tools/llvm-config tools runtime docs unittests OPTIONAL_DIRS := projects bindings endif @@ -159,7 +159,7 @@ $(Echo) Eliminating files constructed by configure $(Verb) $(RM) -f \ $(TopDistDir)/include/llvm/Config/config.h \ - $(TopDistDir)/include/llvm/System/DataTypes.h + $(TopDistDir)/include/llvm/Support/DataTypes.h clang-only: all tools-only: all @@ -178,7 +178,7 @@ include/llvm/Config/AsmPrinters.def \ include/llvm/Config/AsmParsers.def \ include/llvm/Config/Disassemblers.def \ - include/llvm/System/DataTypes.h \ + include/llvm/Support/DataTypes.h \ tools/llvmc/src/Base.td FilesToConfigPATH := $(addprefix $(LLVM_OBJ_ROOT)/,$(FilesToConfig)) Modified: llvm/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.rules?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/Makefile.rules (original) +++ llvm/trunk/Makefile.rules Mon Nov 29 12:16:10 2010 @@ -634,11 +634,11 @@ endif ifeq ($(HOST_OS),SunOS) -CPP.BaseFlags += -include llvm/System/Solaris.h +CPP.BaseFlags += -include llvm/Support/Solaris.h endif ifeq ($(HOST_OS),AuroraUX) -CPP.BaseFlags += -include llvm/System/Solaris.h +CPP.BaseFlags += -include llvm/Support/Solaris.h endif # !HOST_OS - AuroraUX. LD.Flags += -L$(LibDir) -L$(LLVMLibDir) Modified: llvm/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/autoconf/configure.ac?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/autoconf/configure.ac (original) +++ llvm/trunk/autoconf/configure.ac Mon Nov 29 12:16:10 2010 @@ -319,7 +319,7 @@ AC_SUBST(NOLINKALL,$llvm_cv_no_link_all_option) dnl Set the "LLVM_ON_*" variables based on llvm_cv_platform_type -dnl This is used by lib/System to determine the basic kind of implementation +dnl This is used by lib/Support to determine the basic kind of implementation dnl to use. case $llvm_cv_platform_type in Unix) @@ -1625,7 +1625,7 @@ AC_CONFIG_FILES([include/llvm/Config/AsmPrinters.def]) AC_CONFIG_FILES([include/llvm/Config/AsmParsers.def]) AC_CONFIG_FILES([include/llvm/Config/Disassemblers.def]) -AC_CONFIG_HEADERS([include/llvm/System/DataTypes.h]) +AC_CONFIG_HEADERS([include/llvm/Support/DataTypes.h]) dnl Configure the makefile's configuration data AC_CONFIG_FILES([Makefile.config]) Modified: llvm/trunk/cmake/config-ix.cmake URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/cmake/config-ix.cmake (original) +++ llvm/trunk/cmake/config-ix.cmake Mon Nov 29 12:16:10 2010 @@ -277,7 +277,7 @@ ) configure_file( - ${LLVM_MAIN_INCLUDE_DIR}/llvm/System/DataTypes.h.cmake - ${LLVM_BINARY_DIR}/include/llvm/System/DataTypes.h + ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake + ${LLVM_BINARY_DIR}/include/llvm/Support/DataTypes.h ) Modified: llvm/trunk/configure URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/configure?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/configure (original) +++ llvm/trunk/configure Mon Nov 29 12:16:10 2010 @@ -20920,7 +20920,7 @@ ac_config_files="$ac_config_files include/llvm/Config/Disassemblers.def" -ac_config_headers="$ac_config_headers include/llvm/System/DataTypes.h" +ac_config_headers="$ac_config_headers include/llvm/Support/DataTypes.h" ac_config_files="$ac_config_files Makefile.config" @@ -21546,7 +21546,7 @@ "include/llvm/Config/AsmPrinters.def") CONFIG_FILES="$CONFIG_FILES include/llvm/Config/AsmPrinters.def" ;; "include/llvm/Config/AsmParsers.def") CONFIG_FILES="$CONFIG_FILES include/llvm/Config/AsmParsers.def" ;; "include/llvm/Config/Disassemblers.def") CONFIG_FILES="$CONFIG_FILES include/llvm/Config/Disassemblers.def" ;; - "include/llvm/System/DataTypes.h") CONFIG_HEADERS="$CONFIG_HEADERS include/llvm/System/DataTypes.h" ;; + "include/llvm/Support/DataTypes.h") CONFIG_HEADERS="$CONFIG_HEADERS include/llvm/Support/DataTypes.h" ;; "Makefile.config") CONFIG_FILES="$CONFIG_FILES Makefile.config" ;; "llvm.spec") CONFIG_FILES="$CONFIG_FILES llvm.spec" ;; "tools/llvmc/src/Base.td") CONFIG_FILES="$CONFIG_FILES tools/llvmc/src/Base.td" ;; Modified: llvm/trunk/include/llvm-c/EnhancedDisassembly.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/EnhancedDisassembly.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm-c/EnhancedDisassembly.h (original) +++ llvm/trunk/include/llvm-c/EnhancedDisassembly.h Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #ifndef LLVM_C_ENHANCEDDISASSEMBLY_H #define LLVM_C_ENHANCEDDISASSEMBLY_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #ifdef __cplusplus extern "C" { Modified: llvm/trunk/include/llvm/ADT/EquivalenceClasses.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/EquivalenceClasses.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/EquivalenceClasses.h (original) +++ llvm/trunk/include/llvm/ADT/EquivalenceClasses.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_ADT_EQUIVALENCECLASSES_H #define LLVM_ADT_EQUIVALENCECLASSES_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/include/llvm/ADT/FoldingSet.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/FoldingSet.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/FoldingSet.h (original) +++ llvm/trunk/include/llvm/ADT/FoldingSet.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #ifndef LLVM_ADT_FOLDINGSET_H #define LLVM_ADT_FOLDINGSET_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" Modified: llvm/trunk/include/llvm/ADT/ImmutableList.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableList.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/ImmutableList.h (original) +++ llvm/trunk/include/llvm/ADT/ImmutableList.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/Support/Allocator.h" #include "llvm/ADT/FoldingSet.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/ADT/ImmutableSet.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableSet.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/ImmutableSet.h (original) +++ llvm/trunk/include/llvm/ADT/ImmutableSet.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/Support/Allocator.h" #include "llvm/ADT/FoldingSet.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/include/llvm/ADT/SmallPtrSet.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallPtrSet.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/SmallPtrSet.h (original) +++ llvm/trunk/include/llvm/ADT/SmallPtrSet.h Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include #include #include -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/PointerLikeTypeTraits.h" namespace llvm { Modified: llvm/trunk/include/llvm/ADT/SparseBitVector.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SparseBitVector.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/SparseBitVector.h (original) +++ llvm/trunk/include/llvm/ADT/SparseBitVector.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #include "llvm/ADT/ilist.h" #include "llvm/ADT/ilist_node.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include Modified: llvm/trunk/include/llvm/ADT/Statistic.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Statistic.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/Statistic.h (original) +++ llvm/trunk/include/llvm/ADT/Statistic.h Mon Nov 29 12:16:10 2010 @@ -26,7 +26,7 @@ #ifndef LLVM_ADT_STATISTIC_H #define LLVM_ADT_STATISTIC_H -#include "llvm/System/Atomic.h" +#include "llvm/Support/Atomic.h" namespace llvm { class raw_ostream; Modified: llvm/trunk/include/llvm/ADT/StringExtras.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringExtras.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/StringExtras.h (original) +++ llvm/trunk/include/llvm/ADT/StringExtras.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_ADT_STRINGEXTRAS_H #define LLVM_ADT_STRINGEXTRAS_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/StringRef.h" #include Modified: llvm/trunk/include/llvm/ADT/Twine.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Twine.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/Twine.h (original) +++ llvm/trunk/include/llvm/ADT/Twine.h Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ #define LLVM_ADT_TWINE_H #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/include/llvm/ADT/ValueMap.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ValueMap.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/ValueMap.h (original) +++ llvm/trunk/include/llvm/ADT/ValueMap.h Mon Nov 29 12:16:10 2010 @@ -29,7 +29,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/Support/ValueHandle.h" #include "llvm/Support/type_traits.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include Modified: llvm/trunk/include/llvm/Analysis/CallGraph.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/CallGraph.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/CallGraph.h (original) +++ llvm/trunk/include/llvm/Analysis/CallGraph.h Mon Nov 29 12:16:10 2010 @@ -57,7 +57,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Support/CallSite.h" #include "llvm/Support/ValueHandle.h" -#include "llvm/System/IncludeFile.h" +#include "llvm/Support/IncludeFile.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/Analysis/DIBuilder.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DIBuilder.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/DIBuilder.h (original) +++ llvm/trunk/include/llvm/Analysis/DIBuilder.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_ANALYSIS_DIBUILDER_H #define LLVM_ANALYSIS_DIBUILDER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/ADT/StringRef.h" namespace llvm { Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original) +++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Mon Nov 29 12:16:10 2010 @@ -24,7 +24,7 @@ #include "llvm/Pass.h" #include "llvm/Instructions.h" #include "llvm/Function.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/ValueHandle.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/ConstantRange.h" Modified: llvm/trunk/include/llvm/Analysis/ValueTracking.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ValueTracking.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/ValueTracking.h (original) +++ llvm/trunk/include/llvm/Analysis/ValueTracking.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_ANALYSIS_VALUETRACKING_H #define LLVM_ANALYSIS_VALUETRACKING_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/BasicBlock.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BasicBlock.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/BasicBlock.h (original) +++ llvm/trunk/include/llvm/BasicBlock.h Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/SymbolTableListTraits.h" #include "llvm/ADT/ilist.h" #include "llvm/ADT/Twine.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { @@ -58,9 +58,9 @@ /// tables. The type of a BasicBlock is "Type::LabelTy" because the basic block /// represents a label to which a branch can jump. /// -/// A well formed basic block is formed of a list of non-terminating -/// instructions followed by a single TerminatorInst instruction. -/// TerminatorInst's may not occur in the middle of basic blocks, and must +/// A well formed basic block is formed of a list of non-terminating +/// instructions followed by a single TerminatorInst instruction. +/// TerminatorInst's may not occur in the middle of basic blocks, and must /// terminate the blocks. The BasicBlock class allows malformed basic blocks to /// occur because it may be useful in the intermediate stage of constructing or /// modifying a program. However, the verifier will ensure that basic blocks @@ -90,7 +90,7 @@ public: /// getContext - Get the context in which this basic block lives. LLVMContext &getContext() const; - + /// Instruction iterators... typedef InstListType::iterator iterator; typedef InstListType::const_iterator const_iterator; @@ -98,7 +98,7 @@ /// Create - Creates a new BasicBlock. If the Parent parameter is specified, /// the basic block is automatically inserted at either the end of the /// function (if InsertBefore is 0), or before the specified basic block. - static BasicBlock *Create(LLVMContext &Context, const Twine &Name = "", + static BasicBlock *Create(LLVMContext &Context, const Twine &Name = "", Function *Parent = 0,BasicBlock *InsertBefore = 0) { return new BasicBlock(Context, Name, Parent, InsertBefore); } @@ -114,15 +114,15 @@ /// and BlockAddress's). User *use_back() { return cast(*use_begin());} const User *use_back() const { return cast(*use_begin());} - + /// getTerminator() - If this is a well formed basic block, then this returns /// a pointer to the terminator instruction. If it is not, then you get a /// null pointer back. /// TerminatorInst *getTerminator(); const TerminatorInst *getTerminator() const; - - /// Returns a pointer to the first instructon in this block that is not a + + /// Returns a pointer to the first instructon in this block that is not a /// PHINode instruction. When adding instruction to the beginning of the /// basic block, they should be added before the returned value, not before /// the first instruction, which might be PHI. @@ -137,7 +137,7 @@ const Instruction* getFirstNonPHIOrDbg() const { return const_cast(this)->getFirstNonPHIOrDbg(); } - + /// removeFromParent - This method unlinks 'this' from the containing /// function, but does not delete it. /// @@ -147,15 +147,15 @@ /// and deletes it. /// void eraseFromParent(); - + /// moveBefore - Unlink this basic block from its current function and /// insert it into the function that MovePos lives in, right before MovePos. void moveBefore(BasicBlock *MovePos); - + /// moveAfter - Unlink this basic block from its current function and /// insert it into the function that MovePos lives in, right after MovePos. void moveAfter(BasicBlock *MovePos); - + /// getSinglePredecessor - If this basic block has a single predecessor block, /// return the block, otherwise return a null pointer. @@ -166,8 +166,8 @@ /// getUniquePredecessor - If this basic block has a unique predecessor block, /// return the block, otherwise return a null pointer. - /// Note that unique predecessor doesn't mean single edge, there can be - /// multiple edges from the unique predecessor to this block (for example + /// Note that unique predecessor doesn't mean single edge, there can be + /// multiple edges from the unique predecessor to this block (for example /// a switch statement with multiple cases having the same destination). BasicBlock *getUniquePredecessor(); const BasicBlock *getUniquePredecessor() const { @@ -247,7 +247,7 @@ /// hasAddressTaken - returns true if there are any uses of this basic block /// other than direct branches, switches, etc. to it. bool hasAddressTaken() const { return getSubclassDataFromValue() != 0; } - + private: /// AdjustBlockAddressRefCount - BasicBlock stores the number of BlockAddress /// objects using it. This is almost always 0, sometimes one, possibly but Modified: llvm/trunk/include/llvm/Bitcode/Archive.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/Archive.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Bitcode/Archive.h (original) +++ llvm/trunk/include/llvm/Bitcode/Archive.h Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #include "llvm/ADT/ilist.h" #include "llvm/ADT/ilist_node.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include #include Modified: llvm/trunk/include/llvm/Bitcode/BitCodes.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/BitCodes.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Bitcode/BitCodes.h (original) +++ llvm/trunk/include/llvm/Bitcode/BitCodes.h Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #define LLVM_BITCODE_BITCODES_H #include "llvm/ADT/SmallVector.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original) +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #define LLVM_CODEGEN_ASMPRINTER_H #include "llvm/CodeGen/MachineFunctionPass.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class BlockAddress; Modified: llvm/trunk/include/llvm/CodeGen/BinaryObject.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/BinaryObject.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/BinaryObject.h (original) +++ llvm/trunk/include/llvm/CodeGen/BinaryObject.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #define LLVM_CODEGEN_BINARYOBJECT_H #include "llvm/CodeGen/MachineRelocation.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/include/llvm/CodeGen/JITCodeEmitter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/JITCodeEmitter.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/JITCodeEmitter.h (original) +++ llvm/trunk/include/llvm/CodeGen/JITCodeEmitter.h Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #define LLVM_CODEGEN_JITCODEEMITTER_H #include -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/MathExtras.h" #include "llvm/CodeGen/MachineCodeEmitter.h" #include "llvm/ADT/DenseMap.h" Modified: llvm/trunk/include/llvm/CodeGen/MachORelocation.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachORelocation.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachORelocation.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachORelocation.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_CODEGEN_MACHO_RELOCATION_H #define LLVM_CODEGEN_MACHO_RELOCATION_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #ifndef LLVM_CODEGEN_MACHINECODEEMITTER_H #define LLVM_CODEGEN_MACHINECODEEMITTER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/DebugLoc.h" namespace llvm { Modified: llvm/trunk/include/llvm/CodeGen/MachineCodeInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineCodeInfo.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineCodeInfo.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineCodeInfo.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #ifndef EE_MACHINE_CODE_INFO_H #define EE_MACHINE_CODE_INFO_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineFrameInfo.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/ADT/SmallVector.h" //#include "llvm/ADT/IndexedMap.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineMemOperand.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #ifndef LLVM_CODEGEN_MACHINEMEMOPERAND_H #define LLVM_CODEGEN_MACHINEMEMOPERAND_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineModuleInfo.h Mon Nov 29 12:16:10 2010 @@ -39,7 +39,7 @@ #include "llvm/Support/Dwarf.h" #include "llvm/Support/DebugLoc.h" #include "llvm/Support/ValueHandle.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/SmallPtrSet.h" Modified: llvm/trunk/include/llvm/CodeGen/MachineOperand.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineOperand.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineOperand.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineOperand.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_CODEGEN_MACHINEOPERAND_H #define LLVM_CODEGEN_MACHINEOPERAND_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/CodeGen/MachineRelocation.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineRelocation.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineRelocation.h (original) +++ llvm/trunk/include/llvm/CodeGen/MachineRelocation.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_CODEGEN_MACHINERELOCATION_H #define LLVM_CODEGEN_MACHINERELOCATION_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/CodeGen/PostRAHazardRecognizer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/PostRAHazardRecognizer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/PostRAHazardRecognizer.h (original) +++ llvm/trunk/include/llvm/CodeGen/PostRAHazardRecognizer.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #define LLVM_CODEGEN_EXACTHAZARDRECOGNIZER_H #include "llvm/CodeGen/ScheduleHazardRecognizer.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/include/llvm/CodeGen/RegisterCoalescer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/RegisterCoalescer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/RegisterCoalescer.h (original) +++ llvm/trunk/include/llvm/CodeGen/RegisterCoalescer.h Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/IncludeFile.h" +#include "llvm/Support/IncludeFile.h" #include "llvm/CodeGen/LiveInterval.h" #include "llvm/ADT/SmallPtrSet.h" Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h (original) +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h Mon Nov 29 12:16:10 2010 @@ -29,7 +29,7 @@ #include "llvm/CodeGen/ValueTypes.h" #include "llvm/CodeGen/MachineMemOperand.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/DebugLoc.h" #include Modified: llvm/trunk/include/llvm/CodeGen/ValueTypes.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/ValueTypes.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/ValueTypes.h (original) +++ llvm/trunk/include/llvm/CodeGen/ValueTypes.h Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include #include -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/MathExtras.h" namespace llvm { Modified: llvm/trunk/include/llvm/CompilerDriver/CompilationGraph.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/CompilationGraph.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CompilerDriver/CompilationGraph.h (original) +++ llvm/trunk/include/llvm/CompilerDriver/CompilationGraph.h Mon Nov 29 12:16:10 2010 @@ -21,7 +21,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringSet.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include #include Modified: llvm/trunk/include/llvm/CompilerDriver/Tool.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/Tool.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/CompilerDriver/Tool.h (original) +++ llvm/trunk/include/llvm/CompilerDriver/Tool.h Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/StringSet.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include #include Modified: llvm/trunk/include/llvm/DerivedTypes.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DerivedTypes.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/DerivedTypes.h (original) +++ llvm/trunk/include/llvm/DerivedTypes.h Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #define LLVM_DERIVED_TYPES_H #include "llvm/Type.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h (original) +++ llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h Mon Nov 29 12:16:10 2010 @@ -22,7 +22,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/ValueMap.h" #include "llvm/Support/ValueHandle.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include "llvm/Target/TargetMachine.h" namespace llvm { Modified: llvm/trunk/include/llvm/ExecutionEngine/GenericValue.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/GenericValue.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ExecutionEngine/GenericValue.h (original) +++ llvm/trunk/include/llvm/ExecutionEngine/GenericValue.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #define GENERIC_VALUE_H #include "llvm/ADT/APInt.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/ExecutionEngine/JITEventListener.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITEventListener.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ExecutionEngine/JITEventListener.h (original) +++ llvm/trunk/include/llvm/ExecutionEngine/JITEventListener.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_EXECUTION_ENGINE_JIT_EVENTLISTENER_H #define LLVM_EXECUTION_ENGINE_JIT_EVENTLISTENER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/DebugLoc.h" #include Modified: llvm/trunk/include/llvm/ExecutionEngine/JITMemoryManager.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITMemoryManager.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ExecutionEngine/JITMemoryManager.h (original) +++ llvm/trunk/include/llvm/ExecutionEngine/JITMemoryManager.h Mon Nov 29 12:16:10 2010 @@ -10,7 +10,7 @@ #ifndef LLVM_EXECUTION_ENGINE_JIT_MEMMANAGER_H #define LLVM_EXECUTION_ENGINE_JIT_MEMMANAGER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/LinkAllVMCore.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LinkAllVMCore.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/LinkAllVMCore.h (original) +++ llvm/trunk/include/llvm/LinkAllVMCore.h Mon Nov 29 12:16:10 2010 @@ -22,15 +22,15 @@ #include "llvm/IntrinsicInst.h" #include "llvm/InlineAsm.h" #include "llvm/Analysis/Verifier.h" -#include "llvm/System/Alarm.h" -#include "llvm/System/DynamicLibrary.h" -#include "llvm/System/Memory.h" -#include "llvm/System/Mutex.h" -#include "llvm/System/Path.h" -#include "llvm/System/Process.h" -#include "llvm/System/Program.h" -#include "llvm/System/Signals.h" -#include "llvm/System/TimeValue.h" +#include "llvm/Support/Alarm.h" +#include "llvm/Support/DynamicLibrary.h" +#include "llvm/Support/Memory.h" +#include "llvm/Support/Mutex.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/Signals.h" +#include "llvm/Support/TimeValue.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/MathExtras.h" #include Modified: llvm/trunk/include/llvm/MC/EDInstInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/EDInstInfo.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/EDInstInfo.h (original) +++ llvm/trunk/include/llvm/MC/EDInstInfo.h Mon Nov 29 12:16:10 2010 @@ -9,7 +9,7 @@ #ifndef EDINSTINFO_H #define EDINSTINFO_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/MC/MCAssembler.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAssembler.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCAssembler.h (original) +++ llvm/trunk/include/llvm/MC/MCAssembler.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #include "llvm/Support/Casting.h" #include "llvm/MC/MCFixup.h" #include "llvm/MC/MCInst.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include // FIXME: Shouldn't be needed. namespace llvm { Modified: llvm/trunk/include/llvm/MC/MCDisassembler.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCDisassembler.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCDisassembler.h (original) +++ llvm/trunk/include/llvm/MC/MCDisassembler.h Mon Nov 29 12:16:10 2010 @@ -9,7 +9,7 @@ #ifndef MCDISASSEMBLER_H #define MCDISASSEMBLER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/MC/MCExpr.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCExpr.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCExpr.h (original) +++ llvm/trunk/include/llvm/MC/MCExpr.h Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ #define LLVM_MC_MCEXPR_H #include "llvm/Support/Casting.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class MCAsmInfo; Modified: llvm/trunk/include/llvm/MC/MCFixup.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCFixup.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCFixup.h (original) +++ llvm/trunk/include/llvm/MC/MCFixup.h Mon Nov 29 12:16:10 2010 @@ -10,7 +10,7 @@ #ifndef LLVM_MC_MCFIXUP_H #define LLVM_MC_MCFIXUP_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/MC/MCInst.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCInst.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCInst.h (original) +++ llvm/trunk/include/llvm/MC/MCInst.h Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class raw_ostream; Modified: llvm/trunk/include/llvm/MC/MCObjectWriter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectWriter.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCObjectWriter.h (original) +++ llvm/trunk/include/llvm/MC/MCObjectWriter.h Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ #include "llvm/ADT/Triple.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/MC/MCParser/AsmLexer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/AsmLexer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCParser/AsmLexer.h (original) +++ llvm/trunk/include/llvm/MC/MCParser/AsmLexer.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCAsmInfo.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h (original) +++ llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ #define LLVM_MC_MCASMLEXER_H #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/SMLoc.h" namespace llvm { Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h (original) +++ llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h Mon Nov 29 12:16:10 2010 @@ -10,7 +10,7 @@ #ifndef LLVM_MC_MCASMPARSER_H #define LLVM_MC_MCASMPARSER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class AsmToken; Modified: llvm/trunk/include/llvm/MC/MCStreamer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCStreamer.h (original) +++ llvm/trunk/include/llvm/MC/MCStreamer.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_MC_MCSTREAMER_H #define LLVM_MC_MCSTREAMER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/MC/MCDirectives.h" namespace llvm { Modified: llvm/trunk/include/llvm/MC/MCValue.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCValue.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/MC/MCValue.h (original) +++ llvm/trunk/include/llvm/MC/MCValue.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_MC_MCVALUE_H #define LLVM_MC_MCVALUE_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/MC/MCSymbol.h" #include Modified: llvm/trunk/include/llvm/Module.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Module.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Module.h (original) +++ llvm/trunk/include/llvm/Module.h Mon Nov 29 12:16:10 2010 @@ -20,7 +20,7 @@ #include "llvm/GlobalAlias.h" #include "llvm/Metadata.h" #include "llvm/ADT/OwningPtr.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/Object/MachOFormat.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachOFormat.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Object/MachOFormat.h (original) +++ llvm/trunk/include/llvm/Object/MachOFormat.h Mon Nov 29 12:16:10 2010 @@ -22,7 +22,7 @@ #ifndef LLVM_OBJECT_MACHOFORMAT_H #define LLVM_OBJECT_MACHOFORMAT_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { namespace object { Modified: llvm/trunk/include/llvm/Object/ObjectFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Object/ObjectFile.h (original) +++ llvm/trunk/include/llvm/Object/ObjectFile.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #define LLVM_OBJECT_OBJECT_FILE_H #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/PassSupport.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassSupport.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/PassSupport.h (original) +++ llvm/trunk/include/llvm/PassSupport.h Mon Nov 29 12:16:10 2010 @@ -24,7 +24,7 @@ #include "Pass.h" #include "llvm/PassRegistry.h" #include "llvm/InitializePasses.h" -#include "llvm/System/Atomic.h" +#include "llvm/Support/Atomic.h" #include namespace llvm { Copied: llvm/trunk/include/llvm/Support/AIXDataTypesFix.h (from r120288, llvm/trunk/include/llvm/System/AIXDataTypesFix.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/AIXDataTypesFix.h?p2=llvm/trunk/include/llvm/Support/AIXDataTypesFix.h&p1=llvm/trunk/include/llvm/System/AIXDataTypesFix.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/include/llvm/Support/Alarm.h (from r120288, llvm/trunk/include/llvm/System/Alarm.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Alarm.h?p2=llvm/trunk/include/llvm/Support/Alarm.h&p1=llvm/trunk/include/llvm/System/Alarm.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Modified: llvm/trunk/include/llvm/Support/Allocator.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Allocator.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Allocator.h (original) +++ llvm/trunk/include/llvm/Support/Allocator.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/Support/AlignOf.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include #include Copied: llvm/trunk/include/llvm/Support/Atomic.h (from r120288, llvm/trunk/include/llvm/System/Atomic.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Atomic.h?p2=llvm/trunk/include/llvm/Support/Atomic.h&p1=llvm/trunk/include/llvm/System/Atomic.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Atomic.h (original) +++ llvm/trunk/include/llvm/Support/Atomic.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SYSTEM_ATOMIC_H #define LLVM_SYSTEM_ATOMIC_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { namespace sys { Modified: llvm/trunk/include/llvm/Support/COFF.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/COFF.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/COFF.h (original) +++ llvm/trunk/include/llvm/Support/COFF.h Mon Nov 29 12:16:10 2010 @@ -23,7 +23,7 @@ #ifndef LLVM_SUPPORT_WIN_COFF_H #define LLVM_SUPPORT_WIN_COFF_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/Support/ConstantRange.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ConstantRange.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/ConstantRange.h (original) +++ llvm/trunk/include/llvm/Support/ConstantRange.h Mon Nov 29 12:16:10 2010 @@ -33,7 +33,7 @@ #define LLVM_SUPPORT_CONSTANT_RANGE_H #include "llvm/ADT/APInt.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Copied: llvm/trunk/include/llvm/Support/DataTypes.h.cmake (from r120288, llvm/trunk/include/llvm/System/DataTypes.h.cmake) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DataTypes.h.cmake?p2=llvm/trunk/include/llvm/Support/DataTypes.h.cmake&p1=llvm/trunk/include/llvm/System/DataTypes.h.cmake&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/DataTypes.h.cmake (original) +++ llvm/trunk/include/llvm/Support/DataTypes.h.cmake Mon Nov 29 12:16:10 2010 @@ -1,4 +1,4 @@ -/*===-- include/System/DataTypes.h - Define fixed size types -----*- C -*-===*\ +/*===-- include/Support/DataTypes.h - Define fixed size types -----*- C -*-===*\ |* *| |* The LLVM Compiler Infrastructure *| |* *| @@ -43,12 +43,12 @@ happening when system headers or C++ STL headers include stdint.h before we define it here, we define it on the g++ command line (in Makefile.rules). */ #if !defined(__STDC_LIMIT_MACROS) -# error "Must #define __STDC_LIMIT_MACROS before #including System/DataTypes.h" +# error "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h" #endif #if !defined(__STDC_CONSTANT_MACROS) # error "Must #define __STDC_CONSTANT_MACROS before " \ - "#including System/DataTypes.h" + "#including Support/DataTypes.h" #endif /* Note that includes , if this is a C99 system. */ @@ -65,7 +65,7 @@ #endif #ifdef _AIX -#include "llvm/System/AIXDataTypesFix.h" +#include "llvm/Support/AIXDataTypesFix.h" #endif /* Handle incorrect definition of uint64_t as u_int64_t */ Copied: llvm/trunk/include/llvm/Support/DataTypes.h.in (from r120288, llvm/trunk/include/llvm/System/DataTypes.h.in) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DataTypes.h.in?p2=llvm/trunk/include/llvm/Support/DataTypes.h.in&p1=llvm/trunk/include/llvm/System/DataTypes.h.in&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/include/llvm/Support/Disassembler.h (from r120288, llvm/trunk/include/llvm/System/Disassembler.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Disassembler.h?p2=llvm/trunk/include/llvm/Support/Disassembler.h&p1=llvm/trunk/include/llvm/System/Disassembler.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Disassembler.h (original) +++ llvm/trunk/include/llvm/Support/Disassembler.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_SYSTEM_DISASSEMBLER_H #define LLVM_SYSTEM_DISASSEMBLER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Copied: llvm/trunk/include/llvm/Support/DynamicLibrary.h (from r120288, llvm/trunk/include/llvm/System/DynamicLibrary.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DynamicLibrary.h?p2=llvm/trunk/include/llvm/Support/DynamicLibrary.h&p1=llvm/trunk/include/llvm/System/DynamicLibrary.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Modified: llvm/trunk/include/llvm/Support/ELF.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ELF.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/ELF.h (original) +++ llvm/trunk/include/llvm/Support/ELF.h Mon Nov 29 12:16:10 2010 @@ -20,7 +20,7 @@ #ifndef LLVM_SUPPORT_ELF_H #define LLVM_SUPPORT_ELF_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/Support/Endian.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Endian.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Endian.h (original) +++ llvm/trunk/include/llvm/Support/Endian.h Mon Nov 29 12:16:10 2010 @@ -15,8 +15,8 @@ #define LLVM_SUPPORT_ENDIAN_H #include "llvm/Config/config.h" -#include "llvm/System/Host.h" -#include "llvm/System/SwapByteOrder.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/SwapByteOrder.h" #include "llvm/Support/type_traits.h" namespace llvm { Copied: llvm/trunk/include/llvm/Support/Errno.h (from r120288, llvm/trunk/include/llvm/System/Errno.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Errno.h?p2=llvm/trunk/include/llvm/Support/Errno.h&p1=llvm/trunk/include/llvm/System/Errno.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/include/llvm/Support/FEnv.h (from r120288, llvm/trunk/include/llvm/System/FEnv.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FEnv.h?p2=llvm/trunk/include/llvm/Support/FEnv.h&p1=llvm/trunk/include/llvm/System/FEnv.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Modified: llvm/trunk/include/llvm/Support/FileUtilities.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FileUtilities.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/FileUtilities.h (original) +++ llvm/trunk/include/llvm/Support/FileUtilities.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_SUPPORT_FILEUTILITIES_H #define LLVM_SUPPORT_FILEUTILITIES_H -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" namespace llvm { Modified: llvm/trunk/include/llvm/Support/GraphWriter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/GraphWriter.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/GraphWriter.h (original) +++ llvm/trunk/include/llvm/Support/GraphWriter.h Mon Nov 29 12:16:10 2010 @@ -26,7 +26,7 @@ #include "llvm/Support/DOTGraphTraits.h" #include "llvm/Support/raw_ostream.h" #include "llvm/ADT/GraphTraits.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include #include Copied: llvm/trunk/include/llvm/Support/Host.h (from r120288, llvm/trunk/include/llvm/System/Host.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Host.h?p2=llvm/trunk/include/llvm/Support/Host.h&p1=llvm/trunk/include/llvm/System/Host.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/include/llvm/Support/IncludeFile.h (from r120288, llvm/trunk/include/llvm/System/IncludeFile.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/IncludeFile.h?p2=llvm/trunk/include/llvm/Support/IncludeFile.h&p1=llvm/trunk/include/llvm/System/IncludeFile.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/IncludeFile.h (original) +++ llvm/trunk/include/llvm/Support/IncludeFile.h Mon Nov 29 12:16:10 2010 @@ -16,14 +16,14 @@ #define LLVM_SYSTEM_INCLUDEFILE_H /// This macro is the public interface that IncludeFile.h exports. This gives -/// us the option to implement the "link the definition" capability in any +/// us the option to implement the "link the definition" capability in any /// manner that we choose. All header files that depend on a specific .cpp /// file being linked at run time should use this macro instead of the -/// IncludeFile class directly. -/// +/// IncludeFile class directly. +/// /// For example, foo.h would use:
/// FORCE_DEFINING_FILE_TO_BE_LINKED(foo)
-/// +/// /// And, foo.cp would use:
/// DEFINING_FILE_FOR(foo)
#ifdef __GNUC__ @@ -34,14 +34,14 @@ extern const char name ## LinkVar; \ __attribute__((used)) static const char *const name ## LinkObj = \ &name ## LinkVar; \ - } + } #else // Otherwise use a constructor call. #define FORCE_DEFINING_FILE_TO_BE_LINKED(name) \ namespace llvm { \ extern const char name ## LinkVar; \ static const IncludeFile name ## LinkObj ( &name ## LinkVar ); \ - } + } #endif /// This macro is the counterpart to FORCE_DEFINING_FILE_TO_BE_LINKED. It should @@ -53,9 +53,9 @@ namespace llvm { /// This class is used in the implementation of FORCE_DEFINING_FILE_TO_BE_LINKED -/// macro to make sure that the implementation of a header file is included -/// into a tool that uses the header. This is solely -/// to overcome problems linking .a files and not getting the implementation +/// macro to make sure that the implementation of a header file is included +/// into a tool that uses the header. This is solely +/// to overcome problems linking .a files and not getting the implementation /// of compilation units we need. This is commonly an issue with the various /// Passes but also occurs elsewhere in LLVM. We like to use .a files because /// they link faster and provide the smallest executables. However, sometimes Copied: llvm/trunk/include/llvm/Support/LICENSE.TXT (from r120288, llvm/trunk/include/llvm/System/LICENSE.TXT) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/LICENSE.TXT?p2=llvm/trunk/include/llvm/Support/LICENSE.TXT&p1=llvm/trunk/include/llvm/System/LICENSE.TXT&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/LICENSE.TXT (original) +++ llvm/trunk/include/llvm/Support/LICENSE.TXT Mon Nov 29 12:16:10 2010 @@ -1,6 +1,6 @@ LLVM System Interface Library ------------------------------------------------------------------------------- -The LLVM System Interface Library is licensed under the Illinois Open Source +The LLVM System Interface Library is licensed under the Illinois Open Source License and has the following additional copyright: Copyright (C) 2004 eXtensible Systems, Inc. Modified: llvm/trunk/include/llvm/Support/MachO.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MachO.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/MachO.h (original) +++ llvm/trunk/include/llvm/Support/MachO.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SUPPORT_MACHO_H #define LLVM_SUPPORT_MACHO_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" // NOTE: The enums in this file are intentially named to be different than those // in the headers in /usr/include/mach (on darwin systems) to avoid conflicts Modified: llvm/trunk/include/llvm/Support/ManagedStatic.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ManagedStatic.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/ManagedStatic.h (original) +++ llvm/trunk/include/llvm/Support/ManagedStatic.h Mon Nov 29 12:16:10 2010 @@ -14,8 +14,8 @@ #ifndef LLVM_SUPPORT_MANAGED_STATIC_H #define LLVM_SUPPORT_MANAGED_STATIC_H -#include "llvm/System/Atomic.h" -#include "llvm/System/Threading.h" +#include "llvm/Support/Atomic.h" +#include "llvm/Support/Threading.h" namespace llvm { Modified: llvm/trunk/include/llvm/Support/MathExtras.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MathExtras.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/MathExtras.h (original) +++ llvm/trunk/include/llvm/Support/MathExtras.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SUPPORT_MATHEXTRAS_H #define LLVM_SUPPORT_MATHEXTRAS_H -#include "llvm/System/SwapByteOrder.h" +#include "llvm/Support/SwapByteOrder.h" namespace llvm { Copied: llvm/trunk/include/llvm/Support/Memory.h (from r120288, llvm/trunk/include/llvm/System/Memory.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Memory.h?p2=llvm/trunk/include/llvm/Support/Memory.h&p1=llvm/trunk/include/llvm/System/Memory.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Memory.h (original) +++ llvm/trunk/include/llvm/Support/Memory.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SYSTEM_MEMORY_H #define LLVM_SYSTEM_MEMORY_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { @@ -51,7 +51,7 @@ /// /// On success, this returns a non-null memory block, otherwise it returns /// a null memory block and fills in *ErrMsg. - /// + /// /// @brief Allocate Read/Write/Execute memory. static MemoryBlock AllocateRWX(size_t NumBytes, const MemoryBlock *NearBlock, @@ -65,8 +65,8 @@ /// in *ErrMsg. /// @brief Release Read/Write/Execute memory. static bool ReleaseRWX(MemoryBlock &block, std::string *ErrMsg = 0); - - + + /// InvalidateInstructionCache - Before the JIT can run a block of code /// that has been emitted it must invalidate the instruction cache on some /// platforms. @@ -82,11 +82,11 @@ /// boundaries, and the JIT internal allocations are not page aligned. static bool setWritable (MemoryBlock &M, std::string *ErrMsg = 0); - /// setRangeExecutable - Mark the page containing a range of addresses + /// setRangeExecutable - Mark the page containing a range of addresses /// as executable. static bool setRangeExecutable(const void *Addr, size_t Size); - /// setRangeWritable - Mark the page containing a range of addresses + /// setRangeWritable - Mark the page containing a range of addresses /// as writable. static bool setRangeWritable(const void *Addr, size_t Size); }; Modified: llvm/trunk/include/llvm/Support/MemoryBuffer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MemoryBuffer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/MemoryBuffer.h (original) +++ llvm/trunk/include/llvm/Support/MemoryBuffer.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #define LLVM_SUPPORT_MEMORYBUFFER_H #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/Support/MemoryObject.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MemoryObject.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/MemoryObject.h (original) +++ llvm/trunk/include/llvm/Support/MemoryObject.h Mon Nov 29 12:16:10 2010 @@ -10,7 +10,7 @@ #ifndef MEMORYOBJECT_H #define MEMORYOBJECT_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Copied: llvm/trunk/include/llvm/Support/Mutex.h (from r120288, llvm/trunk/include/llvm/System/Mutex.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Mutex.h?p2=llvm/trunk/include/llvm/Support/Mutex.h&p1=llvm/trunk/include/llvm/System/Mutex.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Mutex.h (original) +++ llvm/trunk/include/llvm/Support/Mutex.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SYSTEM_MUTEX_H #define LLVM_SYSTEM_MUTEX_H -#include "llvm/System/Threading.h" +#include "llvm/Support/Threading.h" #include namespace llvm @@ -79,9 +79,9 @@ void operator=(const MutexImpl &); /// @} }; - - - /// SmartMutex - A mutex with a compile time constant parameter that + + + /// SmartMutex - A mutex with a compile time constant parameter that /// indicates whether this mutex should become a no-op when we're not /// running in multithreaded mode. template @@ -91,7 +91,7 @@ public: explicit SmartMutex(bool rec = true) : MutexImpl(rec), acquired(0), recursive(rec) { } - + bool acquire() { if (!mt_only || llvm_is_multithreaded()) { return MutexImpl::acquire(); @@ -124,29 +124,29 @@ return MutexImpl::tryacquire(); else return true; } - + private: SmartMutex(const SmartMutex & original); void operator=(const SmartMutex &); }; - + /// Mutex - A standard, always enforced mutex. typedef SmartMutex Mutex; - + template class SmartScopedLock { SmartMutex& mtx; - + public: SmartScopedLock(SmartMutex& m) : mtx(m) { mtx.acquire(); } - + ~SmartScopedLock() { mtx.release(); } }; - + typedef SmartScopedLock ScopedLock; } } Modified: llvm/trunk/include/llvm/Support/MutexGuard.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MutexGuard.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/MutexGuard.h (original) +++ llvm/trunk/include/llvm/Support/MutexGuard.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_SUPPORT_MUTEXGUARD_H #define LLVM_SUPPORT_MUTEXGUARD_H -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" namespace llvm { /// Instances of this class acquire a given Mutex Lock when constructed and Copied: llvm/trunk/include/llvm/Support/Path.h (from r120288, llvm/trunk/include/llvm/System/Path.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Path.h?p2=llvm/trunk/include/llvm/Support/Path.h&p1=llvm/trunk/include/llvm/System/Path.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Path.h (original) +++ llvm/trunk/include/llvm/Support/Path.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #define LLVM_SYSTEM_PATH_H #include "llvm/ADT/StringRef.h" -#include "llvm/System/TimeValue.h" +#include "llvm/Support/TimeValue.h" #include #include #include Copied: llvm/trunk/include/llvm/Support/PathV2.h (from r120288, llvm/trunk/include/llvm/System/PathV2.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?p2=llvm/trunk/include/llvm/Support/PathV2.h&p1=llvm/trunk/include/llvm/System/PathV2.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Mon Nov 29 12:16:10 2010 @@ -25,8 +25,8 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/SmallString.h" -#include "llvm/System/DataTypes.h" -#include "llvm/System/system_error.h" +#include "llvm/Support/DataTypes.h" +#include "llvm/Support/system_error.h" #include #include #include Modified: llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h (original) +++ llvm/trunk/include/llvm/Support/PointerLikeTypeTraits.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_SUPPORT_POINTERLIKETYPETRAITS_H #define LLVM_SUPPORT_POINTERLIKETYPETRAITS_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Copied: llvm/trunk/include/llvm/Support/Process.h (from r120288, llvm/trunk/include/llvm/System/Process.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Process.h?p2=llvm/trunk/include/llvm/Support/Process.h&p1=llvm/trunk/include/llvm/System/Process.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Process.h (original) +++ llvm/trunk/include/llvm/Support/Process.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SYSTEM_PROCESS_H #define LLVM_SYSTEM_PROCESS_H -#include "llvm/System/TimeValue.h" +#include "llvm/Support/TimeValue.h" namespace llvm { namespace sys { Copied: llvm/trunk/include/llvm/Support/Program.h (from r120288, llvm/trunk/include/llvm/System/Program.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Program.h?p2=llvm/trunk/include/llvm/Support/Program.h&p1=llvm/trunk/include/llvm/System/Program.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Program.h (original) +++ llvm/trunk/include/llvm/Support/Program.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SYSTEM_PROGRAM_H #define LLVM_SYSTEM_PROGRAM_H -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" namespace llvm { namespace sys { Copied: llvm/trunk/include/llvm/Support/RWMutex.h (from r120288, llvm/trunk/include/llvm/System/RWMutex.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/RWMutex.h?p2=llvm/trunk/include/llvm/Support/RWMutex.h&p1=llvm/trunk/include/llvm/System/RWMutex.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/RWMutex.h (original) +++ llvm/trunk/include/llvm/Support/RWMutex.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SYSTEM_RWMUTEX_H #define LLVM_SYSTEM_RWMUTEX_H -#include "llvm/System/Threading.h" +#include "llvm/Support/Threading.h" #include namespace llvm @@ -43,7 +43,7 @@ /// Attempts to unconditionally acquire the lock in reader mode. If the /// lock is held by a writer, this method will wait until it can acquire - /// the lock. + /// the lock. /// @returns false if any kind of error occurs, true otherwise. /// @brief Unconditionally acquire the lock in reader mode. bool reader_acquire(); @@ -55,7 +55,7 @@ /// Attempts to unconditionally acquire the lock in reader mode. If the /// lock is held by any readers, this method will wait until it can - /// acquire the lock. + /// acquire the lock. /// @returns false if any kind of error occurs, true otherwise. /// @brief Unconditionally acquire the lock in writer mode. bool writer_acquire(); @@ -79,8 +79,8 @@ void operator=(const RWMutexImpl &); /// @} }; - - /// SmartMutex - An R/W mutex with a compile time constant parameter that + + /// SmartMutex - An R/W mutex with a compile time constant parameter that /// indicates whether this mutex should become a no-op when we're not /// running in multithreaded mode. template @@ -88,80 +88,80 @@ unsigned readers, writers; public: explicit SmartRWMutex() : RWMutexImpl(), readers(0), writers(0) { } - + bool reader_acquire() { if (!mt_only || llvm_is_multithreaded()) return RWMutexImpl::reader_acquire(); - + // Single-threaded debugging code. This would be racy in multithreaded // mode, but provides not sanity checks in single threaded mode. ++readers; return true; } - + bool reader_release() { if (!mt_only || llvm_is_multithreaded()) return RWMutexImpl::reader_release(); - + // Single-threaded debugging code. This would be racy in multithreaded // mode, but provides not sanity checks in single threaded mode. assert(readers > 0 && "Reader lock not acquired before release!"); --readers; return true; } - + bool writer_acquire() { if (!mt_only || llvm_is_multithreaded()) return RWMutexImpl::writer_acquire(); - + // Single-threaded debugging code. This would be racy in multithreaded // mode, but provides not sanity checks in single threaded mode. assert(writers == 0 && "Writer lock already acquired!"); ++writers; return true; } - + bool writer_release() { if (!mt_only || llvm_is_multithreaded()) return RWMutexImpl::writer_release(); - + // Single-threaded debugging code. This would be racy in multithreaded // mode, but provides not sanity checks in single threaded mode. assert(writers == 1 && "Writer lock not acquired before release!"); --writers; return true; } - + private: SmartRWMutex(const SmartRWMutex & original); void operator=(const SmartRWMutex &); }; typedef SmartRWMutex RWMutex; - + /// ScopedReader - RAII acquisition of a reader lock template struct SmartScopedReader { SmartRWMutex& mutex; - + explicit SmartScopedReader(SmartRWMutex& m) : mutex(m) { mutex.reader_acquire(); } - + ~SmartScopedReader() { mutex.reader_release(); } }; typedef SmartScopedReader ScopedReader; - + /// ScopedWriter - RAII acquisition of a writer lock template struct SmartScopedWriter { SmartRWMutex& mutex; - + explicit SmartScopedWriter(SmartRWMutex& m) : mutex(m) { mutex.writer_acquire(); } - + ~SmartScopedWriter() { mutex.writer_release(); } Copied: llvm/trunk/include/llvm/Support/Signals.h (from r120288, llvm/trunk/include/llvm/System/Signals.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Signals.h?p2=llvm/trunk/include/llvm/Support/Signals.h&p1=llvm/trunk/include/llvm/System/Signals.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Signals.h (original) +++ llvm/trunk/include/llvm/Support/Signals.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_SYSTEM_SIGNALS_H #define LLVM_SYSTEM_SIGNALS_H -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" namespace llvm { namespace sys { Copied: llvm/trunk/include/llvm/Support/Solaris.h (from r120288, llvm/trunk/include/llvm/System/Solaris.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Solaris.h?p2=llvm/trunk/include/llvm/Support/Solaris.h&p1=llvm/trunk/include/llvm/System/Solaris.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/include/llvm/Support/SwapByteOrder.h (from r120288, llvm/trunk/include/llvm/System/SwapByteOrder.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/SwapByteOrder.h?p2=llvm/trunk/include/llvm/Support/SwapByteOrder.h&p1=llvm/trunk/include/llvm/System/SwapByteOrder.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/SwapByteOrder.h (original) +++ llvm/trunk/include/llvm/Support/SwapByteOrder.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_SYSTEM_SWAP_BYTE_ORDER_H #define LLVM_SYSTEM_SWAP_BYTE_ORDER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include @@ -87,7 +87,7 @@ #else #error "Unknown long size!" #endif - + inline unsigned long long SwapByteOrder(unsigned long long C) { return SwapByteOrder_64(C); } Copied: llvm/trunk/include/llvm/Support/ThreadLocal.h (from r120288, llvm/trunk/include/llvm/System/ThreadLocal.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ThreadLocal.h?p2=llvm/trunk/include/llvm/Support/ThreadLocal.h&p1=llvm/trunk/include/llvm/System/ThreadLocal.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/ThreadLocal.h (original) +++ llvm/trunk/include/llvm/Support/ThreadLocal.h Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #ifndef LLVM_SYSTEM_THREAD_LOCAL_H #define LLVM_SYSTEM_THREAD_LOCAL_H -#include "llvm/System/Threading.h" +#include "llvm/Support/Threading.h" #include namespace llvm { @@ -30,21 +30,21 @@ const void* getInstance(); void removeInstance(); }; - + /// ThreadLocal - A class used to abstract thread-local storage. It holds, /// for each thread, a pointer a single object of type T. template class ThreadLocal : public ThreadLocalImpl { public: ThreadLocal() : ThreadLocalImpl() { } - + /// get - Fetches a pointer to the object associated with the current /// thread. If no object has yet been associated, it returns NULL; T* get() { return static_cast(getInstance()); } - + // set - Associates a pointer to an object with the current thread. void set(T* d) { setInstance(d); } - + // erase - Removes the pointer associated with the current thread. void erase() { removeInstance(); } }; Copied: llvm/trunk/include/llvm/Support/Threading.h (from r120288, llvm/trunk/include/llvm/System/Threading.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?p2=llvm/trunk/include/llvm/Support/Threading.h&p1=llvm/trunk/include/llvm/System/Threading.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/Threading.h (original) +++ llvm/trunk/include/llvm/Support/Threading.h Mon Nov 29 12:16:10 2010 @@ -18,25 +18,25 @@ /// llvm_start_multithreaded - Allocate and initialize structures needed to /// make LLVM safe for multithreading. The return value indicates whether /// multithreaded initialization succeeded. LLVM will still be operational - /// on "failed" return, and will still be safe for hosting threading + /// on "failed" return, and will still be safe for hosting threading /// applications in the JIT, but will not be safe for concurrent calls to the /// LLVM APIs. /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS. bool llvm_start_multithreaded(); - + /// llvm_stop_multithreaded - Deallocate structures necessary to make LLVM /// safe for multithreading. /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS. void llvm_stop_multithreaded(); - + /// llvm_is_multithreaded - Check whether LLVM is executing in thread-safe /// mode or not. bool llvm_is_multithreaded(); - + /// acquire_global_lock - Acquire the global lock. This is a no-op if called /// before llvm_start_multithreaded(). void llvm_acquire_global_lock(); - + /// release_global_lock - Release the global lock. This is a no-op if called /// before llvm_start_multithreaded(). void llvm_release_global_lock(); Copied: llvm/trunk/include/llvm/Support/TimeValue.h (from r120288, llvm/trunk/include/llvm/System/TimeValue.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/TimeValue.h?p2=llvm/trunk/include/llvm/Support/TimeValue.h&p1=llvm/trunk/include/llvm/System/TimeValue.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/System/TimeValue.h (original) +++ llvm/trunk/include/llvm/Support/TimeValue.h Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #ifndef LLVM_SYSTEM_TIMEVALUE_H Modified: llvm/trunk/include/llvm/Support/Timer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Timer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Timer.h (original) +++ llvm/trunk/include/llvm/Support/Timer.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_SUPPORT_TIMER_H #define LLVM_SUPPORT_TIMER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/ADT/StringRef.h" #include #include Copied: llvm/trunk/include/llvm/Support/Valgrind.h (from r120288, llvm/trunk/include/llvm/System/Valgrind.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Valgrind.h?p2=llvm/trunk/include/llvm/Support/Valgrind.h&p1=llvm/trunk/include/llvm/System/Valgrind.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Modified: llvm/trunk/include/llvm/Support/raw_ostream.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/raw_ostream.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/raw_ostream.h (original) +++ llvm/trunk/include/llvm/Support/raw_ostream.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #define LLVM_SUPPORT_RAW_OSTREAM_H #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class format_object_base; Copied: llvm/trunk/include/llvm/Support/system_error.h (from r120288, llvm/trunk/include/llvm/System/system_error.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/system_error.h?p2=llvm/trunk/include/llvm/Support/system_error.h&p1=llvm/trunk/include/llvm/System/system_error.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Removed: llvm/trunk/include/llvm/System/AIXDataTypesFix.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/AIXDataTypesFix.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/AIXDataTypesFix.h (original) +++ llvm/trunk/include/llvm/System/AIXDataTypesFix.h (removed) @@ -1,25 +0,0 @@ -//===-- llvm/System/AIXDataTypesFix.h - Fix datatype defs ------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file overrides default system-defined types and limits which cannot be -// done in DataTypes.h.in because it is processed by autoheader first, which -// comments out any #undef statement -// -//===----------------------------------------------------------------------===// - -// No include guards desired! - -#ifndef SUPPORT_DATATYPES_H -#error "AIXDataTypesFix.h must only be included via DataTypes.h!" -#endif - -// GCC is strict about defining large constants: they must have LL modifier. -// These will be defined properly at the end of DataTypes.h -#undef INT64_MAX -#undef INT64_MIN Removed: llvm/trunk/include/llvm/System/Alarm.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Alarm.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Alarm.h (original) +++ llvm/trunk/include/llvm/System/Alarm.h (removed) @@ -1,51 +0,0 @@ -//===- llvm/System/Alarm.h - Alarm Generation support ----------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides an operating system independent interface to alarm(2) -// type functionality. The Alarm class allows a one-shot alarm to be set up -// at some number of seconds in the future. When the alarm triggers, a method -// is called to process the event -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_ALARM_H -#define LLVM_SYSTEM_ALARM_H - -namespace llvm { -namespace sys { - - /// This function registers an alarm to trigger some number of \p seconds in - /// the future. When that time arrives, the AlarmStatus function will begin - /// to return 1 instead of 0. The user must poll the status of the alarm by - /// making occasional calls to AlarmStatus. If the user sends an interrupt - /// signal, AlarmStatus will begin returning -1, even if the alarm event - /// occurred. - /// @returns nothing - void SetupAlarm( - unsigned seconds ///< Number of seconds in future when alarm arrives - ); - - /// This function terminates the alarm previously set up - /// @returns nothing - void TerminateAlarm(); - - /// This function acquires the status of the alarm. - /// @returns -1=cancelled, 0=untriggered, 1=triggered - int AlarmStatus(); - - /// Sleep for n seconds. Warning: mixing calls to Sleep() and other *Alarm - /// calls may be a bad idea on some platforms (source: Linux man page). - /// @returns nothing. - void Sleep(unsigned n); - - -} // End sys namespace -} // End llvm namespace - -#endif Removed: llvm/trunk/include/llvm/System/Atomic.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Atomic.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Atomic.h (original) +++ llvm/trunk/include/llvm/System/Atomic.h (removed) @@ -1,39 +0,0 @@ -//===- llvm/System/Atomic.h - Atomic Operations -----------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys atomic operations. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_ATOMIC_H -#define LLVM_SYSTEM_ATOMIC_H - -#include "llvm/System/DataTypes.h" - -namespace llvm { - namespace sys { - void MemoryFence(); - -#ifdef _MSC_VER - typedef long cas_flag; -#else - typedef uint32_t cas_flag; -#endif - cas_flag CompareAndSwap(volatile cas_flag* ptr, - cas_flag new_value, - cas_flag old_value); - cas_flag AtomicIncrement(volatile cas_flag* ptr); - cas_flag AtomicDecrement(volatile cas_flag* ptr); - cas_flag AtomicAdd(volatile cas_flag* ptr, cas_flag val); - cas_flag AtomicMul(volatile cas_flag* ptr, cas_flag val); - cas_flag AtomicDiv(volatile cas_flag* ptr, cas_flag val); - } -} - -#endif Removed: llvm/trunk/include/llvm/System/DataTypes.h.cmake URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/DataTypes.h.cmake?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/DataTypes.h.cmake (original) +++ llvm/trunk/include/llvm/System/DataTypes.h.cmake (removed) @@ -1,189 +0,0 @@ -/*===-- include/System/DataTypes.h - Define fixed size types -----*- C -*-===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file contains definitions to figure out the size of _HOST_ data types.*| -|* This file is important because different host OS's define different macros,*| -|* which makes portability tough. This file exports the following *| -|* definitions: *| -|* *| -|* [u]int(32|64)_t : typedefs for signed and unsigned 32/64 bit system types*| -|* [U]INT(8|16|32|64)_(MIN|MAX) : Constants for the min and max values. *| -|* *| -|* No library is required when using these functinons. *| -|* *| -|*===----------------------------------------------------------------------===*/ - -/* Please leave this file C-compatible. */ - -#ifndef SUPPORT_DATATYPES_H -#define SUPPORT_DATATYPES_H - -#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H} -#cmakedefine HAVE_INTTYPES_H ${HAVE_INTTYPES_H} -#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H} -#cmakedefine HAVE_UINT64_T ${HAVE_UINT64_T} -#cmakedefine HAVE_U_INT64_T ${HAVE_U_INT64_T} - -#ifdef __cplusplus -#include -#else -#include -#endif - -#ifndef _MSC_VER - -/* Note that this header's correct operation depends on __STDC_LIMIT_MACROS - being defined. We would define it here, but in order to prevent Bad Things - happening when system headers or C++ STL headers include stdint.h before we - define it here, we define it on the g++ command line (in Makefile.rules). */ -#if !defined(__STDC_LIMIT_MACROS) -# error "Must #define __STDC_LIMIT_MACROS before #including System/DataTypes.h" -#endif - -#if !defined(__STDC_CONSTANT_MACROS) -# error "Must #define __STDC_CONSTANT_MACROS before " \ - "#including System/DataTypes.h" -#endif - -/* Note that includes , if this is a C99 system. */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_INTTYPES_H -#include -#endif - -#ifdef HAVE_STDINT_H -#include -#endif - -#ifdef _AIX -#include "llvm/System/AIXDataTypesFix.h" -#endif - -/* Handle incorrect definition of uint64_t as u_int64_t */ -#ifndef HAVE_UINT64_T -#ifdef HAVE_U_INT64_T -typedef u_int64_t uint64_t; -#else -# error "Don't have a definition for uint64_t on this platform" -#endif -#endif - -#ifdef _OpenBSD_ -#define INT8_MAX 127 -#define INT8_MIN -128 -#define UINT8_MAX 255 -#define INT16_MAX 32767 -#define INT16_MIN -32768 -#define UINT16_MAX 65535 -#define INT32_MAX 2147483647 -#define INT32_MIN -2147483648 -#define UINT32_MAX 4294967295U -#endif - -#else /* _MSC_VER */ -/* Visual C++ doesn't provide standard integer headers, but it does provide - built-in data types. */ -#include -#include -#include -#ifdef __cplusplus -#include -#else -#include -#endif -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -typedef signed int int32_t; -typedef unsigned int uint32_t; -typedef short int16_t; -typedef unsigned short uint16_t; -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef signed int ssize_t; -#ifndef INT8_MAX -# define INT8_MAX 127 -#endif -#ifndef INT8_MIN -# define INT8_MIN -128 -#endif -#ifndef UINT8_MAX -# define UINT8_MAX 255 -#endif -#ifndef INT16_MAX -# define INT16_MAX 32767 -#endif -#ifndef INT16_MIN -# define INT16_MIN -32768 -#endif -#ifndef UINT16_MAX -# define UINT16_MAX 65535 -#endif -#ifndef INT32_MAX -# define INT32_MAX 2147483647 -#endif -#ifndef INT32_MIN -# define INT32_MIN -2147483648 -#endif -#ifndef UINT32_MAX -# define UINT32_MAX 4294967295U -#endif -/* Certain compatibility updates to VC++ introduce the `cstdint' - * header, which defines the INT*_C macros. On default installs they - * are absent. */ -#ifndef INT8_C -# define INT8_C(C) C##i8 -#endif -#ifndef UINT8_C -# define UINT8_C(C) C##ui8 -#endif -#ifndef INT16_C -# define INT16_C(C) C##i16 -#endif -#ifndef UINT16_C -# define UINT16_C(C) C##ui16 -#endif -#ifndef INT32_C -# define INT32_C(C) C##i32 -#endif -#ifndef UINT32_C -# define UINT32_C(C) C##ui32 -#endif -#ifndef INT64_C -# define INT64_C(C) C##i64 -#endif -#ifndef UINT64_C -# define UINT64_C(C) C##ui64 -#endif -#endif /* _MSC_VER */ - -/* Set defaults for constants which we cannot find. */ -#if !defined(INT64_MAX) -# define INT64_MAX 9223372036854775807LL -#endif -#if !defined(INT64_MIN) -# define INT64_MIN ((-INT64_MAX)-1) -#endif -#if !defined(UINT64_MAX) -# define UINT64_MAX 0xffffffffffffffffULL -#endif - -#if __GNUC__ > 3 -#define END_WITH_NULL __attribute__((sentinel)) -#else -#define END_WITH_NULL -#endif - -#ifndef HUGE_VALF -#define HUGE_VALF (float)HUGE_VAL -#endif - -#endif /* SUPPORT_DATATYPES_H */ Removed: llvm/trunk/include/llvm/System/DataTypes.h.in URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/DataTypes.h.in?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/DataTypes.h.in (original) +++ llvm/trunk/include/llvm/System/DataTypes.h.in (removed) @@ -1,111 +0,0 @@ -/*===-- include/System/DataTypes.h - Define fixed size types -----*- C -*-===*\ -|* *| -|* The LLVM Compiler Infrastructure *| -|* *| -|* This file is distributed under the University of Illinois Open Source *| -|* License. See LICENSE.TXT for details. *| -|* *| -|*===----------------------------------------------------------------------===*| -|* *| -|* This file contains definitions to figure out the size of _HOST_ data types.*| -|* This file is important because different host OS's define different macros,*| -|* which makes portability tough. This file exports the following *| -|* definitions: *| -|* *| -|* [u]int(32|64)_t : typedefs for signed and unsigned 32/64 bit system types*| -|* [U]INT(8|16|32|64)_(MIN|MAX) : Constants for the min and max values. *| -|* *| -|* No library is required when using these functions. *| -|* *| -|*===----------------------------------------------------------------------===*/ - -/* Please leave this file C-compatible. */ - -#ifndef SUPPORT_DATATYPES_H -#define SUPPORT_DATATYPES_H - -#undef HAVE_SYS_TYPES_H -#undef HAVE_INTTYPES_H -#undef HAVE_STDINT_H -#undef HAVE_UINT64_T -#undef HAVE_U_INT64_T - -#ifdef __cplusplus -#include -#else -#include -#endif - -/* Note that this header's correct operation depends on __STDC_LIMIT_MACROS - being defined. We would define it here, but in order to prevent Bad Things - happening when system headers or C++ STL headers include stdint.h before we - define it here, we define it on the g++ command line (in Makefile.rules). */ -#if !defined(__STDC_LIMIT_MACROS) -# error "Must #define __STDC_LIMIT_MACROS before #including System/DataTypes.h" -#endif - -#if !defined(__STDC_CONSTANT_MACROS) -# error "Must #define __STDC_CONSTANT_MACROS before " \ - "#including System/DataTypes.h" -#endif - -/* Note that includes , if this is a C99 system. */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_INTTYPES_H -#include -#endif - -#ifdef HAVE_STDINT_H -#include -#endif - -#ifdef _AIX -#include "llvm/System/AIXDataTypesFix.h" -#endif - -/* Handle incorrect definition of uint64_t as u_int64_t */ -#ifndef HAVE_UINT64_T -#ifdef HAVE_U_INT64_T -typedef u_int64_t uint64_t; -#else -# error "Don't have a definition for uint64_t on this platform" -#endif -#endif - -#ifdef _OpenBSD_ -#define INT8_MAX 127 -#define INT8_MIN -128 -#define UINT8_MAX 255 -#define INT16_MAX 32767 -#define INT16_MIN -32768 -#define UINT16_MAX 65535 -#define INT32_MAX 2147483647 -#define INT32_MIN -2147483648 -#define UINT32_MAX 4294967295U -#endif - -/* Set defaults for constants which we cannot find. */ -#if !defined(INT64_MAX) -# define INT64_MAX 9223372036854775807LL -#endif -#if !defined(INT64_MIN) -# define INT64_MIN ((-INT64_MAX)-1) -#endif -#if !defined(UINT64_MAX) -# define UINT64_MAX 0xffffffffffffffffULL -#endif - -#if __GNUC__ > 3 -#define END_WITH_NULL __attribute__((sentinel)) -#else -#define END_WITH_NULL -#endif - -#ifndef HUGE_VALF -#define HUGE_VALF (float)HUGE_VAL -#endif - -#endif /* SUPPORT_DATATYPES_H */ Removed: llvm/trunk/include/llvm/System/Disassembler.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Disassembler.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Disassembler.h (original) +++ llvm/trunk/include/llvm/System/Disassembler.h (removed) @@ -1,35 +0,0 @@ -//===- llvm/Support/Disassembler.h ------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the necessary glue to call external disassembler -// libraries. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_DISASSEMBLER_H -#define LLVM_SYSTEM_DISASSEMBLER_H - -#include "llvm/System/DataTypes.h" -#include - -namespace llvm { -namespace sys { - -/// This function returns true, if there is possible to use some external -/// disassembler library. False otherwise. -bool hasDisassembler(); - -/// This function provides some "glue" code to call external disassembler -/// libraries. -std::string disassembleBuffer(uint8_t* start, size_t length, uint64_t pc = 0); - -} -} - -#endif // LLVM_SYSTEM_DISASSEMBLER_H Removed: llvm/trunk/include/llvm/System/DynamicLibrary.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/DynamicLibrary.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/DynamicLibrary.h (original) +++ llvm/trunk/include/llvm/System/DynamicLibrary.h (removed) @@ -1,86 +0,0 @@ -//===-- llvm/System/DynamicLibrary.h - Portable Dynamic Library -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the sys::DynamicLibrary class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_DYNAMIC_LIBRARY_H -#define LLVM_SYSTEM_DYNAMIC_LIBRARY_H - -#include - -namespace llvm { -namespace sys { - - /// This class provides a portable interface to dynamic libraries which also - /// might be known as shared libraries, shared objects, dynamic shared - /// objects, or dynamic link libraries. Regardless of the terminology or the - /// operating system interface, this class provides a portable interface that - /// allows dynamic libraries to be loaded and searched for externally - /// defined symbols. This is typically used to provide "plug-in" support. - /// It also allows for symbols to be defined which don't live in any library, - /// but rather the main program itself, useful on Windows where the main - /// executable cannot be searched. - class DynamicLibrary { - DynamicLibrary(); // DO NOT IMPLEMENT - public: - /// This function allows a library to be loaded without instantiating a - /// DynamicLibrary object. Consequently, it is marked as being permanent - /// and will only be unloaded when the program terminates. This returns - /// false on success or returns true and fills in *ErrMsg on failure. - /// @brief Open a dynamic library permanently. - /// - /// NOTE: This function is not thread safe. - /// - static bool LoadLibraryPermanently(const char *filename, - std::string *ErrMsg = 0); - - /// This function will search through all previously loaded dynamic - /// libraries for the symbol \p symbolName. If it is found, the addressof - /// that symbol is returned. If not, null is returned. Note that this will - /// search permanently loaded libraries (LoadLibraryPermanently) as well - /// as ephemerally loaded libraries (constructors). - /// @throws std::string on error. - /// @brief Search through libraries for address of a symbol - /// - /// NOTE: This function is not thread safe. - /// - static void *SearchForAddressOfSymbol(const char *symbolName); - - /// @brief Convenience function for C++ophiles. - /// - /// NOTE: This function is not thread safe. - /// - static void *SearchForAddressOfSymbol(const std::string &symbolName) { - return SearchForAddressOfSymbol(symbolName.c_str()); - } - - /// This functions permanently adds the symbol \p symbolName with the - /// value \p symbolValue. These symbols are searched before any - /// libraries. - /// @brief Add searchable symbol/value pair. - /// - /// NOTE: This function is not thread safe. - /// - static void AddSymbol(const char *symbolName, void *symbolValue); - - /// @brief Convenience function for C++ophiles. - /// - /// NOTE: This function is not thread safe. - /// - static void AddSymbol(const std::string &symbolName, void *symbolValue) { - AddSymbol(symbolName.c_str(), symbolValue); - } - }; - -} // End sys namespace -} // End llvm namespace - -#endif // LLVM_SYSTEM_DYNAMIC_LIBRARY_H Removed: llvm/trunk/include/llvm/System/Errno.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Errno.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Errno.h (original) +++ llvm/trunk/include/llvm/System/Errno.h (removed) @@ -1,34 +0,0 @@ -//===- llvm/System/Errno.h - Portable+convenient errno handling -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares some portable and convenient functions to deal with errno. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_ERRNO_H -#define LLVM_SYSTEM_ERRNO_H - -#include - -namespace llvm { -namespace sys { - -/// Returns a string representation of the errno value, using whatever -/// thread-safe variant of strerror() is available. Be sure to call this -/// immediately after the function that set errno, or errno may have been -/// overwritten by an intervening call. -std::string StrError(); - -/// Like the no-argument version above, but uses \p errnum instead of errno. -std::string StrError(int errnum); - -} // namespace sys -} // namespace llvm - -#endif // LLVM_SYSTEM_ERRNO_H Removed: llvm/trunk/include/llvm/System/FEnv.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/FEnv.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/FEnv.h (original) +++ llvm/trunk/include/llvm/System/FEnv.h (removed) @@ -1,56 +0,0 @@ -//===- llvm/System/FEnv.h - Host floating-point exceptions ------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides an operating system independent interface to -// floating-point exception interfaces. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_FENV_H -#define LLVM_SYSTEM_FENV_H - -#include "llvm/Config/config.h" -#include -#ifdef HAVE_FENV_H -#include -#endif - -// FIXME: Clang's #include handling apparently doesn't work for libstdc++'s -// fenv.h; see PR6907 for details. -#if defined(__clang__) && defined(_GLIBCXX_FENV_H) -#undef HAVE_FENV_H -#endif - -namespace llvm { -namespace sys { - -/// llvm_fenv_clearexcept - Clear the floating-point exception state. -static inline void llvm_fenv_clearexcept() { -#ifdef HAVE_FENV_H - feclearexcept(FE_ALL_EXCEPT); -#endif - errno = 0; -} - -/// llvm_fenv_testexcept - Test if a floating-point exception was raised. -static inline bool llvm_fenv_testexcept() { - int errno_val = errno; - if (errno_val == ERANGE || errno_val == EDOM) - return true; -#ifdef HAVE_FENV_H - if (fetestexcept(FE_ALL_EXCEPT & ~FE_INEXACT)) - return true; -#endif - return false; -} - -} // End sys namespace -} // End llvm namespace - -#endif Removed: llvm/trunk/include/llvm/System/Host.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Host.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Host.h (original) +++ llvm/trunk/include/llvm/System/Host.h (removed) @@ -1,66 +0,0 @@ -//===- llvm/System/Host.h - Host machine characteristics --------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Methods for querying the nature of the host machine. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_HOST_H -#define LLVM_SYSTEM_HOST_H - -#include "llvm/ADT/StringMap.h" -#include - -namespace llvm { -namespace sys { - - inline bool isLittleEndianHost() { - union { - int i; - char c; - }; - i = 1; - return c; - } - - inline bool isBigEndianHost() { - return !isLittleEndianHost(); - } - - /// getHostTriple() - Return the target triple of the running - /// system. - /// - /// The target triple is a string in the format of: - /// CPU_TYPE-VENDOR-OPERATING_SYSTEM - /// or - /// CPU_TYPE-VENDOR-KERNEL-OPERATING_SYSTEM - std::string getHostTriple(); - - /// getHostCPUName - Get the LLVM name for the host CPU. The particular format - /// of the name is target dependent, and suitable for passing as -mcpu to the - /// target which matches the host. - /// - /// \return - The host CPU name, or empty if the CPU could not be determined. - std::string getHostCPUName(); - - /// getHostCPUFeatures - Get the LLVM names for the host CPU features. - /// The particular format of the names are target dependent, and suitable for - /// passing as -mattr to the target which matches the host. - /// - /// \param Features - A string mapping feature names to either - /// true (if enabled) or false (if disabled). This routine makes no guarantees - /// about exactly which features may appear in this map, except that they are - /// all valid LLVM feature names. - /// - /// \return - True on success. - bool getHostCPUFeatures(StringMap &Features); -} -} - -#endif Removed: llvm/trunk/include/llvm/System/IncludeFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/IncludeFile.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/IncludeFile.h (original) +++ llvm/trunk/include/llvm/System/IncludeFile.h (removed) @@ -1,79 +0,0 @@ -//===- llvm/System/IncludeFile.h - Ensure Linking Of Library ---*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines the FORCE_DEFINING_FILE_TO_BE_LINKED and DEFINE_FILE_FOR -// macros. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_INCLUDEFILE_H -#define LLVM_SYSTEM_INCLUDEFILE_H - -/// This macro is the public interface that IncludeFile.h exports. This gives -/// us the option to implement the "link the definition" capability in any -/// manner that we choose. All header files that depend on a specific .cpp -/// file being linked at run time should use this macro instead of the -/// IncludeFile class directly. -/// -/// For example, foo.h would use:
-/// FORCE_DEFINING_FILE_TO_BE_LINKED(foo)
-/// -/// And, foo.cp would use:
-/// DEFINING_FILE_FOR(foo)
-#ifdef __GNUC__ -// If the `used' attribute is available, use it to create a variable -// with an initializer that will force the linking of the defining file. -#define FORCE_DEFINING_FILE_TO_BE_LINKED(name) \ - namespace llvm { \ - extern const char name ## LinkVar; \ - __attribute__((used)) static const char *const name ## LinkObj = \ - &name ## LinkVar; \ - } -#else -// Otherwise use a constructor call. -#define FORCE_DEFINING_FILE_TO_BE_LINKED(name) \ - namespace llvm { \ - extern const char name ## LinkVar; \ - static const IncludeFile name ## LinkObj ( &name ## LinkVar ); \ - } -#endif - -/// This macro is the counterpart to FORCE_DEFINING_FILE_TO_BE_LINKED. It should -/// be used in a .cpp file to define the name referenced in a header file that -/// will cause linkage of the .cpp file. It should only be used at extern level. -#define DEFINING_FILE_FOR(name) \ - namespace llvm { const char name ## LinkVar = 0; } - -namespace llvm { - -/// This class is used in the implementation of FORCE_DEFINING_FILE_TO_BE_LINKED -/// macro to make sure that the implementation of a header file is included -/// into a tool that uses the header. This is solely -/// to overcome problems linking .a files and not getting the implementation -/// of compilation units we need. This is commonly an issue with the various -/// Passes but also occurs elsewhere in LLVM. We like to use .a files because -/// they link faster and provide the smallest executables. However, sometimes -/// those executables are too small, if the program doesn't reference something -/// that might be needed, especially by a loaded share object. This little class -/// helps to resolve that problem. The basic strategy is to use this class in -/// a header file and pass the address of a variable to the constructor. If the -/// variable is defined in the header file's corresponding .cpp file then all -/// tools/libraries that \#include the header file will require the .cpp as -/// well. -/// For example:
-/// extern int LinkMyCodeStub;
-/// static IncludeFile LinkMyModule(&LinkMyCodeStub);
-/// @brief Class to ensure linking of corresponding object file. -struct IncludeFile { - explicit IncludeFile(const void *); -}; - -} - -#endif Removed: llvm/trunk/include/llvm/System/LICENSE.TXT URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/LICENSE.TXT?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/LICENSE.TXT (original) +++ llvm/trunk/include/llvm/System/LICENSE.TXT (removed) @@ -1,6 +0,0 @@ -LLVM System Interface Library -------------------------------------------------------------------------------- -The LLVM System Interface Library is licensed under the Illinois Open Source -License and has the following additional copyright: - -Copyright (C) 2004 eXtensible Systems, Inc. Removed: llvm/trunk/include/llvm/System/Memory.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Memory.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Memory.h (original) +++ llvm/trunk/include/llvm/System/Memory.h (removed) @@ -1,96 +0,0 @@ -//===- llvm/System/Memory.h - Memory Support --------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::Memory class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_MEMORY_H -#define LLVM_SYSTEM_MEMORY_H - -#include "llvm/System/DataTypes.h" -#include - -namespace llvm { -namespace sys { - - /// This class encapsulates the notion of a memory block which has an address - /// and a size. It is used by the Memory class (a friend) as the result of - /// various memory allocation operations. - /// @see Memory - /// @brief Memory block abstraction. - class MemoryBlock { - public: - MemoryBlock() : Address(0), Size(0) { } - MemoryBlock(void *addr, size_t size) : Address(addr), Size(size) { } - void *base() const { return Address; } - size_t size() const { return Size; } - private: - void *Address; ///< Address of first byte of memory area - size_t Size; ///< Size, in bytes of the memory area - friend class Memory; - }; - - /// This class provides various memory handling functions that manipulate - /// MemoryBlock instances. - /// @since 1.4 - /// @brief An abstraction for memory operations. - class Memory { - public: - /// This method allocates a block of Read/Write/Execute memory that is - /// suitable for executing dynamically generated code (e.g. JIT). An - /// attempt to allocate \p NumBytes bytes of virtual memory is made. - /// \p NearBlock may point to an existing allocation in which case - /// an attempt is made to allocate more memory near the existing block. - /// - /// On success, this returns a non-null memory block, otherwise it returns - /// a null memory block and fills in *ErrMsg. - /// - /// @brief Allocate Read/Write/Execute memory. - static MemoryBlock AllocateRWX(size_t NumBytes, - const MemoryBlock *NearBlock, - std::string *ErrMsg = 0); - - /// This method releases a block of Read/Write/Execute memory that was - /// allocated with the AllocateRWX method. It should not be used to - /// release any memory block allocated any other way. - /// - /// On success, this returns false, otherwise it returns true and fills - /// in *ErrMsg. - /// @brief Release Read/Write/Execute memory. - static bool ReleaseRWX(MemoryBlock &block, std::string *ErrMsg = 0); - - - /// InvalidateInstructionCache - Before the JIT can run a block of code - /// that has been emitted it must invalidate the instruction cache on some - /// platforms. - static void InvalidateInstructionCache(const void *Addr, size_t Len); - - /// setExecutable - Before the JIT can run a block of code, it has to be - /// given read and executable privilege. Return true if it is already r-x - /// or the system is able to change its previlege. - static bool setExecutable (MemoryBlock &M, std::string *ErrMsg = 0); - - /// setWritable - When adding to a block of code, the JIT may need - /// to mark a block of code as RW since the protections are on page - /// boundaries, and the JIT internal allocations are not page aligned. - static bool setWritable (MemoryBlock &M, std::string *ErrMsg = 0); - - /// setRangeExecutable - Mark the page containing a range of addresses - /// as executable. - static bool setRangeExecutable(const void *Addr, size_t Size); - - /// setRangeWritable - Mark the page containing a range of addresses - /// as writable. - static bool setRangeWritable(const void *Addr, size_t Size); - }; -} -} - -#endif Removed: llvm/trunk/include/llvm/System/Mutex.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Mutex.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Mutex.h (original) +++ llvm/trunk/include/llvm/System/Mutex.h (removed) @@ -1,154 +0,0 @@ -//===- llvm/System/Mutex.h - Mutex Operating System Concept -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::Mutex class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_MUTEX_H -#define LLVM_SYSTEM_MUTEX_H - -#include "llvm/System/Threading.h" -#include - -namespace llvm -{ - namespace sys - { - /// @brief Platform agnostic Mutex class. - class MutexImpl - { - /// @name Constructors - /// @{ - public: - - /// Initializes the lock but doesn't acquire it. if \p recursive is set - /// to false, the lock will not be recursive which makes it cheaper but - /// also more likely to deadlock (same thread can't acquire more than - /// once). - /// @brief Default Constructor. - explicit MutexImpl(bool recursive = true); - - /// Releases and removes the lock - /// @brief Destructor - ~MutexImpl(); - - /// @} - /// @name Methods - /// @{ - public: - - /// Attempts to unconditionally acquire the lock. If the lock is held by - /// another thread, this method will wait until it can acquire the lock. - /// @returns false if any kind of error occurs, true otherwise. - /// @brief Unconditionally acquire the lock. - bool acquire(); - - /// Attempts to release the lock. If the lock is held by the current - /// thread, the lock is released allowing other threads to acquire the - /// lock. - /// @returns false if any kind of error occurs, true otherwise. - /// @brief Unconditionally release the lock. - bool release(); - - /// Attempts to acquire the lock without blocking. If the lock is not - /// available, this function returns false quickly (without blocking). If - /// the lock is available, it is acquired. - /// @returns false if any kind of error occurs or the lock is not - /// available, true otherwise. - /// @brief Try to acquire the lock. - bool tryacquire(); - - //@} - /// @name Platform Dependent Data - /// @{ - private: - void* data_; ///< We don't know what the data will be - - /// @} - /// @name Do Not Implement - /// @{ - private: - MutexImpl(const MutexImpl & original); - void operator=(const MutexImpl &); - /// @} - }; - - - /// SmartMutex - A mutex with a compile time constant parameter that - /// indicates whether this mutex should become a no-op when we're not - /// running in multithreaded mode. - template - class SmartMutex : public MutexImpl { - unsigned acquired; - bool recursive; - public: - explicit SmartMutex(bool rec = true) : - MutexImpl(rec), acquired(0), recursive(rec) { } - - bool acquire() { - if (!mt_only || llvm_is_multithreaded()) { - return MutexImpl::acquire(); - } else { - // Single-threaded debugging code. This would be racy in - // multithreaded mode, but provides not sanity checks in single - // threaded mode. - assert((recursive || acquired == 0) && "Lock already acquired!!"); - ++acquired; - return true; - } - } - - bool release() { - if (!mt_only || llvm_is_multithreaded()) { - return MutexImpl::release(); - } else { - // Single-threaded debugging code. This would be racy in - // multithreaded mode, but provides not sanity checks in single - // threaded mode. - assert(((recursive && acquired) || (acquired == 1)) && - "Lock not acquired before release!"); - --acquired; - return true; - } - } - - bool tryacquire() { - if (!mt_only || llvm_is_multithreaded()) - return MutexImpl::tryacquire(); - else return true; - } - - private: - SmartMutex(const SmartMutex & original); - void operator=(const SmartMutex &); - }; - - /// Mutex - A standard, always enforced mutex. - typedef SmartMutex Mutex; - - template - class SmartScopedLock { - SmartMutex& mtx; - - public: - SmartScopedLock(SmartMutex& m) : mtx(m) { - mtx.acquire(); - } - - ~SmartScopedLock() { - mtx.release(); - } - }; - - typedef SmartScopedLock ScopedLock; - } -} - -#endif Removed: llvm/trunk/include/llvm/System/Path.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Path.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Path.h (original) +++ llvm/trunk/include/llvm/System/Path.h (removed) @@ -1,738 +0,0 @@ -//===- llvm/System/Path.h - Path Operating System Concept -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::Path class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_PATH_H -#define LLVM_SYSTEM_PATH_H - -#include "llvm/ADT/StringRef.h" -#include "llvm/System/TimeValue.h" -#include -#include -#include - -namespace llvm { -namespace sys { - - /// This structure provides basic file system information about a file. It - /// is patterned after the stat(2) Unix operating system call but made - /// platform independent and eliminates many of the unix-specific fields. - /// However, to support llvm-ar, the mode, user, and group fields are - /// retained. These pertain to unix security and may not have a meaningful - /// value on non-Unix platforms. However, the other fields should - /// always be applicable on all platforms. The structure is filled in by - /// the PathWithStatus class. - /// @brief File status structure - class FileStatus { - public: - uint64_t fileSize; ///< Size of the file in bytes - TimeValue modTime; ///< Time of file's modification - uint32_t mode; ///< Mode of the file, if applicable - uint32_t user; ///< User ID of owner, if applicable - uint32_t group; ///< Group ID of owner, if applicable - uint64_t uniqueID; ///< A number to uniquely ID this file - bool isDir : 1; ///< True if this is a directory. - bool isFile : 1; ///< True if this is a file. - - FileStatus() : fileSize(0), modTime(0,0), mode(0777), user(999), - group(999), uniqueID(0), isDir(false), isFile(false) { } - - TimeValue getTimestamp() const { return modTime; } - uint64_t getSize() const { return fileSize; } - uint32_t getMode() const { return mode; } - uint32_t getUser() const { return user; } - uint32_t getGroup() const { return group; } - uint64_t getUniqueID() const { return uniqueID; } - }; - - /// This class provides an abstraction for the path to a file or directory - /// in the operating system's filesystem and provides various basic operations - /// on it. Note that this class only represents the name of a path to a file - /// or directory which may or may not be valid for a given machine's file - /// system. The class is patterned after the java.io.File class with various - /// extensions and several omissions (not relevant to LLVM). A Path object - /// ensures that the path it encapsulates is syntactically valid for the - /// operating system it is running on but does not ensure correctness for - /// any particular file system. That is, a syntactically valid path might - /// specify path components that do not exist in the file system and using - /// such a Path to act on the file system could produce errors. There is one - /// invalid Path value which is permitted: the empty path. The class should - /// never allow a syntactically invalid non-empty path name to be assigned. - /// Empty paths are required in order to indicate an error result in some - /// situations. If the path is empty, the isValid operation will return - /// false. All operations will fail if isValid is false. Operations that - /// change the path will either return false if it would cause a syntactically - /// invalid path name (in which case the Path object is left unchanged) or - /// throw an std::string exception indicating the error. The methods are - /// grouped into four basic categories: Path Accessors (provide information - /// about the path without accessing disk), Disk Accessors (provide - /// information about the underlying file or directory), Path Mutators - /// (change the path information, not the disk), and Disk Mutators (change - /// the disk file/directory referenced by the path). The Disk Mutator methods - /// all have the word "disk" embedded in their method name to reinforce the - /// notion that the operation modifies the file system. - /// @since 1.4 - /// @brief An abstraction for operating system paths. - class Path { - /// @name Constructors - /// @{ - public: - /// Construct a path to the root directory of the file system. The root - /// directory is a top level directory above which there are no more - /// directories. For example, on UNIX, the root directory is /. On Windows - /// it is file:///. Other operating systems may have different notions of - /// what the root directory is or none at all. In that case, a consistent - /// default root directory will be used. - static Path GetRootDirectory(); - - /// Construct a path to a unique temporary directory that is created in - /// a "standard" place for the operating system. The directory is - /// guaranteed to be created on exit from this function. If the directory - /// cannot be created, the function will throw an exception. - /// @returns an invalid path (empty) on error - /// @param ErrMsg Optional place for an error message if an error occurs - /// @brief Constrct a path to an new, unique, existing temporary - /// directory. - static Path GetTemporaryDirectory(std::string* ErrMsg = 0); - - /// Construct a vector of sys::Path that contains the "standard" system - /// library paths suitable for linking into programs. - /// @brief Construct a path to the system library directory - static void GetSystemLibraryPaths(std::vector& Paths); - - /// Construct a vector of sys::Path that contains the "standard" bitcode - /// library paths suitable for linking into an llvm program. This function - /// *must* return the value of LLVM_LIB_SEARCH_PATH as well as the value - /// of LLVM_LIBDIR. It also must provide the System library paths as - /// returned by GetSystemLibraryPaths. - /// @see GetSystemLibraryPaths - /// @brief Construct a list of directories in which bitcode could be - /// found. - static void GetBitcodeLibraryPaths(std::vector& Paths); - - /// Find the path to a library using its short name. Use the system - /// dependent library paths to locate the library. - /// @brief Find a library. - static Path FindLibrary(std::string& short_name); - - /// Construct a path to the default LLVM configuration directory. The - /// implementation must ensure that this is a well-known (same on many - /// systems) directory in which llvm configuration files exist. For - /// example, on Unix, the /etc/llvm directory has been selected. - /// @brief Construct a path to the default LLVM configuration directory - static Path GetLLVMDefaultConfigDir(); - - /// Construct a path to the LLVM installed configuration directory. The - /// implementation must ensure that this refers to the "etc" directory of - /// the LLVM installation. This is the location where configuration files - /// will be located for a particular installation of LLVM on a machine. - /// @brief Construct a path to the LLVM installed configuration directory - static Path GetLLVMConfigDir(); - - /// Construct a path to the current user's home directory. The - /// implementation must use an operating system specific mechanism for - /// determining the user's home directory. For example, the environment - /// variable "HOME" could be used on Unix. If a given operating system - /// does not have the concept of a user's home directory, this static - /// constructor must provide the same result as GetRootDirectory. - /// @brief Construct a path to the current user's "home" directory - static Path GetUserHomeDirectory(); - - /// Construct a path to the current directory for the current process. - /// @returns The current working directory. - /// @brief Returns the current working directory. - static Path GetCurrentDirectory(); - - /// Return the suffix commonly used on file names that contain an - /// executable. - /// @returns The executable file suffix for the current platform. - /// @brief Return the executable file suffix. - static StringRef GetEXESuffix(); - - /// Return the suffix commonly used on file names that contain a shared - /// object, shared archive, or dynamic link library. Such files are - /// linked at runtime into a process and their code images are shared - /// between processes. - /// @returns The dynamic link library suffix for the current platform. - /// @brief Return the dynamic link library suffix. - static StringRef GetDLLSuffix(); - - /// GetMainExecutable - Return the path to the main executable, given the - /// value of argv[0] from program startup and the address of main itself. - /// In extremis, this function may fail and return an empty path. - static Path GetMainExecutable(const char *argv0, void *MainAddr); - - /// This is one of the very few ways in which a path can be constructed - /// with a syntactically invalid name. The only *legal* invalid name is an - /// empty one. Other invalid names are not permitted. Empty paths are - /// provided so that they can be used to indicate null or error results in - /// other lib/System functionality. - /// @brief Construct an empty (and invalid) path. - Path() : path() {} - Path(const Path &that) : path(that.path) {} - - /// This constructor will accept a char* or std::string as a path. No - /// checking is done on this path to determine if it is valid. To - /// determine validity of the path, use the isValid method. - /// @param p The path to assign. - /// @brief Construct a Path from a string. - explicit Path(StringRef p); - - /// This constructor will accept a character range as a path. No checking - /// is done on this path to determine if it is valid. To determine - /// validity of the path, use the isValid method. - /// @param StrStart A pointer to the first character of the path name - /// @param StrLen The length of the path name at StrStart - /// @brief Construct a Path from a string. - Path(const char *StrStart, unsigned StrLen); - - /// @} - /// @name Operators - /// @{ - public: - /// Makes a copy of \p that to \p this. - /// @returns \p this - /// @brief Assignment Operator - Path &operator=(const Path &that) { - path = that.path; - return *this; - } - - /// Makes a copy of \p that to \p this. - /// @param that A StringRef denoting the path - /// @returns \p this - /// @brief Assignment Operator - Path &operator=(StringRef that); - - /// Compares \p this Path with \p that Path for equality. - /// @returns true if \p this and \p that refer to the same thing. - /// @brief Equality Operator - bool operator==(const Path &that) const; - - /// Compares \p this Path with \p that Path for inequality. - /// @returns true if \p this and \p that refer to different things. - /// @brief Inequality Operator - bool operator!=(const Path &that) const { return !(*this == that); } - - /// Determines if \p this Path is less than \p that Path. This is required - /// so that Path objects can be placed into ordered collections (e.g. - /// std::map). The comparison is done lexicographically as defined by - /// the std::string::compare method. - /// @returns true if \p this path is lexicographically less than \p that. - /// @brief Less Than Operator - bool operator<(const Path& that) const; - - /// @} - /// @name Path Accessors - /// @{ - public: - /// This function will use an operating system specific algorithm to - /// determine if the current value of \p this is a syntactically valid - /// path name for the operating system. The path name does not need to - /// exist, validity is simply syntactical. Empty paths are always invalid. - /// @returns true iff the path name is syntactically legal for the - /// host operating system. - /// @brief Determine if a path is syntactically valid or not. - bool isValid() const; - - /// This function determines if the contents of the path name are empty. - /// That is, the path name has a zero length. This does NOT determine if - /// if the file is empty. To get the length of the file itself, Use the - /// PathWithStatus::getFileStatus() method and then the getSize() method - /// on the returned FileStatus object. - /// @returns true iff the path is empty. - /// @brief Determines if the path name is empty (invalid). - bool isEmpty() const { return path.empty(); } - - /// This function returns the last component of the path name. The last - /// component is the file or directory name occuring after the last - /// directory separator. If no directory separator is present, the entire - /// path name is returned (i.e. same as toString). - /// @returns StringRef containing the last component of the path name. - /// @brief Returns the last component of the path name. - StringRef getLast() const; - - /// This function strips off the path and suffix of the file or directory - /// name and returns just the basename. For example /a/foo.bar would cause - /// this function to return "foo". - /// @returns StringRef containing the basename of the path - /// @brief Get the base name of the path - StringRef getBasename() const; - - /// This function strips off the suffix of the path beginning with the - /// path separator ('/' on Unix, '\' on Windows) and returns the result. - StringRef getDirname() const; - - /// This function strips off the path and basename(up to and - /// including the last dot) of the file or directory name and - /// returns just the suffix. For example /a/foo.bar would cause - /// this function to return "bar". - /// @returns StringRef containing the suffix of the path - /// @brief Get the suffix of the path - StringRef getSuffix() const; - - /// Obtain a 'C' string for the path name. - /// @returns a 'C' string containing the path name. - /// @brief Returns the path as a C string. - const char *c_str() const { return path.c_str(); } - const std::string &str() const { return path; } - - - /// size - Return the length in bytes of this path name. - size_t size() const { return path.size(); } - - /// empty - Returns true if the path is empty. - unsigned empty() const { return path.empty(); } - - /// @} - /// @name Disk Accessors - /// @{ - public: - /// This function determines if the path name is absolute, as opposed to - /// relative. - /// @brief Determine if the path is absolute. - bool isAbsolute() const; - - /// This function determines if the path name is absolute, as opposed to - /// relative. - /// @brief Determine if the path is absolute. - static bool isAbsolute(const char *NameStart, unsigned NameLen); - - /// This function opens the file associated with the path name provided by - /// the Path object and reads its magic number. If the magic number at the - /// start of the file matches \p magic, true is returned. In all other - /// cases (file not found, file not accessible, etc.) it returns false. - /// @returns true if the magic number of the file matches \p magic. - /// @brief Determine if file has a specific magic number - bool hasMagicNumber(StringRef magic) const; - - /// This function retrieves the first \p len bytes of the file associated - /// with \p this. These bytes are returned as the "magic number" in the - /// \p Magic parameter. - /// @returns true if the Path is a file and the magic number is retrieved, - /// false otherwise. - /// @brief Get the file's magic number. - bool getMagicNumber(std::string& Magic, unsigned len) const; - - /// This function determines if the path name in the object references an - /// archive file by looking at its magic number. - /// @returns true if the file starts with the magic number for an archive - /// file. - /// @brief Determine if the path references an archive file. - bool isArchive() const; - - /// This function determines if the path name in the object references an - /// LLVM Bitcode file by looking at its magic number. - /// @returns true if the file starts with the magic number for LLVM - /// bitcode files. - /// @brief Determine if the path references a bitcode file. - bool isBitcodeFile() const; - - /// This function determines if the path name in the object references a - /// native Dynamic Library (shared library, shared object) by looking at - /// the file's magic number. The Path object must reference a file, not a - /// directory. - /// @returns true if the file starts with the magic number for a native - /// shared library. - /// @brief Determine if the path references a dynamic library. - bool isDynamicLibrary() const; - - /// This function determines if the path name in the object references a - /// native object file by looking at it's magic number. The term object - /// file is defined as "an organized collection of separate, named - /// sequences of binary data." This covers the obvious file formats such - /// as COFF and ELF, but it also includes llvm ir bitcode, archives, - /// libraries, etc... - /// @returns true if the file starts with the magic number for an object - /// file. - /// @brief Determine if the path references an object file. - bool isObjectFile() const; - - /// This function determines if the path name references an existing file - /// or directory in the file system. - /// @returns true if the pathname references an existing file or - /// directory. - /// @brief Determines if the path is a file or directory in - /// the file system. - bool exists() const; - - /// This function determines if the path name references an - /// existing directory. - /// @returns true if the pathname references an existing directory. - /// @brief Determines if the path is a directory in the file system. - bool isDirectory() const; - - /// This function determines if the path name references an - /// existing symbolic link. - /// @returns true if the pathname references an existing symlink. - /// @brief Determines if the path is a symlink in the file system. - bool isSymLink() const; - - /// This function determines if the path name references a readable file - /// or directory in the file system. This function checks for - /// the existence and readability (by the current program) of the file - /// or directory. - /// @returns true if the pathname references a readable file. - /// @brief Determines if the path is a readable file or directory - /// in the file system. - bool canRead() const; - - /// This function determines if the path name references a writable file - /// or directory in the file system. This function checks for the - /// existence and writability (by the current program) of the file or - /// directory. - /// @returns true if the pathname references a writable file. - /// @brief Determines if the path is a writable file or directory - /// in the file system. - bool canWrite() const; - - /// This function checks that what we're trying to work only on a regular - /// file. Check for things like /dev/null, any block special file, or - /// other things that aren't "regular" regular files. - /// @returns true if the file is S_ISREG. - /// @brief Determines if the file is a regular file - bool isRegularFile() const; - - /// This function determines if the path name references an executable - /// file in the file system. This function checks for the existence and - /// executability (by the current program) of the file. - /// @returns true if the pathname references an executable file. - /// @brief Determines if the path is an executable file in the file - /// system. - bool canExecute() const; - - /// This function builds a list of paths that are the names of the - /// files and directories in a directory. - /// @returns true if an error occurs, true otherwise - /// @brief Build a list of directory's contents. - bool getDirectoryContents( - std::set &paths, ///< The resulting list of file & directory names - std::string* ErrMsg ///< Optional place to return an error message. - ) const; - - /// @} - /// @name Path Mutators - /// @{ - public: - /// The path name is cleared and becomes empty. This is an invalid - /// path name but is the *only* invalid path name. This is provided - /// so that path objects can be used to indicate the lack of a - /// valid path being found. - /// @brief Make the path empty. - void clear() { path.clear(); } - - /// This method sets the Path object to \p unverified_path. This can fail - /// if the \p unverified_path does not pass the syntactic checks of the - /// isValid() method. If verification fails, the Path object remains - /// unchanged and false is returned. Otherwise true is returned and the - /// Path object takes on the path value of \p unverified_path - /// @returns true if the path was set, false otherwise. - /// @param unverified_path The path to be set in Path object. - /// @brief Set a full path from a StringRef - bool set(StringRef unverified_path); - - /// One path component is removed from the Path. If only one component is - /// present in the path, the Path object becomes empty. If the Path object - /// is empty, no change is made. - /// @returns false if the path component could not be removed. - /// @brief Removes the last directory component of the Path. - bool eraseComponent(); - - /// The \p component is added to the end of the Path if it is a legal - /// name for the operating system. A directory separator will be added if - /// needed. - /// @returns false if the path component could not be added. - /// @brief Appends one path component to the Path. - bool appendComponent(StringRef component); - - /// A period and the \p suffix are appended to the end of the pathname. - /// The precondition for this function is that the Path reference a file - /// name (i.e. isFile() returns true). If the Path is not a file, no - /// action is taken and the function returns false. If the path would - /// become invalid for the host operating system, false is returned. When - /// the \p suffix is empty, no action is performed. - /// @returns false if the suffix could not be added, true if it was. - /// @brief Adds a period and the \p suffix to the end of the pathname. - bool appendSuffix(StringRef suffix); - - /// The suffix of the filename is erased. The suffix begins with and - /// includes the last . character in the filename after the last directory - /// separator and extends until the end of the name. If no . character is - /// after the last directory separator, then the file name is left - /// unchanged (i.e. it was already without a suffix) but the function - /// returns false. - /// @returns false if there was no suffix to remove, true otherwise. - /// @brief Remove the suffix from a path name. - bool eraseSuffix(); - - /// The current Path name is made unique in the file system. Upon return, - /// the Path will have been changed to make a unique file in the file - /// system or it will not have been changed if the current path name is - /// already unique. - /// @throws std::string if an unrecoverable error occurs. - /// @brief Make the current path name unique in the file system. - bool makeUnique( bool reuse_current /*= true*/, std::string* ErrMsg ); - - /// The current Path name is made absolute by prepending the - /// current working directory if necessary. - void makeAbsolute(); - - /// @} - /// @name Disk Mutators - /// @{ - public: - /// This method attempts to make the file referenced by the Path object - /// available for reading so that the canRead() method will return true. - /// @brief Make the file readable; - bool makeReadableOnDisk(std::string* ErrMsg = 0); - - /// This method attempts to make the file referenced by the Path object - /// available for writing so that the canWrite() method will return true. - /// @brief Make the file writable; - bool makeWriteableOnDisk(std::string* ErrMsg = 0); - - /// This method attempts to make the file referenced by the Path object - /// available for execution so that the canExecute() method will return - /// true. - /// @brief Make the file readable; - bool makeExecutableOnDisk(std::string* ErrMsg = 0); - - /// This method allows the last modified time stamp and permission bits - /// to be set on the disk object referenced by the Path. - /// @throws std::string if an error occurs. - /// @returns true on error. - /// @brief Set the status information. - bool setStatusInfoOnDisk(const FileStatus &SI, - std::string *ErrStr = 0) const; - - /// This method attempts to create a directory in the file system with the - /// same name as the Path object. The \p create_parents parameter controls - /// whether intermediate directories are created or not. if \p - /// create_parents is true, then an attempt will be made to create all - /// intermediate directories, as needed. If \p create_parents is false, - /// then only the final directory component of the Path name will be - /// created. The created directory will have no entries. - /// @returns true if the directory could not be created, false otherwise - /// @brief Create the directory this Path refers to. - bool createDirectoryOnDisk( - bool create_parents = false, ///< Determines whether non-existent - ///< directory components other than the last one (the "parents") - ///< are created or not. - std::string* ErrMsg = 0 ///< Optional place to put error messages. - ); - - /// This method attempts to create a file in the file system with the same - /// name as the Path object. The intermediate directories must all exist - /// at the time this method is called. Use createDirectoriesOnDisk to - /// accomplish that. The created file will be empty upon return from this - /// function. - /// @returns true if the file could not be created, false otherwise. - /// @brief Create the file this Path refers to. - bool createFileOnDisk( - std::string* ErrMsg = 0 ///< Optional place to put error messages. - ); - - /// This is like createFile except that it creates a temporary file. A - /// unique temporary file name is generated based on the contents of - /// \p this before the call. The new name is assigned to \p this and the - /// file is created. Note that this will both change the Path object - /// *and* create the corresponding file. This function will ensure that - /// the newly generated temporary file name is unique in the file system. - /// @returns true if the file couldn't be created, false otherwise. - /// @brief Create a unique temporary file - bool createTemporaryFileOnDisk( - bool reuse_current = false, ///< When set to true, this parameter - ///< indicates that if the current file name does not exist then - ///< it will be used without modification. - std::string* ErrMsg = 0 ///< Optional place to put error messages - ); - - /// This method renames the file referenced by \p this as \p newName. The - /// file referenced by \p this must exist. The file referenced by - /// \p newName does not need to exist. - /// @returns true on error, false otherwise - /// @brief Rename one file as another. - bool renamePathOnDisk(const Path& newName, std::string* ErrMsg); - - /// This method attempts to destroy the file or directory named by the - /// last component of the Path. If the Path refers to a directory and the - /// \p destroy_contents is false, an attempt will be made to remove just - /// the directory (the final Path component). If \p destroy_contents is - /// true, an attempt will be made to remove the entire contents of the - /// directory, recursively. If the Path refers to a file, the - /// \p destroy_contents parameter is ignored. - /// @param destroy_contents Indicates whether the contents of a destroyed - /// @param Err An optional string to receive an error message. - /// directory should also be destroyed (recursively). - /// @returns false if the file/directory was destroyed, true on error. - /// @brief Removes the file or directory from the filesystem. - bool eraseFromDisk(bool destroy_contents = false, - std::string *Err = 0) const; - - - /// MapInFilePages - This is a low level system API to map in the file - /// that is currently opened as FD into the current processes' address - /// space for read only access. This function may return null on failure - /// or if the system cannot provide the following constraints: - /// 1) The pages must be valid after the FD is closed, until - /// UnMapFilePages is called. - /// 2) Any padding after the end of the file must be zero filled, if - /// present. - /// 3) The pages must be contiguous. - /// - /// This API is not intended for general use, clients should use - /// MemoryBuffer::getFile instead. - static const char *MapInFilePages(int FD, uint64_t FileSize); - - /// UnMapFilePages - Free pages mapped into the current process by - /// MapInFilePages. - /// - /// This API is not intended for general use, clients should use - /// MemoryBuffer::getFile instead. - static void UnMapFilePages(const char *Base, uint64_t FileSize); - - /// @} - /// @name Data - /// @{ - protected: - // Our win32 implementation relies on this string being mutable. - mutable std::string path; ///< Storage for the path name. - - - /// @} - }; - - /// This class is identical to Path class except it allows you to obtain the - /// file status of the Path as well. The reason for the distinction is one of - /// efficiency. First, the file status requires additional space and the space - /// is incorporated directly into PathWithStatus without an additional malloc. - /// Second, obtaining status information is an expensive operation on most - /// operating systems so we want to be careful and explicity about where we - /// allow this operation in LLVM. - /// @brief Path with file status class. - class PathWithStatus : public Path { - /// @name Constructors - /// @{ - public: - /// @brief Default constructor - PathWithStatus() : Path(), status(), fsIsValid(false) {} - - /// @brief Copy constructor - PathWithStatus(const PathWithStatus &that) - : Path(static_cast(that)), status(that.status), - fsIsValid(that.fsIsValid) {} - - /// This constructor allows construction from a Path object - /// @brief Path constructor - PathWithStatus(const Path &other) - : Path(other), status(), fsIsValid(false) {} - - /// This constructor will accept a char* or std::string as a path. No - /// checking is done on this path to determine if it is valid. To - /// determine validity of the path, use the isValid method. - /// @brief Construct a Path from a string. - explicit PathWithStatus( - StringRef p ///< The path to assign. - ) : Path(p), status(), fsIsValid(false) {} - - /// This constructor will accept a character range as a path. No checking - /// is done on this path to determine if it is valid. To determine - /// validity of the path, use the isValid method. - /// @brief Construct a Path from a string. - explicit PathWithStatus( - const char *StrStart, ///< Pointer to the first character of the path - unsigned StrLen ///< Length of the path. - ) : Path(StrStart, StrLen), status(), fsIsValid(false) {} - - /// Makes a copy of \p that to \p this. - /// @returns \p this - /// @brief Assignment Operator - PathWithStatus &operator=(const PathWithStatus &that) { - static_cast(*this) = static_cast(that); - status = that.status; - fsIsValid = that.fsIsValid; - return *this; - } - - /// Makes a copy of \p that to \p this. - /// @returns \p this - /// @brief Assignment Operator - PathWithStatus &operator=(const Path &that) { - static_cast(*this) = static_cast(that); - fsIsValid = false; - return *this; - } - - /// @} - /// @name Methods - /// @{ - public: - /// This function returns status information about the file. The type of - /// path (file or directory) is updated to reflect the actual contents - /// of the file system. - /// @returns 0 on failure, with Error explaining why (if non-zero) - /// @returns a pointer to a FileStatus structure on success. - /// @brief Get file status. - const FileStatus *getFileStatus( - bool forceUpdate = false, ///< Force an update from the file system - std::string *Error = 0 ///< Optional place to return an error msg. - ) const; - - /// @} - /// @name Data - /// @{ - private: - mutable FileStatus status; ///< Status information. - mutable bool fsIsValid; ///< Whether we've obtained it or not - - /// @} - }; - - /// This enumeration delineates the kinds of files that LLVM knows about. - enum LLVMFileType { - Unknown_FileType = 0, ///< Unrecognized file - Bitcode_FileType, ///< Bitcode file - Archive_FileType, ///< ar style archive file - ELF_Relocatable_FileType, ///< ELF Relocatable object file - ELF_Executable_FileType, ///< ELF Executable image - ELF_SharedObject_FileType, ///< ELF dynamically linked shared lib - ELF_Core_FileType, ///< ELF core image - Mach_O_Object_FileType, ///< Mach-O Object file - Mach_O_Executable_FileType, ///< Mach-O Executable - Mach_O_FixedVirtualMemorySharedLib_FileType, ///< Mach-O Shared Lib, FVM - Mach_O_Core_FileType, ///< Mach-O Core File - Mach_O_PreloadExecutable_FileType, ///< Mach-O Preloaded Executable - Mach_O_DynamicallyLinkedSharedLib_FileType, ///< Mach-O dynlinked shared lib - Mach_O_DynamicLinker_FileType, ///< The Mach-O dynamic linker - Mach_O_Bundle_FileType, ///< Mach-O Bundle file - Mach_O_DynamicallyLinkedSharedLibStub_FileType, ///< Mach-O Shared lib stub - COFF_FileType ///< COFF object file or lib - }; - - /// This utility function allows any memory block to be examined in order - /// to determine its file type. - LLVMFileType IdentifyFileType(const char*magic, unsigned length); - - /// This function can be used to copy the file specified by Src to the - /// file specified by Dest. If an error occurs, Dest is removed. - /// @returns true if an error occurs, false otherwise - /// @brief Copy one file to another. - bool CopyFile(const Path& Dest, const Path& Src, std::string* ErrMsg); - - /// This is the OS-specific path separator: a colon on Unix or a semicolon - /// on Windows. - extern const char PathSeparator; -} - -} - -#endif Removed: llvm/trunk/include/llvm/System/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/PathV2.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/PathV2.h (original) +++ llvm/trunk/include/llvm/System/PathV2.h (removed) @@ -1,979 +0,0 @@ -//===- llvm/System/PathV2.h - Path Operating System Concept -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::path namespace. It is designed after -// TR2/boost filesystem (v3), but modified to remove exception handling and the -// path class. -// -// All functions return an error_code and their actual work via the last out -// argument. The out argument is defined if and only if errc::success is -// returned. A function may return any error code in the generic or system -// category. However, they shall be equivalent to any error conditions listed -// in each functions respective documentation if the condition applies. [ note: -// this does not guarantee that error_code will be in the set of explicitly -// listed codes, but it does guarantee that if any of the explicitly listed -// errors occur, the correct error_code will be used ]. All functions may -// return errc::not_enough_memory if there is not enough memory to complete the -// operation. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ADT/SmallString.h" -#include "llvm/System/DataTypes.h" -#include "llvm/System/system_error.h" -#include -#include -#include - -namespace llvm { - -// Forward decls. -class StringRef; -class Twine; - -namespace sys { -namespace path { - -/// @name Lexical Component Iterator -/// @{ - -/// @brief Path iterator. -/// -/// This is a bidirectional iterator that iterates over the individual -/// components in \a path. The forward traversal order is as follows: -/// * The root-name element, if present. -/// * The root-directory element, if present. -/// * Each successive filename element, if present. -/// * Dot, if one or more trailing non-root slash characters are present. -/// The backwards traversal order is the reverse of forward traversal. -/// -/// Iteration examples. Each component is separated by ',': -/// / => / -/// /foo => /,foo -/// foo/ => foo,. -/// /foo/bar => /,foo,bar -/// ../ => ..,. -/// C:\foo\bar => C:,/,foo,bar -/// -class const_iterator { - StringRef Path; //< The entire path. - StringRef Component; //< The current component. - -public: - typedef const StringRef value_type; - typedef value_type &reference; - typedef value_type *pointer; - typedef std::bidirectional_iterator_tag iterator_category; - reference operator*() const; - pointer operator->() const; - const_iterator &operator++(); // preincrement - const_iterator &operator++(int); // postincrement - const_iterator &operator--(); // predecrement - const_iterator &operator--(int); // postdecrement - bool operator==(const const_iterator &RHS) const; - bool operator!=(const const_iterator &RHS) const; - - const_iterator(); //< Default construct end iterator. - const_iterator(const StringRef &path); -}; - -/// @} -/// @name Lexical Modifiers -/// @{ - -/// @brief Make \a path an absolute path. -/// -/// Makes \a path absolute using the current directory if it is not already. An -/// empty \a path will result in the current directory. -/// -/// /absolute/path => /absolute/path -/// relative/../path => /path -/// -/// @param path A path that is modified to be an absolute path. -/// @returns errc::success if \a path has been made absolute, otherwise a -/// platform specific error_code. -error_code make_absolute(SmallVectorImpl &path); - -/// @brief Remove the last component from \a path if it exists. -/// -/// directory/filename.cpp => directory/ -/// directory/ => directory/ -/// -/// @param path A path that is modified to not have a file component. -/// @returns errc::success if \a path's file name has been removed (or there was -/// not one to begin with), otherwise a platform specific error_code. -error_code remove_filename(SmallVectorImpl &path); - -/// @brief Replace the file extension of \a path with \a extension. -/// -/// ./filename.cpp => ./filename.extension -/// ./filename => ./filename.extension -/// ./ => ? TODO: decide what semantics this has. -/// -/// @param path A path that has its extension replaced with \a extension. -/// @param extension The extension to be added. It may be empty. It may also -/// optionally start with a '.', if it does not, one will be -/// prepended. -/// @returns errc::success if \a path's extension has been replaced, otherwise a -/// platform specific error_code. -error_code replace_extension(SmallVectorImpl &path, - const Twine &extension); - -/// @brief Append to path. -/// -/// /foo + bar/f => /foo/bar/f -/// /foo/ + bar/f => /foo/bar/f -/// foo + bar/f => foo/bar/f -/// -/// @param path Set to \a path + \a component. -/// @param component The component to be appended to \a path. -/// @returns errc::success if \a component has been appended to \a path, -/// otherwise a platform specific error_code. -error_code append(SmallVectorImpl &path, const Twine &component); - -/// @brief Append to path. -/// -/// /foo + [bar,f] => /foo/bar/f -/// /foo/ + [bar,f] => /foo/bar/f -/// foo + [bar,f] => foo/bar/f -/// -/// @param path Set to \a path + [\a begin, \a end). -/// @param begin Start of components to append. -/// @param end One past the end of components to append. -/// @returns errc::success if [\a begin, \a end) has been appended to \a path, -/// otherwise a platform specific error_code. -error_code append(SmallVectorImpl &path, - const_iterator begin, const_iterator end); - -/// @} -/// @name Transforms (or some other better name) -/// @{ - -/// Convert path to the native form. This is used to give paths to users and -/// operating system calls in the platform's normal way. For example, on Windows -/// all '/' are converted to '\'. -/// -/// @param path A path that is transformed to native format. -/// @param result Holds the result of the transformation. -/// @returns errc::success if \a path has been transformed and stored in result, -/// otherwise a platform specific error_code. -error_code native(const Twine &path, SmallVectorImpl &result); - -/// @} -/// @name Lexical Observers -/// @{ - -/// @brief Get the current path. -/// -/// @param result Holds the current path on return. -/// @results errc::success if the current path has been stored in result, -/// otherwise a platform specific error_code. -error_code current_path(SmallVectorImpl &result); - -// The following are purely lexical. - -/// @brief Is the current path valid? -/// -/// @param path Input path. -/// @param result Set to true if the path is valid, false if it is not. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_valid(const Twine &path, bool &result); - -/// @brief Get root name. -/// -/// //net/hello => //net -/// c:/hello => c: (on Windows, on other platforms nothing) -/// /hello => -/// -/// @param path Input path. -/// @param result Set to the root name of \a path if it has one, otherwise "". -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code root_name(const StringRef &path, StringRef &result); - -/// @brief Get root directory. -/// -/// /goo/hello => / -/// c:/hello => / -/// d/file.txt => -/// -/// @param path Input path. -/// @param result Set to the root directory of \a path if it has one, otherwise -/// "". -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code root_directory(const StringRef &path, StringRef &result); - -/// @brief Get root path. -/// -/// Equivalent to root_name + root_directory. -/// -/// @param path Input path. -/// @param result Set to the root path of \a path if it has one, otherwise "". -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code root_path(const StringRef &path, StringRef &result); - -/// @brief Get relative path. -/// -/// C:\hello\world => hello\world -/// foo/bar => foo/bar -/// /foo/bar => foo/bar -/// -/// @param path Input path. -/// @param result Set to the path starting after root_path if one exists, -/// otherwise "". -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code relative_path(const StringRef &path, StringRef &result); - -/// @brief Get parent path. -/// -/// / => -/// /foo => / -/// foo/../bar => foo/.. -/// -/// @param path Input path. -/// @param result Set to the parent path of \a path if one exists, otherwise "". -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code parent_path(const StringRef &path, StringRef &result); - -/// @brief Get filename. -/// -/// /foo.txt => foo.txt -/// . => . -/// .. => .. -/// / => / -/// -/// @param path Input path. -/// @param result Set to the filename part of \a path. This is defined as the -/// last component of \a path. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code filename(const StringRef &path, StringRef &result); - -/// @brief Get stem. -/// -/// If filename contains a dot but not solely one or two dots, result is the -/// substring of filename ending at (but not including) the last dot. Otherwise -/// it is filename. -/// -/// /foo/bar.txt => bar -/// /foo/bar => bar -/// /foo/.txt => -/// /foo/. => . -/// /foo/.. => .. -/// -/// @param path Input path. -/// @param result Set to the stem of \a path. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code stem(const StringRef &path, StringRef &result); - -/// @brief Get extension. -/// -/// If filename contains a dot but not solely one or two dots, result is the -/// substring of filename starting at (and including) the last dot, and ending -/// at the end of \a path. Otherwise "". -/// -/// /foo/bar.txt => .txt -/// /foo/bar => -/// /foo/.txt => .txt -/// -/// @param path Input path. -/// @param result Set to the extension of \a path. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code extension(const StringRef &path, StringRef &result); - -/// @brief Has root name? -/// -/// root_name != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a root name, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_root_name(const Twine &path, bool &result); - -/// @brief Has root directory? -/// -/// root_directory != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a root directory, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_root_directory(const Twine &path, bool &result); - -/// @brief Has root path? -/// -/// root_path != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a root path, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_root_path(const Twine &path, bool &result); - -/// @brief Has relative path? -/// -/// relative_path != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a relative path, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_relative_path(const Twine &path, bool &result); - -/// @brief Has parent path? -/// -/// parent_path != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a parent path, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_parent_path(const Twine &path, bool &result); - -/// @brief Has filename? -/// -/// filename != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a filename, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_filename(const Twine &path, bool &result); - -/// @brief Has stem? -/// -/// stem != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a stem, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_stem(const Twine &path, bool &result); - -/// @brief Has extension? -/// -/// extension != "" -/// -/// @param path Input path. -/// @param result Set to true if the path has a extension, false otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_extension(const Twine &path, bool &result); - -/// @brief Is path absolute? -/// -/// @param path Input path. -/// @param result Set to true if the path is absolute, false if it is not. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_absolute(const Twine &path, bool &result); - -/// @brief Is path relative? -/// -/// @param path Input path. -/// @param result Set to true if the path is relative, false if it is not. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_relative(const Twine &path, bool &result); -// end purely lexical. - -} // end namespace path - -namespace fs { - -/// file_type - An "enum class" enumeration for the file system's view of the -/// type. -struct file_type { - enum _ { - status_error, - file_not_found, - regular_file, - directory_file, - symlink_file, - block_file, - character_file, - fifo_file, - socket_file, - type_unknown - }; - - file_type(_ v) : v_(v) {} - explicit file_type(int v) : v_(_(v)) {} - operator int() const {return v_;} - -private: - int v_; -}; - -/// copy_option - An "enum class" enumeration of copy semantics for copy -/// operations. -struct copy_option { - enum _ { - fail_if_exists, - overwrite_if_exists - }; - - copy_option(_ v) : v_(v) {} - explicit copy_option(int v) : v_(_(v)) {} - operator int() const {return v_;} - -private: - int v_; -}; - -/// space_info - Self explanatory. -struct space_info { - uint64_t capacity; - uint64_t free; - uint64_t available; -}; - -/// file_status - Represents the result of a call to stat and friends. It has -/// a platform specific member to store the result. -class file_status -{ - // implementation defined status field. -public: - explicit file_status(file_type v=file_type::status_error); - - file_type type() const; - void type(file_type v); -}; - -/// @} -/// @name Physical Operators -/// @{ - -/// @brief Copy the file at \a from to the path \a to. -/// -/// @param from The path to copy the file from. -/// @param to The path to copy the file to. -/// @param copt Behavior if \a to already exists. -/// @returns errc::success if the file has been successfully copied. -/// errc::file_exists if \a to already exists and \a copt == -/// copy_option::fail_if_exists. Otherwise a platform specific -/// error_code. -error_code copy_file(const Twine &from, const Twine &to, - copy_option copt = copy_option::fail_if_exists); - -/// @brief Create all the non-existent directories in path. -/// -/// @param path Directories to create. -/// @param existed Set to true if \a path already existed, false otherwise. -/// @returns errc::success if is_directory(path) and existed have been set, -/// otherwise a platform specific error_code. -error_code create_directories(const Twine &path, bool &existed); - -/// @brief Create the directory in path. -/// -/// @param path Directory to create. -/// @param existed Set to true if \a path already existed, false otherwise. -/// @returns errc::success if is_directory(path) and existed have been set, -/// otherwise a platform specific error_code. -error_code create_directory(const Twine &path, bool &existed); - -/// @brief Create a hard link from \a from to \a to. -/// -/// @param to The path to hard link to. -/// @param from The path to hard link from. This is created. -/// @returns errc::success if exists(to) && exists(from) && equivalent(to, from) -/// , otherwise a platform specific error_code. -error_code create_hard_link(const Twine &to, const Twine &from); - -/// @brief Create a symbolic link from \a from to \a to. -/// -/// @param to The path to symbolically link to. -/// @param from The path to symbolically link from. This is created. -/// @returns errc::success if exists(to) && exists(from) && is_symlink(from), -/// otherwise a platform specific error_code. -error_code create_symlink(const Twine &to, const Twine &from); - -/// @brief Remove path. Equivalent to POSIX remove(). -/// -/// @param path Input path. -/// @param existed Set to true if \a path existed, false if it did not. -/// undefined otherwise. -/// @results errc::success if path has been removed and existed has been -/// successfully set, otherwise a platform specific error_code. -error_code remove(const Twine &path, bool &existed); - -/// @brief Recursively remove all files below \a path, then \a path. Files are -/// removed as if by POSIX remove(). -/// -/// @param path Input path. -/// @param num_removed Number of files removed. -/// @results errc::success if path has been removed and num_removed has been -/// successfully set, otherwise a platform specific error_code. -error_code remove_all(const Twine &path, uint32_t &num_removed); - -/// @brief Rename \a from to \a to. Files are renamed as if by POSIX rename(). -/// -/// @param from The path to rename from. -/// @param to The path to rename to. This is created. -error_code rename(const Twine &from, const Twine &to); - -/// @brief Resize path to size. File is resized as if by POSIX truncate(). -/// -/// @param path Input path. -/// @param size Size to resize to. -/// @returns errc::success if \a path has been resized to \a size, otherwise a -/// platform specific error_code. -error_code resize_file(const Twine &path, uint64_t size); - -/// @brief Make file readable. -/// -/// @param path Input path. -/// @param value If true, make readable, else, make unreadable. -/// @results errc::success if readability has been successfully set, otherwise a -/// platform specific error_code. -error_code set_read(const Twine &path, bool value); - -/// @brief Make file writeable. -/// -/// @param path Input path. -/// @param value If true, make writeable, else, make unwriteable. -/// @results errc::success if writeability has been successfully set, otherwise -/// a platform specific error_code. -error_code set_write(const Twine &path, bool value); - -/// @brief Make file executable. -/// -/// @param path Input path. -/// @param value If true, make executable, else, make unexecutable. -/// @results errc::success if executability has been successfully set, otherwise -/// a platform specific error_code. -error_code set_execute(const Twine &path, bool value); - -/// @} -/// @name Physical Observers -/// @{ - -/// @brief Does file exist? -/// -/// @param status A file_status previously returned from stat. -/// @param result Set to true if the file represented by status exists, false if -/// it does not. Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code exists(file_status status, bool &result); - -/// @brief Does file exist? -/// -/// @param path Input path. -/// @param result Set to true if the file represented by status exists, false if -/// it does not. Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code exists(const Twine &path, bool &result); - -/// @brief Do paths represent the same thing? -/// -/// @param A Input path A. -/// @param B Input path B. -/// @param result Set to true if stat(A) and stat(B) have the same device and -/// inode (or equivalent). -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code equivalent(const Twine &A, const Twine &B, bool &result); - -/// @brief Get file size. -/// -/// @param path Input path. -/// @param result Set to the size of the file in \a path. -/// @returns errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code file_size(const Twine &path, uint64_t &result); - -/// @brief Does status represent a directory? -/// -/// @param status A file_status previously returned from stat. -/// @param result Set to true if the file represented by status is a directory, -/// false if it is not. Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_directory(file_status status, bool &result); - -/// @brief Is path a directory? -/// -/// @param path Input path. -/// @param result Set to true if \a path is a directory, false if it is not. -/// Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_directory(const Twine &path, bool &result); - -/// @brief Is path an empty file? -/// -/// @param path Input path. -/// @param result Set to true if \a path is a an empty file, false if it is not. -/// Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_empty(const Twine &path, bool &result); - -/// @brief Does status represent a regular file? -/// -/// @param status A file_status previously returned from stat. -/// @param result Set to true if the file represented by status is a regular -/// file, false if it is not. Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_regular_file(file_status status, bool &result); - -/// @brief Is path a regular file? -/// -/// @param path Input path. -/// @param result Set to true if \a path is a regular file, false if it is not. -/// Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_regular_file(const Twine &path, bool &result); - -/// @brief Does status represent something that exists but is not a directory, -/// regular file, or symlink? -/// -/// @param status A file_status previously returned from stat. -/// @param result Set to true if the file represented by status exists, but is -/// not a directory, regular file, or a symlink, false if it does -/// not. Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_other(file_status status, bool &result); - -/// @brief Is path something that exists but is not a directory, -/// regular file, or symlink? -/// -/// @param path Input path. -/// @param result Set to true if \a path exists, but is not a directory, regular -/// file, or a symlink, false if it does not. Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_other(const Twine &path, bool &result); - -/// @brief Does status represent a symlink? -/// -/// @param status A file_status previously returned from stat. -/// @param result Set to true if the file represented by status is a symlink, -/// false if it is not. Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_symlink(file_status status, bool &result); - -/// @brief Is path a symlink? -/// -/// @param path Input path. -/// @param result Set to true if \a path is a symlink, false if it is not. -/// Undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_symlink(const Twine &path, bool &result); - -/// @brief Get last write time without changing it. -/// -/// @param path Input path. -/// @param result Set to the last write time (UNIX time) of \a path if it -/// exists. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code last_write_time(const Twine &path, std::time_t &result); - -/// @brief Set last write time. -/// -/// @param path Input path. -/// @param value Time to set (UNIX time) \a path's last write time to. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code set_last_write_time(const Twine &path, std::time_t value); - -/// @brief Read a symlink's value. -/// -/// @param path Input path. -/// @param result Set to the value of the symbolic link \a path. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code read_symlink(const Twine &path, SmallVectorImpl &result); - -/// @brief Get disk space usage information. -/// -/// @param path Input path. -/// @param result Set to the capacity, free, and available space on the device -/// \a path is on. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code disk_space(const Twine &path, space_info &result); - -/// @brief Get file status as if by POSIX stat(). -/// -/// @param path Input path. -/// @param result Set to the file status. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code status(const Twine &path, file_status &result); - -/// @brief Is status available? -/// -/// @param path Input path. -/// @param result Set to true if status() != status_error. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code status_known(const Twine &path, bool &result); - -/// @brief Get file status as if by POSIX lstat(). -/// -/// Does not resolve symlinks. -/// -/// @param path Input path. -/// @param result Set to the file status. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code symlink_status(const Twine &path, file_status &result); - -/// @brief Get the temporary directory. -/// -/// @param result Set to the temporary directory. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -/// @see unique_file -error_code temp_directory_path(SmallVectorImpl &result); - -/// @brief Generate a unique path and open it as a file. -/// -/// Generates a unique path suitable for a temporary file and then opens it as a -/// file. The name is based on \a model with '%' replaced by a random char in -/// [0-9a-f]. -/// -/// This is an atomic operation. Either the file is created and opened, or the -/// file system is left untouched. -/// -/// clang-%%-%%-%%-%%-%%.s => /clang-a0-b1-c2-d3-e4.s -/// -/// @param model Name to base unique path off of. -/// @param result Set to the opened file. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -/// @see temp_directory_path -error_code unique_file(const Twine &model, void* i_have_not_decided_the_ty_yet); - -/// @brief Canonicalize path. -/// -/// Sets result to the file system's idea of what path is. The result is always -/// absolute and has the same capitalization as the file system. -/// -/// @param path Input path. -/// @param result Set to the canonicalized version of \a path. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code canonicalize(const Twine &path, SmallVectorImpl &result); - -/// @brief Are \a path's first bytes \a magic? -/// -/// @param path Input path. -/// @param magic Byte sequence to compare \a path's first len(magic) bytes to. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code has_magic(const Twine &path, const Twine &magic); - -/// @brief Get \a path's first \a len bytes. -/// -/// @param path Input path. -/// @param len Number of magic bytes to get. -/// @param result Set to the first \a len bytes in the file pointed to by -/// \a path. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code get_magic(const Twine &path, uint32_t len, - SmallVectorImpl &result); - -/// @brief Is file bitcode? -/// -/// @param path Input path. -/// @param result Set to true if \a path is a bitcode file, false if it is not, -/// undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_bitcode(const Twine &path, bool &result); - -/// @brief Is file a dynamic library? -/// -/// @param path Input path. -/// @param result Set to true if \a path is a dynamic library, false if it is -/// not, undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_dynamic_library(const Twine &path, bool &result); - -/// @brief Is an object file? -/// -/// @param path Input path. -/// @param result Set to true if \a path is an object file, false if it is not, -/// undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_object_file(const Twine &path, bool &result); - -/// @brief Can file be read? -/// -/// @param path Input path. -/// @param result Set to true if \a path is readable, false it it is not, -/// undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code can_read(const Twine &path, bool &result); - -/// @brief Can file be written? -/// -/// @param path Input path. -/// @param result Set to true if \a path is writeable, false it it is not, -/// undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code can_write(const Twine &path, bool &result); - -/// @brief Can file be executed? -/// -/// @param path Input path. -/// @param result Set to true if \a path is executable, false it it is not, -/// undefined otherwise. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code can_execute(const Twine &path, bool &result); - -/// @brief Get library paths the system linker uses. -/// -/// @param result Set to the list of system library paths. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code GetSystemLibraryPaths(SmallVectorImpl &result); - -/// @brief Get bitcode library paths the system linker uses -/// + LLVM_LIB_SEARCH_PATH + LLVM_LIBDIR. -/// -/// @param result Set to the list of bitcode library paths. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code GetBitcodeLibraryPaths(SmallVectorImpl &result); - -/// @brief Find a library. -/// -/// Find the path to a library using its short name. Use the system -/// dependent library paths to locate the library. -/// -/// c => /usr/lib/libc.so -/// -/// @param short_name Library name one would give to the system linker. -/// @param result Set to the absolute path \a short_name represents. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code FindLibrary(const Twine &short_name, SmallVectorImpl &result); - -/// @brief Get absolute path of main executable. -/// -/// @param argv0 The program name as it was spelled on the command line. -/// @param MainAddr Address of some symbol in the executable (not in a library). -/// @param result Set to the absolute path of the current executable. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code GetMainExecutable(const char *argv0, void *MainAddr, - SmallVectorImpl &result); - -/// @} -/// @name Iterators -/// @{ - -/// directory_entry - A single entry in a directory. Caches the status either -/// from the result of the iteration syscall, or the first time status or -/// symlink_status is called. -class directory_entry { - std::string Path; - mutable file_status Status; - mutable file_status SymlinkStatus; - -public: - explicit directory_entry(const Twine &path, file_status st = file_status(), - file_status symlink_st = file_status()); - - void assign(const Twine &path, file_status st = file_status(), - file_status symlink_st = file_status()); - void replace_filename(const Twine &filename, file_status st = file_status(), - file_status symlink_st = file_status()); - - const SmallVectorImpl &path() const; - error_code status(file_status &result) const; - error_code symlink_status(file_status &result) const; - - bool operator==(const directory_entry& rhs) const; - bool operator!=(const directory_entry& rhs) const; - bool operator< (const directory_entry& rhs) const; - bool operator<=(const directory_entry& rhs) const; - bool operator> (const directory_entry& rhs) const; - bool operator>=(const directory_entry& rhs) const; -}; - -/// directory_iterator - Iterates through the entries in path. There is no -/// operator++ because we need an error_code. If it's really needed we can make -/// it call report_fatal_error on error. -class directory_iterator { - // implementation directory iterator status - -public: - explicit directory_iterator(const Twine &path, error_code &ec); - // No operator++ because we need error_code. - directory_iterator &increment(error_code &ec); - - const directory_entry &operator*() const; - const directory_entry *operator->() const; - - // Other members as required by - // C++ Std, 24.1.1 Input iterators [input.iterators] -}; - -/// recursive_directory_iterator - Same as directory_iterator except for it -/// recurses down into child directories. -class recursive_directory_iterator { - uint16_t Level; - bool HasNoPushRequest; - // implementation directory iterator status - -public: - explicit recursive_directory_iterator(const Twine &path, error_code &ec); - // No operator++ because we need error_code. - directory_iterator &increment(error_code &ec); - - const directory_entry &operator*() const; - const directory_entry *operator->() const; - - // observers - /// Gets the current level. path is at level 0. - int level() const; - /// Returns true if no_push has been called for this directory_entry. - bool no_push_request() const; - - // modifiers - /// Goes up one level if Level > 0. - void pop(); - /// Does not go down into the current directory_entry. - void no_push(); - - // Other members as required by - // C++ Std, 24.1.1 Input iterators [input.iterators] -}; - -/// @} - -} // end namespace fs -} // end namespace sys -} // end namespace llvm Removed: llvm/trunk/include/llvm/System/Process.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Process.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Process.h (original) +++ llvm/trunk/include/llvm/System/Process.h (removed) @@ -1,146 +0,0 @@ -//===- llvm/System/Process.h ------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::Process class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_PROCESS_H -#define LLVM_SYSTEM_PROCESS_H - -#include "llvm/System/TimeValue.h" - -namespace llvm { -namespace sys { - - /// This class provides an abstraction for getting information about the - /// currently executing process. - /// @since 1.4 - /// @brief An abstraction for operating system processes. - class Process { - /// @name Accessors - /// @{ - public: - /// This static function will return the operating system's virtual memory - /// page size. - /// @returns The number of bytes in a virtual memory page. - /// @brief Get the virtual memory page size - static unsigned GetPageSize(); - - /// This static function will return the total amount of memory allocated - /// by the process. This only counts the memory allocated via the malloc, - /// calloc and realloc functions and includes any "free" holes in the - /// allocated space. - /// @brief Return process memory usage. - static size_t GetMallocUsage(); - - /// This static function will return the total memory usage of the - /// process. This includes code, data, stack and mapped pages usage. Notei - /// that the value returned here is not necessarily the Running Set Size, - /// it is the total virtual memory usage, regardless of mapped state of - /// that memory. - static size_t GetTotalMemoryUsage(); - - /// This static function will set \p user_time to the amount of CPU time - /// spent in user (non-kernel) mode and \p sys_time to the amount of CPU - /// time spent in system (kernel) mode. If the operating system does not - /// support collection of these metrics, a zero TimeValue will be for both - /// values. - static void GetTimeUsage( - TimeValue& elapsed, - ///< Returns the TimeValue::now() giving current time - TimeValue& user_time, - ///< Returns the current amount of user time for the process - TimeValue& sys_time - ///< Returns the current amount of system time for the process - ); - - /// This static function will return the process' current user id number. - /// Not all operating systems support this feature. Where it is not - /// supported, the function should return 65536 as the value. - static int GetCurrentUserId(); - - /// This static function will return the process' current group id number. - /// Not all operating systems support this feature. Where it is not - /// supported, the function should return 65536 as the value. - static int GetCurrentGroupId(); - - /// This function makes the necessary calls to the operating system to - /// prevent core files or any other kind of large memory dumps that can - /// occur when a program fails. - /// @brief Prevent core file generation. - static void PreventCoreFiles(); - - /// This function determines if the standard input is connected directly - /// to a user's input (keyboard probably), rather than coming from a file - /// or pipe. - static bool StandardInIsUserInput(); - - /// This function determines if the standard output is connected to a - /// "tty" or "console" window. That is, the output would be displayed to - /// the user rather than being put on a pipe or stored in a file. - static bool StandardOutIsDisplayed(); - - /// This function determines if the standard error is connected to a - /// "tty" or "console" window. That is, the output would be displayed to - /// the user rather than being put on a pipe or stored in a file. - static bool StandardErrIsDisplayed(); - - /// This function determines if the given file descriptor is connected to - /// a "tty" or "console" window. That is, the output would be displayed to - /// the user rather than being put on a pipe or stored in a file. - static bool FileDescriptorIsDisplayed(int fd); - - /// This function determines the number of columns in the window - /// if standard output is connected to a "tty" or "console" - /// window. If standard output is not connected to a tty or - /// console, or if the number of columns cannot be determined, - /// this routine returns zero. - static unsigned StandardOutColumns(); - - /// This function determines the number of columns in the window - /// if standard error is connected to a "tty" or "console" - /// window. If standard error is not connected to a tty or - /// console, or if the number of columns cannot be determined, - /// this routine returns zero. - static unsigned StandardErrColumns(); - - /// This function determines whether the terminal connected to standard - /// output supports colors. If standard output is not connected to a - /// terminal, this function returns false. - static bool StandardOutHasColors(); - - /// This function determines whether the terminal connected to standard - /// error supports colors. If standard error is not connected to a - /// terminal, this function returns false. - static bool StandardErrHasColors(); - - /// Whether changing colors requires the output to be flushed. - /// This is needed on systems that don't support escape sequences for - /// changing colors. - static bool ColorNeedsFlush(); - - /// This function returns the colorcode escape sequences. - /// If ColorNeedsFlush() is true then this function will change the colors - /// and return an empty escape sequence. In that case it is the - /// responsibility of the client to flush the output stream prior to - /// calling this function. - static const char *OutputColor(char c, bool bold, bool bg); - - /// Same as OutputColor, but only enables the bold attribute. - static const char *OutputBold(bool bg); - - /// Resets the terminals colors, or returns an escape sequence to do so. - static const char *ResetColor(); - /// @} - }; -} -} - -#endif Removed: llvm/trunk/include/llvm/System/Program.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Program.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Program.h (original) +++ llvm/trunk/include/llvm/System/Program.h (removed) @@ -1,157 +0,0 @@ -//===- llvm/System/Program.h ------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::Program class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_PROGRAM_H -#define LLVM_SYSTEM_PROGRAM_H - -#include "llvm/System/Path.h" - -namespace llvm { -namespace sys { - - // TODO: Add operations to communicate with the process, redirect its I/O, - // etc. - - /// This class provides an abstraction for programs that are executable by the - /// operating system. It provides a platform generic way to find executable - /// programs from the path and to execute them in various ways. The sys::Path - /// class is used to specify the location of the Program. - /// @since 1.4 - /// @brief An abstraction for finding and executing programs. - class Program { - /// Opaque handle for target specific data. - void *Data_; - - // Noncopyable. - Program(const Program& other); - Program& operator=(const Program& other); - - /// @name Methods - /// @{ - public: - - Program(); - ~Program(); - - /// Return process ID of this program. - unsigned GetPid() const; - - /// This function executes the program using the \p arguments provided. The - /// invoked program will inherit the stdin, stdout, and stderr file - /// descriptors, the environment and other configuration settings of the - /// invoking program. If Path::executable() does not return true when this - /// function is called then a std::string is thrown. - /// @returns false in case of error, true otherwise. - /// @see FindProgramByName - /// @brief Executes the program with the given set of \p args. - bool Execute - ( const Path& path, ///< sys::Path object providing the path of the - ///< program to be executed. It is presumed this is the result of - ///< the FindProgramByName method. - const char** args, ///< A vector of strings that are passed to the - ///< program. The first element should be the name of the program. - ///< The list *must* be terminated by a null char* entry. - const char ** env = 0, ///< An optional vector of strings to use for - ///< the program's environment. If not provided, the current program's - ///< environment will be used. - const sys::Path** redirects = 0, ///< An optional array of pointers to - ///< Paths. If the array is null, no redirection is done. The array - ///< should have a size of at least three. If the pointer in the array - ///< are not null, then the inferior process's stdin(0), stdout(1), - ///< and stderr(2) will be redirected to the corresponding Paths. - ///< When an empty Path is passed in, the corresponding file - ///< descriptor will be disconnected (ie, /dev/null'd) in a portable - ///< way. - unsigned memoryLimit = 0, ///< If non-zero, this specifies max. amount - ///< of memory can be allocated by process. If memory usage will be - ///< higher limit, the child is killed and this call returns. If zero - ///< - no memory limit. - std::string* ErrMsg = 0 ///< If non-zero, provides a pointer to a string - ///< instance in which error messages will be returned. If the string - ///< is non-empty upon return an error occurred while invoking the - ///< program. - ); - - /// This function waits for the program to exit. This function will block - /// the current program until the invoked program exits. - /// @returns an integer result code indicating the status of the program. - /// A zero or positive value indicates the result code of the program. A - /// negative value is the signal number on which it terminated. - /// @see Execute - /// @brief Waits for the program to exit. - int Wait - ( const Path& path, ///< The path to the child process executable. - unsigned secondsToWait, ///< If non-zero, this specifies the amount - ///< of time to wait for the child process to exit. If the time - ///< expires, the child is killed and this call returns. If zero, - ///< this function will wait until the child finishes or forever if - ///< it doesn't. - std::string* ErrMsg ///< If non-zero, provides a pointer to a string - ///< instance in which error messages will be returned. If the string - ///< is non-empty upon return an error occurred while waiting. - ); - - /// This function terminates the program. - /// @returns true if an error occured. - /// @see Execute - /// @brief Terminates the program. - bool Kill - ( std::string* ErrMsg = 0 ///< If non-zero, provides a pointer to a string - ///< instance in which error messages will be returned. If the string - ///< is non-empty upon return an error occurred while killing the - ///< program. - ); - - /// This static constructor (factory) will attempt to locate a program in - /// the operating system's file system using some pre-determined set of - /// locations to search (e.g. the PATH on Unix). Paths with slashes are - /// returned unmodified. - /// @returns A Path object initialized to the path of the program or a - /// Path object that is empty (invalid) if the program could not be found. - /// @brief Construct a Program by finding it by name. - static Path FindProgramByName(const std::string& name); - - // These methods change the specified standard stream (stdin, - // stdout, or stderr) to binary mode. They return true if an error - // occurred - static bool ChangeStdinToBinary(); - static bool ChangeStdoutToBinary(); - static bool ChangeStderrToBinary(); - - /// A convenience function equivalent to Program prg; prg.Execute(..); - /// prg.Wait(..); - /// @see Execute, Wait - static int ExecuteAndWait(const Path& path, - const char** args, - const char ** env = 0, - const sys::Path** redirects = 0, - unsigned secondsToWait = 0, - unsigned memoryLimit = 0, - std::string* ErrMsg = 0); - - /// A convenience function equivalent to Program prg; prg.Execute(..); - /// @see Execute - static void ExecuteNoWait(const Path& path, - const char** args, - const char ** env = 0, - const sys::Path** redirects = 0, - unsigned memoryLimit = 0, - std::string* ErrMsg = 0); - - /// @} - - }; -} -} - -#endif Removed: llvm/trunk/include/llvm/System/RWMutex.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/RWMutex.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/RWMutex.h (original) +++ llvm/trunk/include/llvm/System/RWMutex.h (removed) @@ -1,173 +0,0 @@ -//===- RWMutex.h - Reader/Writer Mutual Exclusion Lock ----------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::RWMutex class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_RWMUTEX_H -#define LLVM_SYSTEM_RWMUTEX_H - -#include "llvm/System/Threading.h" -#include - -namespace llvm -{ - namespace sys - { - /// @brief Platform agnostic RWMutex class. - class RWMutexImpl - { - /// @name Constructors - /// @{ - public: - - /// Initializes the lock but doesn't acquire it. - /// @brief Default Constructor. - explicit RWMutexImpl(); - - /// Releases and removes the lock - /// @brief Destructor - ~RWMutexImpl(); - - /// @} - /// @name Methods - /// @{ - public: - - /// Attempts to unconditionally acquire the lock in reader mode. If the - /// lock is held by a writer, this method will wait until it can acquire - /// the lock. - /// @returns false if any kind of error occurs, true otherwise. - /// @brief Unconditionally acquire the lock in reader mode. - bool reader_acquire(); - - /// Attempts to release the lock in reader mode. - /// @returns false if any kind of error occurs, true otherwise. - /// @brief Unconditionally release the lock in reader mode. - bool reader_release(); - - /// Attempts to unconditionally acquire the lock in reader mode. If the - /// lock is held by any readers, this method will wait until it can - /// acquire the lock. - /// @returns false if any kind of error occurs, true otherwise. - /// @brief Unconditionally acquire the lock in writer mode. - bool writer_acquire(); - - /// Attempts to release the lock in writer mode. - /// @returns false if any kind of error occurs, true otherwise. - /// @brief Unconditionally release the lock in write mode. - bool writer_release(); - - //@} - /// @name Platform Dependent Data - /// @{ - private: - void* data_; ///< We don't know what the data will be - - /// @} - /// @name Do Not Implement - /// @{ - private: - RWMutexImpl(const RWMutexImpl & original); - void operator=(const RWMutexImpl &); - /// @} - }; - - /// SmartMutex - An R/W mutex with a compile time constant parameter that - /// indicates whether this mutex should become a no-op when we're not - /// running in multithreaded mode. - template - class SmartRWMutex : public RWMutexImpl { - unsigned readers, writers; - public: - explicit SmartRWMutex() : RWMutexImpl(), readers(0), writers(0) { } - - bool reader_acquire() { - if (!mt_only || llvm_is_multithreaded()) - return RWMutexImpl::reader_acquire(); - - // Single-threaded debugging code. This would be racy in multithreaded - // mode, but provides not sanity checks in single threaded mode. - ++readers; - return true; - } - - bool reader_release() { - if (!mt_only || llvm_is_multithreaded()) - return RWMutexImpl::reader_release(); - - // Single-threaded debugging code. This would be racy in multithreaded - // mode, but provides not sanity checks in single threaded mode. - assert(readers > 0 && "Reader lock not acquired before release!"); - --readers; - return true; - } - - bool writer_acquire() { - if (!mt_only || llvm_is_multithreaded()) - return RWMutexImpl::writer_acquire(); - - // Single-threaded debugging code. This would be racy in multithreaded - // mode, but provides not sanity checks in single threaded mode. - assert(writers == 0 && "Writer lock already acquired!"); - ++writers; - return true; - } - - bool writer_release() { - if (!mt_only || llvm_is_multithreaded()) - return RWMutexImpl::writer_release(); - - // Single-threaded debugging code. This would be racy in multithreaded - // mode, but provides not sanity checks in single threaded mode. - assert(writers == 1 && "Writer lock not acquired before release!"); - --writers; - return true; - } - - private: - SmartRWMutex(const SmartRWMutex & original); - void operator=(const SmartRWMutex &); - }; - typedef SmartRWMutex RWMutex; - - /// ScopedReader - RAII acquisition of a reader lock - template - struct SmartScopedReader { - SmartRWMutex& mutex; - - explicit SmartScopedReader(SmartRWMutex& m) : mutex(m) { - mutex.reader_acquire(); - } - - ~SmartScopedReader() { - mutex.reader_release(); - } - }; - typedef SmartScopedReader ScopedReader; - - /// ScopedWriter - RAII acquisition of a writer lock - template - struct SmartScopedWriter { - SmartRWMutex& mutex; - - explicit SmartScopedWriter(SmartRWMutex& m) : mutex(m) { - mutex.writer_acquire(); - } - - ~SmartScopedWriter() { - mutex.writer_release(); - } - }; - typedef SmartScopedWriter ScopedWriter; - } -} - -#endif Removed: llvm/trunk/include/llvm/System/Signals.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Signals.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Signals.h (original) +++ llvm/trunk/include/llvm/System/Signals.h (removed) @@ -1,59 +0,0 @@ -//===- llvm/System/Signals.h - Signal Handling support ----------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines some helpful functions for dealing with the possibility of -// unix signals occuring while your program is running. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_SIGNALS_H -#define LLVM_SYSTEM_SIGNALS_H - -#include "llvm/System/Path.h" - -namespace llvm { -namespace sys { - - /// This function runs all the registered interrupt handlers, including the - /// removal of files registered by RemoveFileOnSignal. - void RunInterruptHandlers(); - - /// This function registers signal handlers to ensure that if a signal gets - /// delivered that the named file is removed. - /// @brief Remove a file if a fatal signal occurs. - bool RemoveFileOnSignal(const Path &Filename, std::string* ErrMsg = 0); - - /// This function removes a file from the list of files to be removed on - /// signal delivery. - void DontRemoveFileOnSignal(const Path &Filename); - - /// When an error signal (such as SIBABRT or SIGSEGV) is delivered to the - /// process, print a stack trace and then exit. - /// @brief Print a stack trace if a fatal signal occurs. - void PrintStackTraceOnErrorSignal(); - - /// AddSignalHandler - Add a function to be called when an abort/kill signal - /// is delivered to the process. The handler can have a cookie passed to it - /// to identify what instance of the handler it is. - void AddSignalHandler(void (*FnPtr)(void *), void *Cookie); - - /// This function registers a function to be called when the user "interrupts" - /// the program (typically by pressing ctrl-c). When the user interrupts the - /// program, the specified interrupt function is called instead of the program - /// being killed, and the interrupt function automatically disabled. Note - /// that interrupt functions are not allowed to call any non-reentrant - /// functions. An null interrupt function pointer disables the current - /// installed function. Note also that the handler may be executed on a - /// different thread on some platforms. - /// @brief Register a function to be called when ctrl-c is pressed. - void SetInterruptFunction(void (*IF)()); -} // End sys namespace -} // End llvm namespace - -#endif Removed: llvm/trunk/include/llvm/System/Solaris.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Solaris.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Solaris.h (original) +++ llvm/trunk/include/llvm/System/Solaris.h (removed) @@ -1,40 +0,0 @@ -/*===- llvm/System/Solaris.h ------------------------------------*- C++ -*-===* - * - * The LLVM Compiler Infrastructure - * - * This file is distributed under the University of Illinois Open Source - * License. See LICENSE.TXT for details. - * - *===----------------------------------------------------------------------===* - * - * This file contains portability fixes for Solaris hosts. - * - *===----------------------------------------------------------------------===*/ - -#ifndef LLVM_SYSTEM_SOLARIS_H -#define LLVM_SYSTEM_SOLARIS_H - -#include -#include - -#undef CS -#undef DS -#undef ES -#undef FS -#undef GS -#undef SS -#undef EAX -#undef ECX -#undef EDX -#undef EBX -#undef ESP -#undef EBP -#undef ESI -#undef EDI -#undef EIP -#undef UESP -#undef EFL -#undef ERR -#undef TRAPNO - -#endif Removed: llvm/trunk/include/llvm/System/SwapByteOrder.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/SwapByteOrder.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/SwapByteOrder.h (original) +++ llvm/trunk/include/llvm/System/SwapByteOrder.h (removed) @@ -1,101 +0,0 @@ -//===- SwapByteOrder.h - Generic and optimized byte swaps -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares generic and optimized functions to swap the byte order of -// an integral type. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_SWAP_BYTE_ORDER_H -#define LLVM_SYSTEM_SWAP_BYTE_ORDER_H - -#include "llvm/System/DataTypes.h" -#include -#include - -namespace llvm { -namespace sys { - -/// SwapByteOrder_16 - This function returns a byte-swapped representation of -/// the 16-bit argument. -inline uint16_t SwapByteOrder_16(uint16_t value) { -#if defined(_MSC_VER) && !defined(_DEBUG) - // The DLL version of the runtime lacks these functions (bug!?), but in a - // release build they're replaced with BSWAP instructions anyway. - return _byteswap_ushort(value); -#else - uint16_t Hi = value << 8; - uint16_t Lo = value >> 8; - return Hi | Lo; -#endif -} - -/// SwapByteOrder_32 - This function returns a byte-swapped representation of -/// the 32-bit argument. -inline uint32_t SwapByteOrder_32(uint32_t value) { -#if defined(__llvm__) || \ -(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && !defined(__ICC) - return __builtin_bswap32(value); -#elif defined(_MSC_VER) && !defined(_DEBUG) - return _byteswap_ulong(value); -#else - uint32_t Byte0 = value & 0x000000FF; - uint32_t Byte1 = value & 0x0000FF00; - uint32_t Byte2 = value & 0x00FF0000; - uint32_t Byte3 = value & 0xFF000000; - return (Byte0 << 24) | (Byte1 << 8) | (Byte2 >> 8) | (Byte3 >> 24); -#endif -} - -/// SwapByteOrder_64 - This function returns a byte-swapped representation of -/// the 64-bit argument. -inline uint64_t SwapByteOrder_64(uint64_t value) { -#if defined(__llvm__) || \ -(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && !defined(__ICC) - return __builtin_bswap64(value); -#elif defined(_MSC_VER) && !defined(_DEBUG) - return _byteswap_uint64(value); -#else - uint64_t Hi = SwapByteOrder_32(uint32_t(value)); - uint32_t Lo = SwapByteOrder_32(uint32_t(value >> 32)); - return (Hi << 32) | Lo; -#endif -} - -inline unsigned char SwapByteOrder(unsigned char C) { return C; } -inline signed char SwapByteOrder(signed char C) { return C; } -inline char SwapByteOrder(char C) { return C; } - -inline unsigned short SwapByteOrder(unsigned short C) { return SwapByteOrder_16(C); } -inline signed short SwapByteOrder( signed short C) { return SwapByteOrder_16(C); } - -inline unsigned int SwapByteOrder(unsigned int C) { return SwapByteOrder_32(C); } -inline signed int SwapByteOrder( signed int C) { return SwapByteOrder_32(C); } - -#if __LONG_MAX__ == __INT_MAX__ -inline unsigned long SwapByteOrder(unsigned long C) { return SwapByteOrder_32(C); } -inline signed long SwapByteOrder( signed long C) { return SwapByteOrder_32(C); } -#elif __LONG_MAX__ == __LONG_LONG_MAX__ -inline unsigned long SwapByteOrder(unsigned long C) { return SwapByteOrder_64(C); } -inline signed long SwapByteOrder( signed long C) { return SwapByteOrder_64(C); } -#else -#error "Unknown long size!" -#endif - -inline unsigned long long SwapByteOrder(unsigned long long C) { - return SwapByteOrder_64(C); -} -inline signed long long SwapByteOrder(signed long long C) { - return SwapByteOrder_64(C); -} - -} // end namespace sys -} // end namespace llvm - -#endif Removed: llvm/trunk/include/llvm/System/ThreadLocal.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/ThreadLocal.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/ThreadLocal.h (original) +++ llvm/trunk/include/llvm/System/ThreadLocal.h (removed) @@ -1,54 +0,0 @@ -//===- llvm/System/ThreadLocal.h - Thread Local Data ------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_THREAD_LOCAL_H -#define LLVM_SYSTEM_THREAD_LOCAL_H - -#include "llvm/System/Threading.h" -#include - -namespace llvm { - namespace sys { - // ThreadLocalImpl - Common base class of all ThreadLocal instantiations. - // YOU SHOULD NEVER USE THIS DIRECTLY. - class ThreadLocalImpl { - void* data; - public: - ThreadLocalImpl(); - virtual ~ThreadLocalImpl(); - void setInstance(const void* d); - const void* getInstance(); - void removeInstance(); - }; - - /// ThreadLocal - A class used to abstract thread-local storage. It holds, - /// for each thread, a pointer a single object of type T. - template - class ThreadLocal : public ThreadLocalImpl { - public: - ThreadLocal() : ThreadLocalImpl() { } - - /// get - Fetches a pointer to the object associated with the current - /// thread. If no object has yet been associated, it returns NULL; - T* get() { return static_cast(getInstance()); } - - // set - Associates a pointer to an object with the current thread. - void set(T* d) { setInstance(d); } - - // erase - Removes the pointer associated with the current thread. - void erase() { removeInstance(); } - }; - } -} - -#endif Removed: llvm/trunk/include/llvm/System/Threading.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Threading.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Threading.h (original) +++ llvm/trunk/include/llvm/System/Threading.h (removed) @@ -1,59 +0,0 @@ -//===-- llvm/System/Threading.h - Control multithreading mode --*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// TThis file defines llvm_start_multithreaded() and friends. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_THREADING_H -#define LLVM_SYSTEM_THREADING_H - -namespace llvm { - /// llvm_start_multithreaded - Allocate and initialize structures needed to - /// make LLVM safe for multithreading. The return value indicates whether - /// multithreaded initialization succeeded. LLVM will still be operational - /// on "failed" return, and will still be safe for hosting threading - /// applications in the JIT, but will not be safe for concurrent calls to the - /// LLVM APIs. - /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS. - bool llvm_start_multithreaded(); - - /// llvm_stop_multithreaded - Deallocate structures necessary to make LLVM - /// safe for multithreading. - /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS. - void llvm_stop_multithreaded(); - - /// llvm_is_multithreaded - Check whether LLVM is executing in thread-safe - /// mode or not. - bool llvm_is_multithreaded(); - - /// acquire_global_lock - Acquire the global lock. This is a no-op if called - /// before llvm_start_multithreaded(). - void llvm_acquire_global_lock(); - - /// release_global_lock - Release the global lock. This is a no-op if called - /// before llvm_start_multithreaded(). - void llvm_release_global_lock(); - - /// llvm_execute_on_thread - Execute the given \arg UserFn on a separate - /// thread, passing it the provided \arg UserData. - /// - /// This function does not guarantee that the code will actually be executed - /// on a separate thread or honoring the requested stack size, but tries to do - /// so where system support is available. - /// - /// \param UserFn - The callback to execute. - /// \param UserData - An argument to pass to the callback function. - /// \param RequestedStackSize - If non-zero, a requested size (in bytes) for - /// the thread stack. - void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData, - unsigned RequestedStackSize = 0); -} - -#endif Removed: llvm/trunk/include/llvm/System/TimeValue.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/TimeValue.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/TimeValue.h (original) +++ llvm/trunk/include/llvm/System/TimeValue.h (removed) @@ -1,382 +0,0 @@ -//===-- TimeValue.h - Declare OS TimeValue Concept --------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file declares the operating system TimeValue concept. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/DataTypes.h" -#include - -#ifndef LLVM_SYSTEM_TIMEVALUE_H -#define LLVM_SYSTEM_TIMEVALUE_H - -namespace llvm { -namespace sys { - /// This class is used where a precise fixed point in time is required. The - /// range of TimeValue spans many hundreds of billions of years both past and - /// present. The precision of TimeValue is to the nanosecond. However, the - /// actual precision of its values will be determined by the resolution of - /// the system clock. The TimeValue class is used in conjunction with several - /// other lib/System interfaces to specify the time at which a call should - /// timeout, etc. - /// @since 1.4 - /// @brief Provides an abstraction for a fixed point in time. - class TimeValue { - - /// @name Constants - /// @{ - public: - - /// A constant TimeValue representing the smallest time - /// value permissable by the class. MinTime is some point - /// in the distant past, about 300 billion years BCE. - /// @brief The smallest possible time value. - static const TimeValue MinTime; - - /// A constant TimeValue representing the largest time - /// value permissable by the class. MaxTime is some point - /// in the distant future, about 300 billion years AD. - /// @brief The largest possible time value. - static const TimeValue MaxTime; - - /// A constant TimeValue representing the base time, - /// or zero time of 00:00:00 (midnight) January 1st, 2000. - /// @brief 00:00:00 Jan 1, 2000 UTC. - static const TimeValue ZeroTime; - - /// A constant TimeValue for the Posix base time which is - /// 00:00:00 (midnight) January 1st, 1970. - /// @brief 00:00:00 Jan 1, 1970 UTC. - static const TimeValue PosixZeroTime; - - /// A constant TimeValue for the Win32 base time which is - /// 00:00:00 (midnight) January 1st, 1601. - /// @brief 00:00:00 Jan 1, 1601 UTC. - static const TimeValue Win32ZeroTime; - - /// @} - /// @name Types - /// @{ - public: - typedef int64_t SecondsType; ///< Type used for representing seconds. - typedef int32_t NanoSecondsType;///< Type used for representing nanoseconds. - - enum TimeConversions { - NANOSECONDS_PER_SECOND = 1000000000, ///< One Billion - MICROSECONDS_PER_SECOND = 1000000, ///< One Million - MILLISECONDS_PER_SECOND = 1000, ///< One Thousand - NANOSECONDS_PER_MICROSECOND = 1000, ///< One Thousand - NANOSECONDS_PER_MILLISECOND = 1000000,///< One Million - NANOSECONDS_PER_POSIX_TICK = 100, ///< Posix tick is 100 Hz (10ms) - NANOSECONDS_PER_WIN32_TICK = 100 ///< Win32 tick is 100 Hz (10ms) - }; - - /// @} - /// @name Constructors - /// @{ - public: - /// Caller provides the exact value in seconds and nanoseconds. The - /// \p nanos argument defaults to zero for convenience. - /// @brief Explicit constructor - explicit TimeValue (SecondsType seconds, NanoSecondsType nanos = 0) - : seconds_( seconds ), nanos_( nanos ) { this->normalize(); } - - /// Caller provides the exact value as a double in seconds with the - /// fractional part representing nanoseconds. - /// @brief Double Constructor. - explicit TimeValue( double new_time ) - : seconds_( 0 ) , nanos_ ( 0 ) { - SecondsType integer_part = static_cast( new_time ); - seconds_ = integer_part; - nanos_ = static_cast( (new_time - - static_cast(integer_part)) * NANOSECONDS_PER_SECOND ); - this->normalize(); - } - - /// This is a static constructor that returns a TimeValue that represents - /// the current time. - /// @brief Creates a TimeValue with the current time (UTC). - static TimeValue now(); - - /// @} - /// @name Operators - /// @{ - public: - /// Add \p that to \p this. - /// @returns this - /// @brief Incrementing assignment operator. - TimeValue& operator += (const TimeValue& that ) { - this->seconds_ += that.seconds_ ; - this->nanos_ += that.nanos_ ; - this->normalize(); - return *this; - } - - /// Subtract \p that from \p this. - /// @returns this - /// @brief Decrementing assignment operator. - TimeValue& operator -= (const TimeValue &that ) { - this->seconds_ -= that.seconds_ ; - this->nanos_ -= that.nanos_ ; - this->normalize(); - return *this; - } - - /// Determine if \p this is less than \p that. - /// @returns True iff *this < that. - /// @brief True if this < that. - int operator < (const TimeValue &that) const { return that > *this; } - - /// Determine if \p this is greather than \p that. - /// @returns True iff *this > that. - /// @brief True if this > that. - int operator > (const TimeValue &that) const { - if ( this->seconds_ > that.seconds_ ) { - return 1; - } else if ( this->seconds_ == that.seconds_ ) { - if ( this->nanos_ > that.nanos_ ) return 1; - } - return 0; - } - - /// Determine if \p this is less than or equal to \p that. - /// @returns True iff *this <= that. - /// @brief True if this <= that. - int operator <= (const TimeValue &that) const { return that >= *this; } - - /// Determine if \p this is greater than or equal to \p that. - /// @returns True iff *this >= that. - /// @brief True if this >= that. - int operator >= (const TimeValue &that) const { - if ( this->seconds_ > that.seconds_ ) { - return 1; - } else if ( this->seconds_ == that.seconds_ ) { - if ( this->nanos_ >= that.nanos_ ) return 1; - } - return 0; - } - - /// Determines if two TimeValue objects represent the same moment in time. - /// @brief True iff *this == that. - /// @brief True if this == that. - int operator == (const TimeValue &that) const { - return (this->seconds_ == that.seconds_) && - (this->nanos_ == that.nanos_); - } - - /// Determines if two TimeValue objects represent times that are not the - /// same. - /// @return True iff *this != that. - /// @brief True if this != that. - int operator != (const TimeValue &that) const { return !(*this == that); } - - /// Adds two TimeValue objects together. - /// @returns The sum of the two operands as a new TimeValue - /// @brief Addition operator. - friend TimeValue operator + (const TimeValue &tv1, const TimeValue &tv2); - - /// Subtracts two TimeValue objects. - /// @returns The difference of the two operands as a new TimeValue - /// @brief Subtraction operator. - friend TimeValue operator - (const TimeValue &tv1, const TimeValue &tv2); - - /// @} - /// @name Accessors - /// @{ - public: - - /// Returns only the seconds component of the TimeValue. The nanoseconds - /// portion is ignored. No rounding is performed. - /// @brief Retrieve the seconds component - SecondsType seconds() const { return seconds_; } - - /// Returns only the nanoseconds component of the TimeValue. The seconds - /// portion is ignored. - /// @brief Retrieve the nanoseconds component. - NanoSecondsType nanoseconds() const { return nanos_; } - - /// Returns only the fractional portion of the TimeValue rounded down to the - /// nearest microsecond (divide by one thousand). - /// @brief Retrieve the fractional part as microseconds; - uint32_t microseconds() const { - return nanos_ / NANOSECONDS_PER_MICROSECOND; - } - - /// Returns only the fractional portion of the TimeValue rounded down to the - /// nearest millisecond (divide by one million). - /// @brief Retrieve the fractional part as milliseconds; - uint32_t milliseconds() const { - return nanos_ / NANOSECONDS_PER_MILLISECOND; - } - - /// Returns the TimeValue as a number of microseconds. Note that the value - /// returned can overflow because the range of a uint64_t is smaller than - /// the range of a TimeValue. Nevertheless, this is useful on some operating - /// systems and is therefore provided. - /// @brief Convert to a number of microseconds (can overflow) - uint64_t usec() const { - return seconds_ * MICROSECONDS_PER_SECOND + - ( nanos_ / NANOSECONDS_PER_MICROSECOND ); - } - - /// Returns the TimeValue as a number of milliseconds. Note that the value - /// returned can overflow because the range of a uint64_t is smaller than - /// the range of a TimeValue. Nevertheless, this is useful on some operating - /// systems and is therefore provided. - /// @brief Convert to a number of milliseconds (can overflow) - uint64_t msec() const { - return seconds_ * MILLISECONDS_PER_SECOND + - ( nanos_ / NANOSECONDS_PER_MILLISECOND ); - } - - /// Converts the TimeValue into the corresponding number of "ticks" for - /// Posix, correcting for the difference in Posix zero time. - /// @brief Convert to unix time (100 nanoseconds since 12:00:00a Jan 1,1970) - uint64_t toPosixTime() const { - uint64_t result = seconds_ - PosixZeroTime.seconds_; - result += nanos_ / NANOSECONDS_PER_POSIX_TICK; - return result; - } - - /// Converts the TimeValue into the corresponding number of seconds - /// since the epoch (00:00:00 Jan 1,1970). - uint64_t toEpochTime() const { - return seconds_ - PosixZeroTime.seconds_; - } - - /// Converts the TimeValue into the corresponding number of "ticks" for - /// Win32 platforms, correcting for the difference in Win32 zero time. - /// @brief Convert to windows time (seconds since 12:00:00a Jan 1, 1601) - uint64_t toWin32Time() const { - uint64_t result = seconds_ - Win32ZeroTime.seconds_; - result += nanos_ / NANOSECONDS_PER_WIN32_TICK; - return result; - } - - /// Provides the seconds and nanoseconds as results in its arguments after - /// correction for the Posix zero time. - /// @brief Convert to timespec time (ala POSIX.1b) - void getTimespecTime( uint64_t& seconds, uint32_t& nanos ) const { - seconds = seconds_ - PosixZeroTime.seconds_; - nanos = nanos_; - } - - /// Provides conversion of the TimeValue into a readable time & date. - /// @returns std::string containing the readable time value - /// @brief Convert time to a string. - std::string str() const; - - /// @} - /// @name Mutators - /// @{ - public: - /// The seconds component of the TimeValue is set to \p sec without - /// modifying the nanoseconds part. This is useful for whole second - /// arithmetic. - /// @brief Set the seconds component. - void seconds (SecondsType sec ) { - this->seconds_ = sec; - this->normalize(); - } - - /// The nanoseconds component of the TimeValue is set to \p nanos without - /// modifying the seconds part. This is useful for basic computations - /// involving just the nanoseconds portion. Note that the TimeValue will be - /// normalized after this call so that the fractional (nanoseconds) portion - /// will have the smallest equivalent value. - /// @brief Set the nanoseconds component using a number of nanoseconds. - void nanoseconds ( NanoSecondsType nanos ) { - this->nanos_ = nanos; - this->normalize(); - } - - /// The seconds component remains unchanged. - /// @brief Set the nanoseconds component using a number of microseconds. - void microseconds ( int32_t micros ) { - this->nanos_ = micros * NANOSECONDS_PER_MICROSECOND; - this->normalize(); - } - - /// The seconds component remains unchanged. - /// @brief Set the nanoseconds component using a number of milliseconds. - void milliseconds ( int32_t millis ) { - this->nanos_ = millis * NANOSECONDS_PER_MILLISECOND; - this->normalize(); - } - - /// @brief Converts from microsecond format to TimeValue format - void usec( int64_t microseconds ) { - this->seconds_ = microseconds / MICROSECONDS_PER_SECOND; - this->nanos_ = NanoSecondsType(microseconds % MICROSECONDS_PER_SECOND) * - NANOSECONDS_PER_MICROSECOND; - this->normalize(); - } - - /// @brief Converts from millisecond format to TimeValue format - void msec( int64_t milliseconds ) { - this->seconds_ = milliseconds / MILLISECONDS_PER_SECOND; - this->nanos_ = NanoSecondsType(milliseconds % MILLISECONDS_PER_SECOND) * - NANOSECONDS_PER_MILLISECOND; - this->normalize(); - } - - /// Converts the \p seconds argument from PosixTime to the corresponding - /// TimeValue and assigns that value to \p this. - /// @brief Convert seconds form PosixTime to TimeValue - void fromEpochTime( SecondsType seconds ) { - seconds_ = seconds + PosixZeroTime.seconds_; - nanos_ = 0; - this->normalize(); - } - - /// Converts the \p win32Time argument from Windows FILETIME to the - /// corresponding TimeValue and assigns that value to \p this. - /// @brief Convert seconds form Windows FILETIME to TimeValue - void fromWin32Time( uint64_t win32Time ) { - this->seconds_ = win32Time / 10000000 + Win32ZeroTime.seconds_; - this->nanos_ = NanoSecondsType(win32Time % 10000000) * 100; - } - - /// @} - /// @name Implementation - /// @{ - private: - /// This causes the values to be represented so that the fractional - /// part is minimized, possibly incrementing the seconds part. - /// @brief Normalize to canonical form. - void normalize(); - - /// @} - /// @name Data - /// @{ - private: - /// Store the values as a . - SecondsType seconds_;///< Stores the seconds part of the TimeVal - NanoSecondsType nanos_; ///< Stores the nanoseconds part of the TimeVal - /// @} - - }; - -inline TimeValue operator + (const TimeValue &tv1, const TimeValue &tv2) { - TimeValue sum (tv1.seconds_ + tv2.seconds_, tv1.nanos_ + tv2.nanos_); - sum.normalize (); - return sum; -} - -inline TimeValue operator - (const TimeValue &tv1, const TimeValue &tv2) { - TimeValue difference (tv1.seconds_ - tv2.seconds_, tv1.nanos_ - tv2.nanos_ ); - difference.normalize (); - return difference; -} - -} -} - -#endif Removed: llvm/trunk/include/llvm/System/Valgrind.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/Valgrind.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/Valgrind.h (original) +++ llvm/trunk/include/llvm/System/Valgrind.h (removed) @@ -1,32 +0,0 @@ -//===- llvm/System/Valgrind.h - Communication with Valgrind -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Methods for communicating with a valgrind instance this program is running -// under. These are all no-ops unless LLVM was configured on a system with the -// valgrind headers installed and valgrind is controlling this process. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_VALGRIND_H -#define LLVM_SYSTEM_VALGRIND_H - -#include - -namespace llvm { -namespace sys { - // True if Valgrind is controlling this process. - bool RunningOnValgrind(); - - // Discard valgrind's translation of code in the range [Addr .. Addr + Len). - // Otherwise valgrind may continue to execute the old version of the code. - void ValgrindDiscardTranslations(const void *Addr, size_t Len); -} -} - -#endif Removed: llvm/trunk/include/llvm/System/system_error.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/System/system_error.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/include/llvm/System/system_error.h (original) +++ llvm/trunk/include/llvm/System/system_error.h (removed) @@ -1,911 +0,0 @@ -//===---------------------------- system_error ----------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This was lifted from libc++ and modified for C++03. This is called -// system_error even though it does not define that class because that's what -// it's called in C++0x. We don't define system_error because it is only used -// for exception handling, which we don't use in LLVM. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_SYSTEM_ERROR_H -#define LLVM_SYSTEM_SYSTEM_ERROR_H - -/* - system_error synopsis - -namespace std -{ - -class error_category -{ -public: - virtual ~error_category(); - - error_category(const error_category&) = delete; - error_category& operator=(const error_category&) = delete; - - virtual const char* name() const = 0; - virtual error_condition default_error_condition(int ev) const; - virtual bool equivalent(int code, const error_condition& condition) const; - virtual bool equivalent(const error_code& code, int condition) const; - virtual std::string message(int ev) const = 0; - - bool operator==(const error_category& rhs) const; - bool operator!=(const error_category& rhs) const; - bool operator<(const error_category& rhs) const; -}; - -const error_category& generic_category(); -const error_category& system_category(); - -template struct is_error_code_enum - : public false_type {}; - -template struct is_error_condition_enum - : public false_type {}; - -class error_code -{ -public: - // constructors: - error_code(); - error_code(int val, const error_category& cat); - template - error_code(ErrorCodeEnum e); - - // modifiers: - void assign(int val, const error_category& cat); - template - error_code& operator=(ErrorCodeEnum e); - void clear(); - - // observers: - int value() const; - const error_category& category() const; - error_condition default_error_condition() const; - std::string message() const; - explicit operator bool() const; -}; - -// non-member functions: -bool operator<(const error_code& lhs, const error_code& rhs); -template - basic_ostream& - operator<<(basic_ostream& os, const error_code& ec); - -class error_condition -{ -public: - // constructors: - error_condition(); - error_condition(int val, const error_category& cat); - template - error_condition(ErrorConditionEnum e); - - // modifiers: - void assign(int val, const error_category& cat); - template - error_condition& operator=(ErrorConditionEnum e); - void clear(); - - // observers: - int value() const; - const error_category& category() const; - std::string message() const; - explicit operator bool() const; -}; - -bool operator<(const error_condition& lhs, const error_condition& rhs); - -class system_error - : public runtime_error -{ -public: - system_error(error_code ec, const std::string& what_arg); - system_error(error_code ec, const char* what_arg); - system_error(error_code ec); - system_error(int ev, const error_category& ecat, const std::string& what_arg); - system_error(int ev, const error_category& ecat, const char* what_arg); - system_error(int ev, const error_category& ecat); - - const error_code& code() const throw(); - const char* what() const throw(); -}; - -enum class errc -{ - address_family_not_supported, // EAFNOSUPPORT - address_in_use, // EADDRINUSE - address_not_available, // EADDRNOTAVAIL - already_connected, // EISCONN - argument_list_too_long, // E2BIG - argument_out_of_domain, // EDOM - bad_address, // EFAULT - bad_file_descriptor, // EBADF - bad_message, // EBADMSG - broken_pipe, // EPIPE - connection_aborted, // ECONNABORTED - connection_already_in_progress, // EALREADY - connection_refused, // ECONNREFUSED - connection_reset, // ECONNRESET - cross_device_link, // EXDEV - destination_address_required, // EDESTADDRREQ - device_or_resource_busy, // EBUSY - directory_not_empty, // ENOTEMPTY - executable_format_error, // ENOEXEC - file_exists, // EEXIST - file_too_large, // EFBIG - filename_too_long, // ENAMETOOLONG - function_not_supported, // ENOSYS - host_unreachable, // EHOSTUNREACH - identifier_removed, // EIDRM - illegal_byte_sequence, // EILSEQ - inappropriate_io_control_operation, // ENOTTY - interrupted, // EINTR - invalid_argument, // EINVAL - invalid_seek, // ESPIPE - io_error, // EIO - is_a_directory, // EISDIR - message_size, // EMSGSIZE - network_down, // ENETDOWN - network_reset, // ENETRESET - network_unreachable, // ENETUNREACH - no_buffer_space, // ENOBUFS - no_child_process, // ECHILD - no_link, // ENOLINK - no_lock_available, // ENOLCK - no_message_available, // ENODATA - no_message, // ENOMSG - no_protocol_option, // ENOPROTOOPT - no_space_on_device, // ENOSPC - no_stream_resources, // ENOSR - no_such_device_or_address, // ENXIO - no_such_device, // ENODEV - no_such_file_or_directory, // ENOENT - no_such_process, // ESRCH - not_a_directory, // ENOTDIR - not_a_socket, // ENOTSOCK - not_a_stream, // ENOSTR - not_connected, // ENOTCONN - not_enough_memory, // ENOMEM - not_supported, // ENOTSUP - operation_canceled, // ECANCELED - operation_in_progress, // EINPROGRESS - operation_not_permitted, // EPERM - operation_not_supported, // EOPNOTSUPP - operation_would_block, // EWOULDBLOCK - owner_dead, // EOWNERDEAD - permission_denied, // EACCES - protocol_error, // EPROTO - protocol_not_supported, // EPROTONOSUPPORT - read_only_file_system, // EROFS - resource_deadlock_would_occur, // EDEADLK - resource_unavailable_try_again, // EAGAIN - result_out_of_range, // ERANGE - state_not_recoverable, // ENOTRECOVERABLE - stream_timeout, // ETIME - text_file_busy, // ETXTBSY - timed_out, // ETIMEDOUT - too_many_files_open_in_system, // ENFILE - too_many_files_open, // EMFILE - too_many_links, // EMLINK - too_many_symbolic_link_levels, // ELOOP - value_too_large, // EOVERFLOW - wrong_protocol_type // EPROTOTYPE -}; - -template <> struct is_error_condition_enum : true_type { } - -error_code make_error_code(errc e); -error_condition make_error_condition(errc e); - -// Comparison operators: -bool operator==(const error_code& lhs, const error_code& rhs); -bool operator==(const error_code& lhs, const error_condition& rhs); -bool operator==(const error_condition& lhs, const error_code& rhs); -bool operator==(const error_condition& lhs, const error_condition& rhs); -bool operator!=(const error_code& lhs, const error_code& rhs); -bool operator!=(const error_code& lhs, const error_condition& rhs); -bool operator!=(const error_condition& lhs, const error_code& rhs); -bool operator!=(const error_condition& lhs, const error_condition& rhs); - -template <> struct hash; - -} // std - -*/ - -#include "llvm/Config/config.h" -#include "llvm/Support/type_traits.h" -#include -#include - -// This must be here instead of a .inc file because it is used in the definition -// of the enum values below. -#ifdef LLVM_ON_WIN32 - // VS 2008 needs this for some of the defines below. -# include - - // The following numbers were taken from VS2010. -# ifndef EAFNOSUPPORT -# define EAFNOSUPPORT WSAEAFNOSUPPORT -# endif -# ifndef EADDRINUSE -# define EADDRINUSE WSAEADDRINUSE -# endif -# ifndef EADDRNOTAVAIL -# define EADDRNOTAVAIL WSAEADDRNOTAVAIL -# endif -# ifndef EISCONN -# define EISCONN WSAEISCONN -# endif -# ifndef E2BIG -# define E2BIG WSAE2BIG -# endif -# ifndef EDOM -# define EDOM WSAEDOM -# endif -# ifndef EFAULT -# define EFAULT WSAEFAULT -# endif -# ifndef EBADF -# define EBADF WSAEBADF -# endif -# ifndef EBADMSG -# define EBADMSG 104 -# endif -# ifndef EPIPE -# define EPIPE WSAEPIPE -# endif -# ifndef ECONNABORTED -# define ECONNABORTED WSAECONNABORTED -# endif -# ifndef EALREADY -# define EALREADY WSAEALREADY -# endif -# ifndef ECONNREFUSED -# define ECONNREFUSED WSAECONNREFUSED -# endif -# ifndef ECONNRESET -# define ECONNRESET WSAECONNRESET -# endif -# ifndef EXDEV -# define EXDEV WSAEXDEV -# endif -# ifndef EDESTADDRREQ -# define EDESTADDRREQ WSAEDESTADDRREQ -# endif -# ifndef EBUSY -# define EBUSY WSAEBUSY -# endif -# ifndef ENOTEMPTY -# define ENOTEMPTY WSAENOTEMPTY -# endif -# ifndef ENOEXEC -# define ENOEXEC WSAENOEXEC -# endif -# ifndef EEXIST -# define EEXIST WSAEEXIST -# endif -# ifndef EFBIG -# define EFBIG WSAEFBIG -# endif -# ifndef ENAMETOOLONG -# define ENAMETOOLONG WSAENAMETOOLONG -# endif -# ifndef ENOSYS -# define ENOSYS WSAENOSYS -# endif -# ifndef EHOSTUNREACH -# define EHOSTUNREACH WSAEHOSTUNREACH -# endif -# ifndef EIDRM -# define EIDRM 111 -# endif -# ifndef EILSEQ -# define EILSEQ WSAEILSEQ -# endif -# ifndef ENOTTY -# define ENOTTY WSAENOTTY -# endif -# ifndef EINTR -# define EINTR WSAEINTR -# endif -# ifndef EINVAL -# define EINVAL WSAEINVAL -# endif -# ifndef ESPIPE -# define ESPIPE WSAESPIPE -# endif -# ifndef EIO -# define EIO WSAEIO -# endif -# ifndef EISDIR -# define EISDIR WSAEISDIR -# endif -# ifndef EMSGSIZE -# define EMSGSIZE WSAEMSGSIZE -# endif -# ifndef ENETDOWN -# define ENETDOWN WSAENETDOWN -# endif -# ifndef ENETRESET -# define ENETRESET WSAENETRESET -# endif -# ifndef ENETUNREACH -# define ENETUNREACH WSAENETUNREACH -# endif -# ifndef ENOBUFS -# define ENOBUFS WSAENOBUFS -# endif -# ifndef ECHILD -# define ECHILD WSAECHILD -# endif -# ifndef ENOLINK -# define ENOLINK 121 -# endif -# ifndef ENOLCK -# define ENOLCK WSAENOLCK -# endif -# ifndef ENODATA -# define ENODATA 120 -# endif -# ifndef ENOMSG -# define ENOMSG 122 -# endif -# ifndef ENOPROTOOPT -# define ENOPROTOOPT WSAENOPROTOOPT -# endif -# ifndef ENOSPC -# define ENOSPC WSAENOSPC -# endif -# ifndef ENOSR -# define ENOSR 124 -# endif -# ifndef ENXIO -# define ENXIO WSAENXIO -# endif -# ifndef ENODEV -# define ENODEV WSAENODEV -# endif -# ifndef ENOENT -# define ENOENT WSAENOENT -# endif -# ifndef ESRCH -# define ESRCH WSAESRCH -# endif -# ifndef ENOTDIR -# define ENOTDIR WSAENOTDIR -# endif -# ifndef ENOTSOCK -# define ENOTSOCK WSAENOTSOCK -# endif -# ifndef ENOSTR -# define ENOSTR 125 -# endif -# ifndef ENOTCONN -# define ENOTCONN WSAENOTCONN -# endif -# ifndef ENOMEM -# define ENOMEM WSAENOMEM -# endif -# ifndef ENOTSUP -# define ENOTSUP 129 -# endif -# ifndef ECANCELED -# define ECANCELED 105 -# endif -# ifndef EINPROGRESS -# define EINPROGRESS WSAEINPROGRESS -# endif -# ifndef EPERM -# define EPERM WSAEPERM -# endif -# ifndef EOPNOTSUPP -# define EOPNOTSUPP WSAEOPNOTSUPP -# endif -# ifndef EWOULDBLOCK -# define EWOULDBLOCK WSAEWOULDBLOCK -# endif -# ifndef EOWNERDEAD -# define EOWNERDEAD 133 -# endif -# ifndef EACCES -# define EACCES WSAEACCES -# endif -# ifndef EPROTO -# define EPROTO 134 -# endif -# ifndef EPROTONOSUPPORT -# define EPROTONOSUPPORT WSAEPROTONOSUPPORT -# endif -# ifndef EROFS -# define EROFS WSAEROFS -# endif -# ifndef EDEADLK -# define EDEADLK WSAEDEADLK -# endif -# ifndef EAGAIN -# define EAGAIN WSAEAGAIN -# endif -# ifndef ERANGE -# define ERANGE WSAERANGE -# endif -# ifndef ENOTRECOVERABLE -# define ENOTRECOVERABLE 127 -# endif -# ifndef ETIME -# define ETIME 137 -# endif -# ifndef ETXTBSY -# define ETXTBSY 139 -# endif -# ifndef ETIMEDOUT -# define ETIMEDOUT WSAETIMEDOUT -# endif -# ifndef ENFILE -# define ENFILE WSAENFILE -# endif -# ifndef EMFILE -# define EMFILE WSAEMFILE -# endif -# ifndef EMLINK -# define EMLINK WSAEMLINK -# endif -# ifndef ELOOP -# define ELOOP WSAELOOP -# endif -# ifndef EOVERFLOW -# define EOVERFLOW 132 -# endif -# ifndef EPROTOTYPE -# define EPROTOTYPE WSAEPROTOTYPE -# endif -#endif - -namespace llvm { - -template -struct integral_constant { - typedef T value_type; - static const value_type value = v; - typedef integral_constant type; - operator value_type() { return value; } -}; - -typedef integral_constant true_type; -typedef integral_constant false_type; - -// is_error_code_enum - -template struct is_error_code_enum : public false_type {}; - -// is_error_condition_enum - -template struct is_error_condition_enum : public false_type {}; - -// Some error codes are not present on all platforms, so we provide equivalents -// for them: - -//enum class errc -struct errc { -enum _ { - success = 0, - address_family_not_supported = EAFNOSUPPORT, - address_in_use = EADDRINUSE, - address_not_available = EADDRNOTAVAIL, - already_connected = EISCONN, - argument_list_too_long = E2BIG, - argument_out_of_domain = EDOM, - bad_address = EFAULT, - bad_file_descriptor = EBADF, -#ifdef EBADMSG - bad_message = EBADMSG, -#else - bad_message = EINVAL, -#endif - broken_pipe = EPIPE, - connection_aborted = ECONNABORTED, - connection_already_in_progress = EALREADY, - connection_refused = ECONNREFUSED, - connection_reset = ECONNRESET, - cross_device_link = EXDEV, - destination_address_required = EDESTADDRREQ, - device_or_resource_busy = EBUSY, - directory_not_empty = ENOTEMPTY, - executable_format_error = ENOEXEC, - file_exists = EEXIST, - file_too_large = EFBIG, - filename_too_long = ENAMETOOLONG, - function_not_supported = ENOSYS, - host_unreachable = EHOSTUNREACH, - identifier_removed = EIDRM, - illegal_byte_sequence = EILSEQ, - inappropriate_io_control_operation = ENOTTY, - interrupted = EINTR, - invalid_argument = EINVAL, - invalid_seek = ESPIPE, - io_error = EIO, - is_a_directory = EISDIR, - message_size = EMSGSIZE, - network_down = ENETDOWN, - network_reset = ENETRESET, - network_unreachable = ENETUNREACH, - no_buffer_space = ENOBUFS, - no_child_process = ECHILD, -#ifdef ENOLINK - no_link = ENOLINK, -#else - no_link = EINVAL, -#endif - no_lock_available = ENOLCK, -#ifdef ENODATA - no_message_available = ENODATA, -#else - no_message_available = ENOMSG, -#endif - no_message = ENOMSG, - no_protocol_option = ENOPROTOOPT, - no_space_on_device = ENOSPC, -#ifdef ENOSR - no_stream_resources = ENOSR, -#else - no_stream_resources = ENOMEM, -#endif - no_such_device_or_address = ENXIO, - no_such_device = ENODEV, - no_such_file_or_directory = ENOENT, - no_such_process = ESRCH, - not_a_directory = ENOTDIR, - not_a_socket = ENOTSOCK, -#ifdef ENOSTR - not_a_stream = ENOSTR, -#else - not_a_stream = EINVAL, -#endif - not_connected = ENOTCONN, - not_enough_memory = ENOMEM, - not_supported = ENOTSUP, -#ifdef ECANCELED - operation_canceled = ECANCELED, -#else - operation_canceled = EINVAL, -#endif - operation_in_progress = EINPROGRESS, - operation_not_permitted = EPERM, - operation_not_supported = EOPNOTSUPP, - operation_would_block = EWOULDBLOCK, -#ifdef EOWNERDEAD - owner_dead = EOWNERDEAD, -#else - owner_dead = EINVAL, -#endif - permission_denied = EACCES, -#ifdef EPROTO - protocol_error = EPROTO, -#else - protocol_error = EINVAL, -#endif - protocol_not_supported = EPROTONOSUPPORT, - read_only_file_system = EROFS, - resource_deadlock_would_occur = EDEADLK, - resource_unavailable_try_again = EAGAIN, - result_out_of_range = ERANGE, -#ifdef ENOTRECOVERABLE - state_not_recoverable = ENOTRECOVERABLE, -#else - state_not_recoverable = EINVAL, -#endif -#ifdef ETIME - stream_timeout = ETIME, -#else - stream_timeout = ETIMEDOUT, -#endif - text_file_busy = ETXTBSY, - timed_out = ETIMEDOUT, - too_many_files_open_in_system = ENFILE, - too_many_files_open = EMFILE, - too_many_links = EMLINK, - too_many_symbolic_link_levels = ELOOP, - value_too_large = EOVERFLOW, - wrong_protocol_type = EPROTOTYPE -}; - - _ v_; - - errc(_ v) : v_(v) {} - operator int() const {return v_;} -}; - -template <> struct is_error_condition_enum : true_type { }; - -template <> struct is_error_condition_enum : true_type { }; - -class error_condition; -class error_code; - -// class error_category - -class _do_message; - -class error_category -{ -public: - virtual ~error_category(); - -private: - error_category(); - error_category(const error_category&);// = delete; - error_category& operator=(const error_category&);// = delete; - -public: - virtual const char* name() const = 0; - virtual error_condition default_error_condition(int _ev) const; - virtual bool equivalent(int _code, const error_condition& _condition) const; - virtual bool equivalent(const error_code& _code, int _condition) const; - virtual std::string message(int _ev) const = 0; - - bool operator==(const error_category& _rhs) const {return this == &_rhs;} - - bool operator!=(const error_category& _rhs) const {return !(*this == _rhs);} - - bool operator< (const error_category& _rhs) const {return this < &_rhs;} - - friend class _do_message; -}; - -class _do_message : public error_category -{ -public: - virtual std::string message(int ev) const; -}; - -const error_category& generic_category(); -const error_category& system_category(); - -class error_condition -{ - int _val_; - const error_category* _cat_; -public: - error_condition() : _val_(0), _cat_(&generic_category()) {} - - error_condition(int _val, const error_category& _cat) - : _val_(_val), _cat_(&_cat) {} - - template - error_condition(E _e, typename enable_if_c< - is_error_condition_enum::value - >::type* = 0) - {*this = make_error_condition(_e);} - - void assign(int _val, const error_category& _cat) { - _val_ = _val; - _cat_ = &_cat; - } - - template - typename enable_if_c - < - is_error_condition_enum::value, - error_condition& - >::type - operator=(E _e) - {*this = make_error_condition(_e); return *this;} - - void clear() { - _val_ = 0; - _cat_ = &generic_category(); - } - - int value() const {return _val_;} - - const error_category& category() const {return *_cat_;} - std::string message() const; - - // explicit - operator bool() const {return _val_ != 0;} -}; - -inline error_condition make_error_condition(errc _e) { - return error_condition(static_cast(_e), generic_category()); -} - -inline bool operator<(const error_condition& _x, const error_condition& _y) { - return _x.category() < _y.category() - || (_x.category() == _y.category() && _x.value() < _y.value()); -} - -// error_code - -class error_code { - int _val_; - const error_category* _cat_; -public: - error_code() : _val_(0), _cat_(&system_category()) {} - - error_code(int _val, const error_category& _cat) - : _val_(_val), _cat_(&_cat) {} - - template - error_code(E _e, typename enable_if_c< - is_error_code_enum::value - >::type* = 0) { - *this = make_error_code(_e); - } - - void assign(int _val, const error_category& _cat) { - _val_ = _val; - _cat_ = &_cat; - } - - template - typename enable_if_c - < - is_error_code_enum::value, - error_code& - >::type - operator=(E _e) - {*this = make_error_code(_e); return *this;} - - void clear() { - _val_ = 0; - _cat_ = &system_category(); - } - - int value() const {return _val_;} - - const error_category& category() const {return *_cat_;} - - error_condition default_error_condition() const - {return _cat_->default_error_condition(_val_);} - - std::string message() const; - - // explicit - operator bool() const {return _val_ != 0;} -}; - -inline error_code make_error_code(errc _e) { - return error_code(static_cast(_e), generic_category()); -} - -inline bool operator<(const error_code& _x, const error_code& _y) { - return _x.category() < _y.category() - || (_x.category() == _y.category() && _x.value() < _y.value()); -} - -inline bool operator==(const error_code& _x, const error_code& _y) { - return _x.category() == _y.category() && _x.value() == _y.value(); -} - -inline bool operator==(const error_code& _x, const error_condition& _y) { - return _x.category().equivalent(_x.value(), _y) - || _y.category().equivalent(_x, _y.value()); -} - -inline bool operator==(const error_condition& _x, const error_code& _y) { - return _y == _x; -} - -inline bool operator==(const error_condition& _x, const error_condition& _y) { - return _x.category() == _y.category() && _x.value() == _y.value(); -} - -inline bool operator!=(const error_code& _x, const error_code& _y) { - return !(_x == _y); -} - -inline bool operator!=(const error_code& _x, const error_condition& _y) { - return !(_x == _y); -} - -inline bool operator!=(const error_condition& _x, const error_code& _y) { - return !(_x == _y); -} - -inline bool operator!=(const error_condition& _x, const error_condition& _y) { - return !(_x == _y); -} - -// system_error - -} // end namespace llvm - -// This needs to stay here for KillTheDoctor. -#ifdef LLVM_ON_WIN32 -// FIXME: These two headers really really really need to be removed from here. -// Not only is it a violation of System, they define the stupid min and -// max macros :(. -#include -#include - -namespace llvm { - -// To construct an error_code after an API error: -// -// error_code( ::GetLastError(), system_category() ) -struct windows_error { -enum _ { - success = 0, - // These names and values are based on Windows winerror.h - // This is not a complete list. - invalid_function = ERROR_INVALID_FUNCTION, - file_not_found = ERROR_FILE_NOT_FOUND, - path_not_found = ERROR_PATH_NOT_FOUND, - too_many_open_files = ERROR_TOO_MANY_OPEN_FILES, - access_denied = ERROR_ACCESS_DENIED, - invalid_handle = ERROR_INVALID_HANDLE, - arena_trashed = ERROR_ARENA_TRASHED, - not_enough_memory = ERROR_NOT_ENOUGH_MEMORY, - invalid_block = ERROR_INVALID_BLOCK, - bad_environment = ERROR_BAD_ENVIRONMENT, - bad_format = ERROR_BAD_FORMAT, - invalid_access = ERROR_INVALID_ACCESS, - outofmemory = ERROR_OUTOFMEMORY, - invalid_drive = ERROR_INVALID_DRIVE, - current_directory = ERROR_CURRENT_DIRECTORY, - not_same_device = ERROR_NOT_SAME_DEVICE, - no_more_files = ERROR_NO_MORE_FILES, - write_protect = ERROR_WRITE_PROTECT, - bad_unit = ERROR_BAD_UNIT, - not_ready = ERROR_NOT_READY, - bad_command = ERROR_BAD_COMMAND, - crc = ERROR_CRC, - bad_length = ERROR_BAD_LENGTH, - seek = ERROR_SEEK, - not_dos_disk = ERROR_NOT_DOS_DISK, - sector_not_found = ERROR_SECTOR_NOT_FOUND, - out_of_paper = ERROR_OUT_OF_PAPER, - write_fault = ERROR_WRITE_FAULT, - read_fault = ERROR_READ_FAULT, - gen_failure = ERROR_GEN_FAILURE, - sharing_violation = ERROR_SHARING_VIOLATION, - lock_violation = ERROR_LOCK_VIOLATION, - wrong_disk = ERROR_WRONG_DISK, - sharing_buffer_exceeded = ERROR_SHARING_BUFFER_EXCEEDED, - handle_eof = ERROR_HANDLE_EOF, - handle_disk_full = ERROR_HANDLE_DISK_FULL, - rem_not_list = ERROR_REM_NOT_LIST, - dup_name = ERROR_DUP_NAME, - bad_net_path = ERROR_BAD_NETPATH, - network_busy = ERROR_NETWORK_BUSY, - file_exists = ERROR_FILE_EXISTS, - cannot_make = ERROR_CANNOT_MAKE, - broken_pipe = ERROR_BROKEN_PIPE, - open_failed = ERROR_OPEN_FAILED, - buffer_overflow = ERROR_BUFFER_OVERFLOW, - disk_full = ERROR_DISK_FULL, - lock_failed = ERROR_LOCK_FAILED, - busy = ERROR_BUSY, - cancel_violation = ERROR_CANCEL_VIOLATION, - already_exists = ERROR_ALREADY_EXISTS -}; - _ v_; - - windows_error(_ v) : v_(v) {} - explicit windows_error(DWORD v) : v_(_(v)) {} - operator int() const {return v_;} -}; - - -template <> struct is_error_code_enum : true_type { }; - -template <> struct is_error_code_enum : true_type { }; - -inline error_code make_error_code(windows_error e) { - return error_code(static_cast(e), system_category()); -} - -} // end namespace llvm - -#endif // LLVM_ON_WINDOWS - -#endif Modified: llvm/trunk/include/llvm/Target/SubtargetFeature.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/SubtargetFeature.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/SubtargetFeature.h (original) +++ llvm/trunk/include/llvm/Target/SubtargetFeature.h Mon Nov 29 12:16:10 2010 @@ -22,7 +22,7 @@ #include #include #include "llvm/ADT/Triple.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class raw_ostream; Modified: llvm/trunk/include/llvm/Target/TargetAsmBackend.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetAsmBackend.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetAsmBackend.h (original) +++ llvm/trunk/include/llvm/Target/TargetAsmBackend.h Mon Nov 29 12:16:10 2010 @@ -10,7 +10,7 @@ #ifndef LLVM_TARGET_TARGETASMBACKEND_H #define LLVM_TARGET_TARGETASMBACKEND_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class MCDataFragment; Modified: llvm/trunk/include/llvm/Target/TargetData.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetData.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetData.h (original) +++ llvm/trunk/include/llvm/Target/TargetData.h Mon Nov 29 12:16:10 2010 @@ -22,7 +22,7 @@ #include "llvm/Pass.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/Target/TargetInstrDesc.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetInstrDesc.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetInstrDesc.h (original) +++ llvm/trunk/include/llvm/Target/TargetInstrDesc.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #ifndef LLVM_TARGET_TARGETINSTRDESC_H #define LLVM_TARGET_TARGETINSTRDESC_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/include/llvm/Target/TargetJITInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetJITInfo.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetJITInfo.h (original) +++ llvm/trunk/include/llvm/Target/TargetJITInfo.h Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #include #include "llvm/Support/ErrorHandling.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class Function; Modified: llvm/trunk/include/llvm/TypeSymbolTable.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TypeSymbolTable.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/TypeSymbolTable.h (original) +++ llvm/trunk/include/llvm/TypeSymbolTable.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/Type.h" #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include namespace llvm { Modified: llvm/trunk/include/llvm/ValueSymbolTable.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ValueSymbolTable.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/include/llvm/ValueSymbolTable.h (original) +++ llvm/trunk/include/llvm/ValueSymbolTable.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/Value.h" #include "llvm/ADT/StringMap.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { template Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original) +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Mon Nov 29 12:16:10 2010 @@ -30,7 +30,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/FEnv.h" +#include "llvm/Support/FEnv.h" #include #include using namespace llvm; Modified: llvm/trunk/lib/Archive/Archive.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/Archive.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Archive/Archive.cpp (original) +++ llvm/trunk/lib/Archive/Archive.cpp Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Module.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/Process.h" +#include "llvm/Support/Process.h" #include #include using namespace llvm; Modified: llvm/trunk/lib/Archive/ArchiveInternals.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveInternals.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveInternals.h (original) +++ llvm/trunk/lib/Archive/ArchiveInternals.h Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #define LIB_ARCHIVE_ARCHIVEINTERNALS_H #include "llvm/Bitcode/Archive.h" -#include "llvm/System/TimeValue.h" +#include "llvm/Support/TimeValue.h" #include "llvm/ADT/StringExtras.h" #include Modified: llvm/trunk/lib/Archive/ArchiveWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Archive/ArchiveWriter.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Archive/ArchiveWriter.cpp (original) +++ llvm/trunk/lib/Archive/ArchiveWriter.cpp Mon Nov 29 12:16:10 2010 @@ -16,8 +16,8 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/Process.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Signals.h" #include #include #include Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original) +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Mon Nov 29 12:16:10 2010 @@ -26,7 +26,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Program.h" using namespace llvm; /// These are manifest constants used by the bitcode writer. They do not need to Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original) +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Nov 29 12:16:10 2010 @@ -39,7 +39,7 @@ #include "llvm/Support/ValueHandle.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Timer.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" using namespace llvm; static cl::opt PrintDbgScope("print-dbgscope", cl::Hidden, Modified: llvm/trunk/lib/CodeGen/ELF.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ELF.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/ELF.h (original) +++ llvm/trunk/lib/CodeGen/ELF.h Mon Nov 29 12:16:10 2010 @@ -23,7 +23,7 @@ #include "llvm/CodeGen/BinaryObject.h" #include "llvm/CodeGen/MachineRelocation.h" #include "llvm/Support/ELF.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { class GlobalValue; Modified: llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp (original) +++ llvm/trunk/lib/CodeGen/PseudoSourceValue.cpp Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include using namespace llvm; Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SDNodeDbgValue.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Support/DebugLoc.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Nov 29 12:16:10 2010 @@ -44,7 +44,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallSet.h" Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Mon Nov 29 12:16:10 2010 @@ -26,8 +26,8 @@ #include "llvm/Support/MutexGuard.h" #include "llvm/Support/ValueHandle.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/DynamicLibrary.h" -#include "llvm/System/Host.h" +#include "llvm/Support/DynamicLibrary.h" +#include "llvm/Support/Host.h" #include "llvm/Target/TargetData.h" #include #include Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp Mon Nov 29 12:16:10 2010 @@ -24,10 +24,10 @@ #include "llvm/Module.h" #include "llvm/Config/config.h" // Detect libffi #include "llvm/Support/ErrorHandling.h" -#include "llvm/System/DynamicLibrary.h" +#include "llvm/Support/DynamicLibrary.h" #include "llvm/Target/TargetData.h" #include "llvm/Support/ManagedStatic.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include #include #include Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h (original) +++ llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/Target/TargetData.h" #include "llvm/Support/CallSite.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/raw_ostream.h" Modified: llvm/trunk/lib/ExecutionEngine/JIT/Intercept.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/Intercept.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/Intercept.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/Intercept.cpp Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #include "JIT.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/System/DynamicLibrary.h" +#include "llvm/Support/DynamicLibrary.h" #include "llvm/Config/config.h" using namespace llvm; Modified: llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/JIT.cpp Mon Nov 29 12:16:10 2010 @@ -30,7 +30,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MutexGuard.h" -#include "llvm/System/DynamicLibrary.h" +#include "llvm/Support/DynamicLibrary.h" #include "llvm/Config/config.h" using namespace llvm; Modified: llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.cpp Mon Nov 29 12:16:10 2010 @@ -25,7 +25,7 @@ #include "llvm/Support/Compiler.h" #include "llvm/Support/MutexGuard.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include #include Modified: llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.h (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/JITDebugRegisterer.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #define LLVM_EXECUTION_ENGINE_JIT_DEBUGREGISTERER_H #include "llvm/ADT/DenseMap.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include // This must be kept in sync with gdb/gdb/jit.h . Modified: llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/JITEmitter.cpp Mon Nov 29 12:16:10 2010 @@ -42,8 +42,8 @@ #include "llvm/Support/MutexGuard.h" #include "llvm/Support/ValueHandle.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Disassembler.h" -#include "llvm/System/Memory.h" +#include "llvm/Support/Disassembler.h" +#include "llvm/Support/Memory.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" Modified: llvm/trunk/lib/ExecutionEngine/JIT/JITMemoryManager.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/JITMemoryManager.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/JITMemoryManager.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/JITMemoryManager.cpp Mon Nov 29 12:16:10 2010 @@ -22,7 +22,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Memory.h" +#include "llvm/Support/Memory.h" #include #include #include Modified: llvm/trunk/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/OProfileJITEventListener.cpp Mon Nov 29 12:16:10 2010 @@ -26,7 +26,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ValueHandle.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Errno.h" +#include "llvm/Support/Errno.h" #include "llvm/Config/config.h" #include using namespace llvm; Modified: llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/ADT/Triple.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetRegistry.h" Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/MCJIT.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/System/DynamicLibrary.h" +#include "llvm/Support/DynamicLibrary.h" using namespace llvm; Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/TargetSelect.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/TargetSelect.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/ExecutionEngine/MCJIT/TargetSelect.cpp (original) +++ llvm/trunk/lib/ExecutionEngine/MCJIT/TargetSelect.cpp Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/ADT/Triple.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetRegistry.h" Modified: llvm/trunk/lib/Linker/LinkItems.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkItems.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Linker/LinkItems.cpp (original) +++ llvm/trunk/lib/Linker/LinkItems.cpp Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #include "llvm/Linker.h" #include "llvm/Module.h" #include "llvm/Bitcode/ReaderWriter.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MemoryBuffer.h" using namespace llvm; Modified: llvm/trunk/lib/Linker/LinkModules.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Linker/LinkModules.cpp (original) +++ llvm/trunk/lib/Linker/LinkModules.cpp Mon Nov 29 12:16:10 2010 @@ -28,7 +28,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include "llvm/Transforms/Utils/ValueMapper.h" #include "llvm/ADT/DenseMap.h" using namespace llvm; Modified: llvm/trunk/lib/Linker/Linker.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/Linker.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Linker/Linker.cpp (original) +++ llvm/trunk/lib/Linker/Linker.cpp Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #include "llvm/Linker.h" #include "llvm/Module.h" #include "llvm/Bitcode/ReaderWriter.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Config/config.h" Modified: llvm/trunk/lib/MC/MCAsmInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCAsmInfo.cpp (original) +++ llvm/trunk/lib/MC/MCAsmInfo.cpp Mon Nov 29 12:16:10 2010 @@ -13,7 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/MCAsmInfo.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include using namespace llvm; Modified: llvm/trunk/lib/MC/MCDisassembler/EDDisassembler.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDisassembler/EDDisassembler.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCDisassembler/EDDisassembler.h (original) +++ llvm/trunk/lib/MC/MCDisassembler/EDDisassembler.h Mon Nov 29 12:16:10 2010 @@ -21,7 +21,7 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/Triple.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include #include Modified: llvm/trunk/lib/MC/MCDisassembler/EDInst.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDisassembler/EDInst.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCDisassembler/EDInst.h (original) +++ llvm/trunk/lib/MC/MCDisassembler/EDInst.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #ifndef LLVM_EDINST_H #define LLVM_EDINST_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/ADT/SmallVector.h" #include #include Modified: llvm/trunk/lib/MC/MCDisassembler/EDOperand.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDisassembler/EDOperand.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCDisassembler/EDOperand.h (original) +++ llvm/trunk/lib/MC/MCDisassembler/EDOperand.h Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #ifndef LLVM_EDOPERAND_H #define LLVM_EDOPERAND_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/lib/MC/MCDisassembler/EDToken.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDisassembler/EDToken.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/MC/MCDisassembler/EDToken.h (original) +++ llvm/trunk/lib/MC/MCDisassembler/EDToken.h Mon Nov 29 12:16:10 2010 @@ -17,7 +17,7 @@ #define LLVM_EDTOKEN_H #include "llvm/ADT/StringRef.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original) +++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Mon Nov 29 12:16:10 2010 @@ -31,7 +31,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/System/TimeValue.h" +#include "llvm/Support/TimeValue.h" #include "../Target/X86/X86FixupKinds.h" Modified: llvm/trunk/lib/Object/MachOObject.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObject.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Object/MachOObject.cpp (original) +++ llvm/trunk/lib/Object/MachOObject.cpp Mon Nov 29 12:16:10 2010 @@ -10,8 +10,8 @@ #include "llvm/Object/MachOObject.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/Host.h" -#include "llvm/System/SwapByteOrder.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/SwapByteOrder.h" using namespace llvm; using namespace llvm::object; Modified: llvm/trunk/lib/Object/ObjectFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ObjectFile.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Object/ObjectFile.cpp (original) +++ llvm/trunk/lib/Object/ObjectFile.cpp Mon Nov 29 12:16:10 2010 @@ -14,7 +14,7 @@ #include "llvm/Object/ObjectFile.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" using namespace llvm; using namespace object; Copied: llvm/trunk/lib/Support/Alarm.cpp (from r120288, llvm/trunk/lib/System/Alarm.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Alarm.cpp?p2=llvm/trunk/lib/Support/Alarm.cpp&p1=llvm/trunk/lib/System/Alarm.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Alarm.cpp (original) +++ llvm/trunk/lib/Support/Alarm.cpp Mon Nov 29 12:16:10 2010 @@ -7,11 +7,11 @@ // //===----------------------------------------------------------------------===// // -// This file implements the Alarm functionality +// This file implements the Alarm functionality // //===----------------------------------------------------------------------===// -#include "llvm/System/Alarm.h" +#include "llvm/Support/Alarm.h" #include "llvm/Config/config.h" namespace llvm { @@ -29,5 +29,5 @@ #include "Unix/Alarm.inc" #endif #ifdef LLVM_ON_WIN32 -#include "Win32/Alarm.inc" +#include "Windows/Alarm.inc" #endif Modified: llvm/trunk/lib/Support/Allocator.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Allocator.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/Allocator.cpp (original) +++ llvm/trunk/lib/Support/Allocator.cpp Mon Nov 29 12:16:10 2010 @@ -12,10 +12,10 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/Allocator.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/Recycler.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Memory.h" +#include "llvm/Support/Memory.h" #include namespace llvm { Copied: llvm/trunk/lib/Support/Atomic.cpp (from r120288, llvm/trunk/lib/System/Atomic.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Atomic.cpp?p2=llvm/trunk/lib/Support/Atomic.cpp&p1=llvm/trunk/lib/System/Atomic.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Atomic.cpp (original) +++ llvm/trunk/lib/Support/Atomic.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Atomic.h" +#include "llvm/Support/Atomic.h" #include "llvm/Config/config.h" using namespace llvm; Modified: llvm/trunk/lib/Support/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/CMakeLists.txt (original) +++ llvm/trunk/lib/Support/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -1,5 +1,8 @@ ## FIXME: This only requires RTTI because tblgen uses it. Fix that. set(LLVM_REQUIRES_RTTI 1) +if( MINGW ) + set(LLVM_REQUIRES_EH 1) +endif() add_llvm_library(LLVMSupport APFloat.cpp @@ -49,4 +52,51 @@ regexec.c regfree.c regstrlcpy.c + +# System + Alarm.cpp + Atomic.cpp + Disassembler.cpp + DynamicLibrary.cpp + Errno.cpp + Host.cpp + IncludeFile.cpp + Memory.cpp + Mutex.cpp + Path.cpp + Process.cpp + Program.cpp + RWMutex.cpp + SearchForAddressOfSpecialSymbol.cpp + Signals.cpp + system_error.cpp + ThreadLocal.cpp + Threading.cpp + TimeValue.cpp + Valgrind.cpp + Unix/Alarm.inc + Unix/Host.inc + Unix/Memory.inc + Unix/Mutex.inc + Unix/Path.inc + Unix/Process.inc + Unix/Program.inc + Unix/RWMutex.inc + Unix/Signals.inc + Unix/system_error.inc + Unix/ThreadLocal.inc + Unix/TimeValue.inc + Windows/Alarm.inc + Windows/DynamicLibrary.inc + Windows/Host.inc + Windows/Memory.inc + Windows/Mutex.inc + Windows/Path.inc + Windows/Process.inc + Windows/Program.inc + Windows/RWMutex.inc + Windows/Signals.inc + Windows/system_error.inc + Windows/ThreadLocal.inc + Windows/TimeValue.inc ) Modified: llvm/trunk/lib/Support/CommandLine.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/CommandLine.cpp (original) +++ llvm/trunk/lib/Support/CommandLine.cpp Mon Nov 29 12:16:10 2010 @@ -23,8 +23,8 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetRegistry.h" -#include "llvm/System/Host.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/Path.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallString.h" Modified: llvm/trunk/lib/Support/CrashRecoveryContext.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CrashRecoveryContext.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/CrashRecoveryContext.cpp (original) +++ llvm/trunk/lib/Support/CrashRecoveryContext.cpp Mon Nov 29 12:16:10 2010 @@ -10,8 +10,8 @@ #include "llvm/Support/CrashRecoveryContext.h" #include "llvm/ADT/SmallString.h" #include "llvm/Config/config.h" -#include "llvm/System/Mutex.h" -#include "llvm/System/ThreadLocal.h" +#include "llvm/Support/Mutex.h" +#include "llvm/Support/ThreadLocal.h" #include #include using namespace llvm; Modified: llvm/trunk/lib/Support/Debug.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Debug.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/Debug.cpp (original) +++ llvm/trunk/lib/Support/Debug.cpp Mon Nov 29 12:16:10 2010 @@ -26,7 +26,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/circular_raw_ostream.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" using namespace llvm; Copied: llvm/trunk/lib/Support/Disassembler.cpp (from r120288, llvm/trunk/lib/System/Disassembler.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Disassembler.cpp?p2=llvm/trunk/lib/Support/Disassembler.cpp&p1=llvm/trunk/lib/System/Disassembler.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Disassembler.cpp (original) +++ llvm/trunk/lib/Support/Disassembler.cpp Mon Nov 29 12:16:10 2010 @@ -13,7 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" -#include "llvm/System/Disassembler.h" +#include "llvm/Support/Disassembler.h" #include #include Copied: llvm/trunk/lib/Support/DynamicLibrary.cpp (from r120288, llvm/trunk/lib/System/DynamicLibrary.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/DynamicLibrary.cpp?p2=llvm/trunk/lib/Support/DynamicLibrary.cpp&p1=llvm/trunk/lib/System/DynamicLibrary.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/DynamicLibrary.cpp (original) +++ llvm/trunk/lib/Support/DynamicLibrary.cpp Mon Nov 29 12:16:10 2010 @@ -14,8 +14,8 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/DynamicLibrary.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/DynamicLibrary.h" +#include "llvm/Support/Mutex.h" #include "llvm/Config/config.h" #include #include @@ -47,7 +47,7 @@ #ifdef LLVM_ON_WIN32 -#include "Win32/DynamicLibrary.inc" +#include "Windows/DynamicLibrary.inc" #else @@ -117,7 +117,7 @@ std::map::iterator I = ExplicitSymbols->find(symbolName); std::map::iterator E = ExplicitSymbols->end(); - + if (I != E) return I->second; } @@ -146,7 +146,7 @@ if (!strcmp(symbolName, #SYM)) return &SYM // On linux we have a weird situation. The stderr/out/in symbols are both -// macros and global variables because of standards requirements. So, we +// macros and global variables because of standards requirements. So, we // boldly use the EXPLICIT_SYMBOL macro without checking for a #define first. #if defined(__linux__) { Copied: llvm/trunk/lib/Support/Errno.cpp (from r120288, llvm/trunk/lib/System/Errno.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Errno.cpp?p2=llvm/trunk/lib/Support/Errno.cpp&p1=llvm/trunk/lib/System/Errno.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Errno.cpp (original) +++ llvm/trunk/lib/Support/Errno.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Errno.h" +#include "llvm/Support/Errno.h" #include "llvm/Config/config.h" // Get autoconf configuration settings #if HAVE_STRING_H Modified: llvm/trunk/lib/Support/ErrorHandling.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ErrorHandling.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/ErrorHandling.cpp (original) +++ llvm/trunk/lib/Support/ErrorHandling.cpp Mon Nov 29 12:16:10 2010 @@ -16,8 +16,8 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Signals.h" -#include "llvm/System/Threading.h" +#include "llvm/Support/Signals.h" +#include "llvm/Support/Threading.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Config/config.h" #include Modified: llvm/trunk/lib/Support/FileUtilities.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FileUtilities.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/FileUtilities.cpp (original) +++ llvm/trunk/lib/Support/FileUtilities.cpp Mon Nov 29 12:16:10 2010 @@ -15,7 +15,7 @@ #include "llvm/Support/FileUtilities.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallString.h" #include Modified: llvm/trunk/lib/Support/FoldingSet.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/FoldingSet.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/FoldingSet.cpp (original) +++ llvm/trunk/lib/Support/FoldingSet.cpp Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/Support/Allocator.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include #include using namespace llvm; Modified: llvm/trunk/lib/Support/GraphWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/GraphWriter.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/GraphWriter.cpp (original) +++ llvm/trunk/lib/Support/GraphWriter.cpp Mon Nov 29 12:16:10 2010 @@ -12,8 +12,8 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/GraphWriter.h" -#include "llvm/System/Path.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" #include "llvm/Config/config.h" using namespace llvm; Copied: llvm/trunk/lib/Support/Host.cpp (from r120288, llvm/trunk/lib/System/Host.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?p2=llvm/trunk/lib/Support/Host.cpp&p1=llvm/trunk/lib/System/Host.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Host.cpp (original) +++ llvm/trunk/lib/Support/Host.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include "llvm/Config/config.h" #include @@ -20,7 +20,7 @@ #include "Unix/Host.inc" #endif #ifdef LLVM_ON_WIN32 -#include "Win32/Host.inc" +#include "Windows/Host.inc" #endif #ifdef _MSC_VER #include Copied: llvm/trunk/lib/Support/IncludeFile.cpp (from r120288, llvm/trunk/lib/System/IncludeFile.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/IncludeFile.cpp?p2=llvm/trunk/lib/Support/IncludeFile.cpp&p1=llvm/trunk/lib/System/IncludeFile.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/IncludeFile.cpp (original) +++ llvm/trunk/lib/Support/IncludeFile.cpp Mon Nov 29 12:16:10 2010 @@ -11,10 +11,10 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/IncludeFile.h" +#include "llvm/Support/IncludeFile.h" using namespace llvm; // This constructor is used to ensure linking of other modules. See the -// llvm/System/IncludeFile.h header for details. +// llvm/System/IncludeFile.h header for details. IncludeFile::IncludeFile(const void*) {} Modified: llvm/trunk/lib/Support/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/Makefile (original) +++ llvm/trunk/lib/Support/Makefile Mon Nov 29 12:16:10 2010 @@ -14,4 +14,9 @@ ## FIXME: This only requires RTTI because tblgen uses it. Fix that. REQUIRES_RTTI = 1 +EXTRA_DIST = Unix Win32 README.txt + include $(LEVEL)/Makefile.common + +CompileCommonOpts := $(filter-out -pedantic,$(CompileCommonOpts)) +CompileCommonOpts := $(filter-out -Wno-long-long,$(CompileCommonOpts)) Modified: llvm/trunk/lib/Support/ManagedStatic.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ManagedStatic.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/ManagedStatic.cpp (original) +++ llvm/trunk/lib/Support/ManagedStatic.cpp Mon Nov 29 12:16:10 2010 @@ -13,7 +13,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Config/config.h" -#include "llvm/System/Atomic.h" +#include "llvm/Support/Atomic.h" #include using namespace llvm; Copied: llvm/trunk/lib/Support/Memory.cpp (from r120288, llvm/trunk/lib/System/Memory.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Memory.cpp?p2=llvm/trunk/lib/Support/Memory.cpp&p1=llvm/trunk/lib/System/Memory.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Memory.cpp (original) +++ llvm/trunk/lib/Support/Memory.cpp Mon Nov 29 12:16:10 2010 @@ -12,8 +12,8 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Memory.h" -#include "llvm/System/Valgrind.h" +#include "llvm/Support/Memory.h" +#include "llvm/Support/Valgrind.h" #include "llvm/Config/config.h" namespace llvm { @@ -25,7 +25,7 @@ #include "Unix/Memory.inc" #endif #ifdef LLVM_ON_WIN32 -#include "Win32/Memory.inc" +#include "Windows/Memory.inc" #endif extern "C" void sys_icache_invalidate(const void *Addr, size_t len); @@ -35,7 +35,7 @@ /// platforms. void llvm::sys::Memory::InvalidateInstructionCache(const void *Addr, size_t Len) { - + // icache invalidation for PPC and ARM. #if defined(__APPLE__) Modified: llvm/trunk/lib/Support/MemoryBuffer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/MemoryBuffer.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/MemoryBuffer.cpp (original) +++ llvm/trunk/lib/Support/MemoryBuffer.cpp Mon Nov 29 12:16:10 2010 @@ -15,10 +15,10 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/Errno.h" -#include "llvm/System/Path.h" -#include "llvm/System/Process.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Errno.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Program.h" #include #include #include @@ -203,14 +203,14 @@ if (ErrStr) *ErrStr = sys::StrError(); return 0; } - + return getOpenFile(FD, Filename, ErrStr, FileSize); } - + MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, std::string *ErrStr, int64_t FileSize) { FileCloser FC(FD); // Close FD on return. - + // If we don't know the file size, use fstat to find out. fstat on an open // file descriptor is cheaper than stat on a random path. if (FileSize == -1) { @@ -222,8 +222,8 @@ } FileSize = FileInfo.st_size; } - - + + // If the file is large, try to use mmap to read it in. We don't use mmap // for small files, because this can severely fragment our address space. Also // don't try to map files that are exactly a multiple of the system page size, Copied: llvm/trunk/lib/Support/Mutex.cpp (from r120288, llvm/trunk/lib/System/Mutex.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Mutex.cpp?p2=llvm/trunk/lib/Support/Mutex.cpp&p1=llvm/trunk/lib/System/Mutex.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Mutex.cpp (original) +++ llvm/trunk/lib/Support/Mutex.cpp Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system @@ -149,9 +149,8 @@ #elif defined(LLVM_ON_UNIX) #include "Unix/Mutex.inc" #elif defined( LLVM_ON_WIN32) -#include "Win32/Mutex.inc" +#include "Windows/Mutex.inc" #else #warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/Mutex.cpp #endif #endif - Copied: llvm/trunk/lib/Support/Path.cpp (from r120288, llvm/trunk/lib/System/Path.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Path.cpp?p2=llvm/trunk/lib/Support/Path.cpp&p1=llvm/trunk/lib/System/Path.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Path.cpp (original) +++ llvm/trunk/lib/Support/Path.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include "llvm/Config/config.h" #include #include @@ -292,6 +292,5 @@ #include "Unix/Path.inc" #endif #if defined(LLVM_ON_WIN32) -#include "Win32/Path.inc" +#include "Windows/Path.inc" #endif - Modified: llvm/trunk/lib/Support/PluginLoader.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PluginLoader.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/PluginLoader.cpp (original) +++ llvm/trunk/lib/Support/PluginLoader.cpp Mon Nov 29 12:16:10 2010 @@ -15,8 +15,8 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/DynamicLibrary.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/DynamicLibrary.h" +#include "llvm/Support/Mutex.h" #include using namespace llvm; Modified: llvm/trunk/lib/Support/PrettyStackTrace.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PrettyStackTrace.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/PrettyStackTrace.cpp (original) +++ llvm/trunk/lib/Support/PrettyStackTrace.cpp Mon Nov 29 12:16:10 2010 @@ -15,8 +15,8 @@ #include "llvm/Config/config.h" // Get autoconf configuration settings #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Signals.h" -#include "llvm/System/ThreadLocal.h" +#include "llvm/Support/Signals.h" +#include "llvm/Support/ThreadLocal.h" #include "llvm/ADT/SmallString.h" #ifdef HAVE_CRASHREPORTERCLIENT_H Copied: llvm/trunk/lib/Support/Process.cpp (from r120288, llvm/trunk/lib/System/Process.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Process.cpp?p2=llvm/trunk/lib/Support/Process.cpp&p1=llvm/trunk/lib/System/Process.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Process.cpp (original) +++ llvm/trunk/lib/Support/Process.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Process.h" +#include "llvm/Support/Process.h" #include "llvm/Config/config.h" namespace llvm { @@ -29,5 +29,5 @@ #include "Unix/Process.inc" #endif #ifdef LLVM_ON_WIN32 -#include "Win32/Process.inc" +#include "Windows/Process.inc" #endif Copied: llvm/trunk/lib/Support/Program.cpp (from r120288, llvm/trunk/lib/System/Program.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Program.cpp?p2=llvm/trunk/lib/Support/Program.cpp&p1=llvm/trunk/lib/System/Program.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Program.cpp (original) +++ llvm/trunk/lib/Support/Program.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Program.h" +#include "llvm/Support/Program.h" #include "llvm/Config/config.h" using namespace llvm; using namespace sys; @@ -52,5 +52,5 @@ #include "Unix/Program.inc" #endif #ifdef LLVM_ON_WIN32 -#include "Win32/Program.inc" +#include "Windows/Program.inc" #endif Copied: llvm/trunk/lib/Support/README.txt.system (from r120288, llvm/trunk/lib/System/README.txt) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/README.txt.system?p2=llvm/trunk/lib/Support/README.txt.system&p1=llvm/trunk/lib/System/README.txt&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/README.txt (original) +++ llvm/trunk/lib/Support/README.txt.system Mon Nov 29 12:16:10 2010 @@ -9,15 +9,15 @@ The software located here, of necessity, has very specific and stringent design rules. Violation of these rules means that cracks in the shield could form and the primary goal of the library is defeated. By consistently using this library, -LLVM becomes more easily ported to new platforms since the only thing requiring +LLVM becomes more easily ported to new platforms since the only thing requiring porting is this library. Complete documentation for the library can be found in the file: - llvm/docs/SystemLibrary.html + llvm/docs/SystemLibrary.html or at this URL: http://llvm.org/docs/SystemLibrary.html -While we recommend that you read the more detailed documentation, for the +While we recommend that you read the more detailed documentation, for the impatient, here's a high level summary of the library's requirements. 1. No system header files are to be exposed through the interface. @@ -31,13 +31,13 @@ 9. No duplicate function impementations are permitted within an operating system class. -To accomplish these requirements, the library has numerous design criteria that +To accomplish these requirements, the library has numerous design criteria that must be satisfied. Here's a high level summary of the library's design criteria: 1. No unused functionality (only what LLVM needs) 2. High-Level Interfaces 3. Use Opaque Classes - 4. Common Implementations - 5. Multiple Implementations - 6. Minimize Memory Allocation + 4. Common Implementations + 5. Multiple Implementations + 6. Minimize Memory Allocation 7. No Virtual Methods Copied: llvm/trunk/lib/Support/RWMutex.cpp (from r120288, llvm/trunk/lib/System/RWMutex.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/RWMutex.cpp?p2=llvm/trunk/lib/Support/RWMutex.cpp&p1=llvm/trunk/lib/System/RWMutex.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/RWMutex.cpp (original) +++ llvm/trunk/lib/Support/RWMutex.cpp Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" -#include "llvm/System/RWMutex.h" +#include "llvm/Support/RWMutex.h" #include //===----------------------------------------------------------------------===// @@ -150,7 +150,7 @@ #elif defined(LLVM_ON_UNIX) #include "Unix/RWMutex.inc" #elif defined( LLVM_ON_WIN32) -#include "Win32/RWMutex.inc" +#include "Windows/RWMutex.inc" #else #warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/Mutex.cpp #endif Copied: llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp (from r120288, llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp?p2=llvm/trunk/lib/Support/SearchForAddressOfSpecialSymbol.cpp&p1=llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Signals.cpp (from r120288, llvm/trunk/lib/System/Signals.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Signals.cpp?p2=llvm/trunk/lib/Support/Signals.cpp&p1=llvm/trunk/lib/System/Signals.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Signals.cpp (original) +++ llvm/trunk/lib/Support/Signals.cpp Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include "llvm/Config/config.h" namespace llvm { @@ -30,5 +30,5 @@ #include "Unix/Signals.inc" #endif #ifdef LLVM_ON_WIN32 -#include "Win32/Signals.inc" +#include "Windows/Signals.inc" #endif Modified: llvm/trunk/lib/Support/Statistic.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Statistic.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/Statistic.cpp (original) +++ llvm/trunk/lib/Support/Statistic.cpp Mon Nov 29 12:16:10 2010 @@ -26,7 +26,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include "llvm/ADT/StringExtras.h" #include #include Modified: llvm/trunk/lib/Support/SystemUtils.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/SystemUtils.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/SystemUtils.cpp (original) +++ llvm/trunk/lib/Support/SystemUtils.cpp Mon Nov 29 12:16:10 2010 @@ -13,8 +13,8 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/SystemUtils.h" -#include "llvm/System/Process.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; Modified: llvm/trunk/lib/Support/TargetRegistry.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/TargetRegistry.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/TargetRegistry.cpp (original) +++ llvm/trunk/lib/Support/TargetRegistry.cpp Mon Nov 29 12:16:10 2010 @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Target/TargetRegistry.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include using namespace llvm; Copied: llvm/trunk/lib/Support/ThreadLocal.cpp (from r120288, llvm/trunk/lib/System/ThreadLocal.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ThreadLocal.cpp?p2=llvm/trunk/lib/Support/ThreadLocal.cpp&p1=llvm/trunk/lib/System/ThreadLocal.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/ThreadLocal.cpp (original) +++ llvm/trunk/lib/Support/ThreadLocal.cpp Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" -#include "llvm/System/ThreadLocal.h" +#include "llvm/Support/ThreadLocal.h" //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system @@ -77,9 +77,8 @@ #elif defined(LLVM_ON_UNIX) #include "Unix/ThreadLocal.inc" #elif defined( LLVM_ON_WIN32) -#include "Win32/ThreadLocal.inc" +#include "Windows/ThreadLocal.inc" #else #warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/ThreadLocal.cpp #endif #endif - Copied: llvm/trunk/lib/Support/Threading.cpp (from r120288, llvm/trunk/lib/System/Threading.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?p2=llvm/trunk/lib/Support/Threading.cpp&p1=llvm/trunk/lib/System/Threading.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Threading.cpp (original) +++ llvm/trunk/lib/Support/Threading.cpp Mon Nov 29 12:16:10 2010 @@ -11,9 +11,9 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Threading.h" -#include "llvm/System/Atomic.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Threading.h" +#include "llvm/Support/Atomic.h" +#include "llvm/Support/Mutex.h" #include "llvm/Config/config.h" #include @@ -28,7 +28,7 @@ assert(!multithreaded_mode && "Already multithreaded!"); multithreaded_mode = true; global_lock = new sys::Mutex(true); - + // We fence here to ensure that all initialization is complete BEFORE we // return from llvm_start_multithreaded(). sys::MemoryFence(); @@ -41,11 +41,11 @@ void llvm::llvm_stop_multithreaded() { #ifdef LLVM_MULTITHREADED assert(multithreaded_mode && "Not currently multithreaded!"); - + // We fence here to insure that all threaded operations are complete BEFORE we // return from llvm_stop_multithreaded(). sys::MemoryFence(); - + multithreaded_mode = false; delete global_lock; #endif @@ -98,7 +98,7 @@ // Wait for the thread and clean up. ::pthread_join(Thread, 0); - + error: ::pthread_attr_destroy(&Attr); } Copied: llvm/trunk/lib/Support/TimeValue.cpp (from r120288, llvm/trunk/lib/System/TimeValue.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/TimeValue.cpp?p2=llvm/trunk/lib/Support/TimeValue.cpp&p1=llvm/trunk/lib/System/TimeValue.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/TimeValue.cpp (original) +++ llvm/trunk/lib/Support/TimeValue.cpp Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/TimeValue.h" +#include "llvm/Support/TimeValue.h" #include "llvm/Config/config.h" namespace llvm { @@ -53,6 +53,5 @@ #include "Unix/TimeValue.inc" #endif #ifdef LLVM_ON_WIN32 -#include "Win32/TimeValue.inc" +#include "Windows/TimeValue.inc" #endif - Modified: llvm/trunk/lib/Support/Timer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Timer.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/Timer.cpp (original) +++ llvm/trunk/lib/Support/Timer.cpp Mon Nov 29 12:16:10 2010 @@ -17,8 +17,8 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Format.h" -#include "llvm/System/Mutex.h" -#include "llvm/System/Process.h" +#include "llvm/Support/Mutex.h" +#include "llvm/Support/Process.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/StringMap.h" using namespace llvm; Modified: llvm/trunk/lib/Support/ToolOutputFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ToolOutputFile.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/ToolOutputFile.cpp (original) +++ llvm/trunk/lib/Support/ToolOutputFile.cpp Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" using namespace llvm; tool_output_file::CleanupInstaller::CleanupInstaller(const char *filename) Copied: llvm/trunk/lib/Support/Unix/Alarm.inc (from r120288, llvm/trunk/lib/System/Unix/Alarm.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Alarm.inc?p2=llvm/trunk/lib/Support/Unix/Alarm.inc&p1=llvm/trunk/lib/System/Unix/Alarm.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Unix/Host.inc (from r120288, llvm/trunk/lib/System/Unix/Host.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Host.inc?p2=llvm/trunk/lib/Support/Unix/Host.inc&p1=llvm/trunk/lib/System/Unix/Host.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Host.inc (original) +++ llvm/trunk/lib/Support/Unix/Host.inc Mon Nov 29 12:16:10 2010 @@ -39,7 +39,7 @@ StringRef HostTripleString(LLVM_HOSTTRIPLE); std::pair ArchSplit = HostTripleString.split('-'); - + // Normalize the arch, since the host triple may not actually match the host. std::string Arch = ArchSplit.first; @@ -77,16 +77,16 @@ Triple += ArchSplit.second; // Force i86 to i386. - if (Triple[0] == 'i' && isdigit(Triple[1]) && + if (Triple[0] == 'i' && isdigit(Triple[1]) && Triple[2] == '8' && Triple[3] == '6') Triple[1] = '3'; // On darwin, we want to update the version to match that of the - // host. + // host. std::string::size_type DarwinDashIdx = Triple.find("-darwin"); if (DarwinDashIdx != std::string::npos) { Triple.resize(DarwinDashIdx + strlen("-darwin")); - + // Only add the major part of the os version. std::string Version = getOSVersion(); Triple += Version.substr(0, Version.find('.')); Copied: llvm/trunk/lib/Support/Unix/Memory.inc (from r120288, llvm/trunk/lib/System/Unix/Memory.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Memory.inc?p2=llvm/trunk/lib/Support/Unix/Memory.inc&p1=llvm/trunk/lib/System/Unix/Memory.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Memory.inc (original) +++ llvm/trunk/lib/Support/Unix/Memory.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //===- Unix/Memory.cpp - Generic UNIX System Configuration ------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines some functions for various memory management utilities. @@ -12,8 +12,8 @@ //===----------------------------------------------------------------------===// #include "Unix.h" -#include "llvm/System/DataTypes.h" -#include "llvm/System/Process.h" +#include "llvm/Support/DataTypes.h" +#include "llvm/Support/Process.h" #ifdef HAVE_SYS_MMAN_H #include @@ -28,7 +28,7 @@ /// to emit code to the memory then jump to it. Getting this type of memory /// is very OS specific. /// -llvm::sys::MemoryBlock +llvm::sys::MemoryBlock llvm::sys::Memory::AllocateRWX(size_t NumBytes, const MemoryBlock* NearBlock, std::string *ErrMsg) { if (NumBytes == 0) return MemoryBlock(); @@ -54,7 +54,7 @@ #endif ; - void* start = NearBlock ? (unsigned char*)NearBlock->base() + + void* start = NearBlock ? (unsigned char*)NearBlock->base() + NearBlock->size() : 0; #if defined(__APPLE__) && defined(__arm__) Copied: llvm/trunk/lib/Support/Unix/Mutex.inc (from r120288, llvm/trunk/lib/System/Unix/Mutex.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Mutex.inc?p2=llvm/trunk/lib/Support/Unix/Mutex.inc&p1=llvm/trunk/lib/System/Unix/Mutex.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Mutex.inc (original) +++ llvm/trunk/lib/Support/Unix/Mutex.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //===- llvm/System/Unix/Mutex.inc - Unix Mutex Implementation ---*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the Unix specific (non-pthread) Mutex class. @@ -28,13 +28,13 @@ { } -bool +bool MutexImpl::release() { return true; } -bool +bool MutexImpl::tryacquire( void ) { return true; Copied: llvm/trunk/lib/Support/Unix/Path.inc (from r120288, llvm/trunk/lib/System/Unix/Path.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Path.inc?p2=llvm/trunk/lib/Support/Unix/Path.inc&p1=llvm/trunk/lib/System/Unix/Path.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Unix/Process.inc (from r120288, llvm/trunk/lib/System/Unix/Process.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Process.inc?p2=llvm/trunk/lib/Support/Unix/Process.inc&p1=llvm/trunk/lib/System/Unix/Process.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Process.inc (original) +++ llvm/trunk/lib/Support/Unix/Process.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //===- Unix/Process.cpp - Unix Process Implementation --------- -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides the generic Unix implementation of the Process class. @@ -41,8 +41,8 @@ using namespace llvm; using namespace sys; -unsigned -Process::GetPageSize() +unsigned +Process::GetPageSize() { #if defined(__CYGWIN__) // On Cygwin, getpagesize() returns 64k but the page size for the purposes of @@ -104,20 +104,20 @@ } void -Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time, +Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time, TimeValue& sys_time) { elapsed = TimeValue::now(); #if defined(HAVE_GETRUSAGE) struct rusage usage; ::getrusage(RUSAGE_SELF, &usage); - user_time = TimeValue( - static_cast( usage.ru_utime.tv_sec ), - static_cast( usage.ru_utime.tv_usec * + user_time = TimeValue( + static_cast( usage.ru_utime.tv_sec ), + static_cast( usage.ru_utime.tv_usec * TimeValue::NANOSECONDS_PER_MICROSECOND ) ); - sys_time = TimeValue( - static_cast( usage.ru_stime.tv_sec ), - static_cast( usage.ru_stime.tv_usec * + sys_time = TimeValue( + static_cast( usage.ru_stime.tv_sec ), + static_cast( usage.ru_stime.tv_usec * TimeValue::NANOSECONDS_PER_MICROSECOND ) ); #else #warning Cannot get usage times on this platform @@ -159,14 +159,14 @@ exception_port_t OriginalPorts[EXC_TYPES_COUNT]; exception_behavior_t OriginalBehaviors[EXC_TYPES_COUNT]; thread_state_flavor_t OriginalFlavors[EXC_TYPES_COUNT]; - kern_return_t err = + kern_return_t err = task_get_exception_ports(mach_task_self(), EXC_MASK_ALL, OriginalMasks, &Count, OriginalPorts, OriginalBehaviors, OriginalFlavors); if (err == KERN_SUCCESS) { // replace each with MACH_PORT_NULL. for (unsigned i = 0; i != Count; ++i) - task_set_exception_ports(mach_task_self(), OriginalMasks[i], + task_set_exception_ports(mach_task_self(), OriginalMasks[i], MACH_PORT_NULL, OriginalBehaviors[i], OriginalFlavors[i]); } Copied: llvm/trunk/lib/Support/Unix/Program.inc (from r120288, llvm/trunk/lib/System/Unix/Program.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Program.inc?p2=llvm/trunk/lib/Support/Unix/Program.inc&p1=llvm/trunk/lib/System/Unix/Program.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Unix/README.txt (from r120288, llvm/trunk/lib/System/Unix/README.txt) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/README.txt?p2=llvm/trunk/lib/Support/Unix/README.txt&p1=llvm/trunk/lib/System/Unix/README.txt&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/README.txt (original) +++ llvm/trunk/lib/Support/Unix/README.txt Mon Nov 29 12:16:10 2010 @@ -1,13 +1,13 @@ -llvm/lib/System/Unix README +llvm/lib/Support/Unix README =========================== This directory provides implementations of the lib/System classes that -are common to two or more variants of UNIX. For example, the directory +are common to two or more variants of UNIX. For example, the directory structure underneath this directory could look like this: Unix - only code that is truly generic to all UNIX platforms Posix - code that is specific to Posix variants of UNIX - SUS - code that is specific to the Single Unix Specification + SUS - code that is specific to the Single Unix Specification SysV - code that is specific to System V variants of UNIX As a rule, only those directories actually needing to be created should be Copied: llvm/trunk/lib/Support/Unix/RWMutex.inc (from r120288, llvm/trunk/lib/System/Unix/RWMutex.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/RWMutex.inc?p2=llvm/trunk/lib/Support/Unix/RWMutex.inc&p1=llvm/trunk/lib/System/Unix/RWMutex.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/RWMutex.inc (original) +++ llvm/trunk/lib/Support/Unix/RWMutex.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //= llvm/System/Unix/RWMutex.inc - Unix Reader/Writer Mutual Exclusion Lock =// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the Unix specific (non-pthread) RWMutex class. Copied: llvm/trunk/lib/Support/Unix/Signals.inc (from r120288, llvm/trunk/lib/System/Unix/Signals.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Signals.inc?p2=llvm/trunk/lib/Support/Unix/Signals.inc&p1=llvm/trunk/lib/System/Unix/Signals.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/Signals.inc (original) +++ llvm/trunk/lib/Support/Unix/Signals.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //===- Signals.cpp - Generic Unix Signals Implementation -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file defines some helpful functions for dealing with the possibility of @@ -14,7 +14,7 @@ #include "Unix.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include #include #if HAVE_EXECINFO_H @@ -28,7 +28,7 @@ #endif #if HAVE_DLFCN_H && __GNUG__ #include -#include +#include #endif using namespace llvm; @@ -82,11 +82,11 @@ "Out of space for signal handlers!"); struct sigaction NewHandler; - + NewHandler.sa_handler = SignalHandler; NewHandler.sa_flags = SA_NODEFER|SA_RESETHAND; - sigemptyset(&NewHandler.sa_mask); - + sigemptyset(&NewHandler.sa_mask); + // Install the new handler, save the old one in RegisteredSignalInfo. sigaction(Signal, &NewHandler, &RegisteredSignalInfo[NumRegisteredSignals].SA); @@ -144,7 +144,7 @@ IF(); // run the interrupt function. return; } - + SignalsMutex.release(); raise(Sig); // Execute the default handler. return; @@ -205,7 +205,7 @@ // trace so that the user has an indication of why and where we died. // // On glibc systems we have the 'backtrace' function, which works nicely, but -// doesn't demangle symbols. +// doesn't demangle symbols. static void PrintStackTrace(void *) { #ifdef HAVE_BACKTRACE static void* StackTrace[256]; Copied: llvm/trunk/lib/Support/Unix/ThreadLocal.inc (from r120288, llvm/trunk/lib/System/Unix/ThreadLocal.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/ThreadLocal.inc?p2=llvm/trunk/lib/Support/Unix/ThreadLocal.inc&p1=llvm/trunk/lib/System/Unix/ThreadLocal.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/ThreadLocal.inc (original) +++ llvm/trunk/lib/Support/Unix/ThreadLocal.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //=== llvm/System/Unix/ThreadLocal.inc - Unix Thread Local Data -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the Unix specific (non-pthread) ThreadLocal class. Copied: llvm/trunk/lib/Support/Unix/TimeValue.inc (from r120288, llvm/trunk/lib/System/Unix/TimeValue.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/TimeValue.inc?p2=llvm/trunk/lib/Support/Unix/TimeValue.inc&p1=llvm/trunk/lib/System/Unix/TimeValue.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Unix/TimeValue.inc (original) +++ llvm/trunk/lib/Support/Unix/TimeValue.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //===- Unix/TimeValue.cpp - Unix TimeValue Implementation -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the Unix specific portion of the TimeValue class. @@ -26,7 +26,7 @@ time_t ourTime = time_t(this->toEpochTime()); #ifdef __hpux -// note that the following line needs -D_REENTRANT on HP-UX to be picked up +// note that the following line needs -D_REENTRANT on HP-UX to be picked up asctime_r(localtime(&ourTime), buffer); #else ::asctime_r(::localtime(&ourTime), buffer); @@ -43,13 +43,13 @@ // This is *really* unlikely to occur because the only gettimeofday // errors concern the timezone parameter which we're passing in as 0. // In the unlikely case it does happen, just return MinTime, no error - // message needed. + // message needed. return MinTime; } return TimeValue( - static_cast( the_time.tv_sec + PosixZeroTime.seconds_ ), - static_cast( the_time.tv_usec * + static_cast( the_time.tv_sec + PosixZeroTime.seconds_ ), + static_cast( the_time.tv_usec * NANOSECONDS_PER_MICROSECOND ) ); } Copied: llvm/trunk/lib/Support/Unix/Unix.h (from r120288, llvm/trunk/lib/System/Unix/Unix.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Unix.h?p2=llvm/trunk/lib/Support/Unix/Unix.h&p1=llvm/trunk/lib/System/Unix/Unix.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Unix/system_error.inc (from r120288, llvm/trunk/lib/System/Unix/system_error.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/system_error.inc?p2=llvm/trunk/lib/Support/Unix/system_error.inc&p1=llvm/trunk/lib/System/Unix/system_error.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Valgrind.cpp (from r120288, llvm/trunk/lib/System/Valgrind.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Valgrind.cpp?p2=llvm/trunk/lib/Support/Valgrind.cpp&p1=llvm/trunk/lib/System/Valgrind.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Valgrind.cpp (original) +++ llvm/trunk/lib/Support/Valgrind.cpp Mon Nov 29 12:16:10 2010 @@ -13,7 +13,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Valgrind.h" +#include "llvm/Support/Valgrind.h" #include "llvm/Config/config.h" #if HAVE_VALGRIND_VALGRIND_H Copied: llvm/trunk/lib/Support/Windows/Alarm.inc (from r120288, llvm/trunk/lib/System/Win32/Alarm.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Alarm.inc?p2=llvm/trunk/lib/Support/Windows/Alarm.inc&p1=llvm/trunk/lib/System/Win32/Alarm.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Windows/DynamicLibrary.inc (from r120288, llvm/trunk/lib/System/Win32/DynamicLibrary.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/DynamicLibrary.inc?p2=llvm/trunk/lib/Support/Windows/DynamicLibrary.inc&p1=llvm/trunk/lib/System/Win32/DynamicLibrary.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/DynamicLibrary.inc (original) +++ llvm/trunk/lib/Support/Windows/DynamicLibrary.inc Mon Nov 29 12:16:10 2010 @@ -1,17 +1,17 @@ //===- Win32/DynamicLibrary.cpp - Win32 DL Implementation -------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides the Win32 specific implementation of DynamicLibrary. // //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" #ifdef __MINGW32__ #include @@ -35,7 +35,7 @@ using namespace sys; //===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code +//=== WARNING: Implementation here must contain only Win32 specific code //=== and must not be UNIX code. //===----------------------------------------------------------------------===// @@ -50,7 +50,7 @@ extern "C" { // Use old callback if: // - Not using Visual Studio -// - Visual Studio 2005 or earlier but only if we are not using the Windows SDK +// - Visual Studio 2005 or earlier but only if we are not using the Windows SDK // or Windows SDK version is older than 6.0 // Use new callback if: // - Newer Visual Studio (comes with newer SDK). @@ -89,7 +89,7 @@ } bool DynamicLibrary::LoadLibraryPermanently(const char *filename, - std::string *ErrMsg) { + std::string *ErrMsg) { if (filename) { HMODULE a_handle = LoadLibrary(filename); @@ -143,7 +143,7 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { // First check symbols added via AddSymbol(). if (ExplicitSymbols) { - std::map::iterator I = + std::map::iterator I = ExplicitSymbols->find(symbolName); std::map::iterator E = ExplicitSymbols->end(); if (I != E) @@ -197,4 +197,3 @@ } } - Copied: llvm/trunk/lib/Support/Windows/Host.inc (from r120288, llvm/trunk/lib/System/Win32/Host.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Host.inc?p2=llvm/trunk/lib/Support/Windows/Host.inc&p1=llvm/trunk/lib/System/Win32/Host.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Host.inc (original) +++ llvm/trunk/lib/Support/Windows/Host.inc Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" #include #include Copied: llvm/trunk/lib/Support/Windows/Memory.inc (from r120288, llvm/trunk/lib/System/Win32/Memory.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Memory.inc?p2=llvm/trunk/lib/Support/Windows/Memory.inc&p1=llvm/trunk/lib/System/Win32/Memory.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Memory.inc (original) +++ llvm/trunk/lib/Support/Windows/Memory.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //===- Win32/Memory.cpp - Win32 Memory Implementation -----------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides the Win32 specific implementation of various Memory @@ -12,15 +12,15 @@ // //===----------------------------------------------------------------------===// -#include "Win32.h" -#include "llvm/System/DataTypes.h" -#include "llvm/System/Process.h" +#include "Windows.h" +#include "llvm/Support/DataTypes.h" +#include "llvm/Support/Process.h" namespace llvm { using namespace sys; //===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code +//=== WARNING: Implementation here must contain only Win32 specific code //=== and must not be UNIX code //===----------------------------------------------------------------------===// Copied: llvm/trunk/lib/Support/Windows/Mutex.inc (from r120288, llvm/trunk/lib/System/Win32/Mutex.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Mutex.inc?p2=llvm/trunk/lib/Support/Windows/Mutex.inc&p1=llvm/trunk/lib/System/Win32/Mutex.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Mutex.inc (original) +++ llvm/trunk/lib/Support/Windows/Mutex.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //===- llvm/System/Win32/Mutex.inc - Win32 Mutex Implementation -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the Win32 specific (non-pthread) Mutex class. @@ -16,8 +16,8 @@ //=== is guaranteed to work on *all* Win32 variants. //===----------------------------------------------------------------------===// -#include "Win32.h" -#include "llvm/System/Mutex.h" +#include "Windows.h" +#include "llvm/Support/Mutex.h" namespace llvm { using namespace sys; @@ -35,21 +35,21 @@ data_ = 0; } -bool +bool MutexImpl::acquire() { EnterCriticalSection((LPCRITICAL_SECTION)data_); return true; } -bool +bool MutexImpl::release() { LeaveCriticalSection((LPCRITICAL_SECTION)data_); return true; } -bool +bool MutexImpl::tryacquire() { return TryEnterCriticalSection((LPCRITICAL_SECTION)data_); Copied: llvm/trunk/lib/Support/Windows/Path.inc (from r120288, llvm/trunk/lib/System/Win32/Path.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Path.inc?p2=llvm/trunk/lib/Support/Windows/Path.inc&p1=llvm/trunk/lib/System/Win32/Path.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Path.inc (original) +++ llvm/trunk/lib/Support/Windows/Path.inc Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ //=== is guaranteed to work on *all* Win32 variants. //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" #include #include Copied: llvm/trunk/lib/Support/Windows/Process.inc (from r120288, llvm/trunk/lib/System/Win32/Process.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Process.inc?p2=llvm/trunk/lib/Support/Windows/Process.inc&p1=llvm/trunk/lib/System/Win32/Process.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Process.inc (original) +++ llvm/trunk/lib/Support/Windows/Process.inc Mon Nov 29 12:16:10 2010 @@ -1,17 +1,17 @@ //===- Win32/Process.cpp - Win32 Process Implementation ------- -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides the Win32 specific implementation of the Process class. // //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" #include #include #include @@ -25,7 +25,7 @@ #endif //===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code +//=== WARNING: Implementation here must contain only Win32 specific code //=== and must not be UNIX code //===----------------------------------------------------------------------===// @@ -51,13 +51,13 @@ return static_cast(info.dwPageSize); } -unsigned +unsigned Process::GetPageSize() { static const unsigned PageSize = GetPageSizeOnce(); return PageSize; } -size_t +size_t Process::GetMallocUsage() { _HEAPINFO hinfo; @@ -86,7 +86,7 @@ elapsed = TimeValue::now(); uint64_t ProcCreate, ProcExit, KernelTime, UserTime; - GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate, + GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate, (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, (FILETIME*)&UserTime); Copied: llvm/trunk/lib/Support/Windows/Program.inc (from r120288, llvm/trunk/lib/System/Win32/Program.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Program.inc?p2=llvm/trunk/lib/Support/Windows/Program.inc&p1=llvm/trunk/lib/System/Win32/Program.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Program.inc (original) +++ llvm/trunk/lib/Support/Windows/Program.inc Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" #include #include #include Copied: llvm/trunk/lib/Support/Windows/RWMutex.inc (from r120288, llvm/trunk/lib/System/Win32/RWMutex.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/RWMutex.inc?p2=llvm/trunk/lib/Support/Windows/RWMutex.inc&p1=llvm/trunk/lib/System/Win32/RWMutex.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/RWMutex.inc (original) +++ llvm/trunk/lib/Support/Windows/RWMutex.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //= llvm/System/Win32/Mutex.inc - Win32 Reader/Writer Mutual Exclusion Lock =// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the Win32 specific (non-pthread) RWMutex class. @@ -16,10 +16,10 @@ //=== is guaranteed to work on *all* Win32 variants. //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" // FIXME: Windows does not have reader-writer locks pre-Vista. If you want -// real reader-writer locks, you a pthreads implementation for Windows. +// real reader-writer locks, you a threads implementation for Windows. namespace llvm { using namespace sys; Copied: llvm/trunk/lib/Support/Windows/Signals.inc (from r120288, llvm/trunk/lib/System/Win32/Signals.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Signals.inc?p2=llvm/trunk/lib/Support/Windows/Signals.inc&p1=llvm/trunk/lib/System/Win32/Signals.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/Signals.inc (original) +++ llvm/trunk/lib/Support/Windows/Signals.inc Mon Nov 29 12:16:10 2010 @@ -11,7 +11,7 @@ // //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" #include #include #include @@ -323,4 +323,3 @@ LeaveCriticalSection(&CriticalSection); return FALSE; } - Copied: llvm/trunk/lib/Support/Windows/ThreadLocal.inc (from r120288, llvm/trunk/lib/System/Win32/ThreadLocal.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/ThreadLocal.inc?p2=llvm/trunk/lib/Support/Windows/ThreadLocal.inc&p1=llvm/trunk/lib/System/Win32/ThreadLocal.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/ThreadLocal.inc (original) +++ llvm/trunk/lib/Support/Windows/ThreadLocal.inc Mon Nov 29 12:16:10 2010 @@ -1,10 +1,10 @@ //= llvm/System/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file implements the Win32 specific (non-pthread) ThreadLocal class. @@ -16,8 +16,8 @@ //=== is guaranteed to work on *all* Win32 variants. //===----------------------------------------------------------------------===// -#include "Win32.h" -#include "llvm/System/ThreadLocal.h" +#include "Windows.h" +#include "llvm/Support/ThreadLocal.h" namespace llvm { using namespace sys; Copied: llvm/trunk/lib/Support/Windows/TimeValue.inc (from r120288, llvm/trunk/lib/System/Win32/TimeValue.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/TimeValue.inc?p2=llvm/trunk/lib/Support/Windows/TimeValue.inc&p1=llvm/trunk/lib/System/Win32/TimeValue.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/Win32/TimeValue.inc (original) +++ llvm/trunk/lib/Support/Windows/TimeValue.inc Mon Nov 29 12:16:10 2010 @@ -1,17 +1,17 @@ //===- Win32/TimeValue.cpp - Win32 TimeValue Implementation -----*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file provides the Win32 implementation of the TimeValue class. // //===----------------------------------------------------------------------===// -#include "Win32.h" +#include "Windows.h" #include namespace llvm { Copied: llvm/trunk/lib/Support/Windows/Windows.h (from r120288, llvm/trunk/lib/System/Win32/Win32.h) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Windows.h?p2=llvm/trunk/lib/Support/Windows/Windows.h&p1=llvm/trunk/lib/System/Win32/Win32.h&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Copied: llvm/trunk/lib/Support/Windows/system_error.inc (from r120288, llvm/trunk/lib/System/Win32/system_error.inc) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/system_error.inc?p2=llvm/trunk/lib/Support/Windows/system_error.inc&p1=llvm/trunk/lib/System/Win32/system_error.inc&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== (empty) Modified: llvm/trunk/lib/Support/raw_ostream.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Support/raw_ostream.cpp (original) +++ llvm/trunk/lib/Support/raw_ostream.cpp Mon Nov 29 12:16:10 2010 @@ -13,8 +13,8 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Format.h" -#include "llvm/System/Program.h" -#include "llvm/System/Process.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/Process.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Config/config.h" Copied: llvm/trunk/lib/Support/system_error.cpp (from r120288, llvm/trunk/lib/System/system_error.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/system_error.cpp?p2=llvm/trunk/lib/Support/system_error.cpp&p1=llvm/trunk/lib/System/system_error.cpp&r1=120288&r2=120298&rev=120298&view=diff ============================================================================== --- llvm/trunk/lib/System/system_error.cpp (original) +++ llvm/trunk/lib/Support/system_error.cpp Mon Nov 29 12:16:10 2010 @@ -11,8 +11,8 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/system_error.h" -#include "llvm/System/Errno.h" +#include "llvm/Support/system_error.h" +#include "llvm/Support/Errno.h" #include #include @@ -117,5 +117,5 @@ #include "Unix/system_error.inc" #endif #if defined(LLVM_ON_WIN32) -#include "Win32/system_error.inc" +#include "Windows/system_error.inc" #endif Removed: llvm/trunk/lib/System/Alarm.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Alarm.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Alarm.cpp (original) +++ llvm/trunk/lib/System/Alarm.cpp (removed) @@ -1,33 +0,0 @@ -//===- Alarm.cpp - Alarm Generation Support ---------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Alarm functionality -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Alarm.h" -#include "llvm/Config/config.h" - -namespace llvm { -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -} - -// Include the platform-specific parts of this class. -#ifdef LLVM_ON_UNIX -#include "Unix/Alarm.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/Alarm.inc" -#endif Removed: llvm/trunk/lib/System/Atomic.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Atomic.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Atomic.cpp (original) +++ llvm/trunk/lib/System/Atomic.cpp (removed) @@ -1,112 +0,0 @@ -//===-- Atomic.cpp - Atomic Operations --------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file implements atomic operations. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Atomic.h" -#include "llvm/Config/config.h" - -using namespace llvm; - -#if defined(_MSC_VER) -#include -#undef MemoryFence -#endif - -void sys::MemoryFence() { -#if LLVM_MULTITHREADED==0 - return; -#else -# if defined(__GNUC__) - __sync_synchronize(); -# elif defined(_MSC_VER) - MemoryBarrier(); -# else -# error No memory fence implementation for your platform! -# endif -#endif -} - -sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr, - sys::cas_flag new_value, - sys::cas_flag old_value) { -#if LLVM_MULTITHREADED==0 - sys::cas_flag result = *ptr; - if (result == old_value) - *ptr = new_value; - return result; -#elif defined(__GNUC__) - return __sync_val_compare_and_swap(ptr, old_value, new_value); -#elif defined(_MSC_VER) - return InterlockedCompareExchange(ptr, new_value, old_value); -#else -# error No compare-and-swap implementation for your platform! -#endif -} - -sys::cas_flag sys::AtomicIncrement(volatile sys::cas_flag* ptr) { -#if LLVM_MULTITHREADED==0 - ++(*ptr); - return *ptr; -#elif defined(__GNUC__) - return __sync_add_and_fetch(ptr, 1); -#elif defined(_MSC_VER) - return InterlockedIncrement(ptr); -#else -# error No atomic increment implementation for your platform! -#endif -} - -sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) { -#if LLVM_MULTITHREADED==0 - --(*ptr); - return *ptr; -#elif defined(__GNUC__) - return __sync_sub_and_fetch(ptr, 1); -#elif defined(_MSC_VER) - return InterlockedDecrement(ptr); -#else -# error No atomic decrement implementation for your platform! -#endif -} - -sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) { -#if LLVM_MULTITHREADED==0 - *ptr += val; - return *ptr; -#elif defined(__GNUC__) - return __sync_add_and_fetch(ptr, val); -#elif defined(_MSC_VER) - return InterlockedExchangeAdd(ptr, val) + val; -#else -# error No atomic add implementation for your platform! -#endif -} - -sys::cas_flag sys::AtomicMul(volatile sys::cas_flag* ptr, sys::cas_flag val) { - sys::cas_flag original, result; - do { - original = *ptr; - result = original * val; - } while (sys::CompareAndSwap(ptr, result, original) != original); - - return result; -} - -sys::cas_flag sys::AtomicDiv(volatile sys::cas_flag* ptr, sys::cas_flag val) { - sys::cas_flag original, result; - do { - original = *ptr; - result = original / val; - } while (sys::CompareAndSwap(ptr, result, original) != original); - - return result; -} Removed: llvm/trunk/lib/System/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/CMakeLists.txt?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/CMakeLists.txt (original) +++ llvm/trunk/lib/System/CMakeLists.txt (removed) @@ -1,52 +0,0 @@ -set(LLVM_REQUIRES_RTTI 1) -if( MINGW ) - set(LLVM_REQUIRES_EH 1) -endif() - -add_llvm_library(LLVMSystem - Alarm.cpp - Atomic.cpp - Disassembler.cpp - DynamicLibrary.cpp - Errno.cpp - Host.cpp - IncludeFile.cpp - Memory.cpp - Mutex.cpp - Path.cpp - Process.cpp - Program.cpp - RWMutex.cpp - SearchForAddressOfSpecialSymbol.cpp - Signals.cpp - system_error.cpp - ThreadLocal.cpp - Threading.cpp - TimeValue.cpp - Valgrind.cpp - Unix/Alarm.inc - Unix/Host.inc - Unix/Memory.inc - Unix/Mutex.inc - Unix/Path.inc - Unix/Process.inc - Unix/Program.inc - Unix/RWMutex.inc - Unix/Signals.inc - Unix/system_error.inc - Unix/ThreadLocal.inc - Unix/TimeValue.inc - Win32/Alarm.inc - Win32/DynamicLibrary.inc - Win32/Host.inc - Win32/Memory.inc - Win32/Mutex.inc - Win32/Path.inc - Win32/Process.inc - Win32/Program.inc - Win32/RWMutex.inc - Win32/Signals.inc - Win32/system_error.inc - Win32/ThreadLocal.inc - Win32/TimeValue.inc - ) Removed: llvm/trunk/lib/System/Disassembler.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Disassembler.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Disassembler.cpp (original) +++ llvm/trunk/lib/System/Disassembler.cpp (removed) @@ -1,75 +0,0 @@ -//===- lib/System/Disassembler.cpp ------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the necessary glue to call external disassembler -// libraries. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" -#include "llvm/System/Disassembler.h" - -#include -#include -#include -#include - -#if USE_UDIS86 -#include -#endif - -using namespace llvm; - -bool llvm::sys::hasDisassembler() -{ -#if defined (__i386__) || defined (__amd64__) || defined (__x86_64__) - // We have option to enable udis86 library. -# if USE_UDIS86 - return true; -#else - return false; -#endif -#else - return false; -#endif -} - -std::string llvm::sys::disassembleBuffer(uint8_t* start, size_t length, - uint64_t pc) { - std::stringstream res; - -#if (defined (__i386__) || defined (__amd64__) || defined (__x86_64__)) \ - && USE_UDIS86 - unsigned bits; -# if defined(__i386__) - bits = 32; -# else - bits = 64; -# endif - - ud_t ud_obj; - - ud_init(&ud_obj); - ud_set_input_buffer(&ud_obj, start, length); - ud_set_mode(&ud_obj, bits); - ud_set_pc(&ud_obj, pc); - ud_set_syntax(&ud_obj, UD_SYN_ATT); - - res << std::setbase(16) - << std::setw(bits/4); - - while (ud_disassemble(&ud_obj)) { - res << ud_insn_off(&ud_obj) << ":\t" << ud_insn_asm(&ud_obj) << "\n"; - } -#else - res << "No disassembler available. See configure help for options.\n"; -#endif - - return res.str(); -} Removed: llvm/trunk/lib/System/DynamicLibrary.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/DynamicLibrary.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/DynamicLibrary.cpp (original) +++ llvm/trunk/lib/System/DynamicLibrary.cpp (removed) @@ -1,177 +0,0 @@ -//===-- DynamicLibrary.cpp - Runtime link/load libraries --------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file implements the operating system DynamicLibrary concept. -// -// FIXME: This file leaks the ExplicitSymbols and OpenedHandles vector, and is -// not thread safe! -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/DynamicLibrary.h" -#include "llvm/System/Mutex.h" -#include "llvm/Config/config.h" -#include -#include -#include -#include - -// Collection of symbol name/value pairs to be searched prior to any libraries. -static std::map *ExplicitSymbols = 0; - -namespace { - -struct ExplicitSymbolsDeleter { - ~ExplicitSymbolsDeleter() { - if (ExplicitSymbols) - delete ExplicitSymbols; - } -}; - -} - -static ExplicitSymbolsDeleter Dummy; - -void llvm::sys::DynamicLibrary::AddSymbol(const char* symbolName, - void *symbolValue) { - if (ExplicitSymbols == 0) - ExplicitSymbols = new std::map(); - (*ExplicitSymbols)[symbolName] = symbolValue; -} - -#ifdef LLVM_ON_WIN32 - -#include "Win32/DynamicLibrary.inc" - -#else - -#if HAVE_DLFCN_H -#include -using namespace llvm; -using namespace llvm::sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -static SmartMutex* HandlesMutex; -static std::vector *OpenedHandles = 0; - -static bool InitializeMutex() { - HandlesMutex = new SmartMutex; - return HandlesMutex != 0; -} - -static bool EnsureMutexInitialized() { - static bool result = InitializeMutex(); - return result; -} - - -bool DynamicLibrary::LoadLibraryPermanently(const char *Filename, - std::string *ErrMsg) { - void *H = dlopen(Filename, RTLD_LAZY|RTLD_GLOBAL); - if (H == 0) { - if (ErrMsg) *ErrMsg = dlerror(); - return true; - } -#ifdef __CYGWIN__ - // Cygwin searches symbols only in the main - // with the handle of dlopen(NULL, RTLD_GLOBAL). - if (Filename == NULL) - H = RTLD_DEFAULT; -#endif - EnsureMutexInitialized(); - SmartScopedLock Lock(*HandlesMutex); - if (OpenedHandles == 0) - OpenedHandles = new std::vector(); - OpenedHandles->push_back(H); - return false; -} -#else - -using namespace llvm; -using namespace llvm::sys; - -bool DynamicLibrary::LoadLibraryPermanently(const char *Filename, - std::string *ErrMsg) { - if (ErrMsg) *ErrMsg = "dlopen() not supported on this platform"; - return true; -} -#endif - -namespace llvm { -void *SearchForAddressOfSpecialSymbol(const char* symbolName); -} - -void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { - // First check symbols added via AddSymbol(). - if (ExplicitSymbols) { - std::map::iterator I = - ExplicitSymbols->find(symbolName); - std::map::iterator E = ExplicitSymbols->end(); - - if (I != E) - return I->second; - } - -#if HAVE_DLFCN_H - // Now search the libraries. - EnsureMutexInitialized(); - SmartScopedLock Lock(*HandlesMutex); - if (OpenedHandles) { - for (std::vector::iterator I = OpenedHandles->begin(), - E = OpenedHandles->end(); I != E; ++I) { - //lt_ptr ptr = lt_dlsym(*I, symbolName); - void *ptr = dlsym(*I, symbolName); - if (ptr) { - return ptr; - } - } - } -#endif - - if (void *Result = llvm::SearchForAddressOfSpecialSymbol(symbolName)) - return Result; - -// This macro returns the address of a well-known, explicit symbol -#define EXPLICIT_SYMBOL(SYM) \ - if (!strcmp(symbolName, #SYM)) return &SYM - -// On linux we have a weird situation. The stderr/out/in symbols are both -// macros and global variables because of standards requirements. So, we -// boldly use the EXPLICIT_SYMBOL macro without checking for a #define first. -#if defined(__linux__) - { - EXPLICIT_SYMBOL(stderr); - EXPLICIT_SYMBOL(stdout); - EXPLICIT_SYMBOL(stdin); - } -#else - // For everything else, we want to check to make sure the symbol isn't defined - // as a macro before using EXPLICIT_SYMBOL. - { -#ifndef stdin - EXPLICIT_SYMBOL(stdin); -#endif -#ifndef stdout - EXPLICIT_SYMBOL(stdout); -#endif -#ifndef stderr - EXPLICIT_SYMBOL(stderr); -#endif - } -#endif -#undef EXPLICIT_SYMBOL - - return 0; -} - -#endif // LLVM_ON_WIN32 Removed: llvm/trunk/lib/System/Errno.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Errno.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Errno.cpp (original) +++ llvm/trunk/lib/System/Errno.cpp (removed) @@ -1,74 +0,0 @@ -//===- Errno.cpp - errno support --------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the errno wrappers. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Errno.h" -#include "llvm/Config/config.h" // Get autoconf configuration settings - -#if HAVE_STRING_H -#include - -#if HAVE_ERRNO_H -#include -#endif - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -namespace llvm { -namespace sys { - -#if HAVE_ERRNO_H -std::string StrError() { - return StrError(errno); -} -#endif // HAVE_ERRNO_H - -std::string StrError(int errnum) { - const int MaxErrStrLen = 2000; - char buffer[MaxErrStrLen]; - buffer[0] = '\0'; - char* str = buffer; -#ifdef HAVE_STRERROR_R - // strerror_r is thread-safe. - if (errnum) -# if defined(__GLIBC__) && defined(_GNU_SOURCE) - // glibc defines its own incompatible version of strerror_r - // which may not use the buffer supplied. - str = strerror_r(errnum,buffer,MaxErrStrLen-1); -# else - strerror_r(errnum,buffer,MaxErrStrLen-1); -# endif -#elif defined(HAVE_STRERROR_S) // Windows. - if (errnum) - strerror_s(buffer, errnum); -#elif defined(HAVE_STRERROR) - // Copy the thread un-safe result of strerror into - // the buffer as fast as possible to minimize impact - // of collision of strerror in multiple threads. - if (errnum) - strncpy(buffer,strerror(errnum),MaxErrStrLen-1); - buffer[MaxErrStrLen-1] = '\0'; -#else - // Strange that this system doesn't even have strerror - // but, oh well, just use a generic message - sprintf(buffer, "Error #%d", errnum); -#endif - return str; -} - -} // namespace sys -} // namespace llvm - -#endif // HAVE_STRING_H Removed: llvm/trunk/lib/System/Host.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Host.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Host.cpp (original) +++ llvm/trunk/lib/System/Host.cpp (removed) @@ -1,307 +0,0 @@ -//===-- Host.cpp - Implement OS Host Concept --------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file implements the operating system Host concept. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Host.h" -#include "llvm/Config/config.h" -#include - -// Include the platform-specific parts of this class. -#ifdef LLVM_ON_UNIX -#include "Unix/Host.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/Host.inc" -#endif -#ifdef _MSC_VER -#include -#endif - -//===----------------------------------------------------------------------===// -// -// Implementations of the CPU detection routines -// -//===----------------------------------------------------------------------===// - -using namespace llvm; - -#if defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)\ - || defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64) - -/// GetX86CpuIDAndInfo - Execute the specified cpuid and return the 4 values in the -/// specified arguments. If we can't run cpuid on the host, return true. -static bool GetX86CpuIDAndInfo(unsigned value, unsigned *rEAX, - unsigned *rEBX, unsigned *rECX, unsigned *rEDX) { -#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64) - #if defined(__GNUC__) - // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually. - asm ("movq\t%%rbx, %%rsi\n\t" - "cpuid\n\t" - "xchgq\t%%rbx, %%rsi\n\t" - : "=a" (*rEAX), - "=S" (*rEBX), - "=c" (*rECX), - "=d" (*rEDX) - : "a" (value)); - return false; - #elif defined(_MSC_VER) - int registers[4]; - __cpuid(registers, value); - *rEAX = registers[0]; - *rEBX = registers[1]; - *rECX = registers[2]; - *rEDX = registers[3]; - return false; - #endif -#elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86) - #if defined(__GNUC__) - asm ("movl\t%%ebx, %%esi\n\t" - "cpuid\n\t" - "xchgl\t%%ebx, %%esi\n\t" - : "=a" (*rEAX), - "=S" (*rEBX), - "=c" (*rECX), - "=d" (*rEDX) - : "a" (value)); - return false; - #elif defined(_MSC_VER) - __asm { - mov eax,value - cpuid - mov esi,rEAX - mov dword ptr [esi],eax - mov esi,rEBX - mov dword ptr [esi],ebx - mov esi,rECX - mov dword ptr [esi],ecx - mov esi,rEDX - mov dword ptr [esi],edx - } - return false; - #endif -#endif - return true; -} - -static void DetectX86FamilyModel(unsigned EAX, unsigned &Family, - unsigned &Model) { - Family = (EAX >> 8) & 0xf; // Bits 8 - 11 - Model = (EAX >> 4) & 0xf; // Bits 4 - 7 - if (Family == 6 || Family == 0xf) { - if (Family == 0xf) - // Examine extended family ID if family ID is F. - Family += (EAX >> 20) & 0xff; // Bits 20 - 27 - // Examine extended model ID if family ID is 6 or F. - Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19 - } -} - -std::string sys::getHostCPUName() { - unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0; - if (GetX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX)) - return "generic"; - unsigned Family = 0; - unsigned Model = 0; - DetectX86FamilyModel(EAX, Family, Model); - - bool HasSSE3 = (ECX & 0x1); - GetX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX); - bool Em64T = (EDX >> 29) & 0x1; - - union { - unsigned u[3]; - char c[12]; - } text; - - GetX86CpuIDAndInfo(0, &EAX, text.u+0, text.u+2, text.u+1); - if (memcmp(text.c, "GenuineIntel", 12) == 0) { - switch (Family) { - case 3: - return "i386"; - case 4: - switch (Model) { - case 0: // Intel486 DX processors - case 1: // Intel486 DX processors - case 2: // Intel486 SX processors - case 3: // Intel487 processors, IntelDX2 OverDrive processors, - // IntelDX2 processors - case 4: // Intel486 SL processor - case 5: // IntelSX2 processors - case 7: // Write-Back Enhanced IntelDX2 processors - case 8: // IntelDX4 OverDrive processors, IntelDX4 processors - default: return "i486"; - } - case 5: - switch (Model) { - case 1: // Pentium OverDrive processor for Pentium processor (60, 66), - // Pentium processors (60, 66) - case 2: // Pentium OverDrive processor for Pentium processor (75, 90, - // 100, 120, 133), Pentium processors (75, 90, 100, 120, 133, - // 150, 166, 200) - case 3: // Pentium OverDrive processors for Intel486 processor-based - // systems - return "pentium"; - - case 4: // Pentium OverDrive processor with MMX technology for Pentium - // processor (75, 90, 100, 120, 133), Pentium processor with - // MMX technology (166, 200) - return "pentium-mmx"; - - default: return "pentium"; - } - case 6: - switch (Model) { - case 1: // Pentium Pro processor - return "pentiumpro"; - - case 3: // Intel Pentium II OverDrive processor, Pentium II processor, - // model 03 - case 5: // Pentium II processor, model 05, Pentium II Xeon processor, - // model 05, and Intel Celeron processor, model 05 - case 6: // Celeron processor, model 06 - return "pentium2"; - - case 7: // Pentium III processor, model 07, and Pentium III Xeon - // processor, model 07 - case 8: // Pentium III processor, model 08, Pentium III Xeon processor, - // model 08, and Celeron processor, model 08 - case 10: // Pentium III Xeon processor, model 0Ah - case 11: // Pentium III processor, model 0Bh - return "pentium3"; - - case 9: // Intel Pentium M processor, Intel Celeron M processor model 09. - case 13: // Intel Pentium M processor, Intel Celeron M processor, model - // 0Dh. All processors are manufactured using the 90 nm process. - return "pentium-m"; - - case 14: // Intel Core Duo processor, Intel Core Solo processor, model - // 0Eh. All processors are manufactured using the 65 nm process. - return "yonah"; - - case 15: // Intel Core 2 Duo processor, Intel Core 2 Duo mobile - // processor, Intel Core 2 Quad processor, Intel Core 2 Quad - // mobile processor, Intel Core 2 Extreme processor, Intel - // Pentium Dual-Core processor, Intel Xeon processor, model - // 0Fh. All processors are manufactured using the 65 nm process. - case 22: // Intel Celeron processor model 16h. All processors are - // manufactured using the 65 nm process - return "core2"; - - case 21: // Intel EP80579 Integrated Processor and Intel EP80579 - // Integrated Processor with Intel QuickAssist Technology - return "i686"; // FIXME: ??? - - case 23: // Intel Core 2 Extreme processor, Intel Xeon processor, model - // 17h. All processors are manufactured using the 45 nm process. - // - // 45nm: Penryn , Wolfdale, Yorkfield (XE) - return "penryn"; - - case 26: // Intel Core i7 processor and Intel Xeon processor. All - // processors are manufactured using the 45 nm process. - case 29: // Intel Xeon processor MP. All processors are manufactured using - // the 45 nm process. - case 30: // Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz. - // As found in a Summer 2010 model iMac. - case 37: // Intel Core i7, laptop version. - return "corei7"; - - case 28: // Intel Atom processor. All processors are manufactured using - // the 45 nm process - return "atom"; - - default: return "i686"; - } - case 15: { - switch (Model) { - case 0: // Pentium 4 processor, Intel Xeon processor. All processors are - // model 00h and manufactured using the 0.18 micron process. - case 1: // Pentium 4 processor, Intel Xeon processor, Intel Xeon - // processor MP, and Intel Celeron processor. All processors are - // model 01h and manufactured using the 0.18 micron process. - case 2: // Pentium 4 processor, Mobile Intel Pentium 4 processor - M, - // Intel Xeon processor, Intel Xeon processor MP, Intel Celeron - // processor, and Mobile Intel Celeron processor. All processors - // are model 02h and manufactured using the 0.13 micron process. - return (Em64T) ? "x86-64" : "pentium4"; - - case 3: // Pentium 4 processor, Intel Xeon processor, Intel Celeron D - // processor. All processors are model 03h and manufactured using - // the 90 nm process. - case 4: // Pentium 4 processor, Pentium 4 processor Extreme Edition, - // Pentium D processor, Intel Xeon processor, Intel Xeon - // processor MP, Intel Celeron D processor. All processors are - // model 04h and manufactured using the 90 nm process. - case 6: // Pentium 4 processor, Pentium D processor, Pentium processor - // Extreme Edition, Intel Xeon processor, Intel Xeon processor - // MP, Intel Celeron D processor. All processors are model 06h - // and manufactured using the 65 nm process. - return (Em64T) ? "nocona" : "prescott"; - - default: - return (Em64T) ? "x86-64" : "pentium4"; - } - } - - default: - return "generic"; - } - } else if (memcmp(text.c, "AuthenticAMD", 12) == 0) { - // FIXME: this poorly matches the generated SubtargetFeatureKV table. There - // appears to be no way to generate the wide variety of AMD-specific targets - // from the information returned from CPUID. - switch (Family) { - case 4: - return "i486"; - case 5: - switch (Model) { - case 6: - case 7: return "k6"; - case 8: return "k6-2"; - case 9: - case 13: return "k6-3"; - default: return "pentium"; - } - case 6: - switch (Model) { - case 4: return "athlon-tbird"; - case 6: - case 7: - case 8: return "athlon-mp"; - case 10: return "athlon-xp"; - default: return "athlon"; - } - case 15: - if (HasSSE3) - return "k8-sse3"; - switch (Model) { - case 1: return "opteron"; - case 5: return "athlon-fx"; // also opteron - default: return "athlon64"; - } - case 16: - return "amdfam10"; - default: - return "generic"; - } - } - return "generic"; -} -#else -std::string sys::getHostCPUName() { - return "generic"; -} -#endif - -bool sys::getHostCPUFeatures(StringMap &Features){ - return false; -} Removed: llvm/trunk/lib/System/IncludeFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/IncludeFile.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/IncludeFile.cpp (original) +++ llvm/trunk/lib/System/IncludeFile.cpp (removed) @@ -1,20 +0,0 @@ -//===- lib/System/IncludeFile.cpp - Ensure Linking Of Implementation -----===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the IncludeFile constructor. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/IncludeFile.h" - -using namespace llvm; - -// This constructor is used to ensure linking of other modules. See the -// llvm/System/IncludeFile.h header for details. -IncludeFile::IncludeFile(const void*) {} Removed: llvm/trunk/lib/System/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Makefile?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Makefile (original) +++ llvm/trunk/lib/System/Makefile (removed) @@ -1,20 +0,0 @@ -##===- lib/System/Makefile ---------------------------------*- Makefile -*-===## -# -# The LLVM Compiler Infrastructure -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -##===----------------------------------------------------------------------===## - -LEVEL = ../.. -LIBRARYNAME = LLVMSystem -BUILD_ARCHIVE = 1 -REQUIRES_RTTI = 1 - -EXTRA_DIST = Unix Win32 README.txt - -include $(LEVEL)/Makefile.common - -CompileCommonOpts := $(filter-out -pedantic,$(CompileCommonOpts)) -CompileCommonOpts := $(filter-out -Wno-long-long,$(CompileCommonOpts)) Removed: llvm/trunk/lib/System/Memory.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Memory.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Memory.cpp (original) +++ llvm/trunk/lib/System/Memory.cpp (removed) @@ -1,74 +0,0 @@ -//===- Memory.cpp - Memory Handling Support ---------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines some helpful functions for allocating memory and dealing -// with memory mapped files -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Memory.h" -#include "llvm/System/Valgrind.h" -#include "llvm/Config/config.h" - -namespace llvm { -using namespace sys; -} - -// Include the platform-specific parts of this class. -#ifdef LLVM_ON_UNIX -#include "Unix/Memory.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/Memory.inc" -#endif - -extern "C" void sys_icache_invalidate(const void *Addr, size_t len); - -/// InvalidateInstructionCache - Before the JIT can run a block of code -/// that has been emitted it must invalidate the instruction cache on some -/// platforms. -void llvm::sys::Memory::InvalidateInstructionCache(const void *Addr, - size_t Len) { - -// icache invalidation for PPC and ARM. -#if defined(__APPLE__) - -# if (defined(__POWERPC__) || defined (__ppc__) || \ - defined(_POWER) || defined(_ARCH_PPC)) || defined(__arm__) - sys_icache_invalidate(Addr, Len); -# endif - -#else - -# if (defined(__POWERPC__) || defined (__ppc__) || \ - defined(_POWER) || defined(_ARCH_PPC)) && defined(__GNUC__) - const size_t LineSize = 32; - - const intptr_t Mask = ~(LineSize - 1); - const intptr_t StartLine = ((intptr_t) Addr) & Mask; - const intptr_t EndLine = ((intptr_t) Addr + Len + LineSize - 1) & Mask; - - for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize) - asm volatile("dcbf 0, %0" : : "r"(Line)); - asm volatile("sync"); - - for (intptr_t Line = StartLine; Line < EndLine; Line += LineSize) - asm volatile("icbi 0, %0" : : "r"(Line)); - asm volatile("isync"); -# elif defined(__arm__) && defined(__GNUC__) - // FIXME: Can we safely always call this for __GNUC__ everywhere? - char *Start = (char*) Addr; - char *End = Start + Len; - __clear_cache(Start, End); -# endif - -#endif // end apple - - ValgrindDiscardTranslations(Addr, Len); -} Removed: llvm/trunk/lib/System/Mutex.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Mutex.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Mutex.cpp (original) +++ llvm/trunk/lib/System/Mutex.cpp (removed) @@ -1,157 +0,0 @@ -//===- Mutex.cpp - Mutual Exclusion Lock ------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the llvm::sys::Mutex class. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" -#include "llvm/System/Mutex.h" - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0 -// Define all methods as no-ops if threading is explicitly disabled -namespace llvm { -using namespace sys; -MutexImpl::MutexImpl( bool recursive) { } -MutexImpl::~MutexImpl() { } -bool MutexImpl::acquire() { return true; } -bool MutexImpl::release() { return true; } -bool MutexImpl::tryacquire() { return true; } -} -#else - -#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK) - -#include -#include -#include - -namespace llvm { -using namespace sys; - - -// This variable is useful for situations where the pthread library has been -// compiled with weak linkage for its interface symbols. This allows the -// threading support to be turned off by simply not linking against -lpthread. -// In that situation, the value of pthread_mutex_init will be 0 and -// consequently pthread_enabled will be false. In such situations, all the -// pthread operations become no-ops and the functions all return false. If -// pthread_mutex_init does have an address, then mutex support is enabled. -// Note: all LLVM tools will link against -lpthread if its available since it -// is configured into the LIBS variable. -// Note: this line of code generates a warning if pthread_mutex_init is not -// declared with weak linkage. It's safe to ignore the warning. -static const bool pthread_enabled = true; - -// Construct a Mutex using pthread calls -MutexImpl::MutexImpl( bool recursive) - : data_(0) -{ - if (pthread_enabled) - { - // Declare the pthread_mutex data structures - pthread_mutex_t* mutex = - static_cast(malloc(sizeof(pthread_mutex_t))); - pthread_mutexattr_t attr; - - // Initialize the mutex attributes - int errorcode = pthread_mutexattr_init(&attr); - assert(errorcode == 0); - - // Initialize the mutex as a recursive mutex, if requested, or normal - // otherwise. - int kind = ( recursive ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL ); - errorcode = pthread_mutexattr_settype(&attr, kind); - assert(errorcode == 0); - -#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__) - // Make it a process local mutex - errorcode = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE); -#endif - - // Initialize the mutex - errorcode = pthread_mutex_init(mutex, &attr); - assert(errorcode == 0); - - // Destroy the attributes - errorcode = pthread_mutexattr_destroy(&attr); - assert(errorcode == 0); - - // Assign the data member - data_ = mutex; - } -} - -// Destruct a Mutex -MutexImpl::~MutexImpl() -{ - if (pthread_enabled) - { - pthread_mutex_t* mutex = static_cast(data_); - assert(mutex != 0); - pthread_mutex_destroy(mutex); - free(mutex); - } -} - -bool -MutexImpl::acquire() -{ - if (pthread_enabled) - { - pthread_mutex_t* mutex = static_cast(data_); - assert(mutex != 0); - - int errorcode = pthread_mutex_lock(mutex); - return errorcode == 0; - } else return false; -} - -bool -MutexImpl::release() -{ - if (pthread_enabled) - { - pthread_mutex_t* mutex = static_cast(data_); - assert(mutex != 0); - - int errorcode = pthread_mutex_unlock(mutex); - return errorcode == 0; - } else return false; -} - -bool -MutexImpl::tryacquire() -{ - if (pthread_enabled) - { - pthread_mutex_t* mutex = static_cast(data_); - assert(mutex != 0); - - int errorcode = pthread_mutex_trylock(mutex); - return errorcode == 0; - } else return false; -} - -} - -#elif defined(LLVM_ON_UNIX) -#include "Unix/Mutex.inc" -#elif defined( LLVM_ON_WIN32) -#include "Win32/Mutex.inc" -#else -#warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/Mutex.cpp -#endif -#endif - Removed: llvm/trunk/lib/System/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Path.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Path.cpp (original) +++ llvm/trunk/lib/System/Path.cpp (removed) @@ -1,297 +0,0 @@ -//===-- Path.cpp - Implement OS Path Concept --------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file implements the operating system Path concept. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Path.h" -#include "llvm/Config/config.h" -#include -#include -#include -using namespace llvm; -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -bool Path::operator==(const Path &that) const { - return path == that.path; -} - -bool Path::operator<(const Path& that) const { - return path < that.path; -} - -Path -Path::GetLLVMConfigDir() { - Path result; -#ifdef LLVM_ETCDIR - if (result.set(LLVM_ETCDIR)) - return result; -#endif - return GetLLVMDefaultConfigDir(); -} - -LLVMFileType -sys::IdentifyFileType(const char *magic, unsigned length) { - assert(magic && "Invalid magic number string"); - assert(length >=4 && "Invalid magic number length"); - switch ((unsigned char)magic[0]) { - case 0xDE: // 0x0B17C0DE = BC wraper - if (magic[1] == (char)0xC0 && magic[2] == (char)0x17 && - magic[3] == (char)0x0B) - return Bitcode_FileType; - break; - case 'B': - if (magic[1] == 'C' && magic[2] == (char)0xC0 && magic[3] == (char)0xDE) - return Bitcode_FileType; - break; - case '!': - if (length >= 8) - if (memcmp(magic,"!\n",8) == 0) - return Archive_FileType; - break; - - case '\177': - if (magic[1] == 'E' && magic[2] == 'L' && magic[3] == 'F') { - if (length >= 18 && magic[17] == 0) - switch (magic[16]) { - default: break; - case 1: return ELF_Relocatable_FileType; - case 2: return ELF_Executable_FileType; - case 3: return ELF_SharedObject_FileType; - case 4: return ELF_Core_FileType; - } - } - break; - - case 0xCA: - if (magic[1] == char(0xFE) && magic[2] == char(0xBA) && - magic[3] == char(0xBE)) { - // This is complicated by an overlap with Java class files. - // See the Mach-O section in /usr/share/file/magic for details. - if (length >= 8 && magic[7] < 43) - // FIXME: Universal Binary of any type. - return Mach_O_DynamicallyLinkedSharedLib_FileType; - } - break; - - case 0xFE: - case 0xCE: { - uint16_t type = 0; - if (magic[0] == char(0xFE) && magic[1] == char(0xED) && - magic[2] == char(0xFA) && magic[3] == char(0xCE)) { - /* Native endian */ - if (length >= 16) type = magic[14] << 8 | magic[15]; - } else if (magic[0] == char(0xCE) && magic[1] == char(0xFA) && - magic[2] == char(0xED) && magic[3] == char(0xFE)) { - /* Reverse endian */ - if (length >= 14) type = magic[13] << 8 | magic[12]; - } - switch (type) { - default: break; - case 1: return Mach_O_Object_FileType; - case 2: return Mach_O_Executable_FileType; - case 3: return Mach_O_FixedVirtualMemorySharedLib_FileType; - case 4: return Mach_O_Core_FileType; - case 5: return Mach_O_PreloadExecutable_FileType; - case 6: return Mach_O_DynamicallyLinkedSharedLib_FileType; - case 7: return Mach_O_DynamicLinker_FileType; - case 8: return Mach_O_Bundle_FileType; - case 9: return Mach_O_DynamicallyLinkedSharedLibStub_FileType; - case 10: break; // FIXME: MH_DSYM companion file with only debug. - } - break; - } - case 0xF0: // PowerPC Windows - case 0x83: // Alpha 32-bit - case 0x84: // Alpha 64-bit - case 0x66: // MPS R4000 Windows - case 0x50: // mc68K - case 0x4c: // 80386 Windows - if (magic[1] == 0x01) - return COFF_FileType; - - case 0x90: // PA-RISC Windows - case 0x68: // mc68K Windows - if (magic[1] == 0x02) - return COFF_FileType; - break; - case 0x64: // x86-64 Windows. - if (magic[1] == char(0x86)) - return COFF_FileType; - break; - - default: - break; - } - return Unknown_FileType; -} - -bool -Path::isArchive() const { - return hasMagicNumber("!\012"); -} - -bool -Path::isDynamicLibrary() const { - std::string Magic; - if (getMagicNumber(Magic, 64)) - switch (IdentifyFileType(Magic.c_str(), - static_cast(Magic.length()))) { - default: return false; - case Mach_O_FixedVirtualMemorySharedLib_FileType: - case Mach_O_DynamicallyLinkedSharedLib_FileType: - case Mach_O_DynamicallyLinkedSharedLibStub_FileType: - case ELF_SharedObject_FileType: - case COFF_FileType: return true; - } - - return false; -} - -bool -Path::isObjectFile() const { - std::string Magic; - if (getMagicNumber(Magic, 64)) - if (IdentifyFileType(Magic.c_str(), - static_cast(Magic.length())) - != Unknown_FileType) { - // Everything in LLVMFileType is currently an object file. - return true; - } - - return false; -} - -Path -Path::FindLibrary(std::string& name) { - std::vector LibPaths; - GetSystemLibraryPaths(LibPaths); - for (unsigned i = 0; i < LibPaths.size(); ++i) { - sys::Path FullPath(LibPaths[i]); - FullPath.appendComponent("lib" + name + LTDL_SHLIB_EXT); - if (FullPath.isDynamicLibrary()) - return FullPath; - FullPath.eraseSuffix(); - FullPath.appendSuffix("a"); - if (FullPath.isArchive()) - return FullPath; - } - return sys::Path(); -} - -StringRef Path::GetDLLSuffix() { - return &(LTDL_SHLIB_EXT[1]); -} - -bool -Path::appendSuffix(StringRef suffix) { - if (!suffix.empty()) { - std::string save(path); - path.append("."); - path.append(suffix); - if (!isValid()) { - path = save; - return false; - } - } - - return true; -} - -bool -Path::isBitcodeFile() const { - std::string actualMagic; - if (!getMagicNumber(actualMagic, 4)) - return false; - LLVMFileType FT = - IdentifyFileType(actualMagic.c_str(), - static_cast(actualMagic.length())); - return FT == Bitcode_FileType; -} - -bool Path::hasMagicNumber(StringRef Magic) const { - std::string actualMagic; - if (getMagicNumber(actualMagic, static_cast(Magic.size()))) - return Magic == actualMagic; - return false; -} - -static void getPathList(const char*path, std::vector& Paths) { - const char* at = path; - const char* delim = strchr(at, PathSeparator); - Path tmpPath; - while (delim != 0) { - std::string tmp(at, size_t(delim-at)); - if (tmpPath.set(tmp)) - if (tmpPath.canRead()) - Paths.push_back(tmpPath); - at = delim + 1; - delim = strchr(at, PathSeparator); - } - - if (*at != 0) - if (tmpPath.set(std::string(at))) - if (tmpPath.canRead()) - Paths.push_back(tmpPath); -} - -static StringRef getDirnameCharSep(StringRef path, const char *Sep) { - assert(Sep[0] != '\0' && Sep[1] == '\0' && - "Sep must be a 1-character string literal."); - if (path.empty()) - return "."; - - // If the path is all slashes, return a single slash. - // Otherwise, remove all trailing slashes. - - signed pos = static_cast(path.size()) - 1; - - while (pos >= 0 && path[pos] == Sep[0]) - --pos; - - if (pos < 0) - return path[0] == Sep[0] ? Sep : "."; - - // Any slashes left? - signed i = 0; - - while (i < pos && path[i] != Sep[0]) - ++i; - - if (i == pos) // No slashes? Return "." - return "."; - - // There is at least one slash left. Remove all trailing non-slashes. - while (pos >= 0 && path[pos] != Sep[0]) - --pos; - - // Remove any trailing slashes. - while (pos >= 0 && path[pos] == Sep[0]) - --pos; - - if (pos < 0) - return path[0] == Sep[0] ? Sep : "."; - - return path.substr(0, pos+1); -} - -// Include the truly platform-specific parts of this class. -#if defined(LLVM_ON_UNIX) -#include "Unix/Path.inc" -#endif -#if defined(LLVM_ON_WIN32) -#include "Win32/Path.inc" -#endif - Removed: llvm/trunk/lib/System/Process.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Process.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Process.cpp (original) +++ llvm/trunk/lib/System/Process.cpp (removed) @@ -1,33 +0,0 @@ -//===-- Process.cpp - Implement OS Process Concept --------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file implements the operating system Process concept. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Process.h" -#include "llvm/Config/config.h" - -namespace llvm { -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -} - -// Include the platform-specific parts of this class. -#ifdef LLVM_ON_UNIX -#include "Unix/Process.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/Process.inc" -#endif Removed: llvm/trunk/lib/System/Program.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Program.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Program.cpp (original) +++ llvm/trunk/lib/System/Program.cpp (removed) @@ -1,56 +0,0 @@ -//===-- Program.cpp - Implement OS Program Concept --------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This header file implements the operating system Program concept. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Program.h" -#include "llvm/Config/config.h" -using namespace llvm; -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -int -Program::ExecuteAndWait(const Path& path, - const char** args, - const char** envp, - const Path** redirects, - unsigned secondsToWait, - unsigned memoryLimit, - std::string* ErrMsg) { - Program prg; - if (prg.Execute(path, args, envp, redirects, memoryLimit, ErrMsg)) - return prg.Wait(path, secondsToWait, ErrMsg); - else - return -1; -} - -void -Program::ExecuteNoWait(const Path& path, - const char** args, - const char** envp, - const Path** redirects, - unsigned memoryLimit, - std::string* ErrMsg) { - Program prg; - prg.Execute(path, args, envp, redirects, memoryLimit, ErrMsg); -} - -// Include the platform-specific parts of this class. -#ifdef LLVM_ON_UNIX -#include "Unix/Program.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/Program.inc" -#endif Removed: llvm/trunk/lib/System/README.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/README.txt?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/README.txt (original) +++ llvm/trunk/lib/System/README.txt (removed) @@ -1,43 +0,0 @@ -Design Of lib/System -==================== - -The software in this directory is designed to completely shield LLVM from any -and all operating system specific functionality. It is not intended to be a -complete operating system wrapper (such as ACE), but only to provide the -functionality necessary to support LLVM. - -The software located here, of necessity, has very specific and stringent design -rules. Violation of these rules means that cracks in the shield could form and -the primary goal of the library is defeated. By consistently using this library, -LLVM becomes more easily ported to new platforms since the only thing requiring -porting is this library. - -Complete documentation for the library can be found in the file: - llvm/docs/SystemLibrary.html -or at this URL: - http://llvm.org/docs/SystemLibrary.html - -While we recommend that you read the more detailed documentation, for the -impatient, here's a high level summary of the library's requirements. - - 1. No system header files are to be exposed through the interface. - 2. Std C++ and Std C header files are okay to be exposed through the interface. - 3. No exposed system-specific functions. - 4. No exposed system-specific data. - 5. Data in lib/System classes must use only simple C++ intrinsic types. - 6. Errors are handled by returning "true" and setting an optional std::string - 7. Library must not throw any exceptions, period. - 8. Interface functions must not have throw() specifications. - 9. No duplicate function impementations are permitted within an operating - system class. - -To accomplish these requirements, the library has numerous design criteria that -must be satisfied. Here's a high level summary of the library's design criteria: - - 1. No unused functionality (only what LLVM needs) - 2. High-Level Interfaces - 3. Use Opaque Classes - 4. Common Implementations - 5. Multiple Implementations - 6. Minimize Memory Allocation - 7. No Virtual Methods Removed: llvm/trunk/lib/System/RWMutex.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/RWMutex.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/RWMutex.cpp (original) +++ llvm/trunk/lib/System/RWMutex.cpp (removed) @@ -1,157 +0,0 @@ -//===- RWMutex.cpp - Reader/Writer Mutual Exclusion Lock --------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the llvm::sys::RWMutex class. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" -#include "llvm/System/RWMutex.h" -#include - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0 -// Define all methods as no-ops if threading is explicitly disabled -namespace llvm { -using namespace sys; -RWMutexImpl::RWMutexImpl() { } -RWMutexImpl::~RWMutexImpl() { } -bool RWMutexImpl::reader_acquire() { return true; } -bool RWMutexImpl::reader_release() { return true; } -bool RWMutexImpl::writer_acquire() { return true; } -bool RWMutexImpl::writer_release() { return true; } -} -#else - -#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_RWLOCK_INIT) - -#include -#include -#include - -namespace llvm { -using namespace sys; - - -// This variable is useful for situations where the pthread library has been -// compiled with weak linkage for its interface symbols. This allows the -// threading support to be turned off by simply not linking against -lpthread. -// In that situation, the value of pthread_mutex_init will be 0 and -// consequently pthread_enabled will be false. In such situations, all the -// pthread operations become no-ops and the functions all return false. If -// pthread_rwlock_init does have an address, then rwlock support is enabled. -// Note: all LLVM tools will link against -lpthread if its available since it -// is configured into the LIBS variable. -// Note: this line of code generates a warning if pthread_rwlock_init is not -// declared with weak linkage. It's safe to ignore the warning. -static const bool pthread_enabled = true; - -// Construct a RWMutex using pthread calls -RWMutexImpl::RWMutexImpl() - : data_(0) -{ - if (pthread_enabled) - { - // Declare the pthread_rwlock data structures - pthread_rwlock_t* rwlock = - static_cast(malloc(sizeof(pthread_rwlock_t))); - -#ifdef __APPLE__ - // Workaround a bug/mis-feature in Darwin's pthread_rwlock_init. - bzero(rwlock, sizeof(pthread_rwlock_t)); -#endif - - // Initialize the rwlock - int errorcode = pthread_rwlock_init(rwlock, NULL); - (void)errorcode; - assert(errorcode == 0); - - // Assign the data member - data_ = rwlock; - } -} - -// Destruct a RWMutex -RWMutexImpl::~RWMutexImpl() -{ - if (pthread_enabled) - { - pthread_rwlock_t* rwlock = static_cast(data_); - assert(rwlock != 0); - pthread_rwlock_destroy(rwlock); - free(rwlock); - } -} - -bool -RWMutexImpl::reader_acquire() -{ - if (pthread_enabled) - { - pthread_rwlock_t* rwlock = static_cast(data_); - assert(rwlock != 0); - - int errorcode = pthread_rwlock_rdlock(rwlock); - return errorcode == 0; - } else return false; -} - -bool -RWMutexImpl::reader_release() -{ - if (pthread_enabled) - { - pthread_rwlock_t* rwlock = static_cast(data_); - assert(rwlock != 0); - - int errorcode = pthread_rwlock_unlock(rwlock); - return errorcode == 0; - } else return false; -} - -bool -RWMutexImpl::writer_acquire() -{ - if (pthread_enabled) - { - pthread_rwlock_t* rwlock = static_cast(data_); - assert(rwlock != 0); - - int errorcode = pthread_rwlock_wrlock(rwlock); - return errorcode == 0; - } else return false; -} - -bool -RWMutexImpl::writer_release() -{ - if (pthread_enabled) - { - pthread_rwlock_t* rwlock = static_cast(data_); - assert(rwlock != 0); - - int errorcode = pthread_rwlock_unlock(rwlock); - return errorcode == 0; - } else return false; -} - -} - -#elif defined(LLVM_ON_UNIX) -#include "Unix/RWMutex.inc" -#elif defined( LLVM_ON_WIN32) -#include "Win32/RWMutex.inc" -#else -#warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/Mutex.cpp -#endif -#endif Removed: llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp (original) +++ llvm/trunk/lib/System/SearchForAddressOfSpecialSymbol.cpp (removed) @@ -1,68 +0,0 @@ -//===- SearchForAddressOfSpecialSymbol.cpp - Function addresses -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file pulls the addresses of certain symbols out of the linker. It must -// include as few header files as possible because it declares the symbols as -// void*, which would conflict with the actual symbol type if any header -// declared it. -// -//===----------------------------------------------------------------------===// - -#include - -// Must declare the symbols in the global namespace. -static void *DoSearch(const char* symbolName) { -#define EXPLICIT_SYMBOL(SYM) \ - extern void *SYM; if (!strcmp(symbolName, #SYM)) return &SYM - - // If this is darwin, it has some funky issues, try to solve them here. Some - // important symbols are marked 'private external' which doesn't allow - // SearchForAddressOfSymbol to find them. As such, we special case them here, - // there is only a small handful of them. - -#ifdef __APPLE__ - { - EXPLICIT_SYMBOL(__ashldi3); - EXPLICIT_SYMBOL(__ashrdi3); - EXPLICIT_SYMBOL(__cmpdi2); - EXPLICIT_SYMBOL(__divdi3); - EXPLICIT_SYMBOL(__fixdfdi); - EXPLICIT_SYMBOL(__fixsfdi); - EXPLICIT_SYMBOL(__fixunsdfdi); - EXPLICIT_SYMBOL(__fixunssfdi); - EXPLICIT_SYMBOL(__floatdidf); - EXPLICIT_SYMBOL(__floatdisf); - EXPLICIT_SYMBOL(__lshrdi3); - EXPLICIT_SYMBOL(__moddi3); - EXPLICIT_SYMBOL(__udivdi3); - EXPLICIT_SYMBOL(__umoddi3); - - // __eprintf is sometimes used for assert() handling on x86. -#ifdef __i386__ - EXPLICIT_SYMBOL(__eprintf); -#endif - } -#endif - -#ifdef __CYGWIN__ - { - EXPLICIT_SYMBOL(_alloca); - EXPLICIT_SYMBOL(__main); - } -#endif - -#undef EXPLICIT_SYMBOL - return 0; -} - -namespace llvm { -void *SearchForAddressOfSpecialSymbol(const char* symbolName) { - return DoSearch(symbolName); -} -} // namespace llvm Removed: llvm/trunk/lib/System/Signals.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Signals.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Signals.cpp (original) +++ llvm/trunk/lib/System/Signals.cpp (removed) @@ -1,34 +0,0 @@ -//===- Signals.cpp - Signal Handling support --------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines some helpful functions for dealing with the possibility of -// Unix signals occuring while your program is running. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Signals.h" -#include "llvm/Config/config.h" - -namespace llvm { -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -} - -// Include the platform-specific parts of this class. -#ifdef LLVM_ON_UNIX -#include "Unix/Signals.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/Signals.inc" -#endif Removed: llvm/trunk/lib/System/ThreadLocal.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/ThreadLocal.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/ThreadLocal.cpp (original) +++ llvm/trunk/lib/System/ThreadLocal.cpp (removed) @@ -1,85 +0,0 @@ -//===- ThreadLocal.cpp - Thread Local Data ----------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the llvm::sys::ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" -#include "llvm/System/ThreadLocal.h" - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0 -// Define all methods as no-ops if threading is explicitly disabled -namespace llvm { -using namespace sys; -ThreadLocalImpl::ThreadLocalImpl() { } -ThreadLocalImpl::~ThreadLocalImpl() { } -void ThreadLocalImpl::setInstance(const void* d) { data = const_cast(d);} -const void* ThreadLocalImpl::getInstance() { return data; } -void ThreadLocalImpl::removeInstance() { data = 0; } -} -#else - -#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_GETSPECIFIC) - -#include -#include -#include - -namespace llvm { -using namespace sys; - -ThreadLocalImpl::ThreadLocalImpl() : data(0) { - pthread_key_t* key = new pthread_key_t; - int errorcode = pthread_key_create(key, NULL); - assert(errorcode == 0); - (void) errorcode; - data = (void*)key; -} - -ThreadLocalImpl::~ThreadLocalImpl() { - pthread_key_t* key = static_cast(data); - int errorcode = pthread_key_delete(*key); - assert(errorcode == 0); - (void) errorcode; - delete key; -} - -void ThreadLocalImpl::setInstance(const void* d) { - pthread_key_t* key = static_cast(data); - int errorcode = pthread_setspecific(*key, d); - assert(errorcode == 0); - (void) errorcode; -} - -const void* ThreadLocalImpl::getInstance() { - pthread_key_t* key = static_cast(data); - return pthread_getspecific(*key); -} - -void ThreadLocalImpl::removeInstance() { - setInstance(0); -} - -} - -#elif defined(LLVM_ON_UNIX) -#include "Unix/ThreadLocal.inc" -#elif defined( LLVM_ON_WIN32) -#include "Win32/ThreadLocal.inc" -#else -#warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/ThreadLocal.cpp -#endif -#endif - Removed: llvm/trunk/lib/System/Threading.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Threading.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Threading.cpp (original) +++ llvm/trunk/lib/System/Threading.cpp (removed) @@ -1,116 +0,0 @@ -//===-- llvm/System/Threading.cpp- Control multithreading mode --*- C++ -*-==// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements llvm_start_multithreaded() and friends. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Threading.h" -#include "llvm/System/Atomic.h" -#include "llvm/System/Mutex.h" -#include "llvm/Config/config.h" -#include - -using namespace llvm; - -static bool multithreaded_mode = false; - -static sys::Mutex* global_lock = 0; - -bool llvm::llvm_start_multithreaded() { -#ifdef LLVM_MULTITHREADED - assert(!multithreaded_mode && "Already multithreaded!"); - multithreaded_mode = true; - global_lock = new sys::Mutex(true); - - // We fence here to ensure that all initialization is complete BEFORE we - // return from llvm_start_multithreaded(). - sys::MemoryFence(); - return true; -#else - return false; -#endif -} - -void llvm::llvm_stop_multithreaded() { -#ifdef LLVM_MULTITHREADED - assert(multithreaded_mode && "Not currently multithreaded!"); - - // We fence here to insure that all threaded operations are complete BEFORE we - // return from llvm_stop_multithreaded(). - sys::MemoryFence(); - - multithreaded_mode = false; - delete global_lock; -#endif -} - -bool llvm::llvm_is_multithreaded() { - return multithreaded_mode; -} - -void llvm::llvm_acquire_global_lock() { - if (multithreaded_mode) global_lock->acquire(); -} - -void llvm::llvm_release_global_lock() { - if (multithreaded_mode) global_lock->release(); -} - -#if defined(LLVM_MULTITHREADED) && defined(HAVE_PTHREAD_H) -#include - -struct ThreadInfo { - void (*UserFn)(void *); - void *UserData; -}; -static void *ExecuteOnThread_Dispatch(void *Arg) { - ThreadInfo *TI = reinterpret_cast(Arg); - TI->UserFn(TI->UserData); - return 0; -} - -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData, - unsigned RequestedStackSize) { - ThreadInfo Info = { Fn, UserData }; - pthread_attr_t Attr; - pthread_t Thread; - - // Construct the attributes object. - if (::pthread_attr_init(&Attr) != 0) - return; - - // Set the requested stack size, if given. - if (RequestedStackSize != 0) { - if (::pthread_attr_setstacksize(&Attr, RequestedStackSize) != 0) - goto error; - } - - // Construct and execute the thread. - if (::pthread_create(&Thread, &Attr, ExecuteOnThread_Dispatch, &Info) != 0) - goto error; - - // Wait for the thread and clean up. - ::pthread_join(Thread, 0); - - error: - ::pthread_attr_destroy(&Attr); -} - -#else - -// No non-pthread implementation, currently. - -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData, - unsigned RequestedStackSize) { - (void) RequestedStackSize; - Fn(UserData); -} - -#endif Removed: llvm/trunk/lib/System/TimeValue.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/TimeValue.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/TimeValue.cpp (original) +++ llvm/trunk/lib/System/TimeValue.cpp (removed) @@ -1,58 +0,0 @@ -//===-- TimeValue.cpp - Implement OS TimeValue Concept ----------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the operating system TimeValue concept. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/TimeValue.h" -#include "llvm/Config/config.h" - -namespace llvm { -using namespace sys; - -const TimeValue TimeValue::MinTime = TimeValue ( INT64_MIN,0 ); -const TimeValue TimeValue::MaxTime = TimeValue ( INT64_MAX,0 ); -const TimeValue TimeValue::ZeroTime = TimeValue ( 0,0 ); -const TimeValue TimeValue::PosixZeroTime = TimeValue ( -946684800,0 ); -const TimeValue TimeValue::Win32ZeroTime = TimeValue ( -12591158400ULL,0 ); - -void -TimeValue::normalize( void ) { - if ( nanos_ >= NANOSECONDS_PER_SECOND ) { - do { - seconds_++; - nanos_ -= NANOSECONDS_PER_SECOND; - } while ( nanos_ >= NANOSECONDS_PER_SECOND ); - } else if (nanos_ <= -NANOSECONDS_PER_SECOND ) { - do { - seconds_--; - nanos_ += NANOSECONDS_PER_SECOND; - } while (nanos_ <= -NANOSECONDS_PER_SECOND); - } - - if (seconds_ >= 1 && nanos_ < 0) { - seconds_--; - nanos_ += NANOSECONDS_PER_SECOND; - } else if (seconds_ < 0 && nanos_ > 0) { - seconds_++; - nanos_ -= NANOSECONDS_PER_SECOND; - } -} - -} - -/// Include the platform specific portion of TimeValue class -#ifdef LLVM_ON_UNIX -#include "Unix/TimeValue.inc" -#endif -#ifdef LLVM_ON_WIN32 -#include "Win32/TimeValue.inc" -#endif - Removed: llvm/trunk/lib/System/Unix/Alarm.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Alarm.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Alarm.inc (original) +++ llvm/trunk/lib/System/Unix/Alarm.inc (removed) @@ -1,72 +0,0 @@ -//===-- Alarm.inc - Implement Unix Alarm Support ----------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the UNIX Alarm support. -// -//===----------------------------------------------------------------------===// - -#include -#include -#include -using namespace llvm; - -/// AlarmCancelled - This flag is set by the SIGINT signal handler if the -/// user presses CTRL-C. -static volatile bool AlarmCancelled = false; - -/// AlarmTriggered - This flag is set by the SIGALRM signal handler if the -/// alarm was triggered. -static volatile bool AlarmTriggered = false; - -/// NestedSOI - Sanity check. Alarms cannot be nested or run in parallel. -/// This ensures that they never do. -static bool NestedSOI = false; - -static RETSIGTYPE SigIntHandler(int Sig) { - AlarmCancelled = true; - signal(SIGINT, SigIntHandler); -} - -static RETSIGTYPE SigAlarmHandler(int Sig) { - AlarmTriggered = true; -} - -static void (*OldSigIntHandler) (int); - -void sys::SetupAlarm(unsigned seconds) { - assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!"); - NestedSOI = true; - AlarmCancelled = false; - AlarmTriggered = false; - ::signal(SIGALRM, SigAlarmHandler); - OldSigIntHandler = ::signal(SIGINT, SigIntHandler); - ::alarm(seconds); -} - -void sys::TerminateAlarm() { - assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!"); - ::alarm(0); - ::signal(SIGALRM, SIG_DFL); - ::signal(SIGINT, OldSigIntHandler); - AlarmCancelled = false; - AlarmTriggered = false; - NestedSOI = false; -} - -int sys::AlarmStatus() { - if (AlarmCancelled) - return -1; - if (AlarmTriggered) - return 1; - return 0; -} - -void sys::Sleep(unsigned n) { - ::sleep(n); -} Removed: llvm/trunk/lib/System/Unix/Host.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Host.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Host.inc (original) +++ llvm/trunk/lib/System/Unix/Host.inc (removed) @@ -1,96 +0,0 @@ - //===- llvm/System/Unix/Host.inc -------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the UNIX Host support. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" -#include "llvm/ADT/StringRef.h" -#include "Unix.h" -#include -#include - -using namespace llvm; - -static std::string getOSVersion() { - struct utsname info; - - if (uname(&info)) - return ""; - - return info.release; -} - -std::string sys::getHostTriple() { - // FIXME: Derive directly instead of relying on the autoconf generated - // variable. - - StringRef HostTripleString(LLVM_HOSTTRIPLE); - std::pair ArchSplit = HostTripleString.split('-'); - - // Normalize the arch, since the host triple may not actually match the host. - std::string Arch = ArchSplit.first; - - // It would be nice to do this in terms of llvm::Triple, but that is in - // Support which is layered above us. -#if defined(__x86_64__) - Arch = "x86_64"; -#elif defined(__i386__) - Arch = "i386"; -#elif defined(__ppc64__) - Arch = "powerpc64"; -#elif defined(__ppc__) - Arch = "powerpc"; -#elif defined(__arm__) - - // FIXME: We need to pick the right ARM triple (which involves querying the - // chip). However, for now this is most important for LLVM arch selection, so - // we only need to make sure to distinguish ARM and Thumb. -# if defined(__thumb__) - Arch = "thumb"; -# else - Arch = "arm"; -# endif - -#else - - // FIXME: When enough auto-detection is in place, this should just - // #error. Then at least the arch selection is done, and we only need the OS - // etc selection to kill off the use of LLVM_HOSTTRIPLE. - -#endif - - std::string Triple(Arch); - Triple += '-'; - Triple += ArchSplit.second; - - // Force i86 to i386. - if (Triple[0] == 'i' && isdigit(Triple[1]) && - Triple[2] == '8' && Triple[3] == '6') - Triple[1] = '3'; - - // On darwin, we want to update the version to match that of the - // host. - std::string::size_type DarwinDashIdx = Triple.find("-darwin"); - if (DarwinDashIdx != std::string::npos) { - Triple.resize(DarwinDashIdx + strlen("-darwin")); - - // Only add the major part of the os version. - std::string Version = getOSVersion(); - Triple += Version.substr(0, Version.find('.')); - } - - return Triple; -} Removed: llvm/trunk/lib/System/Unix/Memory.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Memory.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Memory.inc (original) +++ llvm/trunk/lib/System/Unix/Memory.inc (removed) @@ -1,151 +0,0 @@ -//===- Unix/Memory.cpp - Generic UNIX System Configuration ------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines some functions for various memory management utilities. -// -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#include "llvm/System/DataTypes.h" -#include "llvm/System/Process.h" - -#ifdef HAVE_SYS_MMAN_H -#include -#endif - -#ifdef __APPLE__ -#include -#endif - -/// AllocateRWX - Allocate a slab of memory with read/write/execute -/// permissions. This is typically used for JIT applications where we want -/// to emit code to the memory then jump to it. Getting this type of memory -/// is very OS specific. -/// -llvm::sys::MemoryBlock -llvm::sys::Memory::AllocateRWX(size_t NumBytes, const MemoryBlock* NearBlock, - std::string *ErrMsg) { - if (NumBytes == 0) return MemoryBlock(); - - size_t pageSize = Process::GetPageSize(); - size_t NumPages = (NumBytes+pageSize-1)/pageSize; - - int fd = -1; -#ifdef NEED_DEV_ZERO_FOR_MMAP - static int zero_fd = open("/dev/zero", O_RDWR); - if (zero_fd == -1) { - MakeErrMsg(ErrMsg, "Can't open /dev/zero device"); - return MemoryBlock(); - } - fd = zero_fd; -#endif - - int flags = MAP_PRIVATE | -#ifdef HAVE_MMAP_ANONYMOUS - MAP_ANONYMOUS -#else - MAP_ANON -#endif - ; - - void* start = NearBlock ? (unsigned char*)NearBlock->base() + - NearBlock->size() : 0; - -#if defined(__APPLE__) && defined(__arm__) - void *pa = ::mmap(start, pageSize*NumPages, PROT_READ|PROT_EXEC, - flags, fd, 0); -#else - void *pa = ::mmap(start, pageSize*NumPages, PROT_READ|PROT_WRITE|PROT_EXEC, - flags, fd, 0); -#endif - if (pa == MAP_FAILED) { - if (NearBlock) //Try again without a near hint - return AllocateRWX(NumBytes, 0); - - MakeErrMsg(ErrMsg, "Can't allocate RWX Memory"); - return MemoryBlock(); - } - -#if defined(__APPLE__) && defined(__arm__) - kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)pa, - (vm_size_t)(pageSize*NumPages), 0, - VM_PROT_READ | VM_PROT_EXECUTE | VM_PROT_COPY); - if (KERN_SUCCESS != kr) { - MakeErrMsg(ErrMsg, "vm_protect max RX failed"); - return sys::MemoryBlock(); - } - - kr = vm_protect(mach_task_self(), (vm_address_t)pa, - (vm_size_t)(pageSize*NumPages), 0, - VM_PROT_READ | VM_PROT_WRITE); - if (KERN_SUCCESS != kr) { - MakeErrMsg(ErrMsg, "vm_protect RW failed"); - return sys::MemoryBlock(); - } -#endif - - MemoryBlock result; - result.Address = pa; - result.Size = NumPages*pageSize; - - return result; -} - -bool llvm::sys::Memory::ReleaseRWX(MemoryBlock &M, std::string *ErrMsg) { - if (M.Address == 0 || M.Size == 0) return false; - if (0 != ::munmap(M.Address, M.Size)) - return MakeErrMsg(ErrMsg, "Can't release RWX Memory"); - return false; -} - -bool llvm::sys::Memory::setWritable (MemoryBlock &M, std::string *ErrMsg) { -#if defined(__APPLE__) && defined(__arm__) - if (M.Address == 0 || M.Size == 0) return false; - sys::Memory::InvalidateInstructionCache(M.Address, M.Size); - kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)M.Address, - (vm_size_t)M.Size, 0, VM_PROT_READ | VM_PROT_WRITE); - return KERN_SUCCESS == kr; -#else - return true; -#endif -} - -bool llvm::sys::Memory::setExecutable (MemoryBlock &M, std::string *ErrMsg) { -#if defined(__APPLE__) && defined(__arm__) - if (M.Address == 0 || M.Size == 0) return false; - sys::Memory::InvalidateInstructionCache(M.Address, M.Size); - kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)M.Address, - (vm_size_t)M.Size, 0, VM_PROT_READ | VM_PROT_EXECUTE | VM_PROT_COPY); - return KERN_SUCCESS == kr; -#else - return false; -#endif -} - -bool llvm::sys::Memory::setRangeWritable(const void *Addr, size_t Size) { -#if defined(__APPLE__) && defined(__arm__) - kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)Addr, - (vm_size_t)Size, 0, - VM_PROT_READ | VM_PROT_WRITE); - return KERN_SUCCESS == kr; -#else - return true; -#endif -} - -bool llvm::sys::Memory::setRangeExecutable(const void *Addr, size_t Size) { -#if defined(__APPLE__) && defined(__arm__) - kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)Addr, - (vm_size_t)Size, 0, - VM_PROT_READ | VM_PROT_EXECUTE | VM_PROT_COPY); - return KERN_SUCCESS == kr; -#else - return true; -#endif -} Removed: llvm/trunk/lib/System/Unix/Mutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Mutex.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Mutex.inc (original) +++ llvm/trunk/lib/System/Unix/Mutex.inc (removed) @@ -1,43 +0,0 @@ -//===- llvm/System/Unix/Mutex.inc - Unix Mutex Implementation ---*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific (non-pthread) Mutex class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -namespace llvm -{ -using namespace sys; - -MutexImpl::MutexImpl( bool recursive) -{ -} - -MutexImpl::~MutexImpl() -{ -} - -bool -MutexImpl::release() -{ - return true; -} - -bool -MutexImpl::tryacquire( void ) -{ - return true; -} - -} Removed: llvm/trunk/lib/System/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Path.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Path.inc (original) +++ llvm/trunk/lib/System/Unix/Path.inc (removed) @@ -1,896 +0,0 @@ -//===- llvm/System/Unix/Path.cpp - Unix Path Implementation -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific portion of the Path class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#if HAVE_SYS_STAT_H -#include -#endif -#if HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_SYS_MMAN_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#if HAVE_UTIME_H -#include -#endif -#if HAVE_TIME_H -#include -#endif -#if HAVE_DIRENT_H -# include -# define NAMLEN(dirent) strlen((dirent)->d_name) -#else -# define dirent direct -# define NAMLEN(dirent) (dirent)->d_namlen -# if HAVE_SYS_NDIR_H -# include -# endif -# if HAVE_SYS_DIR_H -# include -# endif -# if HAVE_NDIR_H -# include -# endif -#endif - -#if HAVE_DLFCN_H -#include -#endif - -#ifdef __APPLE__ -#include -#endif - -// Put in a hack for Cygwin which falsely reports that the mkdtemp function -// is available when it is not. -#ifdef __CYGWIN__ -# undef HAVE_MKDTEMP -#endif - -namespace { -inline bool lastIsSlash(const std::string& path) { - return !path.empty() && path[path.length() - 1] == '/'; -} - -} - -namespace llvm { -using namespace sys; - -const char sys::PathSeparator = ':'; - -StringRef Path::GetEXESuffix() { - return StringRef(); -} - -Path::Path(StringRef p) - : path(p) {} - -Path::Path(const char *StrStart, unsigned StrLen) - : path(StrStart, StrLen) {} - -Path& -Path::operator=(StringRef that) { - path.assign(that.data(), that.size()); - return *this; -} - -bool -Path::isValid() const { - // Empty paths are considered invalid here. - // This code doesn't check MAXPATHLEN because there's no need. Nothing in - // LLVM manipulates Paths with fixed-sizes arrays, and if the OS can't - // handle names longer than some limit, it'll report this on demand using - // ENAMETOLONG. - return !path.empty(); -} - -bool -Path::isAbsolute(const char *NameStart, unsigned NameLen) { - assert(NameStart); - if (NameLen == 0) - return false; - return NameStart[0] == '/'; -} - -bool -Path::isAbsolute() const { - if (path.empty()) - return false; - return path[0] == '/'; -} - -void Path::makeAbsolute() { - if (isAbsolute()) - return; - - Path CWD = Path::GetCurrentDirectory(); - assert(CWD.isAbsolute() && "GetCurrentDirectory returned relative path!"); - - CWD.appendComponent(path); - - path = CWD.str(); -} - -Path -Path::GetRootDirectory() { - Path result; - result.set("/"); - return result; -} - -Path -Path::GetTemporaryDirectory(std::string *ErrMsg) { -#if defined(HAVE_MKDTEMP) - // The best way is with mkdtemp but that's not available on many systems, - // Linux and FreeBSD have it. Others probably won't. - char pathname[] = "/tmp/llvm_XXXXXX"; - if (0 == mkdtemp(pathname)) { - MakeErrMsg(ErrMsg, - std::string(pathname) + ": can't create temporary directory"); - return Path(); - } - return Path(pathname); -#elif defined(HAVE_MKSTEMP) - // If no mkdtemp is available, mkstemp can be used to create a temporary file - // which is then removed and created as a directory. We prefer this over - // mktemp because of mktemp's inherent security and threading risks. We still - // have a slight race condition from the time the temporary file is created to - // the time it is re-created as a directoy. - char pathname[] = "/tmp/llvm_XXXXXX"; - int fd = 0; - if (-1 == (fd = mkstemp(pathname))) { - MakeErrMsg(ErrMsg, - std::string(pathname) + ": can't create temporary directory"); - return Path(); - } - ::close(fd); - ::unlink(pathname); // start race condition, ignore errors - if (-1 == ::mkdir(pathname, S_IRWXU)) { // end race condition - MakeErrMsg(ErrMsg, - std::string(pathname) + ": can't create temporary directory"); - return Path(); - } - return Path(pathname); -#elif defined(HAVE_MKTEMP) - // If a system doesn't have mkdtemp(3) or mkstemp(3) but it does have - // mktemp(3) then we'll assume that system (e.g. AIX) has a reasonable - // implementation of mktemp(3) and doesn't follow BSD 4.3's lead of replacing - // the XXXXXX with the pid of the process and a letter. That leads to only - // twenty six temporary files that can be generated. - char pathname[] = "/tmp/llvm_XXXXXX"; - char *TmpName = ::mktemp(pathname); - if (TmpName == 0) { - MakeErrMsg(ErrMsg, - std::string(TmpName) + ": can't create unique directory name"); - return Path(); - } - if (-1 == ::mkdir(TmpName, S_IRWXU)) { - MakeErrMsg(ErrMsg, - std::string(TmpName) + ": can't create temporary directory"); - return Path(); - } - return Path(TmpName); -#else - // This is the worst case implementation. tempnam(3) leaks memory unless its - // on an SVID2 (or later) system. On BSD 4.3 it leaks. tmpnam(3) has thread - // issues. The mktemp(3) function doesn't have enough variability in the - // temporary name generated. So, we provide our own implementation that - // increments an integer from a random number seeded by the current time. This - // should be sufficiently unique that we don't have many collisions between - // processes. Generally LLVM processes don't run very long and don't use very - // many temporary files so this shouldn't be a big issue for LLVM. - static time_t num = ::time(0); - char pathname[MAXPATHLEN]; - do { - num++; - sprintf(pathname, "/tmp/llvm_%010u", unsigned(num)); - } while ( 0 == access(pathname, F_OK ) ); - if (-1 == ::mkdir(pathname, S_IRWXU)) { - MakeErrMsg(ErrMsg, - std::string(pathname) + ": can't create temporary directory"); - return Path(); - } - return Path(pathname); -#endif -} - -void -Path::GetSystemLibraryPaths(std::vector& Paths) { -#ifdef LTDL_SHLIBPATH_VAR - char* env_var = getenv(LTDL_SHLIBPATH_VAR); - if (env_var != 0) { - getPathList(env_var,Paths); - } -#endif - // FIXME: Should this look at LD_LIBRARY_PATH too? - Paths.push_back(sys::Path("/usr/local/lib/")); - Paths.push_back(sys::Path("/usr/X11R6/lib/")); - Paths.push_back(sys::Path("/usr/lib/")); - Paths.push_back(sys::Path("/lib/")); -} - -void -Path::GetBitcodeLibraryPaths(std::vector& Paths) { - char * env_var = getenv("LLVM_LIB_SEARCH_PATH"); - if (env_var != 0) { - getPathList(env_var,Paths); - } -#ifdef LLVM_LIBDIR - { - Path tmpPath; - if (tmpPath.set(LLVM_LIBDIR)) - if (tmpPath.canRead()) - Paths.push_back(tmpPath); - } -#endif - GetSystemLibraryPaths(Paths); -} - -Path -Path::GetLLVMDefaultConfigDir() { - return Path("/etc/llvm/"); -} - -Path -Path::GetUserHomeDirectory() { - const char* home = getenv("HOME"); - if (home) { - Path result; - if (result.set(home)) - return result; - } - return GetRootDirectory(); -} - -Path -Path::GetCurrentDirectory() { - char pathname[MAXPATHLEN]; - if (!getcwd(pathname,MAXPATHLEN)) { - assert (false && "Could not query current working directory."); - return Path(); - } - - return Path(pathname); -} - -#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__minix) -static int -test_dir(char buf[PATH_MAX], char ret[PATH_MAX], - const char *dir, const char *bin) -{ - struct stat sb; - - snprintf(buf, PATH_MAX, "%s/%s", dir, bin); - if (realpath(buf, ret) == NULL) - return (1); - if (stat(buf, &sb) != 0) - return (1); - - return (0); -} - -static char * -getprogpath(char ret[PATH_MAX], const char *bin) -{ - char *pv, *s, *t, buf[PATH_MAX]; - - /* First approach: absolute path. */ - if (bin[0] == '/') { - if (test_dir(buf, ret, "/", bin) == 0) - return (ret); - return (NULL); - } - - /* Second approach: relative path. */ - if (strchr(bin, '/') != NULL) { - if (getcwd(buf, PATH_MAX) == NULL) - return (NULL); - if (test_dir(buf, ret, buf, bin) == 0) - return (ret); - return (NULL); - } - - /* Third approach: $PATH */ - if ((pv = getenv("PATH")) == NULL) - return (NULL); - s = pv = strdup(pv); - if (pv == NULL) - return (NULL); - while ((t = strsep(&s, ":")) != NULL) { - if (test_dir(buf, ret, t, bin) == 0) { - free(pv); - return (ret); - } - } - free(pv); - return (NULL); -} -#endif // __FreeBSD__ || __NetBSD__ - -/// GetMainExecutable - Return the path to the main executable, given the -/// value of argv[0] from program startup. -Path Path::GetMainExecutable(const char *argv0, void *MainAddr) { -#if defined(__APPLE__) - // On OS X the executable path is saved to the stack by dyld. Reading it - // from there is much faster than calling dladdr, especially for large - // binaries with symbols. - char exe_path[MAXPATHLEN]; - uint32_t size = sizeof(exe_path); - if (_NSGetExecutablePath(exe_path, &size) == 0) { - char link_path[MAXPATHLEN]; - if (realpath(exe_path, link_path)) - return Path(link_path); - } -#elif defined(__FreeBSD__) || defined (__NetBSD__) || defined(__minix) - char exe_path[PATH_MAX]; - - if (getprogpath(exe_path, argv0) != NULL) - return Path(exe_path); -#elif defined(__linux__) || defined(__CYGWIN__) - char exe_path[MAXPATHLEN]; - ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path)); - if (len >= 0) - return Path(StringRef(exe_path, len)); -#elif defined(HAVE_DLFCN_H) - // Use dladdr to get executable path if available. - Dl_info DLInfo; - int err = dladdr(MainAddr, &DLInfo); - if (err == 0) - return Path(); - - // If the filename is a symlink, we need to resolve and return the location of - // the actual executable. - char link_path[MAXPATHLEN]; - if (realpath(DLInfo.dli_fname, link_path)) - return Path(link_path); -#else -#error GetMainExecutable is not implemented on this host yet. -#endif - return Path(); -} - - -StringRef Path::getDirname() const { - return getDirnameCharSep(path, "/"); -} - -StringRef -Path::getBasename() const { - // Find the last slash - std::string::size_type slash = path.rfind('/'); - if (slash == std::string::npos) - slash = 0; - else - slash++; - - std::string::size_type dot = path.rfind('.'); - if (dot == std::string::npos || dot < slash) - return StringRef(path).substr(slash); - else - return StringRef(path).substr(slash, dot - slash); -} - -StringRef -Path::getSuffix() const { - // Find the last slash - std::string::size_type slash = path.rfind('/'); - if (slash == std::string::npos) - slash = 0; - else - slash++; - - std::string::size_type dot = path.rfind('.'); - if (dot == std::string::npos || dot < slash) - return StringRef(); - else - return StringRef(path).substr(dot + 1); -} - -bool Path::getMagicNumber(std::string &Magic, unsigned len) const { - assert(len < 1024 && "Request for magic string too long"); - char Buf[1025]; - int fd = ::open(path.c_str(), O_RDONLY); - if (fd < 0) - return false; - ssize_t bytes_read = ::read(fd, Buf, len); - ::close(fd); - if (ssize_t(len) != bytes_read) - return false; - Magic.assign(Buf, len); - return true; -} - -bool -Path::exists() const { - return 0 == access(path.c_str(), F_OK ); -} - -bool -Path::isDirectory() const { - struct stat buf; - if (0 != stat(path.c_str(), &buf)) - return false; - return ((buf.st_mode & S_IFMT) == S_IFDIR) ? true : false; -} - -bool -Path::isSymLink() const { - struct stat buf; - if (0 != lstat(path.c_str(), &buf)) - return false; - return S_ISLNK(buf.st_mode); -} - - -bool -Path::canRead() const { - return 0 == access(path.c_str(), R_OK); -} - -bool -Path::canWrite() const { - return 0 == access(path.c_str(), W_OK); -} - -bool -Path::isRegularFile() const { - // Get the status so we can determine if it's a file or directory - struct stat buf; - - if (0 != stat(path.c_str(), &buf)) - return false; - - if (S_ISREG(buf.st_mode)) - return true; - - return false; -} - -bool -Path::canExecute() const { - if (0 != access(path.c_str(), R_OK | X_OK )) - return false; - struct stat buf; - if (0 != stat(path.c_str(), &buf)) - return false; - if (!S_ISREG(buf.st_mode)) - return false; - return true; -} - -StringRef -Path::getLast() const { - // Find the last slash - size_t pos = path.rfind('/'); - - // Handle the corner cases - if (pos == std::string::npos) - return path; - - // If the last character is a slash - if (pos == path.length()-1) { - // Find the second to last slash - size_t pos2 = path.rfind('/', pos-1); - if (pos2 == std::string::npos) - return StringRef(path).substr(0,pos); - else - return StringRef(path).substr(pos2+1,pos-pos2-1); - } - // Return everything after the last slash - return StringRef(path).substr(pos+1); -} - -const FileStatus * -PathWithStatus::getFileStatus(bool update, std::string *ErrStr) const { - if (!fsIsValid || update) { - struct stat buf; - if (0 != stat(path.c_str(), &buf)) { - MakeErrMsg(ErrStr, path + ": can't get status of file"); - return 0; - } - status.fileSize = buf.st_size; - status.modTime.fromEpochTime(buf.st_mtime); - status.mode = buf.st_mode; - status.user = buf.st_uid; - status.group = buf.st_gid; - status.uniqueID = uint64_t(buf.st_ino); - status.isDir = S_ISDIR(buf.st_mode); - status.isFile = S_ISREG(buf.st_mode); - fsIsValid = true; - } - return &status; -} - -static bool AddPermissionBits(const Path &File, int bits) { - // Get the umask value from the operating system. We want to use it - // when changing the file's permissions. Since calling umask() sets - // the umask and returns its old value, we must call it a second - // time to reset it to the user's preference. - int mask = umask(0777); // The arg. to umask is arbitrary. - umask(mask); // Restore the umask. - - // Get the file's current mode. - struct stat buf; - if (0 != stat(File.c_str(), &buf)) - return false; - // Change the file to have whichever permissions bits from 'bits' - // that the umask would not disable. - if ((chmod(File.c_str(), (buf.st_mode | (bits & ~mask)))) == -1) - return false; - return true; -} - -bool Path::makeReadableOnDisk(std::string* ErrMsg) { - if (!AddPermissionBits(*this, 0444)) - return MakeErrMsg(ErrMsg, path + ": can't make file readable"); - return false; -} - -bool Path::makeWriteableOnDisk(std::string* ErrMsg) { - if (!AddPermissionBits(*this, 0222)) - return MakeErrMsg(ErrMsg, path + ": can't make file writable"); - return false; -} - -bool Path::makeExecutableOnDisk(std::string* ErrMsg) { - if (!AddPermissionBits(*this, 0111)) - return MakeErrMsg(ErrMsg, path + ": can't make file executable"); - return false; -} - -bool -Path::getDirectoryContents(std::set& result, std::string* ErrMsg) const { - DIR* direntries = ::opendir(path.c_str()); - if (direntries == 0) - return MakeErrMsg(ErrMsg, path + ": can't open directory"); - - std::string dirPath = path; - if (!lastIsSlash(dirPath)) - dirPath += '/'; - - result.clear(); - struct dirent* de = ::readdir(direntries); - for ( ; de != 0; de = ::readdir(direntries)) { - if (de->d_name[0] != '.') { - Path aPath(dirPath + (const char*)de->d_name); - struct stat st; - if (0 != lstat(aPath.path.c_str(), &st)) { - if (S_ISLNK(st.st_mode)) - continue; // dangling symlink -- ignore - return MakeErrMsg(ErrMsg, - aPath.path + ": can't determine file object type"); - } - result.insert(aPath); - } - } - - closedir(direntries); - return false; -} - -bool -Path::set(StringRef a_path) { - if (a_path.empty()) - return false; - path = a_path; - return true; -} - -bool -Path::appendComponent(StringRef name) { - if (name.empty()) - return false; - if (!lastIsSlash(path)) - path += '/'; - path += name; - return true; -} - -bool -Path::eraseComponent() { - size_t slashpos = path.rfind('/',path.size()); - if (slashpos == 0 || slashpos == std::string::npos) { - path.erase(); - return true; - } - if (slashpos == path.size() - 1) - slashpos = path.rfind('/',slashpos-1); - if (slashpos == std::string::npos) { - path.erase(); - return true; - } - path.erase(slashpos); - return true; -} - -bool -Path::eraseSuffix() { - size_t dotpos = path.rfind('.',path.size()); - size_t slashpos = path.rfind('/',path.size()); - if (dotpos != std::string::npos) { - if (slashpos == std::string::npos || dotpos > slashpos+1) { - path.erase(dotpos, path.size()-dotpos); - return true; - } - } - return false; -} - -static bool createDirectoryHelper(char* beg, char* end, bool create_parents) { - - if (access(beg, R_OK | W_OK) == 0) - return false; - - if (create_parents) { - - char* c = end; - - for (; c != beg; --c) - if (*c == '/') { - - // Recurse to handling the parent directory. - *c = '\0'; - bool x = createDirectoryHelper(beg, c, create_parents); - *c = '/'; - - // Return if we encountered an error. - if (x) - return true; - - break; - } - } - - return mkdir(beg, S_IRWXU | S_IRWXG) != 0; -} - -bool -Path::createDirectoryOnDisk( bool create_parents, std::string* ErrMsg ) { - // Get a writeable copy of the path name - std::string pathname(path); - - // Null-terminate the last component - size_t lastchar = path.length() - 1 ; - - if (pathname[lastchar] != '/') - ++lastchar; - - pathname[lastchar] = '\0'; - - if (createDirectoryHelper(&pathname[0], &pathname[lastchar], create_parents)) - return MakeErrMsg(ErrMsg, pathname + ": can't create directory"); - - return false; -} - -bool -Path::createFileOnDisk(std::string* ErrMsg) { - // Create the file - int fd = ::creat(path.c_str(), S_IRUSR | S_IWUSR); - if (fd < 0) - return MakeErrMsg(ErrMsg, path + ": can't create file"); - ::close(fd); - return false; -} - -bool -Path::createTemporaryFileOnDisk(bool reuse_current, std::string* ErrMsg) { - // Make this into a unique file name - if (makeUnique( reuse_current, ErrMsg )) - return true; - - // create the file - int fd = ::open(path.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0666); - if (fd < 0) - return MakeErrMsg(ErrMsg, path + ": can't create temporary file"); - ::close(fd); - return false; -} - -bool -Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const { - // Get the status so we can determine if it's a file or directory. - struct stat buf; - if (0 != stat(path.c_str(), &buf)) { - MakeErrMsg(ErrStr, path + ": can't get status of file"); - return true; - } - - // Note: this check catches strange situations. In all cases, LLVM should - // only be involved in the creation and deletion of regular files. This - // check ensures that what we're trying to erase is a regular file. It - // effectively prevents LLVM from erasing things like /dev/null, any block - // special file, or other things that aren't "regular" files. - if (S_ISREG(buf.st_mode)) { - if (unlink(path.c_str()) != 0) - return MakeErrMsg(ErrStr, path + ": can't destroy file"); - return false; - } - - if (!S_ISDIR(buf.st_mode)) { - if (ErrStr) *ErrStr = "not a file or directory"; - return true; - } - - if (remove_contents) { - // Recursively descend the directory to remove its contents. - std::string cmd = "/bin/rm -rf " + path; - if (system(cmd.c_str()) != 0) { - MakeErrMsg(ErrStr, path + ": failed to recursively remove directory."); - return true; - } - return false; - } - - // Otherwise, try to just remove the one directory. - std::string pathname(path); - size_t lastchar = path.length() - 1; - if (pathname[lastchar] == '/') - pathname[lastchar] = '\0'; - else - pathname[lastchar+1] = '\0'; - - if (rmdir(pathname.c_str()) != 0) - return MakeErrMsg(ErrStr, pathname + ": can't erase directory"); - return false; -} - -bool -Path::renamePathOnDisk(const Path& newName, std::string* ErrMsg) { - if (0 != ::rename(path.c_str(), newName.c_str())) - return MakeErrMsg(ErrMsg, std::string("can't rename '") + path + "' as '" + - newName.str() + "'"); - return false; -} - -bool -Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrStr) const { - struct utimbuf utb; - utb.actime = si.modTime.toPosixTime(); - utb.modtime = utb.actime; - if (0 != ::utime(path.c_str(),&utb)) - return MakeErrMsg(ErrStr, path + ": can't set file modification time"); - if (0 != ::chmod(path.c_str(),si.mode)) - return MakeErrMsg(ErrStr, path + ": can't set mode"); - return false; -} - -bool -sys::CopyFile(const sys::Path &Dest, const sys::Path &Src, std::string* ErrMsg){ - int inFile = -1; - int outFile = -1; - inFile = ::open(Src.c_str(), O_RDONLY); - if (inFile == -1) - return MakeErrMsg(ErrMsg, Src.str() + - ": can't open source file to copy"); - - outFile = ::open(Dest.c_str(), O_WRONLY|O_CREAT, 0666); - if (outFile == -1) { - ::close(inFile); - return MakeErrMsg(ErrMsg, Dest.str() + - ": can't create destination file for copy"); - } - - char Buffer[16*1024]; - while (ssize_t Amt = ::read(inFile, Buffer, 16*1024)) { - if (Amt == -1) { - if (errno != EINTR && errno != EAGAIN) { - ::close(inFile); - ::close(outFile); - return MakeErrMsg(ErrMsg, Src.str()+": can't read source file"); - } - } else { - char *BufPtr = Buffer; - while (Amt) { - ssize_t AmtWritten = ::write(outFile, BufPtr, Amt); - if (AmtWritten == -1) { - if (errno != EINTR && errno != EAGAIN) { - ::close(inFile); - ::close(outFile); - return MakeErrMsg(ErrMsg, Dest.str() + - ": can't write destination file"); - } - } else { - Amt -= AmtWritten; - BufPtr += AmtWritten; - } - } - } - } - ::close(inFile); - ::close(outFile); - return false; -} - -bool -Path::makeUnique(bool reuse_current, std::string* ErrMsg) { - if (reuse_current && !exists()) - return false; // File doesn't exist already, just use it! - - // Append an XXXXXX pattern to the end of the file for use with mkstemp, - // mktemp or our own implementation. - // This uses std::vector instead of SmallVector to avoid a dependence on - // libSupport. And performance isn't critical here. - std::vector Buf; - Buf.resize(path.size()+8); - char *FNBuffer = &Buf[0]; - path.copy(FNBuffer,path.size()); - if (isDirectory()) - strcpy(FNBuffer+path.size(), "/XXXXXX"); - else - strcpy(FNBuffer+path.size(), "-XXXXXX"); - -#if defined(HAVE_MKSTEMP) - int TempFD; - if ((TempFD = mkstemp(FNBuffer)) == -1) - return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); - - // We don't need to hold the temp file descriptor... we will trust that no one - // will overwrite/delete the file before we can open it again. - close(TempFD); - - // Save the name - path = FNBuffer; -#elif defined(HAVE_MKTEMP) - // If we don't have mkstemp, use the old and obsolete mktemp function. - if (mktemp(FNBuffer) == 0) - return MakeErrMsg(ErrMsg, path + ": can't make unique filename"); - - // Save the name - path = FNBuffer; -#else - // Okay, looks like we have to do it all by our lonesome. - static unsigned FCounter = 0; - // Try to initialize with unique value. - if (FCounter == 0) FCounter = ((unsigned)getpid() & 0xFFFF) << 8; - char* pos = strstr(FNBuffer, "XXXXXX"); - do { - if (++FCounter > 0xFFFFFF) { - return MakeErrMsg(ErrMsg, - path + ": can't make unique filename: too many files"); - } - sprintf(pos, "%06X", FCounter); - path = FNBuffer; - } while (exists()); - // POSSIBLE SECURITY BUG: An attacker can easily guess the name and exploit - // LLVM. -#endif - return false; -} - -const char *Path::MapInFilePages(int FD, uint64_t FileSize) { - int Flags = MAP_PRIVATE; -#ifdef MAP_FILE - Flags |= MAP_FILE; -#endif - void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, 0); - if (BasePtr == MAP_FAILED) - return 0; - return (const char*)BasePtr; -} - -void Path::UnMapFilePages(const char *BasePtr, uint64_t FileSize) { - ::munmap((void*)BasePtr, FileSize); -} - -} // end llvm namespace Removed: llvm/trunk/lib/System/Unix/Process.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Process.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Process.inc (original) +++ llvm/trunk/lib/System/Unix/Process.inc (removed) @@ -1,295 +0,0 @@ -//===- Unix/Process.cpp - Unix Process Implementation --------- -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the generic Unix implementation of the Process class. -// -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif -// DragonFly BSD has deprecated for instead, -// Unix.h includes this for us already. -#if defined(HAVE_MALLOC_H) && !defined(__DragonFly__) -#include -#endif -#ifdef HAVE_MALLOC_MALLOC_H -#include -#endif -#ifdef HAVE_SYS_IOCTL_H -# include -#endif -#ifdef HAVE_TERMIOS_H -# include -#endif - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -using namespace llvm; -using namespace sys; - -unsigned -Process::GetPageSize() -{ -#if defined(__CYGWIN__) - // On Cygwin, getpagesize() returns 64k but the page size for the purposes of - // memory protection and mmap() is 4k. - // See http://www.cygwin.com/ml/cygwin/2009-01/threads.html#00492 - const int page_size = 0x1000; -#elif defined(HAVE_GETPAGESIZE) - const int page_size = ::getpagesize(); -#elif defined(HAVE_SYSCONF) - long page_size = ::sysconf(_SC_PAGE_SIZE); -#else -#warning Cannot get the page size on this machine -#endif - return static_cast(page_size); -} - -size_t Process::GetMallocUsage() { -#if defined(HAVE_MALLINFO) - struct mallinfo mi; - mi = ::mallinfo(); - return mi.uordblks; -#elif defined(HAVE_MALLOC_ZONE_STATISTICS) && defined(HAVE_MALLOC_MALLOC_H) - malloc_statistics_t Stats; - malloc_zone_statistics(malloc_default_zone(), &Stats); - return Stats.size_in_use; // darwin -#elif defined(HAVE_SBRK) - // Note this is only an approximation and more closely resembles - // the value returned by mallinfo in the arena field. - static char *StartOfMemory = reinterpret_cast(::sbrk(0)); - char *EndOfMemory = (char*)sbrk(0); - if (EndOfMemory != ((char*)-1) && StartOfMemory != ((char*)-1)) - return EndOfMemory - StartOfMemory; - else - return 0; -#else -#warning Cannot get malloc info on this platform - return 0; -#endif -} - -size_t -Process::GetTotalMemoryUsage() -{ -#if defined(HAVE_MALLINFO) - struct mallinfo mi = ::mallinfo(); - return mi.uordblks + mi.hblkhd; -#elif defined(HAVE_MALLOC_ZONE_STATISTICS) && defined(HAVE_MALLOC_MALLOC_H) - malloc_statistics_t Stats; - malloc_zone_statistics(malloc_default_zone(), &Stats); - return Stats.size_allocated; // darwin -#elif defined(HAVE_GETRUSAGE) && !defined(__HAIKU__) - struct rusage usage; - ::getrusage(RUSAGE_SELF, &usage); - return usage.ru_maxrss; -#else -#warning Cannot get total memory size on this platform - return 0; -#endif -} - -void -Process::GetTimeUsage(TimeValue& elapsed, TimeValue& user_time, - TimeValue& sys_time) -{ - elapsed = TimeValue::now(); -#if defined(HAVE_GETRUSAGE) - struct rusage usage; - ::getrusage(RUSAGE_SELF, &usage); - user_time = TimeValue( - static_cast( usage.ru_utime.tv_sec ), - static_cast( usage.ru_utime.tv_usec * - TimeValue::NANOSECONDS_PER_MICROSECOND ) ); - sys_time = TimeValue( - static_cast( usage.ru_stime.tv_sec ), - static_cast( usage.ru_stime.tv_usec * - TimeValue::NANOSECONDS_PER_MICROSECOND ) ); -#else -#warning Cannot get usage times on this platform - user_time.seconds(0); - user_time.microseconds(0); - sys_time.seconds(0); - sys_time.microseconds(0); -#endif -} - -int Process::GetCurrentUserId() { - return getuid(); -} - -int Process::GetCurrentGroupId() { - return getgid(); -} - -#ifdef HAVE_MACH_MACH_H -#include -#endif - -// Some LLVM programs such as bugpoint produce core files as a normal part of -// their operation. To prevent the disk from filling up, this function -// does what's necessary to prevent their generation. -void Process::PreventCoreFiles() { -#if HAVE_SETRLIMIT - struct rlimit rlim; - rlim.rlim_cur = rlim.rlim_max = 0; - setrlimit(RLIMIT_CORE, &rlim); -#endif - -#ifdef HAVE_MACH_MACH_H - // Disable crash reporting on Mac OS X 10.0-10.4 - - // get information about the original set of exception ports for the task - mach_msg_type_number_t Count = 0; - exception_mask_t OriginalMasks[EXC_TYPES_COUNT]; - exception_port_t OriginalPorts[EXC_TYPES_COUNT]; - exception_behavior_t OriginalBehaviors[EXC_TYPES_COUNT]; - thread_state_flavor_t OriginalFlavors[EXC_TYPES_COUNT]; - kern_return_t err = - task_get_exception_ports(mach_task_self(), EXC_MASK_ALL, OriginalMasks, - &Count, OriginalPorts, OriginalBehaviors, - OriginalFlavors); - if (err == KERN_SUCCESS) { - // replace each with MACH_PORT_NULL. - for (unsigned i = 0; i != Count; ++i) - task_set_exception_ports(mach_task_self(), OriginalMasks[i], - MACH_PORT_NULL, OriginalBehaviors[i], - OriginalFlavors[i]); - } - - // Disable crash reporting on Mac OS X 10.5 - signal(SIGABRT, _exit); - signal(SIGILL, _exit); - signal(SIGFPE, _exit); - signal(SIGSEGV, _exit); - signal(SIGBUS, _exit); -#endif -} - -bool Process::StandardInIsUserInput() { - return FileDescriptorIsDisplayed(STDIN_FILENO); -} - -bool Process::StandardOutIsDisplayed() { - return FileDescriptorIsDisplayed(STDOUT_FILENO); -} - -bool Process::StandardErrIsDisplayed() { - return FileDescriptorIsDisplayed(STDERR_FILENO); -} - -bool Process::FileDescriptorIsDisplayed(int fd) { -#if HAVE_ISATTY - return isatty(fd); -#else - // If we don't have isatty, just return false. - return false; -#endif -} - -static unsigned getColumns(int FileID) { - // If COLUMNS is defined in the environment, wrap to that many columns. - if (const char *ColumnsStr = std::getenv("COLUMNS")) { - int Columns = std::atoi(ColumnsStr); - if (Columns > 0) - return Columns; - } - - unsigned Columns = 0; - -#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_TERMIOS_H) - // Try to determine the width of the terminal. - struct winsize ws; - if (ioctl(FileID, TIOCGWINSZ, &ws) == 0) - Columns = ws.ws_col; -#endif - - return Columns; -} - -unsigned Process::StandardOutColumns() { - if (!StandardOutIsDisplayed()) - return 0; - - return getColumns(1); -} - -unsigned Process::StandardErrColumns() { - if (!StandardErrIsDisplayed()) - return 0; - - return getColumns(2); -} - -static bool terminalHasColors() { - if (const char *term = std::getenv("TERM")) { - // Most modern terminals support ANSI escape sequences for colors. - // We could check terminfo, or have a list of known terms that support - // colors, but that would be overkill. - // The user can always ask for no colors by setting TERM to dumb, or - // using a commandline flag. - return strcmp(term, "dumb") != 0; - } - return false; -} - -bool Process::StandardOutHasColors() { - if (!StandardOutIsDisplayed()) - return false; - return terminalHasColors(); -} - -bool Process::StandardErrHasColors() { - if (!StandardErrIsDisplayed()) - return false; - return terminalHasColors(); -} - -bool Process::ColorNeedsFlush() { - // No, we use ANSI escape sequences. - return false; -} - -#define COLOR(FGBG, CODE, BOLD) "\033[0;" BOLD FGBG CODE "m" - -#define ALLCOLORS(FGBG,BOLD) {\ - COLOR(FGBG, "0", BOLD),\ - COLOR(FGBG, "1", BOLD),\ - COLOR(FGBG, "2", BOLD),\ - COLOR(FGBG, "3", BOLD),\ - COLOR(FGBG, "4", BOLD),\ - COLOR(FGBG, "5", BOLD),\ - COLOR(FGBG, "6", BOLD),\ - COLOR(FGBG, "7", BOLD)\ - } - -static const char colorcodes[2][2][8][10] = { - { ALLCOLORS("3",""), ALLCOLORS("3","1;") }, - { ALLCOLORS("4",""), ALLCOLORS("4","1;") } -}; - -const char *Process::OutputColor(char code, bool bold, bool bg) { - return colorcodes[bg?1:0][bold?1:0][code&7]; -} - -const char *Process::OutputBold(bool bg) { - return "\033[1m"; -} - -const char *Process::ResetColor() { - return "\033[0m"; -} Removed: llvm/trunk/lib/System/Unix/Program.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Program.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Program.inc (original) +++ llvm/trunk/lib/System/Unix/Program.inc (removed) @@ -1,422 +0,0 @@ -//===- llvm/System/Unix/Program.cpp -----------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific portion of the Program class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include -#include "Unix.h" -#if HAVE_SYS_STAT_H -#include -#endif -#if HAVE_SYS_RESOURCE_H -#include -#endif -#if HAVE_SIGNAL_H -#include -#endif -#if HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_POSIX_SPAWN -#include -#if !defined(__APPLE__) - extern char **environ; -#else -#include // _NSGetEnviron -#endif -#endif - -namespace llvm { -using namespace sys; - -Program::Program() : Data_(0) {} - -Program::~Program() {} - -unsigned Program::GetPid() const { - uint64_t pid = reinterpret_cast(Data_); - return static_cast(pid); -} - -// This function just uses the PATH environment variable to find the program. -Path -Program::FindProgramByName(const std::string& progName) { - - // Check some degenerate cases - if (progName.length() == 0) // no program - return Path(); - Path temp; - if (!temp.set(progName)) // invalid name - return Path(); - // Use the given path verbatim if it contains any slashes; this matches - // the behavior of sh(1) and friends. - if (progName.find('/') != std::string::npos) - return temp; - - // At this point, the file name is valid and does not contain slashes. Search - // for it through the directories specified in the PATH environment variable. - - // Get the path. If its empty, we can't do anything to find it. - const char *PathStr = getenv("PATH"); - if (PathStr == 0) - return Path(); - - // Now we have a colon separated list of directories to search; try them. - size_t PathLen = strlen(PathStr); - while (PathLen) { - // Find the first colon... - const char *Colon = std::find(PathStr, PathStr+PathLen, ':'); - - // Check to see if this first directory contains the executable... - Path FilePath; - if (FilePath.set(std::string(PathStr,Colon))) { - FilePath.appendComponent(progName); - if (FilePath.canExecute()) - return FilePath; // Found the executable! - } - - // Nope it wasn't in this directory, check the next path in the list! - PathLen -= Colon-PathStr; - PathStr = Colon; - - // Advance past duplicate colons - while (*PathStr == ':') { - PathStr++; - PathLen--; - } - } - return Path(); -} - -static bool RedirectIO(const Path *Path, int FD, std::string* ErrMsg) { - if (Path == 0) // Noop - return false; - const char *File; - if (Path->isEmpty()) - // Redirect empty paths to /dev/null - File = "/dev/null"; - else - File = Path->c_str(); - - // Open the file - int InFD = open(File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666); - if (InFD == -1) { - MakeErrMsg(ErrMsg, "Cannot open file '" + std::string(File) + "' for " - + (FD == 0 ? "input" : "output")); - return true; - } - - // Install it as the requested FD - if (dup2(InFD, FD) == -1) { - MakeErrMsg(ErrMsg, "Cannot dup2"); - close(InFD); - return true; - } - close(InFD); // Close the original FD - return false; -} - -#ifdef HAVE_POSIX_SPAWN -static bool RedirectIO_PS(const Path *Path, int FD, std::string *ErrMsg, - posix_spawn_file_actions_t &FileActions) { - if (Path == 0) // Noop - return false; - const char *File; - if (Path->isEmpty()) - // Redirect empty paths to /dev/null - File = "/dev/null"; - else - File = Path->c_str(); - - if (int Err = posix_spawn_file_actions_addopen(&FileActions, FD, - File, FD == 0 ? O_RDONLY : O_WRONLY|O_CREAT, 0666)) - return MakeErrMsg(ErrMsg, "Cannot dup2", Err); - return false; -} -#endif - -static void TimeOutHandler(int Sig) { -} - -static void SetMemoryLimits (unsigned size) -{ -#if HAVE_SYS_RESOURCE_H && HAVE_GETRLIMIT && HAVE_SETRLIMIT - struct rlimit r; - __typeof__ (r.rlim_cur) limit = (__typeof__ (r.rlim_cur)) (size) * 1048576; - - // Heap size - getrlimit (RLIMIT_DATA, &r); - r.rlim_cur = limit; - setrlimit (RLIMIT_DATA, &r); -#ifdef RLIMIT_RSS - // Resident set size. - getrlimit (RLIMIT_RSS, &r); - r.rlim_cur = limit; - setrlimit (RLIMIT_RSS, &r); -#endif -#ifdef RLIMIT_AS // e.g. NetBSD doesn't have it. - // Virtual memory. - getrlimit (RLIMIT_AS, &r); - r.rlim_cur = limit; - setrlimit (RLIMIT_AS, &r); -#endif -#endif -} - -bool -Program::Execute(const Path &path, const char **args, const char **envp, - const Path **redirects, unsigned memoryLimit, - std::string *ErrMsg) { - // If this OS has posix_spawn and there is no memory limit being implied, use - // posix_spawn. It is more efficient than fork/exec. -#ifdef HAVE_POSIX_SPAWN - if (memoryLimit == 0) { - posix_spawn_file_actions_t FileActions; - posix_spawn_file_actions_init(&FileActions); - - if (redirects) { - // Redirect stdin/stdout. - if (RedirectIO_PS(redirects[0], 0, ErrMsg, FileActions) || - RedirectIO_PS(redirects[1], 1, ErrMsg, FileActions)) - return false; - if (redirects[1] == 0 || redirects[2] == 0 || - *redirects[1] != *redirects[2]) { - // Just redirect stderr - if (RedirectIO_PS(redirects[2], 2, ErrMsg, FileActions)) return false; - } else { - // If stdout and stderr should go to the same place, redirect stderr - // to the FD already open for stdout. - if (int Err = posix_spawn_file_actions_adddup2(&FileActions, 1, 2)) - return !MakeErrMsg(ErrMsg, "Can't redirect stderr to stdout", Err); - } - } - - if (!envp) -#if !defined(__APPLE__) - envp = const_cast(environ); -#else - // environ is missing in dylibs. - envp = const_cast(*_NSGetEnviron()); -#endif - - // Explicitly initialized to prevent what appears to be a valgrind false - // positive. - pid_t PID = 0; - int Err = posix_spawn(&PID, path.c_str(), &FileActions, /*attrp*/0, - const_cast(args), const_cast(envp)); - - posix_spawn_file_actions_destroy(&FileActions); - - if (Err) - return !MakeErrMsg(ErrMsg, "posix_spawn failed", Err); - - Data_ = reinterpret_cast(PID); - return true; - } -#endif - - // Create a child process. - int child = fork(); - switch (child) { - // An error occured: Return to the caller. - case -1: - MakeErrMsg(ErrMsg, "Couldn't fork"); - return false; - - // Child process: Execute the program. - case 0: { - // Redirect file descriptors... - if (redirects) { - // Redirect stdin - if (RedirectIO(redirects[0], 0, ErrMsg)) { return false; } - // Redirect stdout - if (RedirectIO(redirects[1], 1, ErrMsg)) { return false; } - if (redirects[1] && redirects[2] && - *(redirects[1]) == *(redirects[2])) { - // If stdout and stderr should go to the same place, redirect stderr - // to the FD already open for stdout. - if (-1 == dup2(1,2)) { - MakeErrMsg(ErrMsg, "Can't redirect stderr to stdout"); - return false; - } - } else { - // Just redirect stderr - if (RedirectIO(redirects[2], 2, ErrMsg)) { return false; } - } - } - - // Set memory limits - if (memoryLimit!=0) { - SetMemoryLimits(memoryLimit); - } - - // Execute! - if (envp != 0) - execve(path.c_str(), - const_cast(args), - const_cast(envp)); - else - execv(path.c_str(), - const_cast(args)); - // If the execve() failed, we should exit. Follow Unix protocol and - // return 127 if the executable was not found, and 126 otherwise. - // Use _exit rather than exit so that atexit functions and static - // object destructors cloned from the parent process aren't - // redundantly run, and so that any data buffered in stdio buffers - // cloned from the parent aren't redundantly written out. - _exit(errno == ENOENT ? 127 : 126); - } - - // Parent process: Break out of the switch to do our processing. - default: - break; - } - - Data_ = reinterpret_cast(child); - - return true; -} - -int -Program::Wait(const sys::Path &path, - unsigned secondsToWait, - std::string* ErrMsg) -{ -#ifdef HAVE_SYS_WAIT_H - struct sigaction Act, Old; - - if (Data_ == 0) { - MakeErrMsg(ErrMsg, "Process not started!"); - return -1; - } - - // Install a timeout handler. The handler itself does nothing, but the simple - // fact of having a handler at all causes the wait below to return with EINTR, - // unlike if we used SIG_IGN. - if (secondsToWait) { - memset(&Act, 0, sizeof(Act)); - Act.sa_handler = TimeOutHandler; - sigemptyset(&Act.sa_mask); - sigaction(SIGALRM, &Act, &Old); - alarm(secondsToWait); - } - - // Parent process: Wait for the child process to terminate. - int status; - uint64_t pid = reinterpret_cast(Data_); - pid_t child = static_cast(pid); - while (waitpid(pid, &status, 0) != child) - if (secondsToWait && errno == EINTR) { - // Kill the child. - kill(child, SIGKILL); - - // Turn off the alarm and restore the signal handler - alarm(0); - sigaction(SIGALRM, &Old, 0); - - // Wait for child to die - if (wait(&status) != child) - MakeErrMsg(ErrMsg, "Child timed out but wouldn't die"); - else - MakeErrMsg(ErrMsg, "Child timed out", 0); - - return -1; // Timeout detected - } else if (errno != EINTR) { - MakeErrMsg(ErrMsg, "Error waiting for child process"); - return -1; - } - - // We exited normally without timeout, so turn off the timer. - if (secondsToWait) { - alarm(0); - sigaction(SIGALRM, &Old, 0); - } - - // Return the proper exit status. Detect error conditions - // so we can return -1 for them and set ErrMsg informatively. - int result = 0; - if (WIFEXITED(status)) { - result = WEXITSTATUS(status); -#ifdef HAVE_POSIX_SPAWN - // The posix_spawn child process returns 127 on any kind of error. - // Following the POSIX convention for command-line tools (which posix_spawn - // itself apparently does not), check to see if the failure was due to some - // reason other than the file not existing, and return 126 in this case. - if (result == 127 && path.exists()) - result = 126; -#endif - if (result == 127) { - if (ErrMsg) - *ErrMsg = llvm::sys::StrError(ENOENT); - return -1; - } - if (result == 126) { - if (ErrMsg) - *ErrMsg = "Program could not be executed"; - return -1; - } - } else if (WIFSIGNALED(status)) { - if (ErrMsg) { - *ErrMsg = strsignal(WTERMSIG(status)); -#ifdef WCOREDUMP - if (WCOREDUMP(status)) - *ErrMsg += " (core dumped)"; -#endif - } - return -1; - } - return result; -#else - if (ErrMsg) - *ErrMsg = "Program::Wait is not implemented on this platform yet!"; - return -1; -#endif -} - -bool -Program::Kill(std::string* ErrMsg) { - if (Data_ == 0) { - MakeErrMsg(ErrMsg, "Process not started!"); - return true; - } - - uint64_t pid64 = reinterpret_cast(Data_); - pid_t pid = static_cast(pid64); - - if (kill(pid, SIGKILL) != 0) { - MakeErrMsg(ErrMsg, "The process couldn't be killed!"); - return true; - } - - return false; -} - -bool Program::ChangeStdinToBinary(){ - // Do nothing, as Unix doesn't differentiate between text and binary. - return false; -} - -bool Program::ChangeStdoutToBinary(){ - // Do nothing, as Unix doesn't differentiate between text and binary. - return false; -} - -bool Program::ChangeStderrToBinary(){ - // Do nothing, as Unix doesn't differentiate between text and binary. - return false; -} - -} Removed: llvm/trunk/lib/System/Unix/README.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/README.txt?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/README.txt (original) +++ llvm/trunk/lib/System/Unix/README.txt (removed) @@ -1,16 +0,0 @@ -llvm/lib/System/Unix README -=========================== - -This directory provides implementations of the lib/System classes that -are common to two or more variants of UNIX. For example, the directory -structure underneath this directory could look like this: - -Unix - only code that is truly generic to all UNIX platforms - Posix - code that is specific to Posix variants of UNIX - SUS - code that is specific to the Single Unix Specification - SysV - code that is specific to System V variants of UNIX - -As a rule, only those directories actually needing to be created should be -created. Also, further subdirectories could be created to reflect versions of -the various standards. For example, under SUS there could be v1, v2, and v3 -subdirectories to reflect the three major versions of SUS. Removed: llvm/trunk/lib/System/Unix/RWMutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/RWMutex.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/RWMutex.inc (original) +++ llvm/trunk/lib/System/Unix/RWMutex.inc (removed) @@ -1,43 +0,0 @@ -//= llvm/System/Unix/RWMutex.inc - Unix Reader/Writer Mutual Exclusion Lock =// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific (non-pthread) RWMutex class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -namespace llvm { - -using namespace sys; - -RWMutexImpl::RWMutexImpl() { } - -RWMutexImpl::~RWMutexImpl() { } - -bool RWMutexImpl::reader_acquire() { - return true; -} - -bool RWMutexImpl::reader_release() { - return true; -} - -bool RWMutexImpl::writer_acquire() { - return true; -} - -bool RWMutexImpl::writer_release() { - return true; -} - -} Removed: llvm/trunk/lib/System/Unix/Signals.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Signals.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Signals.inc (original) +++ llvm/trunk/lib/System/Unix/Signals.inc (removed) @@ -1,303 +0,0 @@ -//===- Signals.cpp - Generic Unix Signals Implementation -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines some helpful functions for dealing with the possibility of -// Unix signals occuring while your program is running. -// -//===----------------------------------------------------------------------===// - -#include "Unix.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/System/Mutex.h" -#include -#include -#if HAVE_EXECINFO_H -# include // For backtrace(). -#endif -#if HAVE_SIGNAL_H -#include -#endif -#if HAVE_SYS_STAT_H -#include -#endif -#if HAVE_DLFCN_H && __GNUG__ -#include -#include -#endif -using namespace llvm; - -static RETSIGTYPE SignalHandler(int Sig); // defined below. - -static SmartMutex SignalsMutex; - -/// InterruptFunction - The function to call if ctrl-c is pressed. -static void (*InterruptFunction)() = 0; - -static std::vector FilesToRemove; -static std::vector > CallBacksToRun; - -// IntSigs - Signals that may interrupt the program at any time. -static const int IntSigs[] = { - SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGTERM, SIGUSR1, SIGUSR2 -}; -static const int *const IntSigsEnd = - IntSigs + sizeof(IntSigs) / sizeof(IntSigs[0]); - -// KillSigs - Signals that are synchronous with the program that will cause it -// to die. -static const int KillSigs[] = { - SIGILL, SIGTRAP, SIGABRT, SIGFPE, SIGBUS, SIGSEGV -#ifdef SIGSYS - , SIGSYS -#endif -#ifdef SIGXCPU - , SIGXCPU -#endif -#ifdef SIGXFSZ - , SIGXFSZ -#endif -#ifdef SIGEMT - , SIGEMT -#endif -}; -static const int *const KillSigsEnd = - KillSigs + sizeof(KillSigs) / sizeof(KillSigs[0]); - -static unsigned NumRegisteredSignals = 0; -static struct { - struct sigaction SA; - int SigNo; -} RegisteredSignalInfo[(sizeof(IntSigs)+sizeof(KillSigs))/sizeof(KillSigs[0])]; - - -static void RegisterHandler(int Signal) { - assert(NumRegisteredSignals < - sizeof(RegisteredSignalInfo)/sizeof(RegisteredSignalInfo[0]) && - "Out of space for signal handlers!"); - - struct sigaction NewHandler; - - NewHandler.sa_handler = SignalHandler; - NewHandler.sa_flags = SA_NODEFER|SA_RESETHAND; - sigemptyset(&NewHandler.sa_mask); - - // Install the new handler, save the old one in RegisteredSignalInfo. - sigaction(Signal, &NewHandler, - &RegisteredSignalInfo[NumRegisteredSignals].SA); - RegisteredSignalInfo[NumRegisteredSignals].SigNo = Signal; - ++NumRegisteredSignals; -} - -static void RegisterHandlers() { - // If the handlers are already registered, we're done. - if (NumRegisteredSignals != 0) return; - - std::for_each(IntSigs, IntSigsEnd, RegisterHandler); - std::for_each(KillSigs, KillSigsEnd, RegisterHandler); -} - -static void UnregisterHandlers() { - // Restore all of the signal handlers to how they were before we showed up. - for (unsigned i = 0, e = NumRegisteredSignals; i != e; ++i) - sigaction(RegisteredSignalInfo[i].SigNo, - &RegisteredSignalInfo[i].SA, 0); - NumRegisteredSignals = 0; -} - - -/// RemoveFilesToRemove - Process the FilesToRemove list. This function -/// should be called with the SignalsMutex lock held. -static void RemoveFilesToRemove() { - while (!FilesToRemove.empty()) { - FilesToRemove.back().eraseFromDisk(true); - FilesToRemove.pop_back(); - } -} - -// SignalHandler - The signal handler that runs. -static RETSIGTYPE SignalHandler(int Sig) { - // Restore the signal behavior to default, so that the program actually - // crashes when we return and the signal reissues. This also ensures that if - // we crash in our signal handler that the program will terminate immediately - // instead of recursing in the signal handler. - UnregisterHandlers(); - - // Unmask all potentially blocked kill signals. - sigset_t SigMask; - sigfillset(&SigMask); - sigprocmask(SIG_UNBLOCK, &SigMask, 0); - - SignalsMutex.acquire(); - RemoveFilesToRemove(); - - if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) { - if (InterruptFunction) { - void (*IF)() = InterruptFunction; - SignalsMutex.release(); - InterruptFunction = 0; - IF(); // run the interrupt function. - return; - } - - SignalsMutex.release(); - raise(Sig); // Execute the default handler. - return; - } - - SignalsMutex.release(); - - // Otherwise if it is a fault (like SEGV) run any handler. - for (unsigned i = 0, e = CallBacksToRun.size(); i != e; ++i) - CallBacksToRun[i].first(CallBacksToRun[i].second); -} - -void llvm::sys::RunInterruptHandlers() { - SignalsMutex.acquire(); - RemoveFilesToRemove(); - SignalsMutex.release(); -} - -void llvm::sys::SetInterruptFunction(void (*IF)()) { - SignalsMutex.acquire(); - InterruptFunction = IF; - SignalsMutex.release(); - RegisterHandlers(); -} - -// RemoveFileOnSignal - The public API -bool llvm::sys::RemoveFileOnSignal(const sys::Path &Filename, - std::string* ErrMsg) { - SignalsMutex.acquire(); - FilesToRemove.push_back(Filename); - - SignalsMutex.release(); - - RegisterHandlers(); - return false; -} - -// DontRemoveFileOnSignal - The public API -void llvm::sys::DontRemoveFileOnSignal(const sys::Path &Filename) { - SignalsMutex.acquire(); - std::vector::reverse_iterator I = - std::find(FilesToRemove.rbegin(), FilesToRemove.rend(), Filename); - if (I != FilesToRemove.rend()) - FilesToRemove.erase(I.base()-1); - SignalsMutex.release(); -} - -/// AddSignalHandler - Add a function to be called when a signal is delivered -/// to the process. The handler can have a cookie passed to it to identify -/// what instance of the handler it is. -void llvm::sys::AddSignalHandler(void (*FnPtr)(void *), void *Cookie) { - CallBacksToRun.push_back(std::make_pair(FnPtr, Cookie)); - RegisterHandlers(); -} - - -// PrintStackTrace - In the case of a program crash or fault, print out a stack -// trace so that the user has an indication of why and where we died. -// -// On glibc systems we have the 'backtrace' function, which works nicely, but -// doesn't demangle symbols. -static void PrintStackTrace(void *) { -#ifdef HAVE_BACKTRACE - static void* StackTrace[256]; - // Use backtrace() to output a backtrace on Linux systems with glibc. - int depth = backtrace(StackTrace, - static_cast(array_lengthof(StackTrace))); -#if HAVE_DLFCN_H && __GNUG__ - int width = 0; - for (int i = 0; i < depth; ++i) { - Dl_info dlinfo; - dladdr(StackTrace[i], &dlinfo); - const char* name = strrchr(dlinfo.dli_fname, '/'); - - int nwidth; - if (name == NULL) nwidth = strlen(dlinfo.dli_fname); - else nwidth = strlen(name) - 1; - - if (nwidth > width) width = nwidth; - } - - for (int i = 0; i < depth; ++i) { - Dl_info dlinfo; - dladdr(StackTrace[i], &dlinfo); - - fprintf(stderr, "%-2d", i); - - const char* name = strrchr(dlinfo.dli_fname, '/'); - if (name == NULL) fprintf(stderr, " %-*s", width, dlinfo.dli_fname); - else fprintf(stderr, " %-*s", width, name+1); - - fprintf(stderr, " %#0*lx", - (int)(sizeof(void*) * 2) + 2, (unsigned long)StackTrace[i]); - - if (dlinfo.dli_sname != NULL) { - int res; - fputc(' ', stderr); - char* d = abi::__cxa_demangle(dlinfo.dli_sname, NULL, NULL, &res); - if (d == NULL) fputs(dlinfo.dli_sname, stderr); - else fputs(d, stderr); - free(d); - - fprintf(stderr, " + %tu",(char*)StackTrace[i]-(char*)dlinfo.dli_saddr); - } - fputc('\n', stderr); - } -#else - backtrace_symbols_fd(StackTrace, depth, STDERR_FILENO); -#endif -#endif -} - -/// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or -/// SIGSEGV) is delivered to the process, print a stack trace and then exit. -void llvm::sys::PrintStackTraceOnErrorSignal() { - AddSignalHandler(PrintStackTrace, 0); -} - - -/***/ - -// On Darwin, raise sends a signal to the main thread instead of the current -// thread. This has the unfortunate effect that assert() and abort() will end up -// bypassing our crash recovery attempts. We work around this for anything in -// the same linkage unit by just defining our own versions of the assert handler -// and abort. - -#ifdef __APPLE__ - -int raise(int sig) { - return pthread_kill(pthread_self(), sig); -} - -void __assert_rtn(const char *func, - const char *file, - int line, - const char *expr) { - if (func) - fprintf(stderr, "Assertion failed: (%s), function %s, file %s, line %d.\n", - expr, func, file, line); - else - fprintf(stderr, "Assertion failed: (%s), file %s, line %d.\n", - expr, file, line); - abort(); -} - -#include -#include - -void abort() { - raise(SIGABRT); - usleep(1000); - __builtin_trap(); -} - -#endif Removed: llvm/trunk/lib/System/Unix/ThreadLocal.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/ThreadLocal.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/ThreadLocal.inc (original) +++ llvm/trunk/lib/System/Unix/ThreadLocal.inc (removed) @@ -1,26 +0,0 @@ -//=== llvm/System/Unix/ThreadLocal.inc - Unix Thread Local Data -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific (non-pthread) ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -namespace llvm { -using namespace sys; -ThreadLocalImpl::ThreadLocalImpl() { } -ThreadLocalImpl::~ThreadLocalImpl() { } -void ThreadLocalImpl::setInstance(const void* d) { data = const_cast(d);} -const void* ThreadLocalImpl::getInstance() { return data; } -void ThreadLocalImpl::removeInstance() { setInstance(0); } -} Removed: llvm/trunk/lib/System/Unix/TimeValue.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/TimeValue.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/TimeValue.inc (original) +++ llvm/trunk/lib/System/Unix/TimeValue.inc (removed) @@ -1,56 +0,0 @@ -//===- Unix/TimeValue.cpp - Unix TimeValue Implementation -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific portion of the TimeValue class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include "Unix.h" - -namespace llvm { - using namespace sys; - -std::string TimeValue::str() const { - char buffer[32]; - - time_t ourTime = time_t(this->toEpochTime()); -#ifdef __hpux -// note that the following line needs -D_REENTRANT on HP-UX to be picked up - asctime_r(localtime(&ourTime), buffer); -#else - ::asctime_r(::localtime(&ourTime), buffer); -#endif - - std::string result(buffer); - return result.substr(0,24); -} - -TimeValue TimeValue::now() { - struct timeval the_time; - timerclear(&the_time); - if (0 != ::gettimeofday(&the_time,0)) { - // This is *really* unlikely to occur because the only gettimeofday - // errors concern the timezone parameter which we're passing in as 0. - // In the unlikely case it does happen, just return MinTime, no error - // message needed. - return MinTime; - } - - return TimeValue( - static_cast( the_time.tv_sec + PosixZeroTime.seconds_ ), - static_cast( the_time.tv_usec * - NANOSECONDS_PER_MICROSECOND ) ); -} - -} Removed: llvm/trunk/lib/System/Unix/Unix.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Unix.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/Unix.h (original) +++ llvm/trunk/lib/System/Unix/Unix.h (removed) @@ -1,87 +0,0 @@ -//===- llvm/System/Unix/Unix.h - Common Unix Include File -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines things specific to Unix implementations. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SYSTEM_UNIX_UNIX_H -#define LLVM_SYSTEM_UNIX_UNIX_H - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on all UNIX variants. -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" // Get autoconf configuration settings -#include "llvm/System/Errno.h" -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_SYS_PARAM_H -#include -#endif - -#ifdef HAVE_ASSERT_H -#include -#endif - -#ifdef TIME_WITH_SYS_TIME -# include -# include -#else -# ifdef HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - -#ifdef HAVE_SYS_WAIT_H -# include -#endif - -#ifndef WEXITSTATUS -# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) -#endif - -#ifndef WIFEXITED -# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) -#endif - -/// This function builds an error message into \p ErrMsg using the \p prefix -/// string and the Unix error number given by \p errnum. If errnum is -1, the -/// default then the value of errno is used. -/// @brief Make an error message -/// -/// If the error number can be converted to a string, it will be -/// separated from prefix by ": ". -static inline bool MakeErrMsg( - std::string* ErrMsg, const std::string& prefix, int errnum = -1) { - if (!ErrMsg) - return true; - if (errnum == -1) - errnum = errno; - *ErrMsg = prefix + ": " + llvm::sys::StrError(errnum); - return true; -} - -#endif Removed: llvm/trunk/lib/System/Unix/system_error.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/system_error.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Unix/system_error.inc (original) +++ llvm/trunk/lib/System/Unix/system_error.inc (removed) @@ -1,34 +0,0 @@ -//===- llvm/System/Unix/system_error.inc - Unix error_code ------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Unix specific implementation of the error_code -// and error_condition classes. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -using namespace llvm; - -std::string -_system_error_category::message(int ev) const { - return _do_message::message(ev); -} - -error_condition -_system_error_category::default_error_condition(int ev) const { -#ifdef ELAST - if (ev > ELAST) - return error_condition(ev, system_category()); -#endif // ELAST - return error_condition(ev, generic_category()); -} Removed: llvm/trunk/lib/System/Valgrind.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Valgrind.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Valgrind.cpp (original) +++ llvm/trunk/lib/System/Valgrind.cpp (removed) @@ -1,54 +0,0 @@ -//===-- Valgrind.cpp - Implement Valgrind communication ---------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Defines Valgrind communication methods, if HAVE_VALGRIND_VALGRIND_H is -// defined. If we have valgrind.h but valgrind isn't running, its macros are -// no-ops. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/Valgrind.h" -#include "llvm/Config/config.h" - -#if HAVE_VALGRIND_VALGRIND_H -#include - -static bool InitNotUnderValgrind() { - return !RUNNING_ON_VALGRIND; -} - -// This bool is negated from what we'd expect because code may run before it -// gets initialized. If that happens, it will appear to be 0 (false), and we -// want that to cause the rest of the code in this file to run the -// Valgrind-provided macros. -static const bool NotUnderValgrind = InitNotUnderValgrind(); - -bool llvm::sys::RunningOnValgrind() { - if (NotUnderValgrind) - return false; - return RUNNING_ON_VALGRIND; -} - -void llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) { - if (NotUnderValgrind) - return; - - VALGRIND_DISCARD_TRANSLATIONS(Addr, Len); -} - -#else // !HAVE_VALGRIND_VALGRIND_H - -bool llvm::sys::RunningOnValgrind() { - return false; -} - -void llvm::sys::ValgrindDiscardTranslations(const void *Addr, size_t Len) { -} - -#endif // !HAVE_VALGRIND_VALGRIND_H Removed: llvm/trunk/lib/System/Win32/Alarm.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Alarm.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Alarm.inc (original) +++ llvm/trunk/lib/System/Win32/Alarm.inc (removed) @@ -1,43 +0,0 @@ -//===-- Alarm.inc - Implement Win32 Alarm Support ---------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Win32 Alarm support. -// -//===----------------------------------------------------------------------===// - -#include -using namespace llvm; - -/// NestedSOI - Sanity check. Alarms cannot be nested or run in parallel. -/// This ensures that they never do. -static bool NestedSOI = false; - -void sys::SetupAlarm(unsigned seconds) { - assert(!NestedSOI && "sys::SetupAlarm calls cannot be nested!"); - NestedSOI = true; - // FIXME: Implement for Win32 -} - -void sys::TerminateAlarm() { - assert(NestedSOI && "sys::TerminateAlarm called without sys::SetupAlarm!"); - // FIXME: Implement for Win32 - NestedSOI = false; -} - -int sys::AlarmStatus() { - // FIXME: Implement for Win32 - return 0; -} - -// Don't pull in all of the Windows headers. -extern "C" void __stdcall Sleep(unsigned long); - -void sys::Sleep(unsigned n) { - ::Sleep(n*1000); -} Removed: llvm/trunk/lib/System/Win32/DynamicLibrary.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/DynamicLibrary.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/DynamicLibrary.inc (original) +++ llvm/trunk/lib/System/Win32/DynamicLibrary.inc (removed) @@ -1,200 +0,0 @@ -//===- Win32/DynamicLibrary.cpp - Win32 DL Implementation -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 specific implementation of DynamicLibrary. -// -//===----------------------------------------------------------------------===// - -#include "Win32.h" - -#ifdef __MINGW32__ - #include -#else - #include -#endif - -#ifdef _MSC_VER - #include -#endif - -#ifdef __MINGW32__ - #if (HAVE_LIBIMAGEHLP != 1) - #error "libimagehlp.a should be present" - #endif -#else - #pragma comment(lib, "dbghelp.lib") -#endif - -namespace llvm { -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code -//=== and must not be UNIX code. -//===----------------------------------------------------------------------===// - -static std::vector OpenedHandles; - -#ifdef _WIN64 - typedef DWORD64 ModuleBaseType; -#else - typedef ULONG ModuleBaseType; -#endif - -extern "C" { -// Use old callback if: -// - Not using Visual Studio -// - Visual Studio 2005 or earlier but only if we are not using the Windows SDK -// or Windows SDK version is older than 6.0 -// Use new callback if: -// - Newer Visual Studio (comes with newer SDK). -// - Visual Studio 2005 with Windows SDK 6.0+ -#if !defined(_MSC_VER) || _MSC_VER < 1500 && (!defined(VER_PRODUCTBUILD) || VER_PRODUCTBUILD < 6000) - static BOOL CALLBACK ELM_Callback(PSTR ModuleName, - ModuleBaseType ModuleBase, - ULONG ModuleSize, - PVOID UserContext) -#else - static BOOL CALLBACK ELM_Callback(PCSTR ModuleName, - ModuleBaseType ModuleBase, - ULONG ModuleSize, - PVOID UserContext) -#endif - { - // Ignore VC++ runtimes prior to 7.1. Somehow some of them get loaded - // into the process. - if (stricmp(ModuleName, "msvci70") != 0 && - stricmp(ModuleName, "msvcirt") != 0 && - stricmp(ModuleName, "msvcp50") != 0 && - stricmp(ModuleName, "msvcp60") != 0 && - stricmp(ModuleName, "msvcp70") != 0 && - stricmp(ModuleName, "msvcr70") != 0 && -#ifndef __MINGW32__ - // Mingw32 uses msvcrt.dll by default. Don't ignore it. - // Otherwise, user should be aware, what he's doing :) - stricmp(ModuleName, "msvcrt") != 0 && -#endif - stricmp(ModuleName, "msvcrt20") != 0 && - stricmp(ModuleName, "msvcrt40") != 0) { - OpenedHandles.push_back((HMODULE)ModuleBase); - } - return TRUE; - } -} - -bool DynamicLibrary::LoadLibraryPermanently(const char *filename, - std::string *ErrMsg) { - if (filename) { - HMODULE a_handle = LoadLibrary(filename); - - if (a_handle == 0) - return MakeErrMsg(ErrMsg, std::string(filename) + ": Can't open : "); - - OpenedHandles.push_back(a_handle); - } else { - // When no file is specified, enumerate all DLLs and EXEs in the - // process. - EnumerateLoadedModules(GetCurrentProcess(), ELM_Callback, 0); - } - - // Because we don't remember the handle, we will never free it; hence, - // it is loaded permanently. - return false; -} - -// Stack probing routines are in the support library (e.g. libgcc), but we don't -// have dynamic linking on windows. Provide a hook. -#if defined(__MINGW32__) || defined (_MSC_VER) - #define EXPLICIT_SYMBOL(SYM) \ - if (!strcmp(symbolName, #SYM)) return (void*)&SYM - #define EXPLICIT_SYMBOL2(SYMFROM, SYMTO) \ - if (!strcmp(symbolName, #SYMFROM)) return (void*)&SYMTO - #define EXPLICIT_SYMBOL_DEF(SYM) \ - extern "C" { extern void *SYM; } - - #if defined(__MINGW32__) - EXPLICIT_SYMBOL_DEF(_alloca) - EXPLICIT_SYMBOL_DEF(__main) - EXPLICIT_SYMBOL_DEF(__ashldi3) - EXPLICIT_SYMBOL_DEF(__ashrdi3) - EXPLICIT_SYMBOL_DEF(__cmpdi2) - EXPLICIT_SYMBOL_DEF(__divdi3) - EXPLICIT_SYMBOL_DEF(__fixdfdi) - EXPLICIT_SYMBOL_DEF(__fixsfdi) - EXPLICIT_SYMBOL_DEF(__fixunsdfdi) - EXPLICIT_SYMBOL_DEF(__fixunssfdi) - EXPLICIT_SYMBOL_DEF(__floatdidf) - EXPLICIT_SYMBOL_DEF(__floatdisf) - EXPLICIT_SYMBOL_DEF(__lshrdi3) - EXPLICIT_SYMBOL_DEF(__moddi3) - EXPLICIT_SYMBOL_DEF(__udivdi3) - EXPLICIT_SYMBOL_DEF(__umoddi3) - #elif defined(_MSC_VER) - EXPLICIT_SYMBOL_DEF(_alloca_probe) - #endif -#endif - -void* DynamicLibrary::SearchForAddressOfSymbol(const char* symbolName) { - // First check symbols added via AddSymbol(). - if (ExplicitSymbols) { - std::map::iterator I = - ExplicitSymbols->find(symbolName); - std::map::iterator E = ExplicitSymbols->end(); - if (I != E) - return I->second; - } - - // Now search the libraries. - for (std::vector::iterator I = OpenedHandles.begin(), - E = OpenedHandles.end(); I != E; ++I) { - FARPROC ptr = GetProcAddress((HMODULE)*I, symbolName); - if (ptr) { - return (void *) ptr; - } - } - -#if defined(__MINGW32__) - { - EXPLICIT_SYMBOL(_alloca); - EXPLICIT_SYMBOL(__main); - EXPLICIT_SYMBOL(__ashldi3); - EXPLICIT_SYMBOL(__ashrdi3); - EXPLICIT_SYMBOL(__cmpdi2); - EXPLICIT_SYMBOL(__divdi3); - EXPLICIT_SYMBOL(__fixdfdi); - EXPLICIT_SYMBOL(__fixsfdi); - EXPLICIT_SYMBOL(__fixunsdfdi); - EXPLICIT_SYMBOL(__fixunssfdi); - EXPLICIT_SYMBOL(__floatdidf); - EXPLICIT_SYMBOL(__floatdisf); - EXPLICIT_SYMBOL(__lshrdi3); - EXPLICIT_SYMBOL(__moddi3); - EXPLICIT_SYMBOL(__udivdi3); - EXPLICIT_SYMBOL(__umoddi3); - - EXPLICIT_SYMBOL2(alloca, _alloca); -#undef EXPLICIT_SYMBOL -#undef EXPLICIT_SYMBOL2 -#undef EXPLICIT_SYMBOL_DEF - } -#elif defined(_MSC_VER) - { - EXPLICIT_SYMBOL2(alloca, _alloca_probe); - EXPLICIT_SYMBOL2(_alloca, _alloca_probe); -#undef EXPLICIT_SYMBOL -#undef EXPLICIT_SYMBOL2 -#undef EXPLICIT_SYMBOL_DEF - } -#endif - - return 0; -} - -} - Removed: llvm/trunk/lib/System/Win32/Host.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Host.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Host.inc (original) +++ llvm/trunk/lib/System/Win32/Host.inc (removed) @@ -1,23 +0,0 @@ -//===- llvm/System/Win32/Host.inc -------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Win32 Host support. -// -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include -#include - -using namespace llvm; - -std::string sys::getHostTriple() { - // FIXME: Adapt to running version. - return LLVM_HOSTTRIPLE; -} Removed: llvm/trunk/lib/System/Win32/Memory.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Memory.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Memory.inc (original) +++ llvm/trunk/lib/System/Win32/Memory.inc (removed) @@ -1,73 +0,0 @@ -//===- Win32/Memory.cpp - Win32 Memory Implementation -----------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 specific implementation of various Memory -// management utilities -// -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include "llvm/System/DataTypes.h" -#include "llvm/System/Process.h" - -namespace llvm { -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code -//=== and must not be UNIX code -//===----------------------------------------------------------------------===// - -MemoryBlock Memory::AllocateRWX(size_t NumBytes, - const MemoryBlock *NearBlock, - std::string *ErrMsg) { - if (NumBytes == 0) return MemoryBlock(); - - static const size_t pageSize = Process::GetPageSize(); - size_t NumPages = (NumBytes+pageSize-1)/pageSize; - - //FIXME: support NearBlock if ever needed on Win64. - - void *pa = VirtualAlloc(NULL, NumPages*pageSize, MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (pa == NULL) { - MakeErrMsg(ErrMsg, "Can't allocate RWX Memory: "); - return MemoryBlock(); - } - - MemoryBlock result; - result.Address = pa; - result.Size = NumPages*pageSize; - return result; -} - -bool Memory::ReleaseRWX(MemoryBlock &M, std::string *ErrMsg) { - if (M.Address == 0 || M.Size == 0) return false; - if (!VirtualFree(M.Address, 0, MEM_RELEASE)) - return MakeErrMsg(ErrMsg, "Can't release RWX Memory: "); - return false; -} - -bool Memory::setWritable(MemoryBlock &M, std::string *ErrMsg) { - return true; -} - -bool Memory::setExecutable(MemoryBlock &M, std::string *ErrMsg) { - return false; -} - -bool Memory::setRangeWritable(const void *Addr, size_t Size) { - return true; -} - -bool Memory::setRangeExecutable(const void *Addr, size_t Size) { - return false; -} - -} Removed: llvm/trunk/lib/System/Win32/Mutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Mutex.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Mutex.inc (original) +++ llvm/trunk/lib/System/Win32/Mutex.inc (removed) @@ -1,58 +0,0 @@ -//===- llvm/System/Win32/Mutex.inc - Win32 Mutex Implementation -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Win32 specific (non-pthread) Mutex class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic Win32 code that -//=== is guaranteed to work on *all* Win32 variants. -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include "llvm/System/Mutex.h" - -namespace llvm { -using namespace sys; - -MutexImpl::MutexImpl(bool /*recursive*/) -{ - data_ = new CRITICAL_SECTION; - InitializeCriticalSection((LPCRITICAL_SECTION)data_); -} - -MutexImpl::~MutexImpl() -{ - DeleteCriticalSection((LPCRITICAL_SECTION)data_); - delete (LPCRITICAL_SECTION)data_; - data_ = 0; -} - -bool -MutexImpl::acquire() -{ - EnterCriticalSection((LPCRITICAL_SECTION)data_); - return true; -} - -bool -MutexImpl::release() -{ - LeaveCriticalSection((LPCRITICAL_SECTION)data_); - return true; -} - -bool -MutexImpl::tryacquire() -{ - return TryEnterCriticalSection((LPCRITICAL_SECTION)data_); -} - -} Removed: llvm/trunk/lib/System/Win32/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Path.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Path.inc (original) +++ llvm/trunk/lib/System/Win32/Path.inc (removed) @@ -1,918 +0,0 @@ -//===- llvm/System/Win32/Path.cpp - Win32 Path Implementation ---*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 specific implementation of the Path class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic Win32 code that -//=== is guaranteed to work on *all* Win32 variants. -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include -#include - -// We need to undo a macro defined in Windows.h, otherwise we won't compile: -#undef CopyFile -#undef GetCurrentDirectory - -// Windows happily accepts either forward or backward slashes, though any path -// returned by a Win32 API will have backward slashes. As LLVM code basically -// assumes forward slashes are used, backward slashs are converted where they -// can be introduced into a path. -// -// Another invariant is that a path ends with a slash if and only if the path -// is a root directory. Any other use of a trailing slash is stripped. Unlike -// in Unix, Windows has a rather complicated notion of a root path and this -// invariant helps simply the code. - -static void FlipBackSlashes(std::string& s) { - for (size_t i = 0; i < s.size(); i++) - if (s[i] == '\\') - s[i] = '/'; -} - -namespace llvm { -namespace sys { - -const char PathSeparator = ';'; - -StringRef Path::GetEXESuffix() { - return "exe"; -} - -Path::Path(llvm::StringRef p) - : path(p) { - FlipBackSlashes(path); -} - -Path::Path(const char *StrStart, unsigned StrLen) - : path(StrStart, StrLen) { - FlipBackSlashes(path); -} - -Path& -Path::operator=(StringRef that) { - path.assign(that.data(), that.size()); - FlipBackSlashes(path); - return *this; -} - -// push_back 0 on create, and pop_back on delete. -struct ScopedNullTerminator { - std::string &str; - ScopedNullTerminator(std::string &s) : str(s) { str.push_back(0); } - ~ScopedNullTerminator() { - // str.pop_back(); But wait, C++03 doesn't have this... - assert(!str.empty() && str[str.size() - 1] == 0 - && "Null char not present!"); - str.resize(str.size() - 1); - } -}; - -bool -Path::isValid() const { - if (path.empty()) - return false; - - // If there is a colon, it must be the second character, preceded by a letter - // and followed by something. - size_t len = path.size(); - // This code assumes that path is null terminated, so make sure it is. - ScopedNullTerminator snt(path); - size_t pos = path.rfind(':',len); - size_t rootslash = 0; - if (pos != std::string::npos) { - if (pos != 1 || !isalpha(path[0]) || len < 3) - return false; - rootslash = 2; - } - - // Look for a UNC path, and if found adjust our notion of the root slash. - if (len > 3 && path[0] == '/' && path[1] == '/') { - rootslash = path.find('/', 2); - if (rootslash == std::string::npos) - rootslash = 0; - } - - // Check for illegal characters. - if (path.find_first_of("\\<>\"|\001\002\003\004\005\006\007\010\011\012" - "\013\014\015\016\017\020\021\022\023\024\025\026" - "\027\030\031\032\033\034\035\036\037") - != std::string::npos) - return false; - - // Remove trailing slash, unless it's a root slash. - if (len > rootslash+1 && path[len-1] == '/') - path.erase(--len); - - // Check each component for legality. - for (pos = 0; pos < len; ++pos) { - // A component may not end in a space. - if (path[pos] == ' ') { - if (path[pos+1] == '/' || path[pos+1] == '\0') - return false; - } - - // A component may not end in a period. - if (path[pos] == '.') { - if (path[pos+1] == '/' || path[pos+1] == '\0') { - // Unless it is the pseudo-directory "."... - if (pos == 0 || path[pos-1] == '/' || path[pos-1] == ':') - return true; - // or "..". - if (pos > 0 && path[pos-1] == '.') { - if (pos == 1 || path[pos-2] == '/' || path[pos-2] == ':') - return true; - } - return false; - } - } - } - - return true; -} - -void Path::makeAbsolute() { - TCHAR FullPath[MAX_PATH + 1] = {0}; - LPTSTR FilePart = NULL; - - DWORD RetLength = ::GetFullPathNameA(path.c_str(), - sizeof(FullPath)/sizeof(FullPath[0]), - FullPath, &FilePart); - - if (0 == RetLength) { - // FIXME: Report the error GetLastError() - assert(0 && "Unable to make absolute path!"); - } else if (RetLength > MAX_PATH) { - // FIXME: Report too small buffer (needed RetLength bytes). - assert(0 && "Unable to make absolute path!"); - } else { - path = FullPath; - } -} - -bool -Path::isAbsolute(const char *NameStart, unsigned NameLen) { - assert(NameStart); - // FIXME: This does not handle correctly an absolute path starting from - // a drive letter or in UNC format. - switch (NameLen) { - case 0: - return false; - case 1: - case 2: - return NameStart[0] == '/'; - default: - return - (NameStart[0] == '/' || (NameStart[1] == ':' && NameStart[2] == '/')) || - (NameStart[0] == '\\' || (NameStart[1] == ':' && NameStart[2] == '\\')); - } -} - -bool -Path::isAbsolute() const { - // FIXME: This does not handle correctly an absolute path starting from - // a drive letter or in UNC format. - switch (path.length()) { - case 0: - return false; - case 1: - case 2: - return path[0] == '/'; - default: - return path[0] == '/' || (path[1] == ':' && path[2] == '/'); - } -} - -static Path *TempDirectory; - -Path -Path::GetTemporaryDirectory(std::string* ErrMsg) { - if (TempDirectory) - return *TempDirectory; - - char pathname[MAX_PATH]; - if (!GetTempPath(MAX_PATH, pathname)) { - if (ErrMsg) - *ErrMsg = "Can't determine temporary directory"; - return Path(); - } - - Path result; - result.set(pathname); - - // Append a subdirectory passed on our process id so multiple LLVMs don't - // step on each other's toes. -#ifdef __MINGW32__ - // Mingw's Win32 header files are broken. - sprintf(pathname, "LLVM_%u", unsigned(GetCurrentProcessId())); -#else - sprintf(pathname, "LLVM_%u", GetCurrentProcessId()); -#endif - result.appendComponent(pathname); - - // If there's a directory left over from a previous LLVM execution that - // happened to have the same process id, get rid of it. - result.eraseFromDisk(true); - - // And finally (re-)create the empty directory. - result.createDirectoryOnDisk(false); - TempDirectory = new Path(result); - return *TempDirectory; -} - -// FIXME: the following set of functions don't map to Windows very well. -Path -Path::GetRootDirectory() { - // This is the only notion that that Windows has of a root directory. Nothing - // is here except for drives. - return Path("file:///"); -} - -void -Path::GetSystemLibraryPaths(std::vector& Paths) { - char buff[MAX_PATH]; - // Generic form of C:\Windows\System32 - HRESULT res = SHGetFolderPathA(NULL, - CSIDL_FLAG_CREATE | CSIDL_SYSTEM, - NULL, - SHGFP_TYPE_CURRENT, - buff); - if (res != S_OK) { - assert(0 && "Failed to get system directory"); - return; - } - Paths.push_back(sys::Path(buff)); - - // Reset buff. - buff[0] = 0; - // Generic form of C:\Windows - res = SHGetFolderPathA(NULL, - CSIDL_FLAG_CREATE | CSIDL_WINDOWS, - NULL, - SHGFP_TYPE_CURRENT, - buff); - if (res != S_OK) { - assert(0 && "Failed to get windows directory"); - return; - } - Paths.push_back(sys::Path(buff)); -} - -void -Path::GetBitcodeLibraryPaths(std::vector& Paths) { - char * env_var = getenv("LLVM_LIB_SEARCH_PATH"); - if (env_var != 0) { - getPathList(env_var,Paths); - } -#ifdef LLVM_LIBDIR - { - Path tmpPath; - if (tmpPath.set(LLVM_LIBDIR)) - if (tmpPath.canRead()) - Paths.push_back(tmpPath); - } -#endif - GetSystemLibraryPaths(Paths); -} - -Path -Path::GetLLVMDefaultConfigDir() { - Path ret = GetUserHomeDirectory(); - if (!ret.appendComponent(".llvm")) - assert(0 && "Failed to append .llvm"); - return ret; -} - -Path -Path::GetUserHomeDirectory() { - char buff[MAX_PATH]; - HRESULT res = SHGetFolderPathA(NULL, - CSIDL_FLAG_CREATE | CSIDL_APPDATA, - NULL, - SHGFP_TYPE_CURRENT, - buff); - if (res != S_OK) - assert(0 && "Failed to get user home directory"); - return Path(buff); -} - -Path -Path::GetCurrentDirectory() { - char pathname[MAX_PATH]; - ::GetCurrentDirectoryA(MAX_PATH,pathname); - return Path(pathname); -} - -/// GetMainExecutable - Return the path to the main executable, given the -/// value of argv[0] from program startup. -Path Path::GetMainExecutable(const char *argv0, void *MainAddr) { - char pathname[MAX_PATH]; - DWORD ret = ::GetModuleFileNameA(NULL, pathname, MAX_PATH); - return ret != MAX_PATH ? Path(pathname) : Path(); -} - - -// FIXME: the above set of functions don't map to Windows very well. - - -StringRef Path::getDirname() const { - return getDirnameCharSep(path, "/"); -} - -StringRef -Path::getBasename() const { - // Find the last slash - size_t slash = path.rfind('/'); - if (slash == std::string::npos) - slash = 0; - else - slash++; - - size_t dot = path.rfind('.'); - if (dot == std::string::npos || dot < slash) - return StringRef(path).substr(slash); - else - return StringRef(path).substr(slash, dot - slash); -} - -StringRef -Path::getSuffix() const { - // Find the last slash - size_t slash = path.rfind('/'); - if (slash == std::string::npos) - slash = 0; - else - slash++; - - size_t dot = path.rfind('.'); - if (dot == std::string::npos || dot < slash) - return StringRef(""); - else - return StringRef(path).substr(dot + 1); -} - -bool -Path::exists() const { - DWORD attr = GetFileAttributes(path.c_str()); - return attr != INVALID_FILE_ATTRIBUTES; -} - -bool -Path::isDirectory() const { - DWORD attr = GetFileAttributes(path.c_str()); - return (attr != INVALID_FILE_ATTRIBUTES) && - (attr & FILE_ATTRIBUTE_DIRECTORY); -} - -bool -Path::isSymLink() const { - DWORD attributes = GetFileAttributes(path.c_str()); - - if (attributes == INVALID_FILE_ATTRIBUTES) - // There's no sane way to report this :(. - assert(0 && "GetFileAttributes returned INVALID_FILE_ATTRIBUTES"); - - // This isn't exactly what defines a NTFS symlink, but it is only true for - // paths that act like a symlink. - return attributes & FILE_ATTRIBUTE_REPARSE_POINT; -} - -bool -Path::canRead() const { - // FIXME: take security attributes into account. - DWORD attr = GetFileAttributes(path.c_str()); - return attr != INVALID_FILE_ATTRIBUTES; -} - -bool -Path::canWrite() const { - // FIXME: take security attributes into account. - DWORD attr = GetFileAttributes(path.c_str()); - return (attr != INVALID_FILE_ATTRIBUTES) && !(attr & FILE_ATTRIBUTE_READONLY); -} - -bool -Path::canExecute() const { - // FIXME: take security attributes into account. - DWORD attr = GetFileAttributes(path.c_str()); - return attr != INVALID_FILE_ATTRIBUTES; -} - -bool -Path::isRegularFile() const { - if (isDirectory()) - return false; - return true; -} - -StringRef -Path::getLast() const { - // Find the last slash - size_t pos = path.rfind('/'); - - // Handle the corner cases - if (pos == std::string::npos) - return path; - - // If the last character is a slash, we have a root directory - if (pos == path.length()-1) - return path; - - // Return everything after the last slash - return StringRef(path).substr(pos+1); -} - -const FileStatus * -PathWithStatus::getFileStatus(bool update, std::string *ErrStr) const { - if (!fsIsValid || update) { - WIN32_FILE_ATTRIBUTE_DATA fi; - if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &fi)) { - MakeErrMsg(ErrStr, "getStatusInfo():" + std::string(path) + - ": Can't get status: "); - return 0; - } - - status.fileSize = fi.nFileSizeHigh; - status.fileSize <<= sizeof(fi.nFileSizeHigh)*8; - status.fileSize += fi.nFileSizeLow; - - status.mode = fi.dwFileAttributes & FILE_ATTRIBUTE_READONLY ? 0555 : 0777; - status.user = 9999; // Not applicable to Windows, so... - status.group = 9999; // Not applicable to Windows, so... - - // FIXME: this is only unique if the file is accessed by the same file path. - // How do we do this for C:\dir\file and ..\dir\file ? Unix has inode - // numbers, but the concept doesn't exist in Windows. - status.uniqueID = 0; - for (unsigned i = 0; i < path.length(); ++i) - status.uniqueID += path[i]; - - ULARGE_INTEGER ui; - ui.LowPart = fi.ftLastWriteTime.dwLowDateTime; - ui.HighPart = fi.ftLastWriteTime.dwHighDateTime; - status.modTime.fromWin32Time(ui.QuadPart); - - status.isDir = fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; - fsIsValid = true; - } - return &status; -} - -bool Path::makeReadableOnDisk(std::string* ErrMsg) { - // All files are readable on Windows (ignoring security attributes). - return false; -} - -bool Path::makeWriteableOnDisk(std::string* ErrMsg) { - DWORD attr = GetFileAttributes(path.c_str()); - - // If it doesn't exist, we're done. - if (attr == INVALID_FILE_ATTRIBUTES) - return false; - - if (attr & FILE_ATTRIBUTE_READONLY) { - if (!SetFileAttributes(path.c_str(), attr & ~FILE_ATTRIBUTE_READONLY)) { - MakeErrMsg(ErrMsg, std::string(path) + ": Can't make file writable: "); - return true; - } - } - return false; -} - -bool Path::makeExecutableOnDisk(std::string* ErrMsg) { - // All files are executable on Windows (ignoring security attributes). - return false; -} - -bool -Path::getDirectoryContents(std::set& result, std::string* ErrMsg) const { - WIN32_FILE_ATTRIBUTE_DATA fi; - if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &fi)) { - MakeErrMsg(ErrMsg, path + ": can't get status of file"); - return true; - } - - if (!(fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - if (ErrMsg) - *ErrMsg = path + ": not a directory"; - return true; - } - - result.clear(); - WIN32_FIND_DATA fd; - std::string searchpath = path; - if (path.size() == 0 || searchpath[path.size()-1] == '/') - searchpath += "*"; - else - searchpath += "/*"; - - HANDLE h = FindFirstFile(searchpath.c_str(), &fd); - if (h == INVALID_HANDLE_VALUE) { - if (GetLastError() == ERROR_FILE_NOT_FOUND) - return true; // not really an error, now is it? - MakeErrMsg(ErrMsg, path + ": Can't read directory: "); - return true; - } - - do { - if (fd.cFileName[0] == '.') - continue; - Path aPath(path); - aPath.appendComponent(&fd.cFileName[0]); - result.insert(aPath); - } while (FindNextFile(h, &fd)); - - DWORD err = GetLastError(); - FindClose(h); - if (err != ERROR_NO_MORE_FILES) { - SetLastError(err); - MakeErrMsg(ErrMsg, path + ": Can't read directory: "); - return true; - } - return false; -} - -bool -Path::set(StringRef a_path) { - if (a_path.empty()) - return false; - std::string save(path); - path = a_path; - FlipBackSlashes(path); - if (!isValid()) { - path = save; - return false; - } - return true; -} - -bool -Path::appendComponent(StringRef name) { - if (name.empty()) - return false; - std::string save(path); - if (!path.empty()) { - size_t last = path.size() - 1; - if (path[last] != '/') - path += '/'; - } - path += name; - if (!isValid()) { - path = save; - return false; - } - return true; -} - -bool -Path::eraseComponent() { - size_t slashpos = path.rfind('/',path.size()); - if (slashpos == path.size() - 1 || slashpos == std::string::npos) - return false; - std::string save(path); - path.erase(slashpos); - if (!isValid()) { - path = save; - return false; - } - return true; -} - -bool -Path::eraseSuffix() { - size_t dotpos = path.rfind('.',path.size()); - size_t slashpos = path.rfind('/',path.size()); - if (dotpos != std::string::npos) { - if (slashpos == std::string::npos || dotpos > slashpos+1) { - std::string save(path); - path.erase(dotpos, path.size()-dotpos); - if (!isValid()) { - path = save; - return false; - } - return true; - } - } - return false; -} - -inline bool PathMsg(std::string* ErrMsg, const char* pathname, const char*msg) { - if (ErrMsg) - *ErrMsg = std::string(pathname) + ": " + std::string(msg); - return true; -} - -bool -Path::createDirectoryOnDisk(bool create_parents, std::string* ErrMsg) { - // Get a writeable copy of the path name - size_t len = path.length(); - char *pathname = reinterpret_cast(_alloca(len+2)); - path.copy(pathname, len); - pathname[len] = 0; - - // Make sure it ends with a slash. - if (len == 0 || pathname[len - 1] != '/') { - pathname[len] = '/'; - pathname[++len] = 0; - } - - // Determine starting point for initial / search. - char *next = pathname; - if (pathname[0] == '/' && pathname[1] == '/') { - // Skip host name. - next = strchr(pathname+2, '/'); - if (next == NULL) - return PathMsg(ErrMsg, pathname, "badly formed remote directory"); - - // Skip share name. - next = strchr(next+1, '/'); - if (next == NULL) - return PathMsg(ErrMsg, pathname,"badly formed remote directory"); - - next++; - if (*next == 0) - return PathMsg(ErrMsg, pathname, "badly formed remote directory"); - - } else { - if (pathname[1] == ':') - next += 2; // skip drive letter - if (*next == '/') - next++; // skip root directory - } - - // If we're supposed to create intermediate directories - if (create_parents) { - // Loop through the directory components until we're done - while (*next) { - next = strchr(next, '/'); - *next = 0; - if (!CreateDirectory(pathname, NULL) && - GetLastError() != ERROR_ALREADY_EXISTS) - return MakeErrMsg(ErrMsg, - std::string(pathname) + ": Can't create directory: "); - *next++ = '/'; - } - } else { - // Drop trailing slash. - pathname[len-1] = 0; - if (!CreateDirectory(pathname, NULL) && - GetLastError() != ERROR_ALREADY_EXISTS) { - return MakeErrMsg(ErrMsg, std::string(pathname) + - ": Can't create directory: "); - } - } - return false; -} - -bool -Path::createFileOnDisk(std::string* ErrMsg) { - // Create the file - HANDLE h = CreateFile(path.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, - FILE_ATTRIBUTE_NORMAL, NULL); - if (h == INVALID_HANDLE_VALUE) - return MakeErrMsg(ErrMsg, path + ": Can't create file: "); - - CloseHandle(h); - return false; -} - -bool -Path::eraseFromDisk(bool remove_contents, std::string *ErrStr) const { - WIN32_FILE_ATTRIBUTE_DATA fi; - if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &fi)) - return true; - - if (fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - // If it doesn't exist, we're done. - if (!exists()) - return false; - - char *pathname = reinterpret_cast(_alloca(path.length()+3)); - int lastchar = path.length() - 1 ; - path.copy(pathname, lastchar+1); - - // Make path end with '/*'. - if (pathname[lastchar] != '/') - pathname[++lastchar] = '/'; - pathname[lastchar+1] = '*'; - pathname[lastchar+2] = 0; - - if (remove_contents) { - WIN32_FIND_DATA fd; - HANDLE h = FindFirstFile(pathname, &fd); - - // It's a bad idea to alter the contents of a directory while enumerating - // its contents. So build a list of its contents first, then destroy them. - - if (h != INVALID_HANDLE_VALUE) { - std::vector list; - - do { - if (strcmp(fd.cFileName, ".") == 0) - continue; - if (strcmp(fd.cFileName, "..") == 0) - continue; - - Path aPath(path); - aPath.appendComponent(&fd.cFileName[0]); - list.push_back(aPath); - } while (FindNextFile(h, &fd)); - - DWORD err = GetLastError(); - FindClose(h); - if (err != ERROR_NO_MORE_FILES) { - SetLastError(err); - return MakeErrMsg(ErrStr, path + ": Can't read directory: "); - } - - for (std::vector::iterator I = list.begin(); I != list.end(); - ++I) { - Path &aPath = *I; - aPath.eraseFromDisk(true); - } - } else { - if (GetLastError() != ERROR_FILE_NOT_FOUND) - return MakeErrMsg(ErrStr, path + ": Can't read directory: "); - } - } - - pathname[lastchar] = 0; - if (!RemoveDirectory(pathname)) - return MakeErrMsg(ErrStr, - std::string(pathname) + ": Can't destroy directory: "); - return false; - } else { - // Read-only files cannot be deleted on Windows. Must remove the read-only - // attribute first. - if (fi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { - if (!SetFileAttributes(path.c_str(), - fi.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY)) - return MakeErrMsg(ErrStr, path + ": Can't destroy file: "); - } - - if (!DeleteFile(path.c_str())) - return MakeErrMsg(ErrStr, path + ": Can't destroy file: "); - return false; - } -} - -bool Path::getMagicNumber(std::string& Magic, unsigned len) const { - assert(len < 1024 && "Request for magic string too long"); - char* buf = reinterpret_cast(alloca(len)); - - HANDLE h = CreateFile(path.c_str(), - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - if (h == INVALID_HANDLE_VALUE) - return false; - - DWORD nRead = 0; - BOOL ret = ReadFile(h, buf, len, &nRead, NULL); - CloseHandle(h); - - if (!ret || nRead != len) - return false; - - Magic = std::string(buf, len); - return true; -} - -bool -Path::renamePathOnDisk(const Path& newName, std::string* ErrMsg) { - if (!MoveFileEx(path.c_str(), newName.c_str(), MOVEFILE_REPLACE_EXISTING)) - return MakeErrMsg(ErrMsg, "Can't move '" + path + "' to '" + newName.path - + "': "); - return false; -} - -bool -Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrMsg) const { - // FIXME: should work on directories also. - if (!si.isFile) { - return true; - } - - HANDLE h = CreateFile(path.c_str(), - FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - if (h == INVALID_HANDLE_VALUE) - return true; - - BY_HANDLE_FILE_INFORMATION bhfi; - if (!GetFileInformationByHandle(h, &bhfi)) { - DWORD err = GetLastError(); - CloseHandle(h); - SetLastError(err); - return MakeErrMsg(ErrMsg, path + ": GetFileInformationByHandle: "); - } - - ULARGE_INTEGER ui; - ui.QuadPart = si.modTime.toWin32Time(); - FILETIME ft; - ft.dwLowDateTime = ui.LowPart; - ft.dwHighDateTime = ui.HighPart; - BOOL ret = SetFileTime(h, NULL, &ft, &ft); - DWORD err = GetLastError(); - CloseHandle(h); - if (!ret) { - SetLastError(err); - return MakeErrMsg(ErrMsg, path + ": SetFileTime: "); - } - - // Best we can do with Unix permission bits is to interpret the owner - // writable bit. - if (si.mode & 0200) { - if (bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { - if (!SetFileAttributes(path.c_str(), - bhfi.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY)) - return MakeErrMsg(ErrMsg, path + ": SetFileAttributes: "); - } - } else { - if (!(bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) { - if (!SetFileAttributes(path.c_str(), - bhfi.dwFileAttributes | FILE_ATTRIBUTE_READONLY)) - return MakeErrMsg(ErrMsg, path + ": SetFileAttributes: "); - } - } - - return false; -} - -bool -CopyFile(const sys::Path &Dest, const sys::Path &Src, std::string* ErrMsg) { - // Can't use CopyFile macro defined in Windows.h because it would mess up the - // above line. We use the expansion it would have in a non-UNICODE build. - if (!::CopyFileA(Src.c_str(), Dest.c_str(), false)) - return MakeErrMsg(ErrMsg, "Can't copy '" + Src.str() + - "' to '" + Dest.str() + "': "); - return false; -} - -bool -Path::makeUnique(bool reuse_current, std::string* ErrMsg) { - if (reuse_current && !exists()) - return false; // File doesn't exist already, just use it! - - // Reserve space for -XXXXXX at the end. - char *FNBuffer = (char*) alloca(path.size()+8); - unsigned offset = path.size(); - path.copy(FNBuffer, offset); - - // Find a numeric suffix that isn't used by an existing file. Assume there - // won't be more than 1 million files with the same prefix. Probably a safe - // bet. - static unsigned FCounter = 0; - do { - sprintf(FNBuffer+offset, "-%06u", FCounter); - if (++FCounter > 999999) - FCounter = 0; - path = FNBuffer; - } while (exists()); - return false; -} - -bool -Path::createTemporaryFileOnDisk(bool reuse_current, std::string* ErrMsg) { - // Make this into a unique file name - makeUnique(reuse_current, ErrMsg); - - // Now go and create it - HANDLE h = CreateFile(path.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, - FILE_ATTRIBUTE_NORMAL, NULL); - if (h == INVALID_HANDLE_VALUE) - return MakeErrMsg(ErrMsg, path + ": can't create file"); - - CloseHandle(h); - return false; -} - -/// MapInFilePages - Not yet implemented on win32. -const char *Path::MapInFilePages(int FD, uint64_t FileSize) { - return 0; -} - -/// MapInFilePages - Not yet implemented on win32. -void Path::UnMapFilePages(const char *Base, uint64_t FileSize) { - assert(0 && "NOT IMPLEMENTED"); -} - -} -} Removed: llvm/trunk/lib/System/Win32/Process.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Process.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Process.inc (original) +++ llvm/trunk/lib/System/Win32/Process.inc (removed) @@ -1,222 +0,0 @@ -//===- Win32/Process.cpp - Win32 Process Implementation ------- -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 specific implementation of the Process class. -// -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include -#include -#include - -#ifdef __MINGW32__ - #if (HAVE_LIBPSAPI != 1) - #error "libpsapi.a should be present" - #endif -#else - #pragma comment(lib, "psapi.lib") -#endif - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code -//=== and must not be UNIX code -//===----------------------------------------------------------------------===// - -#ifdef __MINGW32__ -// This ban should be lifted when MinGW 1.0+ has defined this value. -# define _HEAPOK (-2) -#endif - -namespace llvm { -using namespace sys; - -// This function retrieves the page size using GetSystemInfo and is present -// solely so it can be called once in Process::GetPageSize to initialize the -// static variable PageSize. -inline unsigned GetPageSizeOnce() { - // NOTE: A 32-bit application running under WOW64 is supposed to use - // GetNativeSystemInfo. However, this interface is not present prior - // to Windows XP so to use it requires dynamic linking. It is not clear - // how this affects the reported page size, if at all. One could argue - // that LLVM ought to run as 64-bits on a 64-bit system, anyway. - SYSTEM_INFO info; - GetSystemInfo(&info); - return static_cast(info.dwPageSize); -} - -unsigned -Process::GetPageSize() { - static const unsigned PageSize = GetPageSizeOnce(); - return PageSize; -} - -size_t -Process::GetMallocUsage() -{ - _HEAPINFO hinfo; - hinfo._pentry = NULL; - - size_t size = 0; - - while (_heapwalk(&hinfo) == _HEAPOK) - size += hinfo._size; - - return size; -} - -size_t -Process::GetTotalMemoryUsage() -{ - PROCESS_MEMORY_COUNTERS pmc; - GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)); - return pmc.PagefileUsage; -} - -void -Process::GetTimeUsage( - TimeValue& elapsed, TimeValue& user_time, TimeValue& sys_time) -{ - elapsed = TimeValue::now(); - - uint64_t ProcCreate, ProcExit, KernelTime, UserTime; - GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate, - (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, - (FILETIME*)&UserTime); - - // FILETIME's are # of 100 nanosecond ticks (1/10th of a microsecond) - user_time.seconds( UserTime / 10000000 ); - user_time.nanoseconds( unsigned(UserTime % 10000000) * 100 ); - sys_time.seconds( KernelTime / 10000000 ); - sys_time.nanoseconds( unsigned(KernelTime % 10000000) * 100 ); -} - -int Process::GetCurrentUserId() -{ - return 65536; -} - -int Process::GetCurrentGroupId() -{ - return 65536; -} - -// Some LLVM programs such as bugpoint produce core files as a normal part of -// their operation. To prevent the disk from filling up, this configuration item -// does what's necessary to prevent their generation. -void Process::PreventCoreFiles() { - // Windows doesn't do core files, but it does do modal pop-up message - // boxes. As this method is used by bugpoint, preventing these pop-ups - // is the moral equivalent of suppressing core files. - SetErrorMode(SEM_FAILCRITICALERRORS | - SEM_NOGPFAULTERRORBOX | - SEM_NOOPENFILEERRORBOX); -} - -bool Process::StandardInIsUserInput() { - return FileDescriptorIsDisplayed(0); -} - -bool Process::StandardOutIsDisplayed() { - return FileDescriptorIsDisplayed(1); -} - -bool Process::StandardErrIsDisplayed() { - return FileDescriptorIsDisplayed(2); -} - -bool Process::FileDescriptorIsDisplayed(int fd) { - DWORD Mode; // Unused - return (GetConsoleMode((HANDLE)_get_osfhandle(fd), &Mode) != 0); -} - -unsigned Process::StandardOutColumns() { - unsigned Columns = 0; - CONSOLE_SCREEN_BUFFER_INFO csbi; - if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) - Columns = csbi.dwSize.X; - return Columns; -} - -unsigned Process::StandardErrColumns() { - unsigned Columns = 0; - CONSOLE_SCREEN_BUFFER_INFO csbi; - if (GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &csbi)) - Columns = csbi.dwSize.X; - return Columns; -} - -// It always has colors. -bool Process::StandardErrHasColors() { - return StandardErrIsDisplayed(); -} - -bool Process::StandardOutHasColors() { - return StandardOutIsDisplayed(); -} - -namespace { -class DefaultColors -{ - private: - WORD defaultColor; - public: - DefaultColors() - :defaultColor(GetCurrentColor()) {} - static unsigned GetCurrentColor() { - CONSOLE_SCREEN_BUFFER_INFO csbi; - if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) - return csbi.wAttributes; - return 0; - } - WORD operator()() const { return defaultColor; } -}; - -DefaultColors defaultColors; -} - -bool Process::ColorNeedsFlush() { - return true; -} - -const char *Process::OutputBold(bool bg) { - WORD colors = DefaultColors::GetCurrentColor(); - if (bg) - colors |= BACKGROUND_INTENSITY; - else - colors |= FOREGROUND_INTENSITY; - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors); - return 0; -} - -const char *Process::OutputColor(char code, bool bold, bool bg) { - WORD colors; - if (bg) { - colors = ((code&1) ? BACKGROUND_RED : 0) | - ((code&2) ? BACKGROUND_GREEN : 0 ) | - ((code&4) ? BACKGROUND_BLUE : 0); - if (bold) - colors |= BACKGROUND_INTENSITY; - } else { - colors = ((code&1) ? FOREGROUND_RED : 0) | - ((code&2) ? FOREGROUND_GREEN : 0 ) | - ((code&4) ? FOREGROUND_BLUE : 0); - if (bold) - colors |= FOREGROUND_INTENSITY; - } - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors); - return 0; -} - -const char *Process::ResetColor() { - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), defaultColors()); - return 0; -} - -} Removed: llvm/trunk/lib/System/Win32/Program.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Program.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Program.inc (original) +++ llvm/trunk/lib/System/Win32/Program.inc (removed) @@ -1,412 +0,0 @@ -//===- Win32/Program.cpp - Win32 Program Implementation ------- -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 specific implementation of the Program class. -// -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include -#include -#include -#include - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code -//=== and must not be UNIX code -//===----------------------------------------------------------------------===// - -#ifdef __MINGW32__ -// Ancient mingw32's w32api might not have this declaration. -extern "C" -BOOL WINAPI SetInformationJobObject(HANDLE hJob, - JOBOBJECTINFOCLASS JobObjectInfoClass, - LPVOID lpJobObjectInfo, - DWORD cbJobObjectInfoLength); -#endif - -namespace { - struct Win32ProcessInfo { - HANDLE hProcess; - DWORD dwProcessId; - }; -} - -namespace llvm { -using namespace sys; - -Program::Program() : Data_(0) {} - -Program::~Program() { - if (Data_) { - Win32ProcessInfo* wpi = reinterpret_cast(Data_); - CloseHandle(wpi->hProcess); - delete wpi; - Data_ = 0; - } -} - -unsigned Program::GetPid() const { - Win32ProcessInfo* wpi = reinterpret_cast(Data_); - return wpi->dwProcessId; -} - -// This function just uses the PATH environment variable to find the program. -Path -Program::FindProgramByName(const std::string& progName) { - - // Check some degenerate cases - if (progName.length() == 0) // no program - return Path(); - Path temp; - if (!temp.set(progName)) // invalid name - return Path(); - // Return paths with slashes verbatim. - if (progName.find('\\') != std::string::npos || - progName.find('/') != std::string::npos) - return temp; - - // At this point, the file name is valid and does not contain slashes. - // Let Windows search for it. - char buffer[MAX_PATH]; - char *dummy = NULL; - DWORD len = SearchPath(NULL, progName.c_str(), ".exe", MAX_PATH, - buffer, &dummy); - - // See if it wasn't found. - if (len == 0) - return Path(); - - // See if we got the entire path. - if (len < MAX_PATH) - return Path(buffer); - - // Buffer was too small; grow and retry. - while (true) { - char *b = reinterpret_cast(_alloca(len+1)); - DWORD len2 = SearchPath(NULL, progName.c_str(), ".exe", len+1, b, &dummy); - - // It is unlikely the search failed, but it's always possible some file - // was added or removed since the last search, so be paranoid... - if (len2 == 0) - return Path(); - else if (len2 <= len) - return Path(b); - - len = len2; - } -} - -static HANDLE RedirectIO(const Path *path, int fd, std::string* ErrMsg) { - HANDLE h; - if (path == 0) { - DuplicateHandle(GetCurrentProcess(), (HANDLE)_get_osfhandle(fd), - GetCurrentProcess(), &h, - 0, TRUE, DUPLICATE_SAME_ACCESS); - return h; - } - - const char *fname; - if (path->isEmpty()) - fname = "NUL"; - else - fname = path->c_str(); - - SECURITY_ATTRIBUTES sa; - sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = 0; - sa.bInheritHandle = TRUE; - - h = CreateFile(fname, fd ? GENERIC_WRITE : GENERIC_READ, FILE_SHARE_READ, - &sa, fd == 0 ? OPEN_EXISTING : CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, NULL); - if (h == INVALID_HANDLE_VALUE) { - MakeErrMsg(ErrMsg, std::string(fname) + ": Can't open file for " + - (fd ? "input: " : "output: ")); - } - - return h; -} - -/// ArgNeedsQuotes - Check whether argument needs to be quoted when calling -/// CreateProcess. -static bool ArgNeedsQuotes(const char *Str) { - return Str[0] == '\0' || strchr(Str, ' ') != 0; -} - - -/// ArgLenWithQuotes - Check whether argument needs to be quoted when calling -/// CreateProcess and returns length of quoted arg with escaped quotes -static unsigned int ArgLenWithQuotes(const char *Str) { - unsigned int len = ArgNeedsQuotes(Str) ? 2 : 0; - - while (*Str != '\0') { - if (*Str == '\"') - ++len; - - ++len; - ++Str; - } - - return len; -} - - -bool -Program::Execute(const Path& path, - const char** args, - const char** envp, - const Path** redirects, - unsigned memoryLimit, - std::string* ErrMsg) { - if (Data_) { - Win32ProcessInfo* wpi = reinterpret_cast(Data_); - CloseHandle(wpi->hProcess); - delete wpi; - Data_ = 0; - } - - if (!path.canExecute()) { - if (ErrMsg) - *ErrMsg = "program not executable"; - return false; - } - - // Windows wants a command line, not an array of args, to pass to the new - // process. We have to concatenate them all, while quoting the args that - // have embedded spaces (or are empty). - - // First, determine the length of the command line. - unsigned len = 0; - for (unsigned i = 0; args[i]; i++) { - len += ArgLenWithQuotes(args[i]) + 1; - } - - // Now build the command line. - char *command = reinterpret_cast(_alloca(len+1)); - char *p = command; - - for (unsigned i = 0; args[i]; i++) { - const char *arg = args[i]; - - bool needsQuoting = ArgNeedsQuotes(arg); - if (needsQuoting) - *p++ = '"'; - - while (*arg != '\0') { - if (*arg == '\"') - *p++ = '\\'; - - *p++ = *arg++; - } - - if (needsQuoting) - *p++ = '"'; - *p++ = ' '; - } - - *p = 0; - - // The pointer to the environment block for the new process. - char *envblock = 0; - - if (envp) { - // An environment block consists of a null-terminated block of - // null-terminated strings. Convert the array of environment variables to - // an environment block by concatenating them. - - // First, determine the length of the environment block. - len = 0; - for (unsigned i = 0; envp[i]; i++) - len += strlen(envp[i]) + 1; - - // Now build the environment block. - envblock = reinterpret_cast(_alloca(len+1)); - p = envblock; - - for (unsigned i = 0; envp[i]; i++) { - const char *ev = envp[i]; - size_t len = strlen(ev) + 1; - memcpy(p, ev, len); - p += len; - } - - *p = 0; - } - - // Create a child process. - STARTUPINFO si; - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - si.hStdInput = INVALID_HANDLE_VALUE; - si.hStdOutput = INVALID_HANDLE_VALUE; - si.hStdError = INVALID_HANDLE_VALUE; - - if (redirects) { - si.dwFlags = STARTF_USESTDHANDLES; - - si.hStdInput = RedirectIO(redirects[0], 0, ErrMsg); - if (si.hStdInput == INVALID_HANDLE_VALUE) { - MakeErrMsg(ErrMsg, "can't redirect stdin"); - return false; - } - si.hStdOutput = RedirectIO(redirects[1], 1, ErrMsg); - if (si.hStdOutput == INVALID_HANDLE_VALUE) { - CloseHandle(si.hStdInput); - MakeErrMsg(ErrMsg, "can't redirect stdout"); - return false; - } - if (redirects[1] && redirects[2] && *(redirects[1]) == *(redirects[2])) { - // If stdout and stderr should go to the same place, redirect stderr - // to the handle already open for stdout. - DuplicateHandle(GetCurrentProcess(), si.hStdOutput, - GetCurrentProcess(), &si.hStdError, - 0, TRUE, DUPLICATE_SAME_ACCESS); - } else { - // Just redirect stderr - si.hStdError = RedirectIO(redirects[2], 2, ErrMsg); - if (si.hStdError == INVALID_HANDLE_VALUE) { - CloseHandle(si.hStdInput); - CloseHandle(si.hStdOutput); - MakeErrMsg(ErrMsg, "can't redirect stderr"); - return false; - } - } - } - - PROCESS_INFORMATION pi; - memset(&pi, 0, sizeof(pi)); - - fflush(stdout); - fflush(stderr); - BOOL rc = CreateProcess(path.c_str(), command, NULL, NULL, TRUE, 0, - envblock, NULL, &si, &pi); - DWORD err = GetLastError(); - - // Regardless of whether the process got created or not, we are done with - // the handles we created for it to inherit. - CloseHandle(si.hStdInput); - CloseHandle(si.hStdOutput); - CloseHandle(si.hStdError); - - // Now return an error if the process didn't get created. - if (!rc) { - SetLastError(err); - MakeErrMsg(ErrMsg, std::string("Couldn't execute program '") + - path.str() + "'"); - return false; - } - Win32ProcessInfo* wpi = new Win32ProcessInfo; - wpi->hProcess = pi.hProcess; - wpi->dwProcessId = pi.dwProcessId; - Data_ = wpi; - - // Make sure these get closed no matter what. - AutoHandle hThread(pi.hThread); - - // Assign the process to a job if a memory limit is defined. - AutoHandle hJob(0); - if (memoryLimit != 0) { - hJob = CreateJobObject(0, 0); - bool success = false; - if (hJob != 0) { - JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli; - memset(&jeli, 0, sizeof(jeli)); - jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY; - jeli.ProcessMemoryLimit = uintptr_t(memoryLimit) * 1048576; - if (SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, - &jeli, sizeof(jeli))) { - if (AssignProcessToJobObject(hJob, pi.hProcess)) - success = true; - } - } - if (!success) { - SetLastError(GetLastError()); - MakeErrMsg(ErrMsg, std::string("Unable to set memory limit")); - TerminateProcess(pi.hProcess, 1); - WaitForSingleObject(pi.hProcess, INFINITE); - return false; - } - } - - return true; -} - -int -Program::Wait(const Path &path, - unsigned secondsToWait, - std::string* ErrMsg) { - if (Data_ == 0) { - MakeErrMsg(ErrMsg, "Process not started!"); - return -1; - } - - Win32ProcessInfo* wpi = reinterpret_cast(Data_); - HANDLE hProcess = wpi->hProcess; - - // Wait for the process to terminate. - DWORD millisecondsToWait = INFINITE; - if (secondsToWait > 0) - millisecondsToWait = secondsToWait * 1000; - - if (WaitForSingleObject(hProcess, millisecondsToWait) == WAIT_TIMEOUT) { - if (!TerminateProcess(hProcess, 1)) { - MakeErrMsg(ErrMsg, "Failed to terminate timed-out program."); - return -1; - } - WaitForSingleObject(hProcess, INFINITE); - } - - // Get its exit status. - DWORD status; - BOOL rc = GetExitCodeProcess(hProcess, &status); - DWORD err = GetLastError(); - - if (!rc) { - SetLastError(err); - MakeErrMsg(ErrMsg, "Failed getting status for program."); - return -1; - } - - return status; -} - -bool -Program::Kill(std::string* ErrMsg) { - if (Data_ == 0) { - MakeErrMsg(ErrMsg, "Process not started!"); - return true; - } - - Win32ProcessInfo* wpi = reinterpret_cast(Data_); - HANDLE hProcess = wpi->hProcess; - if (TerminateProcess(hProcess, 1) == 0) { - MakeErrMsg(ErrMsg, "The process couldn't be killed!"); - return true; - } - - return false; -} - -bool Program::ChangeStdinToBinary(){ - int result = _setmode( _fileno(stdin), _O_BINARY ); - return result == -1; -} - -bool Program::ChangeStdoutToBinary(){ - int result = _setmode( _fileno(stdout), _O_BINARY ); - return result == -1; -} - -bool Program::ChangeStderrToBinary(){ - int result = _setmode( _fileno(stderr), _O_BINARY ); - return result == -1; -} - -} Removed: llvm/trunk/lib/System/Win32/RWMutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/RWMutex.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/RWMutex.inc (original) +++ llvm/trunk/lib/System/Win32/RWMutex.inc (removed) @@ -1,58 +0,0 @@ -//= llvm/System/Win32/Mutex.inc - Win32 Reader/Writer Mutual Exclusion Lock =// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Win32 specific (non-pthread) RWMutex class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic Win32 code that -//=== is guaranteed to work on *all* Win32 variants. -//===----------------------------------------------------------------------===// - -#include "Win32.h" - -// FIXME: Windows does not have reader-writer locks pre-Vista. If you want -// real reader-writer locks, you a pthreads implementation for Windows. - -namespace llvm { -using namespace sys; - -RWMutexImpl::RWMutexImpl() { - data_ = calloc(1, sizeof(CRITICAL_SECTION)); - InitializeCriticalSection(static_cast(data_)); -} - -RWMutexImpl::~RWMutexImpl() { - DeleteCriticalSection(static_cast(data_)); - free(data_); -} - -bool RWMutexImpl::reader_acquire() { - EnterCriticalSection(static_cast(data_)); - return true; -} - -bool RWMutexImpl::reader_release() { - LeaveCriticalSection(static_cast(data_)); - return true; -} - -bool RWMutexImpl::writer_acquire() { - EnterCriticalSection(static_cast(data_)); - return true; -} - -bool RWMutexImpl::writer_release() { - LeaveCriticalSection(static_cast(data_)); - return true; -} - - -} Removed: llvm/trunk/lib/System/Win32/Signals.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Signals.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Signals.inc (original) +++ llvm/trunk/lib/System/Win32/Signals.inc (removed) @@ -1,326 +0,0 @@ -//===- Win32/Signals.cpp - Win32 Signals Implementation ---------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 specific implementation of the Signals class. -// -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include -#include -#include - -#ifdef __MINGW32__ - #include -#else - #include -#endif -#include - -#ifdef __MINGW32__ - #if ((HAVE_LIBIMAGEHLP != 1) || (HAVE_LIBPSAPI != 1)) - #error "libimagehlp.a & libpsapi.a should be present" - #endif -#else - #pragma comment(lib, "psapi.lib") - #pragma comment(lib, "dbghelp.lib") -#endif - -// Forward declare. -static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep); -static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType); - -// InterruptFunction - The function to call if ctrl-c is pressed. -static void (*InterruptFunction)() = 0; - -static std::vector *FilesToRemove = NULL; -static std::vector > *CallBacksToRun = 0; -static bool RegisteredUnhandledExceptionFilter = false; -static bool CleanupExecuted = false; -static bool ExitOnUnhandledExceptions = false; -static PTOP_LEVEL_EXCEPTION_FILTER OldFilter = NULL; - -// Windows creates a new thread to execute the console handler when an event -// (such as CTRL/C) occurs. This causes concurrency issues with the above -// globals which this critical section addresses. -static CRITICAL_SECTION CriticalSection; - -namespace llvm { - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code -//=== and must not be UNIX code -//===----------------------------------------------------------------------===// - -#ifdef _MSC_VER -/// CRTReportHook - Function called on a CRT debugging event. -static int CRTReportHook(int ReportType, char *Message, int *Return) { - // Don't cause a DebugBreak() on return. - if (Return) - *Return = 0; - - switch (ReportType) { - default: - case _CRT_ASSERT: - fprintf(stderr, "CRT assert: %s\n", Message); - // FIXME: Is there a way to just crash? Perhaps throw to the unhandled - // exception code? Perhaps SetErrorMode() handles this. - _exit(3); - break; - case _CRT_ERROR: - fprintf(stderr, "CRT error: %s\n", Message); - // FIXME: Is there a way to just crash? Perhaps throw to the unhandled - // exception code? Perhaps SetErrorMode() handles this. - _exit(3); - break; - case _CRT_WARN: - fprintf(stderr, "CRT warn: %s\n", Message); - break; - } - - // Don't call _CrtDbgReport. - return TRUE; -} -#endif - -static void RegisterHandler() { - if (RegisteredUnhandledExceptionFilter) { - EnterCriticalSection(&CriticalSection); - return; - } - - // Now's the time to create the critical section. This is the first time - // through here, and there's only one thread. - InitializeCriticalSection(&CriticalSection); - - // Enter it immediately. Now if someone hits CTRL/C, the console handler - // can't proceed until the globals are updated. - EnterCriticalSection(&CriticalSection); - - RegisteredUnhandledExceptionFilter = true; - OldFilter = SetUnhandledExceptionFilter(LLVMUnhandledExceptionFilter); - SetConsoleCtrlHandler(LLVMConsoleCtrlHandler, TRUE); - - // Environment variable to disable any kind of crash dialog. - if (getenv("LLVM_DISABLE_CRT_DEBUG")) { -#ifdef _MSC_VER - _CrtSetReportHook(CRTReportHook); -#endif - ExitOnUnhandledExceptions = true; - } - - // IMPORTANT NOTE: Caller must call LeaveCriticalSection(&CriticalSection) or - // else multi-threading problems will ensue. -} - -// RemoveFileOnSignal - The public API -bool sys::RemoveFileOnSignal(const sys::Path &Filename, std::string* ErrMsg) { - RegisterHandler(); - - if (CleanupExecuted) { - if (ErrMsg) - *ErrMsg = "Process terminating -- cannot register for removal"; - return true; - } - - if (FilesToRemove == NULL) - FilesToRemove = new std::vector; - - FilesToRemove->push_back(Filename); - - LeaveCriticalSection(&CriticalSection); - return false; -} - -// DontRemoveFileOnSignal - The public API -void sys::DontRemoveFileOnSignal(const sys::Path &Filename) { - if (FilesToRemove == NULL) - return; - - RegisterHandler(); - - FilesToRemove->push_back(Filename); - std::vector::reverse_iterator I = - std::find(FilesToRemove->rbegin(), FilesToRemove->rend(), Filename); - if (I != FilesToRemove->rend()) - FilesToRemove->erase(I.base()-1); - - LeaveCriticalSection(&CriticalSection); -} - -/// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or -/// SIGSEGV) is delivered to the process, print a stack trace and then exit. -void sys::PrintStackTraceOnErrorSignal() { - RegisterHandler(); - LeaveCriticalSection(&CriticalSection); -} - - -void sys::SetInterruptFunction(void (*IF)()) { - RegisterHandler(); - InterruptFunction = IF; - LeaveCriticalSection(&CriticalSection); -} - - -/// AddSignalHandler - Add a function to be called when a signal is delivered -/// to the process. The handler can have a cookie passed to it to identify -/// what instance of the handler it is. -void sys::AddSignalHandler(void (*FnPtr)(void *), void *Cookie) { - if (CallBacksToRun == 0) - CallBacksToRun = new std::vector >(); - CallBacksToRun->push_back(std::make_pair(FnPtr, Cookie)); - RegisterHandler(); - LeaveCriticalSection(&CriticalSection); -} -} - -static void Cleanup() { - EnterCriticalSection(&CriticalSection); - - // Prevent other thread from registering new files and directories for - // removal, should we be executing because of the console handler callback. - CleanupExecuted = true; - - // FIXME: open files cannot be deleted. - - if (FilesToRemove != NULL) - while (!FilesToRemove->empty()) { - FilesToRemove->back().eraseFromDisk(); - FilesToRemove->pop_back(); - } - - if (CallBacksToRun) - for (unsigned i = 0, e = CallBacksToRun->size(); i != e; ++i) - (*CallBacksToRun)[i].first((*CallBacksToRun)[i].second); - - LeaveCriticalSection(&CriticalSection); -} - -void llvm::sys::RunInterruptHandlers() { - Cleanup(); -} - -static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep) { - Cleanup(); - -#ifdef _WIN64 - // TODO: provide a x64 friendly version of the following -#else - - // Initialize the STACKFRAME structure. - STACKFRAME StackFrame; - memset(&StackFrame, 0, sizeof(StackFrame)); - - StackFrame.AddrPC.Offset = ep->ContextRecord->Eip; - StackFrame.AddrPC.Mode = AddrModeFlat; - StackFrame.AddrStack.Offset = ep->ContextRecord->Esp; - StackFrame.AddrStack.Mode = AddrModeFlat; - StackFrame.AddrFrame.Offset = ep->ContextRecord->Ebp; - StackFrame.AddrFrame.Mode = AddrModeFlat; - - HANDLE hProcess = GetCurrentProcess(); - HANDLE hThread = GetCurrentThread(); - - // Initialize the symbol handler. - SymSetOptions(SYMOPT_DEFERRED_LOADS|SYMOPT_LOAD_LINES); - SymInitialize(hProcess, NULL, TRUE); - - while (true) { - if (!StackWalk(IMAGE_FILE_MACHINE_I386, hProcess, hThread, &StackFrame, - ep->ContextRecord, NULL, SymFunctionTableAccess, - SymGetModuleBase, NULL)) { - break; - } - - if (StackFrame.AddrFrame.Offset == 0) - break; - - // Print the PC in hexadecimal. - DWORD PC = StackFrame.AddrPC.Offset; - fprintf(stderr, "%08lX", PC); - - // Print the parameters. Assume there are four. - fprintf(stderr, " (0x%08lX 0x%08lX 0x%08lX 0x%08lX)", - StackFrame.Params[0], - StackFrame.Params[1], StackFrame.Params[2], StackFrame.Params[3]); - - // Verify the PC belongs to a module in this process. - if (!SymGetModuleBase(hProcess, PC)) { - fputs(" \n", stderr); - continue; - } - - // Print the symbol name. - char buffer[512]; - IMAGEHLP_SYMBOL *symbol = reinterpret_cast(buffer); - memset(symbol, 0, sizeof(IMAGEHLP_SYMBOL)); - symbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL); - symbol->MaxNameLength = 512 - sizeof(IMAGEHLP_SYMBOL); - - DWORD dwDisp; - if (!SymGetSymFromAddr(hProcess, PC, &dwDisp, symbol)) { - fputc('\n', stderr); - continue; - } - - buffer[511] = 0; - if (dwDisp > 0) - fprintf(stderr, ", %s()+%04lu bytes(s)", symbol->Name, dwDisp); - else - fprintf(stderr, ", %s", symbol->Name); - - // Print the source file and line number information. - IMAGEHLP_LINE line; - memset(&line, 0, sizeof(line)); - line.SizeOfStruct = sizeof(line); - if (SymGetLineFromAddr(hProcess, PC, &dwDisp, &line)) { - fprintf(stderr, ", %s, line %lu", line.FileName, line.LineNumber); - if (dwDisp > 0) - fprintf(stderr, "+%04lu byte(s)", dwDisp); - } - - fputc('\n', stderr); - } - -#endif - - if (ExitOnUnhandledExceptions) - _exit(-3); - - // Allow dialog box to pop up allowing choice to start debugger. - if (OldFilter) - return (*OldFilter)(ep); - else - return EXCEPTION_CONTINUE_SEARCH; -} - -static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType) { - // We are running in our very own thread, courtesy of Windows. - EnterCriticalSection(&CriticalSection); - Cleanup(); - - // If an interrupt function has been set, go and run one it; otherwise, - // the process dies. - void (*IF)() = InterruptFunction; - InterruptFunction = 0; // Don't run it on another CTRL-C. - - if (IF) { - // Note: if the interrupt function throws an exception, there is nothing - // to catch it in this thread so it will kill the process. - IF(); // Run it now. - LeaveCriticalSection(&CriticalSection); - return TRUE; // Don't kill the process. - } - - // Allow normal processing to take place; i.e., the process dies. - LeaveCriticalSection(&CriticalSection); - return FALSE; -} - Removed: llvm/trunk/lib/System/Win32/ThreadLocal.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/ThreadLocal.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/ThreadLocal.inc (original) +++ llvm/trunk/lib/System/Win32/ThreadLocal.inc (removed) @@ -1,54 +0,0 @@ -//= llvm/System/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Win32 specific (non-pthread) ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic Win32 code that -//=== is guaranteed to work on *all* Win32 variants. -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include "llvm/System/ThreadLocal.h" - -namespace llvm { -using namespace sys; - -ThreadLocalImpl::ThreadLocalImpl() { - DWORD* tls = new DWORD; - *tls = TlsAlloc(); - assert(*tls != TLS_OUT_OF_INDEXES); - data = tls; -} - -ThreadLocalImpl::~ThreadLocalImpl() { - DWORD* tls = static_cast(data); - TlsFree(*tls); - delete tls; -} - -const void* ThreadLocalImpl::getInstance() { - DWORD* tls = static_cast(data); - return TlsGetValue(*tls); -} - -void ThreadLocalImpl::setInstance(const void* d){ - DWORD* tls = static_cast(data); - int errorcode = TlsSetValue(*tls, const_cast(d)); - assert(errorcode != 0); - (void)errorcode; -} - -void ThreadLocalImpl::removeInstance() { - setInstance(0); -} - -} Removed: llvm/trunk/lib/System/Win32/TimeValue.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/TimeValue.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/TimeValue.inc (original) +++ llvm/trunk/lib/System/Win32/TimeValue.inc (removed) @@ -1,51 +0,0 @@ -//===- Win32/TimeValue.cpp - Win32 TimeValue Implementation -----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Win32 implementation of the TimeValue class. -// -//===----------------------------------------------------------------------===// - -#include "Win32.h" -#include - -namespace llvm { -using namespace sys; - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only Win32 specific code. -//===----------------------------------------------------------------------===// - -TimeValue TimeValue::now() { - uint64_t ft; - GetSystemTimeAsFileTime(reinterpret_cast(&ft)); - - TimeValue t(0, 0); - t.fromWin32Time(ft); - return t; -} - -std::string TimeValue::str() const { -#ifdef __MINGW32__ - // This ban may be lifted by either: - // (i) a future MinGW version other than 1.0 inherents the __time64_t type, or - // (ii) configure tests for either the time_t or __time64_t type. - time_t ourTime = time_t(this->toEpochTime()); - struct tm *lt = ::localtime(&ourTime); -#else - __time64_t ourTime = this->toEpochTime(); - struct tm *lt = ::_localtime64(&ourTime); -#endif - - char buffer[25]; - strftime(buffer, 25, "%a %b %d %H:%M:%S %Y", lt); - return std::string(buffer); -} - - -} Removed: llvm/trunk/lib/System/Win32/Win32.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/Win32.h?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/Win32.h (original) +++ llvm/trunk/lib/System/Win32/Win32.h (removed) @@ -1,60 +0,0 @@ -//===- Win32/Win32.h - Common Win32 Include File ----------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines things specific to Win32 implementations. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic Win32 code that -//=== is guaranteed to work on *all* Win32 variants. -//===----------------------------------------------------------------------===// - -// Require at least Windows 2000 API. -#define _WIN32_WINNT 0x0500 -#define _WIN32_IE 0x0500 // MinGW at it again. -#define WIN32_LEAN_AND_MEAN - -#include "llvm/Config/config.h" // Get build system configuration settings -#include -#include -#include -#include - -inline bool MakeErrMsg(std::string* ErrMsg, const std::string& prefix) { - if (!ErrMsg) - return true; - char *buffer = NULL; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, - NULL, GetLastError(), 0, (LPSTR)&buffer, 1, NULL); - *ErrMsg = prefix + buffer; - LocalFree(buffer); - return true; -} - -class AutoHandle { - HANDLE handle; - -public: - AutoHandle(HANDLE h) : handle(h) {} - - ~AutoHandle() { - if (handle) - CloseHandle(handle); - } - - operator HANDLE() { - return handle; - } - - AutoHandle &operator=(HANDLE h) { - handle = h; - return *this; - } -}; Removed: llvm/trunk/lib/System/Win32/system_error.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Win32/system_error.inc?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/Win32/system_error.inc (original) +++ llvm/trunk/lib/System/Win32/system_error.inc (removed) @@ -1,140 +0,0 @@ -//===- llvm/System/Win32/system_error.inc - Windows error_code --*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides the Windows specific implementation of the error_code -// and error_condition classes. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic Windows code that -//=== is guaranteed to work on *all* Windows variants. -//===----------------------------------------------------------------------===// - -#include -#include - -using namespace llvm; - -std::string -_system_error_category::message(int ev) const { - LPVOID lpMsgBuf = 0; - DWORD retval = ::FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - ev, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPSTR) &lpMsgBuf, - 0, - NULL); - if (retval == 0) { - ::LocalFree(lpMsgBuf); - return std::string("Unknown error"); - } - - std::string str( static_cast(lpMsgBuf) ); - ::LocalFree(lpMsgBuf); - - while (str.size() - && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r')) - str.erase( str.size()-1 ); - if (str.size() && str[str.size()-1] == '.') - str.erase( str.size()-1 ); - return str; -} - -// I'd rather not double the line count of the following. -#define MAP_ERR_TO_COND(x, y) case x: return make_error_condition(errc::y) - -error_condition -_system_error_category::default_error_condition(int ev) const { - switch (ev) { - MAP_ERR_TO_COND(0, success); - // Windows system -> posix_errno decode table ---------------------------// - // see WinError.h comments for descriptions of errors - MAP_ERR_TO_COND(ERROR_ACCESS_DENIED, permission_denied); - MAP_ERR_TO_COND(ERROR_ALREADY_EXISTS, file_exists); - MAP_ERR_TO_COND(ERROR_BAD_UNIT, no_such_device); - MAP_ERR_TO_COND(ERROR_BUFFER_OVERFLOW, filename_too_long); - MAP_ERR_TO_COND(ERROR_BUSY, device_or_resource_busy); - MAP_ERR_TO_COND(ERROR_BUSY_DRIVE, device_or_resource_busy); - MAP_ERR_TO_COND(ERROR_CANNOT_MAKE, permission_denied); - MAP_ERR_TO_COND(ERROR_CANTOPEN, io_error); - MAP_ERR_TO_COND(ERROR_CANTREAD, io_error); - MAP_ERR_TO_COND(ERROR_CANTWRITE, io_error); - MAP_ERR_TO_COND(ERROR_CURRENT_DIRECTORY, permission_denied); - MAP_ERR_TO_COND(ERROR_DEV_NOT_EXIST, no_such_device); - MAP_ERR_TO_COND(ERROR_DEVICE_IN_USE, device_or_resource_busy); - MAP_ERR_TO_COND(ERROR_DIR_NOT_EMPTY, directory_not_empty); - MAP_ERR_TO_COND(ERROR_DIRECTORY, invalid_argument); - MAP_ERR_TO_COND(ERROR_DISK_FULL, no_space_on_device); - MAP_ERR_TO_COND(ERROR_FILE_EXISTS, file_exists); - MAP_ERR_TO_COND(ERROR_FILE_NOT_FOUND, no_such_file_or_directory); - MAP_ERR_TO_COND(ERROR_HANDLE_DISK_FULL, no_space_on_device); - MAP_ERR_TO_COND(ERROR_INVALID_ACCESS, permission_denied); - MAP_ERR_TO_COND(ERROR_INVALID_DRIVE, no_such_device); - MAP_ERR_TO_COND(ERROR_INVALID_FUNCTION, function_not_supported); - MAP_ERR_TO_COND(ERROR_INVALID_HANDLE, invalid_argument); - MAP_ERR_TO_COND(ERROR_INVALID_NAME, invalid_argument); - MAP_ERR_TO_COND(ERROR_LOCK_VIOLATION, no_lock_available); - MAP_ERR_TO_COND(ERROR_LOCKED, no_lock_available); - MAP_ERR_TO_COND(ERROR_NEGATIVE_SEEK, invalid_argument); - MAP_ERR_TO_COND(ERROR_NOACCESS, permission_denied); - MAP_ERR_TO_COND(ERROR_NOT_ENOUGH_MEMORY, not_enough_memory); - MAP_ERR_TO_COND(ERROR_NOT_READY, resource_unavailable_try_again); - MAP_ERR_TO_COND(ERROR_NOT_SAME_DEVICE, cross_device_link); - MAP_ERR_TO_COND(ERROR_OPEN_FAILED, io_error); - MAP_ERR_TO_COND(ERROR_OPEN_FILES, device_or_resource_busy); - MAP_ERR_TO_COND(ERROR_OPERATION_ABORTED, operation_canceled); - MAP_ERR_TO_COND(ERROR_OUTOFMEMORY, not_enough_memory); - MAP_ERR_TO_COND(ERROR_PATH_NOT_FOUND, no_such_file_or_directory); - MAP_ERR_TO_COND(ERROR_READ_FAULT, io_error); - MAP_ERR_TO_COND(ERROR_RETRY, resource_unavailable_try_again); - MAP_ERR_TO_COND(ERROR_SEEK, io_error); - MAP_ERR_TO_COND(ERROR_SHARING_VIOLATION, permission_denied); - MAP_ERR_TO_COND(ERROR_TOO_MANY_OPEN_FILES, too_many_files_open); - MAP_ERR_TO_COND(ERROR_WRITE_FAULT, io_error); - MAP_ERR_TO_COND(ERROR_WRITE_PROTECT, permission_denied); - MAP_ERR_TO_COND(ERROR_SEM_TIMEOUT, timed_out); - MAP_ERR_TO_COND(WSAEACCES, permission_denied); - MAP_ERR_TO_COND(WSAEADDRINUSE, address_in_use); - MAP_ERR_TO_COND(WSAEADDRNOTAVAIL, address_not_available); - MAP_ERR_TO_COND(WSAEAFNOSUPPORT, address_family_not_supported); - MAP_ERR_TO_COND(WSAEALREADY, connection_already_in_progress); - MAP_ERR_TO_COND(WSAEBADF, bad_file_descriptor); - MAP_ERR_TO_COND(WSAECONNABORTED, connection_aborted); - MAP_ERR_TO_COND(WSAECONNREFUSED, connection_refused); - MAP_ERR_TO_COND(WSAECONNRESET, connection_reset); - MAP_ERR_TO_COND(WSAEDESTADDRREQ, destination_address_required); - MAP_ERR_TO_COND(WSAEFAULT, bad_address); - MAP_ERR_TO_COND(WSAEHOSTUNREACH, host_unreachable); - MAP_ERR_TO_COND(WSAEINPROGRESS, operation_in_progress); - MAP_ERR_TO_COND(WSAEINTR, interrupted); - MAP_ERR_TO_COND(WSAEINVAL, invalid_argument); - MAP_ERR_TO_COND(WSAEISCONN, already_connected); - MAP_ERR_TO_COND(WSAEMFILE, too_many_files_open); - MAP_ERR_TO_COND(WSAEMSGSIZE, message_size); - MAP_ERR_TO_COND(WSAENAMETOOLONG, filename_too_long); - MAP_ERR_TO_COND(WSAENETDOWN, network_down); - MAP_ERR_TO_COND(WSAENETRESET, network_reset); - MAP_ERR_TO_COND(WSAENETUNREACH, network_unreachable); - MAP_ERR_TO_COND(WSAENOBUFS, no_buffer_space); - MAP_ERR_TO_COND(WSAENOPROTOOPT, no_protocol_option); - MAP_ERR_TO_COND(WSAENOTCONN, not_connected); - MAP_ERR_TO_COND(WSAENOTSOCK, not_a_socket); - MAP_ERR_TO_COND(WSAEOPNOTSUPP, operation_not_supported); - MAP_ERR_TO_COND(WSAEPROTONOSUPPORT, protocol_not_supported); - MAP_ERR_TO_COND(WSAEPROTOTYPE, wrong_protocol_type); - MAP_ERR_TO_COND(WSAETIMEDOUT, timed_out); - MAP_ERR_TO_COND(WSAEWOULDBLOCK, operation_would_block); - default: return error_condition(ev, system_category()); - } -} Removed: llvm/trunk/lib/System/system_error.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/system_error.cpp?rev=120297&view=auto ============================================================================== --- llvm/trunk/lib/System/system_error.cpp (original) +++ llvm/trunk/lib/System/system_error.cpp (removed) @@ -1,121 +0,0 @@ -//===---------------------- system_error.cpp ------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This was lifted from libc++ and modified for C++03. -// -//===----------------------------------------------------------------------===// - -#include "llvm/System/system_error.h" -#include "llvm/System/Errno.h" -#include -#include - -namespace llvm { - -// class error_category - -error_category::error_category() { -} - -error_category::~error_category() { -} - -error_condition -error_category::default_error_condition(int ev) const { - return error_condition(ev, *this); -} - -bool -error_category::equivalent(int code, const error_condition& condition) const { - return default_error_condition(code) == condition; -} - -bool -error_category::equivalent(const error_code& code, int condition) const { - return *this == code.category() && code.value() == condition; -} - -std::string -_do_message::message(int ev) const { - return std::string(sys::StrError(ev)); -} - -class _generic_error_category : public _do_message { -public: - virtual const char* name() const; - virtual std::string message(int ev) const; -}; - -const char* -_generic_error_category::name() const { - return "generic"; -} - -std::string -_generic_error_category::message(int ev) const { -#ifdef ELAST - if (ev > ELAST) - return std::string("unspecified generic_category error"); -#endif // ELAST - return _do_message::message(ev); -} - -const error_category& -generic_category() { - static _generic_error_category s; - return s; -} - -class _system_error_category : public _do_message { -public: - virtual const char* name() const; - virtual std::string message(int ev) const; - virtual error_condition default_error_condition(int ev) const; -}; - -const char* -_system_error_category::name() const { - return "system"; -} - -// std::string _system_error_category::message(int ev) const { -// Is in Platform/system_error.inc - -// error_condition _system_error_category::default_error_condition(int ev) const -// Is in Platform/system_error.inc - -const error_category& -system_category() { - static _system_error_category s; - return s; -} - -// error_condition - -std::string -error_condition::message() const { - return _cat_->message(_val_); -} - -// error_code - -std::string -error_code::message() const { - return _cat_->message(_val_); -} - -} // end namespace llvm - -// Include the truly platform-specific parts of this class. -#if defined(LLVM_ON_UNIX) -#include "Unix/system_error.inc" -#endif -#if defined(LLVM_ON_WIN32) -#include "Win32/system_error.inc" -#endif Modified: llvm/trunk/lib/Target/TargetData.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetData.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Target/TargetData.cpp (original) +++ llvm/trunk/lib/Target/TargetData.cpp Mon Nov 29 12:16:10 2010 @@ -25,7 +25,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include "llvm/ADT/DenseMap.h" #include #include Modified: llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h (original) +++ llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoderCommon.h Mon Nov 29 12:16:10 2010 @@ -22,7 +22,7 @@ #ifndef X86DISASSEMBLERDECODERCOMMON_H #define X86DISASSEMBLERDECODERCOMMON_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #define INSTRUCTIONS_SYM x86DisassemblerInstrSpecifiers #define CONTEXTS_SYM x86DisassemblerContexts Modified: llvm/trunk/lib/Target/X86/X86JITInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86JITInfo.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86JITInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86JITInfo.cpp Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #include "llvm/Function.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/System/Valgrind.h" +#include "llvm/Support/Valgrind.h" #include #include using namespace llvm; Modified: llvm/trunk/lib/Target/X86/X86Subtarget.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86Subtarget.cpp (original) +++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/GlobalValue.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/ADT/SmallVector.h" Modified: llvm/trunk/lib/VMCore/Attributes.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Attributes.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Attributes.cpp (original) +++ llvm/trunk/lib/VMCore/Attributes.cpp Mon Nov 29 12:16:10 2010 @@ -15,8 +15,8 @@ #include "llvm/Type.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/FoldingSet.h" -#include "llvm/System/Atomic.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Atomic.h" +#include "llvm/Support/Mutex.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" Modified: llvm/trunk/lib/VMCore/Function.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Function.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Function.cpp (original) +++ llvm/trunk/lib/VMCore/Function.cpp Mon Nov 29 12:16:10 2010 @@ -20,8 +20,8 @@ #include "llvm/Support/LeakDetector.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/StringPool.h" -#include "llvm/System/RWMutex.h" -#include "llvm/System/Threading.h" +#include "llvm/Support/RWMutex.h" +#include "llvm/Support/Threading.h" #include "SymbolTableListTraitsImpl.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringExtras.h" Modified: llvm/trunk/lib/VMCore/LeakDetector.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/LeakDetector.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/LeakDetector.cpp (original) +++ llvm/trunk/lib/VMCore/LeakDetector.cpp Mon Nov 29 12:16:10 2010 @@ -16,8 +16,8 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ManagedStatic.h" -#include "llvm/System/Mutex.h" -#include "llvm/System/Threading.h" +#include "llvm/Support/Mutex.h" +#include "llvm/Support/Threading.h" #include "llvm/Value.h" using namespace llvm; Modified: llvm/trunk/lib/VMCore/PassManager.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/PassManager.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/PassManager.cpp (original) +++ llvm/trunk/lib/VMCore/PassManager.cpp Mon Nov 29 12:16:10 2010 @@ -24,7 +24,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PassNameParser.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include #include #include Modified: llvm/trunk/lib/VMCore/PassRegistry.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/PassRegistry.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/PassRegistry.cpp (original) +++ llvm/trunk/lib/VMCore/PassRegistry.cpp Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/PassSupport.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ManagedStatic.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Mutex.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/StringMap.h" Modified: llvm/trunk/lib/VMCore/Type.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Type.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Type.cpp (original) +++ llvm/trunk/lib/VMCore/Type.cpp Mon Nov 29 12:16:10 2010 @@ -27,7 +27,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Threading.h" +#include "llvm/Support/Threading.h" #include #include using namespace llvm; Modified: llvm/trunk/tools/bugpoint/BugDriver.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/BugDriver.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/BugDriver.cpp (original) +++ llvm/trunk/tools/bugpoint/BugDriver.cpp Mon Nov 29 12:16:10 2010 @@ -23,7 +23,7 @@ #include "llvm/Support/FileUtilities.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include using namespace llvm; Modified: llvm/trunk/tools/bugpoint/ExtractFunction.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ExtractFunction.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/ExtractFunction.cpp (original) +++ llvm/trunk/tools/bugpoint/ExtractFunction.cpp Mon Nov 29 12:16:10 2010 @@ -30,8 +30,8 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Path.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Signals.h" #include using namespace llvm; Modified: llvm/trunk/tools/bugpoint/OptimizerDriver.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/OptimizerDriver.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/OptimizerDriver.cpp (original) +++ llvm/trunk/tools/bugpoint/OptimizerDriver.cpp Mon Nov 29 12:16:10 2010 @@ -26,8 +26,8 @@ #include "llvm/Support/SystemUtils.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Path.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" #define DONT_GET_PLUGIN_LOADER_OPTION #include "llvm/Support/PluginLoader.h" Modified: llvm/trunk/tools/bugpoint/ToolRunner.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ToolRunner.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/ToolRunner.cpp (original) +++ llvm/trunk/tools/bugpoint/ToolRunner.cpp Mon Nov 29 12:16:10 2010 @@ -13,7 +13,7 @@ #define DEBUG_TYPE "toolrunner" #include "ToolRunner.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Program.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FileUtilities.h" Modified: llvm/trunk/tools/bugpoint/ToolRunner.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/ToolRunner.h?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/ToolRunner.h (original) +++ llvm/trunk/tools/bugpoint/ToolRunner.h Mon Nov 29 12:16:10 2010 @@ -21,7 +21,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/SystemUtils.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include #include Modified: llvm/trunk/tools/bugpoint/bugpoint.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/bugpoint.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/bugpoint/bugpoint.cpp (original) +++ llvm/trunk/tools/bugpoint/bugpoint.cpp Mon Nov 29 12:16:10 2010 @@ -23,9 +23,9 @@ #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/StandardPasses.h" -#include "llvm/System/Process.h" -#include "llvm/System/Signals.h" -#include "llvm/System/Valgrind.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Signals.h" +#include "llvm/Support/Valgrind.h" #include "llvm/LinkAllVMCore.h" using namespace llvm; Modified: llvm/trunk/tools/llc/llc.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llc/llc.cpp (original) +++ llvm/trunk/tools/llc/llc.cpp Mon Nov 29 12:16:10 2010 @@ -29,8 +29,8 @@ #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Host.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/Signals.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" Modified: llvm/trunk/tools/lli/lli.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/lli.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/lli/lli.cpp (original) +++ llvm/trunk/tools/lli/lli.cpp Mon Nov 29 12:16:10 2010 @@ -31,8 +31,8 @@ #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Process.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Signals.h" #include "llvm/Target/TargetSelect.h" #include Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original) +++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Mon Nov 29 12:16:10 2010 @@ -19,7 +19,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include #include #include Modified: llvm/trunk/tools/llvm-as/llvm-as.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-as/llvm-as.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-as/llvm-as.cpp (original) +++ llvm/trunk/tools/llvm-as/llvm-as.cpp Mon Nov 29 12:16:10 2010 @@ -26,7 +26,7 @@ #include "llvm/Support/SourceMgr.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include using namespace llvm; Modified: llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp (original) +++ llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp Mon Nov 29 12:16:10 2010 @@ -37,7 +37,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include #include #include Modified: llvm/trunk/tools/llvm-dis/llvm-dis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dis/llvm-dis.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-dis/llvm-dis.cpp (original) +++ llvm/trunk/tools/llvm-dis/llvm-dis.cpp Mon Nov 29 12:16:10 2010 @@ -27,7 +27,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" using namespace llvm; static cl::opt Modified: llvm/trunk/tools/llvm-extract/llvm-extract.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-extract/llvm-extract.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-extract/llvm-extract.cpp (original) +++ llvm/trunk/tools/llvm-extract/llvm-extract.cpp Mon Nov 29 12:16:10 2010 @@ -25,7 +25,7 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/SystemUtils.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include "llvm/ADT/SmallPtrSet.h" #include using namespace llvm; Modified: llvm/trunk/tools/llvm-ld/Optimize.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ld/Optimize.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-ld/Optimize.cpp (original) +++ llvm/trunk/tools/llvm-ld/Optimize.cpp Mon Nov 29 12:16:10 2010 @@ -16,7 +16,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/StandardPasses.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/DynamicLibrary.h" +#include "llvm/Support/DynamicLibrary.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/PassNameParser.h" Modified: llvm/trunk/tools/llvm-ld/llvm-ld.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ld/llvm-ld.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-ld/llvm-ld.cpp (original) +++ llvm/trunk/tools/llvm-ld/llvm-ld.cpp Mon Nov 29 12:16:10 2010 @@ -23,7 +23,7 @@ #include "llvm/LinkAllVMCore.h" #include "llvm/Linker.h" #include "llvm/LLVMContext.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Program.h" #include "llvm/Module.h" #include "llvm/PassManager.h" #include "llvm/Bitcode/ReaderWriter.h" @@ -36,7 +36,7 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include "llvm/Config/config.h" #include #include Modified: llvm/trunk/tools/llvm-link/llvm-link.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/llvm-link.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-link/llvm-link.cpp (original) +++ llvm/trunk/tools/llvm-link/llvm-link.cpp Mon Nov 29 12:16:10 2010 @@ -23,8 +23,8 @@ #include "llvm/Support/ToolOutputFile.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/IRReader.h" -#include "llvm/System/Signals.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Signals.h" +#include "llvm/Support/Path.h" #include using namespace llvm; Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original) +++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Mon Nov 29 12:16:10 2010 @@ -35,8 +35,8 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Host.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/Signals.h" #include "Disassembler.h" using namespace llvm; Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original) +++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Mon Nov 29 12:16:10 2010 @@ -25,7 +25,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include #include #include Modified: llvm/trunk/tools/llvm-prof/llvm-prof.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-prof/llvm-prof.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-prof/llvm-prof.cpp (original) +++ llvm/trunk/tools/llvm-prof/llvm-prof.cpp Mon Nov 29 12:16:10 2010 @@ -29,7 +29,7 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Format.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include #include #include Modified: llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp (original) +++ llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp Mon Nov 29 12:16:10 2010 @@ -18,7 +18,7 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include #include #include Modified: llvm/trunk/tools/opt/opt.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/opt.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/tools/opt/opt.cpp (original) +++ llvm/trunk/tools/opt/opt.cpp Mon Nov 29 12:16:10 2010 @@ -25,7 +25,7 @@ #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/PassNameParser.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include "llvm/Support/Debug.h" #include "llvm/Support/IRReader.h" #include "llvm/Support/ManagedStatic.h" Modified: llvm/trunk/unittests/ADT/StringMapTest.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/StringMapTest.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/ADT/StringMapTest.cpp (original) +++ llvm/trunk/unittests/ADT/StringMapTest.cpp Mon Nov 29 12:16:10 2010 @@ -9,7 +9,7 @@ #include "gtest/gtest.h" #include "llvm/ADT/StringMap.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" using namespace llvm; namespace { Modified: llvm/trunk/unittests/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/CMakeLists.txt (original) +++ llvm/trunk/unittests/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -29,7 +29,6 @@ BitReader AsmParser Core - System Support ) @@ -109,7 +108,6 @@ add_llvm_unittest(VMCore ${VMCoreSources}) set(LLVM_LINK_COMPONENTS - System Support Core ) @@ -130,7 +128,7 @@ ) set(LLVM_LINK_COMPONENTS - System + Support ) add_llvm_unittest(System Modified: llvm/trunk/unittests/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/Makefile (original) +++ llvm/trunk/unittests/Makefile Mon Nov 29 12:16:10 2010 @@ -9,7 +9,7 @@ LEVEL = .. -PARALLEL_DIRS = ADT ExecutionEngine Support System Transforms VMCore Analysis +PARALLEL_DIRS = ADT ExecutionEngine Support Transforms VMCore Analysis include $(LEVEL)/Makefile.common Modified: llvm/trunk/unittests/Support/EndianTest.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/EndianTest.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/Support/EndianTest.cpp (original) +++ llvm/trunk/unittests/Support/EndianTest.cpp Mon Nov 29 12:16:10 2010 @@ -9,7 +9,7 @@ #include "gtest/gtest.h" #include "llvm/Support/Endian.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include using namespace llvm; Modified: llvm/trunk/unittests/Support/SwapByteOrderTest.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/SwapByteOrderTest.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/Support/SwapByteOrderTest.cpp (original) +++ llvm/trunk/unittests/Support/SwapByteOrderTest.cpp Mon Nov 29 12:16:10 2010 @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// #include "gtest/gtest.h" -#include "llvm/System/SwapByteOrder.h" +#include "llvm/Support/SwapByteOrder.h" #include #include using namespace llvm; Modified: llvm/trunk/unittests/System/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/System/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/System/Makefile (original) +++ llvm/trunk/unittests/System/Makefile Mon Nov 29 12:16:10 2010 @@ -9,7 +9,7 @@ LEVEL = ../.. TESTNAME = System -LINK_COMPONENTS := system support +LINK_COMPONENTS := support include $(LEVEL)/Makefile.config include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest Modified: llvm/trunk/unittests/System/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/System/Path.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/System/Path.cpp (original) +++ llvm/trunk/unittests/System/Path.cpp Mon Nov 29 12:16:10 2010 @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// // For now, just test that the header file parses. -#include "llvm/System/PathV2.h" +#include "llvm/Support/PathV2.h" #include "gtest/gtest.h" Modified: llvm/trunk/unittests/System/TimeValue.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/System/TimeValue.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/unittests/System/TimeValue.cpp (original) +++ llvm/trunk/unittests/System/TimeValue.cpp Mon Nov 29 12:16:10 2010 @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// #include "gtest/gtest.h" -#include "llvm/System/TimeValue.h" +#include "llvm/Support/TimeValue.h" #include using namespace llvm; Modified: llvm/trunk/utils/FileCheck/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/FileCheck/CMakeLists.txt (original) +++ llvm/trunk/utils/FileCheck/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -2,7 +2,7 @@ FileCheck.cpp ) -target_link_libraries(FileCheck LLVMSupport LLVMSystem) +target_link_libraries(FileCheck LLVMSupport) if( MINGW ) target_link_libraries(FileCheck imagehlp psapi) endif( MINGW ) Modified: llvm/trunk/utils/FileCheck/FileCheck.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/FileCheck.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/FileCheck/FileCheck.cpp (original) +++ llvm/trunk/utils/FileCheck/FileCheck.cpp Mon Nov 29 12:16:10 2010 @@ -22,7 +22,7 @@ #include "llvm/Support/Regex.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringMap.h" #include Modified: llvm/trunk/utils/FileCheck/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/FileCheck/Makefile (original) +++ llvm/trunk/utils/FileCheck/Makefile Mon Nov 29 12:16:10 2010 @@ -1,15 +1,15 @@ ##===- utils/FileCheck/Makefile ----------------------------*- Makefile -*-===## -# +# # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. -# +# ##===----------------------------------------------------------------------===## LEVEL = ../.. TOOLNAME = FileCheck -USEDLIBS = LLVMSupport.a LLVMSystem.a +USEDLIBS = LLVMSupport.a # This tool has no plugins, optimize startup time. TOOL_NO_EXPORTS = 1 Modified: llvm/trunk/utils/FileUpdate/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileUpdate/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/FileUpdate/CMakeLists.txt (original) +++ llvm/trunk/utils/FileUpdate/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -2,7 +2,7 @@ FileUpdate.cpp ) -target_link_libraries(FileUpdate LLVMSupport LLVMSystem) +target_link_libraries(FileUpdate LLVMSupport) if( MINGW ) target_link_libraries(FileUpdate imagehlp psapi) endif( MINGW ) Modified: llvm/trunk/utils/FileUpdate/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileUpdate/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/FileUpdate/Makefile (original) +++ llvm/trunk/utils/FileUpdate/Makefile Mon Nov 29 12:16:10 2010 @@ -1,15 +1,15 @@ ##===- utils/FileUpdate/Makefile ---------------------------*- Makefile -*-===## -# +# # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. -# +# ##===----------------------------------------------------------------------===## LEVEL = ../.. TOOLNAME = FileUpdate -USEDLIBS = LLVMSupport.a LLVMSystem.a +USEDLIBS = LLVMSupport.a # This tool has no plugins, optimize startup time. TOOL_NO_EXPORTS = 1 Modified: llvm/trunk/utils/KillTheDoctor/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/KillTheDoctor/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/KillTheDoctor/CMakeLists.txt (original) +++ llvm/trunk/utils/KillTheDoctor/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -2,4 +2,4 @@ KillTheDoctor.cpp ) -target_link_libraries(KillTheDoctor LLVMSupport LLVMSystem) +target_link_libraries(KillTheDoctor LLVMSupport) Modified: llvm/trunk/utils/KillTheDoctor/KillTheDoctor.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/KillTheDoctor/KillTheDoctor.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/KillTheDoctor/KillTheDoctor.cpp (original) +++ llvm/trunk/utils/KillTheDoctor/KillTheDoctor.cpp Mon Nov 29 12:16:10 2010 @@ -41,8 +41,8 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/type_traits.h" -#include "llvm/System/Signals.h" -#include "llvm/System/system_error.h" +#include "llvm/Support/Signals.h" +#include "llvm/Support/system_error.h" #include #include #include Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Mon Nov 29 12:16:10 2010 @@ -1826,7 +1826,7 @@ assert(0 && "Unreachable code!"); } - o << "#include \"llvm/System/DataTypes.h\"\n"; + o << "#include \"llvm/Support/DataTypes.h\"\n"; o << "#include \n"; o << '\n'; o << "namespace llvm {\n\n"; Modified: llvm/trunk/utils/TableGen/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CMakeLists.txt (original) +++ llvm/trunk/utils/TableGen/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -41,7 +41,7 @@ X86RecognizableInstr.cpp ) -target_link_libraries(tblgen LLVMSupport LLVMSystem) +target_link_libraries(tblgen LLVMSupport) if( MINGW ) target_link_libraries(tblgen imagehlp psapi) endif( MINGW ) Modified: llvm/trunk/utils/TableGen/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/Makefile (original) +++ llvm/trunk/utils/TableGen/Makefile Mon Nov 29 12:16:10 2010 @@ -9,7 +9,7 @@ LEVEL = ../.. TOOLNAME = tblgen -USEDLIBS = LLVMSupport.a LLVMSystem.a +USEDLIBS = LLVMSupport.a REQUIRES_EH := 1 REQUIRES_RTTI := 1 Modified: llvm/trunk/utils/TableGen/Record.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/Record.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/Record.cpp (original) +++ llvm/trunk/utils/TableGen/Record.cpp Mon Nov 29 12:16:10 2010 @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "Record.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/Format.h" #include "llvm/ADT/StringExtras.h" Modified: llvm/trunk/utils/TableGen/TableGen.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/TableGen.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/TableGen.cpp (original) +++ llvm/trunk/utils/TableGen/TableGen.cpp Mon Nov 29 12:16:10 2010 @@ -41,7 +41,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include #include using namespace llvm; Modified: llvm/trunk/utils/fpcmp/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/fpcmp/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/fpcmp/Makefile (original) +++ llvm/trunk/utils/fpcmp/Makefile Mon Nov 29 12:16:10 2010 @@ -1,15 +1,15 @@ ##===- utils/fpcmp/Makefile --------------------------------*- Makefile -*-===## -# +# # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. -# +# ##===----------------------------------------------------------------------===## LEVEL = ../.. TOOLNAME = fpcmp -USEDLIBS = LLVMSupport.a LLVMSystem.a +USEDLIBS = LLVMSupport.a NO_INSTALL = 1 include $(LEVEL)/Makefile.common Modified: llvm/trunk/utils/not/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/not/CMakeLists.txt?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/not/CMakeLists.txt (original) +++ llvm/trunk/utils/not/CMakeLists.txt Mon Nov 29 12:16:10 2010 @@ -2,7 +2,7 @@ not.cpp ) -target_link_libraries(not LLVMSupport LLVMSystem) +target_link_libraries(not LLVMSupport) if( MINGW ) target_link_libraries(not imagehlp psapi) endif( MINGW ) Modified: llvm/trunk/utils/not/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/not/Makefile?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/not/Makefile (original) +++ llvm/trunk/utils/not/Makefile Mon Nov 29 12:16:10 2010 @@ -1,15 +1,15 @@ ##===- utils/not/Makefile ----------------------------------*- Makefile -*-===## -# +# # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. -# +# ##===----------------------------------------------------------------------===## LEVEL = ../.. TOOLNAME = not -USEDLIBS = LLVMSupport.a LLVMSystem.a +USEDLIBS = LLVMSupport.a # This tool has no plugins, optimize startup time. TOOL_NO_EXPORTS = 1 Modified: llvm/trunk/utils/not/not.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/not/not.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/not/not.cpp (original) +++ llvm/trunk/utils/not/not.cpp Mon Nov 29 12:16:10 2010 @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Path.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; Modified: llvm/trunk/utils/unittest/UnitTestMain/TestMain.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/unittest/UnitTestMain/TestMain.cpp?rev=120298&r1=120297&r2=120298&view=diff ============================================================================== --- llvm/trunk/utils/unittest/UnitTestMain/TestMain.cpp (original) +++ llvm/trunk/utils/unittest/UnitTestMain/TestMain.cpp Mon Nov 29 12:16:10 2010 @@ -8,7 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" #include "gtest/gtest.h" From sabre at nondot.org Mon Nov 29 12:28:05 2010 From: sabre at nondot.org (Chris Lattner) Date: Mon, 29 Nov 2010 18:28:05 -0000 Subject: [llvm-commits] [www] r120300 - in /www/trunk/devmtg/2010-11: Dunbar-MC.pdf Gregor-libclang.pdf Hinnant-libcxx.pdf index.html Message-ID: <20101129182807.0684F2A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 12:28:05 2010 New Revision: 120300 URL: http://llvm.org/viewvc/llvm-project?rev=120300&view=rev Log: add some slides. Added: www/trunk/devmtg/2010-11/Dunbar-MC.pdf www/trunk/devmtg/2010-11/Gregor-libclang.pdf (with props) www/trunk/devmtg/2010-11/Hinnant-libcxx.pdf Modified: www/trunk/devmtg/2010-11/index.html Added: www/trunk/devmtg/2010-11/Dunbar-MC.pdf URL: http://llvm.org/viewvc/llvm-project/www/trunk/devmtg/2010-11/Dunbar-MC.pdf?rev=120300&view=auto ============================================================================== Binary files www/trunk/devmtg/2010-11/Dunbar-MC.pdf (added) and www/trunk/devmtg/2010-11/Dunbar-MC.pdf Mon Nov 29 12:28:05 2010 differ Added: www/trunk/devmtg/2010-11/Gregor-libclang.pdf URL: http://llvm.org/viewvc/llvm-project/www/trunk/devmtg/2010-11/Gregor-libclang.pdf?rev=120300&view=auto ============================================================================== Binary file - no diff available. Propchange: www/trunk/devmtg/2010-11/Gregor-libclang.pdf ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: www/trunk/devmtg/2010-11/Hinnant-libcxx.pdf URL: http://llvm.org/viewvc/llvm-project/www/trunk/devmtg/2010-11/Hinnant-libcxx.pdf?rev=120300&view=auto ============================================================================== Binary files www/trunk/devmtg/2010-11/Hinnant-libcxx.pdf (added) and www/trunk/devmtg/2010-11/Hinnant-libcxx.pdf Mon Nov 29 12:28:05 2010 differ Modified: www/trunk/devmtg/2010-11/index.html URL: http://llvm.org/viewvc/llvm-project/www/trunk/devmtg/2010-11/index.html?rev=120300&r1=120299&r2=120300&view=diff ============================================================================== --- www/trunk/devmtg/2010-11/index.html (original) +++ www/trunk/devmtg/2010-11/index.html Mon Nov 29 12:28:05 2010 @@ -67,7 +67,7 @@ -[Slides] +[Slides]

[Video] (Computer)
[Videos] (Mobile)

libclang: Thinking Beyond the Compiler
Doug Gregor, Apple Inc. @@ -79,7 +79,7 @@ Polly - Polyhedral optimizations in LLVM
Tobias Grosser , University of Passau -[Slides] +[Slides]

[Video] (Computer)
[Videos] (Mobile)

libc++: A Standard Library for C++0x
Howard Hinnant, Apple Inc. @@ -90,7 +90,7 @@ Symbolic Crosschecking of Floating-Point and SIMD Code
Peter Collingbourne, Imperial College London -[Slides] +[Slides]

[Video] (Computer)
[Video] (Mobile)

The LLVM Assembler & Machine Code Infrastructure
Daniel Dunbar, Apple Inc. From bigcheesegs at gmail.com Mon Nov 29 12:29:56 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 18:29:56 -0000 Subject: [llvm-commits] [llvm] r120301 - /llvm/trunk/lib/Support/Unix/Unix.h Message-ID: <20101129182956.155C22A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 12:29:55 2010 New Revision: 120301 URL: http://llvm.org/viewvc/llvm-project?rev=120301&view=rev Log: Missed a spot. Modified: llvm/trunk/lib/Support/Unix/Unix.h Modified: llvm/trunk/lib/Support/Unix/Unix.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Unix.h?rev=120301&r1=120300&r2=120301&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/Unix.h (original) +++ llvm/trunk/lib/Support/Unix/Unix.h Mon Nov 29 12:29:55 2010 @@ -20,7 +20,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Config/config.h" // Get autoconf configuration settings -#include "llvm/System/Errno.h" +#include "llvm/Support/Errno.h" #include #include #include From bigcheesegs at gmail.com Mon Nov 29 12:33:09 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 18:33:09 -0000 Subject: [llvm-commits] [llvm] r120302 - /llvm/trunk/utils/FileUpdate/FileUpdate.cpp Message-ID: <20101129183309.1AA7A2A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 12:33:08 2010 New Revision: 120302 URL: http://llvm.org/viewvc/llvm-project?rev=120302&view=rev Log: Missed another one. Modified: llvm/trunk/utils/FileUpdate/FileUpdate.cpp Modified: llvm/trunk/utils/FileUpdate/FileUpdate.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileUpdate/FileUpdate.cpp?rev=120302&r1=120301&r2=120302&view=diff ============================================================================== --- llvm/trunk/utils/FileUpdate/FileUpdate.cpp (original) +++ llvm/trunk/utils/FileUpdate/FileUpdate.cpp Mon Nov 29 12:33:08 2010 @@ -17,7 +17,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Signals.h" using namespace llvm; static cl::opt From clattner at apple.com Mon Nov 29 12:37:52 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 10:37:52 -0800 Subject: [llvm-commits] [PATCH] Merge System into Support In-Reply-To: References: Message-ID: <70EDF92A-F167-4905-AFB2-27C767EEBE51@apple.com> On Nov 29, 2010, at 10:13 AM, Anton Korobeynikov wrote: >> This is going to be a major change for almost every project that uses >> LLVM. Should we keep headers in System that forward to Support for a >> little bit? > This sounds like a sane idea at least for 2.9 Why? I don't think we should waste time on this. -Chris From grosbach at apple.com Mon Nov 29 12:37:44 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 18:37:44 -0000 Subject: [llvm-commits] [llvm] r120303 - in /llvm/trunk/lib/Target/ARM: ARMAsmPrinter.cpp ARMInstrFormats.td ARMInstrInfo.td Message-ID: <20101129183745.106E62A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 12:37:44 2010 New Revision: 120303 URL: http://llvm.org/viewvc/llvm-project?rev=120303&view=rev Log: Switch ARM BR_JTm and BR_JTr instructions to be MC-expanded pseudos. Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120303&r1=120302&r2=120303&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Nov 29 12:37:44 2010 @@ -936,32 +936,74 @@ EmitJump2Table(MI); return; } - case ARM::tBR_JTr: - case ARM::BR_JTr: - case ARM::BR_JTm: { + case ARM::tBR_JTr: { // Lower and emit the instruction itself, then the jump table following it. MCInst TmpInst; // FIXME: The branch instruction is really a pseudo. We should xform it // explicitly. LowerARMMachineInstrToMCInst(MI, TmpInst, *this); OutStreamer.EmitInstruction(TmpInst); + + // Output the data for the jump table itself + EmitJumpTable(MI); + return; + } + case ARM::BR_JTr: { + // Lower and emit the instruction itself, then the jump table following it. + // mov pc, target + MCInst TmpInst; + TmpInst.setOpcode(ARM::MOVr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + + // Output the data for the jump table itself + EmitJumpTable(MI); + return; + } + case ARM::BR_JTm: { + // Lower and emit the instruction itself, then the jump table following it. + // ldr pc, target + MCInst TmpInst; + if (MI->getOperand(1).getReg() == 0) { + // literal offset + TmpInst.setOpcode(ARM::LDRi12); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm())); + } else { + TmpInst.setOpcode(ARM::LDRrs); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); + TmpInst.addOperand(MCOperand::CreateImm(0)); + } + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + + // Output the data for the jump table itself EmitJumpTable(MI); return; } case ARM::BR_JTadd: { // Lower and emit the instruction itself, then the jump table following it. // add pc, target, idx - MCInst AddInst; - AddInst.setOpcode(ARM::ADDrr); - AddInst.addOperand(MCOperand::CreateReg(ARM::PC)); - AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); - AddInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); + MCInst TmpInst; + TmpInst.setOpcode(ARM::ADDrr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg())); // Add predicate operands. - AddInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); - AddInst.addOperand(MCOperand::CreateReg(0)); + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); // Add 's' bit operand (always reg0 for this) - AddInst.addOperand(MCOperand::CreateReg(0)); - OutStreamer.EmitInstruction(AddInst); + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); // Output the data for the jump table itself EmitJumpTable(MI); Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120303&r1=120302&r2=120303&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Mon Nov 29 12:37:44 2010 @@ -508,6 +508,24 @@ let Inst{15-12} = Rt; // Rt let Inst{7-4} = op; } +class AI3stridx op, bit isByte, bit isPre, dag oops, dag iops, + IndexMode im, Format f, InstrItinClass itin, string opc, + string asm, string cstr, list pattern> + : AI2ldstidx<0, isByte, isPre, oops, iops, im, f, itin, opc, asm, cstr, + pattern> { + // AM3 store w/ two operands: (GPR, am3offset) + bits<14> offset; + bits<4> Rt; + bits<4> Rn; + let Inst{27-25} = 0b000; + let Inst{23} = offset{8}; + let Inst{22} = offset{9}; + let Inst{19-16} = Rn; + let Inst{15-12} = Rt; // Rt + let Inst{11-8} = offset{7-4}; // imm7_4/zero + let Inst{7-4} = op; + let Inst{3-0} = offset{3-0}; // imm3_0/Rm +} // stores class AI3str op, dag oops, dag iops, Format f, InstrItinClass itin, Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120303&r1=120302&r2=120303&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 12:37:44 2010 @@ -1427,29 +1427,21 @@ let Inst{23-0} = target; } - let isNotDuplicable = 1, isIndirectBranch = 1, - // FIXME: $imm field is not specified by asm string. Mark as cgonly. - isCodeGenOnly = 1 in { - def BR_JTr : JTI<(outs), (ins GPR:$target, jtblock_operand:$jt, i32imm:$id), - IIC_Br, "mov\tpc, $target$jt", + let isNotDuplicable = 1, isIndirectBranch = 1 in { + def BR_JTr : ARMPseudoInst<(outs), + (ins GPR:$target, jtblock_operand:$jt, i32imm:$id), + IIC_Br,// "mov\tpc, $target$jt", [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]> { - let Inst{11-4} = 0b00000000; - let Inst{15-12} = 0b1111; - let Inst{20} = 0; // S Bit - let Inst{24-21} = 0b1101; - let Inst{27-25} = 0b000; + let SZ = SizeSpecial; } - def BR_JTm : JTI<(outs), + // FIXME: This shouldn't use the generic "addrmode2," but rather be split + // into i12 and rs suffixed versions. + def BR_JTm : ARMPseudoInst<(outs), (ins addrmode2:$target, jtblock_operand:$jt, i32imm:$id), - IIC_Br, "ldr\tpc, $target$jt", + IIC_Br, [(ARMbrjt (i32 (load addrmode2:$target)), tjumptable:$jt, imm:$id)]> { - let Inst{15-12} = 0b1111; - let Inst{20} = 1; // L bit - let Inst{21} = 0; // W bit - let Inst{22} = 0; // B bit - let Inst{24} = 1; // P bit - let Inst{27-25} = 0b011; + let SZ = SizeSpecial; } def BR_JTadd : ARMPseudoInst<(outs), (ins GPR:$target, GPR:$idx, jtblock_operand:$jt, i32imm:$id), @@ -1730,19 +1722,19 @@ [(set GPR:$Rn_wb, (post_truncsti8 GPR:$Rt, GPR:$Rn, am2offset:$offset))]>; -def STRH_PRE : AI3sthpr<(outs GPR:$base_wb), - (ins GPR:$src, GPR:$base,am3offset:$offset), - StMiscFrm, IIC_iStore_ru, - "strh", "\t$src, [$base, $offset]!", "$base = $base_wb", - [(set GPR:$base_wb, - (pre_truncsti16 GPR:$src, GPR:$base,am3offset:$offset))]>; - -def STRH_POST: AI3sthpo<(outs GPR:$base_wb), - (ins GPR:$src, GPR:$base,am3offset:$offset), - StMiscFrm, IIC_iStore_bh_ru, - "strh", "\t$src, [$base], $offset", "$base = $base_wb", - [(set GPR:$base_wb, (post_truncsti16 GPR:$src, - GPR:$base, am3offset:$offset))]>; +def STRH_PRE : AI3stridx<0b1011, 0, 1, (outs GPR:$Rn_wb), + (ins GPR:$Rt, GPR:$Rn, am3offset:$offset), + IndexModePre, StMiscFrm, IIC_iStore_ru, + "strh", "\t$Rt, [$Rn, $offset]!", "$Rn = $Rn_wb", + [(set GPR:$Rn_wb, + (pre_truncsti16 GPR:$Rt, GPR:$Rn, am3offset:$offset))]>; + +def STRH_POST: AI3stridx<0b1011, 0, 0, (outs GPR:$Rn_wb), + (ins GPR:$Rt, GPR:$Rn, am3offset:$offset), + IndexModePost, StMiscFrm, IIC_iStore_bh_ru, + "strh", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb", + [(set GPR:$Rn_wb, (post_truncsti16 GPR:$Rt, + GPR:$Rn, am3offset:$offset))]>; // For disassembly only def STRD_PRE : AI3stdpr<(outs GPR:$base_wb), From anton at korobeynikov.info Mon Nov 29 12:45:24 2010 From: anton at korobeynikov.info (Anton Korobeynikov) Date: Mon, 29 Nov 2010 21:45:24 +0300 Subject: [llvm-commits] [PATCH] Merge System into Support In-Reply-To: <70EDF92A-F167-4905-AFB2-27C767EEBE51@apple.com> References: <70EDF92A-F167-4905-AFB2-27C767EEBE51@apple.com> Message-ID: > Why? ?I don't think we should waste time on this. Well... at least time was wasted before on iterator / hash_map, etc. Anything changed since that time? -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University From bigcheesegs at gmail.com Mon Nov 29 12:47:54 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 18:47:54 -0000 Subject: [llvm-commits] [llvm] r120304 - in /llvm/trunk: include/llvm-c/ include/llvm/Support/ lib/CompilerDriver/ lib/Target/ARM/ lib/Target/CBackend/ lib/Target/PowerPC/ projects/sample/lib/sample/ tools/gold/ tools/llvmc/examples/mcc16/ tools/lto/ utils/TableGen/ Message-ID: <20101129184754.B81F22A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 12:47:54 2010 New Revision: 120304 URL: http://llvm.org/viewvc/llvm-project?rev=120304&view=rev Log: I swear I did a make clean and make before committing all this... Modified: llvm/trunk/include/llvm-c/Core.h llvm/trunk/include/llvm-c/lto.h llvm/trunk/include/llvm/Support/DataTypes.h.in llvm/trunk/lib/CompilerDriver/Action.cpp llvm/trunk/lib/CompilerDriver/Main.cpp llvm/trunk/lib/CompilerDriver/Tool.cpp llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp llvm/trunk/lib/Target/CBackend/CBackend.cpp llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp llvm/trunk/projects/sample/lib/sample/sample.c llvm/trunk/tools/gold/gold-plugin.cpp llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp llvm/trunk/tools/lto/LTOCodeGenerator.cpp llvm/trunk/tools/lto/LTOModule.cpp llvm/trunk/utils/TableGen/ARMDecoderEmitter.h llvm/trunk/utils/TableGen/Record.h llvm/trunk/utils/TableGen/TGLexer.h llvm/trunk/utils/TableGen/X86ModRMFilters.h llvm/trunk/utils/TableGen/X86RecognizableInstr.h Modified: llvm/trunk/include/llvm-c/Core.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/include/llvm-c/Core.h (original) +++ llvm/trunk/include/llvm-c/Core.h Mon Nov 29 12:47:54 2010 @@ -33,7 +33,7 @@ #ifndef LLVM_C_CORE_H #define LLVM_C_CORE_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #ifdef __cplusplus Modified: llvm/trunk/include/llvm-c/lto.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/include/llvm-c/lto.h (original) +++ llvm/trunk/include/llvm-c/lto.h Mon Nov 29 12:47:54 2010 @@ -18,7 +18,7 @@ #include #include -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #define LTO_API_VERSION 4 Modified: llvm/trunk/include/llvm/Support/DataTypes.h.in URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DataTypes.h.in?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/DataTypes.h.in (original) +++ llvm/trunk/include/llvm/Support/DataTypes.h.in Mon Nov 29 12:47:54 2010 @@ -63,7 +63,7 @@ #endif #ifdef _AIX -#include "llvm/System/AIXDataTypesFix.h" +#include "llvm/Support/AIXDataTypesFix.h" #endif /* Handle incorrect definition of uint64_t as u_int64_t */ Modified: llvm/trunk/lib/CompilerDriver/Action.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Action.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/lib/CompilerDriver/Action.cpp (original) +++ llvm/trunk/lib/CompilerDriver/Action.cpp Mon Nov 29 12:47:54 2010 @@ -18,8 +18,8 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Support/SystemUtils.h" -#include "llvm/System/Program.h" -#include "llvm/System/TimeValue.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/TimeValue.h" #include #include Modified: llvm/trunk/lib/CompilerDriver/Main.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Main.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/lib/CompilerDriver/Main.cpp (original) +++ llvm/trunk/lib/CompilerDriver/Main.cpp Mon Nov 29 12:47:54 2010 @@ -17,7 +17,7 @@ #include "llvm/CompilerDriver/Error.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include #include Modified: llvm/trunk/lib/CompilerDriver/Tool.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Tool.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/lib/CompilerDriver/Tool.cpp (original) +++ llvm/trunk/lib/CompilerDriver/Tool.cpp Mon Nov 29 12:47:54 2010 @@ -15,7 +15,7 @@ #include "llvm/CompilerDriver/Tool.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include Modified: llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp Mon Nov 29 12:47:54 2010 @@ -22,7 +22,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/System/Memory.h" +#include "llvm/Support/Memory.h" #include using namespace llvm; Modified: llvm/trunk/lib/Target/CBackend/CBackend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CBackend/CBackend.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/lib/Target/CBackend/CBackend.cpp (original) +++ llvm/trunk/lib/Target/CBackend/CBackend.cpp Mon Nov 29 12:47:54 2010 @@ -47,7 +47,7 @@ #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include "llvm/Config/config.h" #include // Some ms header decided to define setjmp as _setjmp, undo this for this file. Modified: llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp (original) +++ llvm/trunk/lib/Target/PowerPC/PPCJITInfo.cpp Mon Nov 29 12:47:54 2010 @@ -16,7 +16,7 @@ #include "PPCRelocations.h" #include "PPCTargetMachine.h" #include "llvm/Function.h" -#include "llvm/System/Memory.h" +#include "llvm/Support/Memory.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" Modified: llvm/trunk/projects/sample/lib/sample/sample.c URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/projects/sample/lib/sample/sample.c?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/projects/sample/lib/sample/sample.c (original) +++ llvm/trunk/projects/sample/lib/sample/sample.c Mon Nov 29 12:47:54 2010 @@ -11,7 +11,7 @@ #include /* LLVM Header File -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" */ /* Header file global to this project */ Modified: llvm/trunk/tools/gold/gold-plugin.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/tools/gold/gold-plugin.cpp (original) +++ llvm/trunk/tools/gold/gold-plugin.cpp Mon Nov 29 12:47:54 2010 @@ -18,9 +18,9 @@ #include "llvm-c/lto.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Errno.h" -#include "llvm/System/Path.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Errno.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" #include #include Modified: llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp (original) +++ llvm/trunk/tools/llvmc/examples/mcc16/Hooks.cpp Mon Nov 29 12:47:54 2010 @@ -1,4 +1,4 @@ -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" Modified: llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp (original) +++ llvm/trunk/tools/llvmc/examples/mcc16/Main.cpp Mon Nov 29 12:47:54 2010 @@ -16,7 +16,7 @@ #include "llvm/CompilerDriver/BuiltinOptions.h" #include "llvm/CompilerDriver/Main.h" -#include "llvm/System/Path.h" +#include "llvm/Support/Path.h" #include "llvm/Config/config.h" #include Modified: llvm/trunk/tools/lto/LTOCodeGenerator.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOCodeGenerator.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/tools/lto/LTOCodeGenerator.cpp (original) +++ llvm/trunk/tools/lto/LTOCodeGenerator.cpp Mon Nov 29 12:47:54 2010 @@ -40,9 +40,9 @@ #include "llvm/Support/StandardPasses.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Host.h" -#include "llvm/System/Program.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/Signals.h" #include "llvm/Config/config.h" #include #include Modified: llvm/trunk/tools/lto/LTOModule.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOModule.cpp?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/tools/lto/LTOModule.cpp (original) +++ llvm/trunk/tools/lto/LTOModule.cpp Mon Nov 29 12:47:54 2010 @@ -23,9 +23,9 @@ #include "llvm/Support/SystemUtils.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/Host.h" -#include "llvm/System/Path.h" -#include "llvm/System/Process.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" #include "llvm/Target/Mangler.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/MC/MCAsmInfo.h" Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.h?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.h (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.h Mon Nov 29 12:47:54 2010 @@ -17,7 +17,7 @@ #include "TableGenBackend.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/utils/TableGen/Record.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/Record.h?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/Record.h (original) +++ llvm/trunk/utils/TableGen/Record.h Mon Nov 29 12:47:54 2010 @@ -16,7 +16,7 @@ #define RECORD_H #include "llvm/Support/SourceMgr.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/raw_ostream.h" #include Modified: llvm/trunk/utils/TableGen/TGLexer.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/TGLexer.h?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/TGLexer.h (original) +++ llvm/trunk/utils/TableGen/TGLexer.h Mon Nov 29 12:47:54 2010 @@ -14,7 +14,7 @@ #ifndef TGLEXER_H #define TGLEXER_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include #include #include Modified: llvm/trunk/utils/TableGen/X86ModRMFilters.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/X86ModRMFilters.h?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/X86ModRMFilters.h (original) +++ llvm/trunk/utils/TableGen/X86ModRMFilters.h Mon Nov 29 12:47:54 2010 @@ -18,7 +18,7 @@ #ifndef X86MODRMFILTERS_H #define X86MODRMFILTERS_H -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" namespace llvm { Modified: llvm/trunk/utils/TableGen/X86RecognizableInstr.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/X86RecognizableInstr.h?rev=120304&r1=120303&r2=120304&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/X86RecognizableInstr.h (original) +++ llvm/trunk/utils/TableGen/X86RecognizableInstr.h Mon Nov 29 12:47:54 2010 @@ -22,7 +22,7 @@ #include "CodeGenTarget.h" #include "Record.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/ADT/SmallVector.h" namespace llvm { From grosbach at apple.com Mon Nov 29 12:53:24 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 18:53:24 -0000 Subject: [llvm-commits] [llvm] r120305 - /llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Message-ID: <20101129185324.9DFBF2A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 12:53:24 2010 New Revision: 120305 URL: http://llvm.org/viewvc/llvm-project?rev=120305&view=rev Log: The ARM BR_JT* pseudos don't need to use the printer jtblock_operand node to get the pretty-printer. That's handled explicityly by the MC lowering now. Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120305&r1=120304&r2=120305&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 12:53:24 2010 @@ -1429,22 +1429,22 @@ let isNotDuplicable = 1, isIndirectBranch = 1 in { def BR_JTr : ARMPseudoInst<(outs), - (ins GPR:$target, jtblock_operand:$jt, i32imm:$id), - IIC_Br,// "mov\tpc, $target$jt", + (ins GPR:$target, i32imm:$jt, i32imm:$id), + IIC_Br, [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]> { let SZ = SizeSpecial; } // FIXME: This shouldn't use the generic "addrmode2," but rather be split // into i12 and rs suffixed versions. def BR_JTm : ARMPseudoInst<(outs), - (ins addrmode2:$target, jtblock_operand:$jt, i32imm:$id), + (ins addrmode2:$target, i32imm:$jt, i32imm:$id), IIC_Br, [(ARMbrjt (i32 (load addrmode2:$target)), tjumptable:$jt, imm:$id)]> { let SZ = SizeSpecial; } def BR_JTadd : ARMPseudoInst<(outs), - (ins GPR:$target, GPR:$idx, jtblock_operand:$jt, i32imm:$id), + (ins GPR:$target, GPR:$idx, i32imm:$jt, i32imm:$id), IIC_Br, [(ARMbrjt (add GPR:$target, GPR:$idx), tjumptable:$jt, imm:$id)]> { From resistor at mac.com Mon Nov 29 12:54:38 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 29 Nov 2010 18:54:38 -0000 Subject: [llvm-commits] [llvm] r120306 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101129185438.731D12A6C12D@llvm.org> Author: resistor Date: Mon Nov 29 12:54:38 2010 New Revision: 120306 URL: http://llvm.org/viewvc/llvm-project?rev=120306&view=rev Log: Thumb2 encodings for branches and IT blocks. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120306&r1=120305&r2=120306&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 12:54:38 2010 @@ -2921,6 +2921,13 @@ let Inst{31-27} = 0b11110; let Inst{15-14} = 0b10; let Inst{12} = 1; + + bits<20> target; + let Inst{26} = target{19}; + let Inst{11} = target{18}; + let Inst{13} = target{17}; + let Inst{21-16} = target{16-11}; + let Inst{10-0} = target{10-0}; } let isNotDuplicable = 1, isIndirectBranch = 1, @@ -3004,6 +3011,11 @@ // 16-bit instruction. let Inst{31-16} = 0x0000; let Inst{15-8} = 0b10111111; + + bits<4> cc; + bits<4> mask; + let Inst{7-4} = cc{3-0}; + let Inst{3-0} = mask{3-0}; } // Branch and Exchange Jazelle -- for disassembly only @@ -3015,6 +3027,9 @@ let Inst{25-20} = 0b111100; let Inst{15-14} = 0b10; let Inst{12} = 0; + + bits<4> func; + let Inst{19-16} = func{3-0}; } // Change Processor State is a system instruction -- for disassembly only. From clattner at apple.com Mon Nov 29 13:04:43 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 11:04:43 -0800 Subject: [llvm-commits] [PATCH] Merge System into Support In-Reply-To: References: <70EDF92A-F167-4905-AFB2-27C767EEBE51@apple.com> Message-ID: <9EC7F938-3EF3-46F5-9E03-6C9D8F384148@apple.com> On Nov 29, 2010, at 10:45 AM, Anton Korobeynikov wrote: >> Why? I don't think we should waste time on this. > Well... at least time was wasted before on iterator / hash_map, etc. > Anything changed since that time? This would require a lot more work than those, and even they weren't really that important. We don't provide api compatibility across releases, sorry. -Chris From gohman at apple.com Mon Nov 29 13:20:14 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 29 Nov 2010 11:20:14 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> Message-ID: <4931539F-BC52-4235-B421-C9140759527B@apple.com> On Nov 24, 2010, at 9:07 AM, Danil Malyshev wrote: > Hello everyone, > > Please find attached a patch to review. > > This patch > > 1. Adds support for setw() method to the llvm::raw_ostream. An alternative to unpopular iostream-style manipulators is llvm/Support/Format.h. Dan From gohman at apple.com Mon Nov 29 13:20:21 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 29 Nov 2010 11:20:21 -0800 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: Message-ID: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> On Nov 28, 2010, at 2:43 AM, Frits van Bommel wrote: > On Sun, Nov 28, 2010 at 3:52 AM, Frits van Bommel wrote: >> No, definitely not okay. It inserts the new load at the location of >> the extractvalue instead of the location of the old load. Fixed >> version attached. I'll provide an extra test case once I've had some >> sleep... > > So apparently 4 AM is not the best time to try to fix bugs. Who knew? > I forgot to even run the testcase. > That version is even more broken than the one it replaced; it asserts > every time it fires. > > Here's the real fix, as well as the promised adjusted testcase that > checks for the original problem. > <006-instcombine-extractvalue-load-v3.patch><007-instcombine-extractvalue-load-test-v2.patch>_______________________________________________ Why is this needed? Front-ends should emit gep+load instead of load+extractvalue. Dan From gohman at apple.com Mon Nov 29 13:20:55 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 29 Nov 2010 11:20:55 -0800 Subject: [llvm-commits] [PATCH] Fix llvm.invariant support In-Reply-To: References: Message-ID: <0C0069DC-258D-45D1-877E-3921693D2221@apple.com> On Nov 22, 2010, at 7:14 PM, Kenneth Uildriks wrote: > Ping. > > On Sat, Nov 13, 2010 at 7:00 PM, Kenneth Uildriks wrote: >> A less drastic attempt to fix issues with support for >> llvm.invariant.start and llvm.invariant.end. It involves adding >> invariant tracking by block to MemoryDependenceAnalysis. When a load >> is analyzed, the invariant information for that block and its >> predecessors is lazily computed and consulted. If the load's target >> is not invariant anywhere in the block, there is no need to look for >> invariant markers during the scan. If it is invariant throughout the >> block, no def or clobber can be in that block, so we can skip >> backwards to the block(s) that began the invariance. If it is >> invariant through part of the block, we need to continue scanning >> backwards past clobbers until we find the def or an invariant marker - >> we can't assume that the scan starts after the invariant end, but >> instead assume that we *might* have started scanning in the middle of >> an invariant region until we can prove otherwise. How do @llvm.invariant.start and @llvm.invariant.end work? There are at least two interesting situations. First, is this valid? define void @callee(i8* %p) { call void @llvm.invariant.end(i8* %p) ret void } If so, then any call can call @llvm.invariant.end on any pointer it has access to, which substantially weakens what MemDep can do. If not, then it seems to violate high-level IR design principles -- it should always be valid to out-line code regions. Next, what about this? %a = alloca i32 %b = bitcast i32* %a to i8* %c = call {}* @llvm.invariant.begin(i8* %b) %d = bitcast {}* %c to i8* call void @llvm.invariant.end(i8* %d) If I read your patch correctly, it won't notice that the invariant region for %b is ended here, because it's ended with a different pointer. The results for subsequent getPointerDependencyFrom queries will depend on which pointer happens to land first in the std::map. Or did I miss something? Here are a few specific comments on the patch: > + struct InvariantInfo { > + unsigned Size; AliasAnalysis uses uint64_t for sizes now. > + else if (F->getName() == "llvm.invariant.start" > + else if (F->getName() == "llvm.invariant.end" These should use F->getIntrinsicID(). > @@ -321,8 +367,11 @@ > > if (R == AliasAnalysis::NoAlias) > continue; > - if (R == AliasAnalysis::MayAlias) > - return MemDepResult::getClobber(Inst); > + if (R == AliasAnalysis::MayAlias) { > + if (!InvariantInside) > + return MemDepResult::getClobber(Inst); > + MayBeClobbered = true; > + } > return MemDepResult::getDef(Inst); > } It's not obvious what's happening here. If the pointer is invariant inside the block, why is it marked MayBeClobbered? And, a testcase demonstrating the basic functionality would be helpful. Dan From resistor at mac.com Mon Nov 29 13:22:08 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 29 Nov 2010 19:22:08 -0000 Subject: [llvm-commits] [llvm] r120307 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101129192208.524192A6C12D@llvm.org> Author: resistor Date: Mon Nov 29 13:22:08 2010 New Revision: 120307 URL: http://llvm.org/viewvc/llvm-project?rev=120307&view=rev Log: Thumb2 encodings for system instructions. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120307&r1=120306&r2=120307&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 13:22:08 2010 @@ -3045,6 +3045,26 @@ let Inst{25-20} = 0b111010; let Inst{15-14} = 0b10; let Inst{12} = 0; + + bits<11> opt; + + // mode number + let Inst{4-0} = opt{4-0}; + + // M flag + let Inst{8} = opt{5}; + + // F flag + let Inst{5} = opt{6}; + + // I flag + let Inst{6} = opt{7}; + + // A flag + let Inst{7} = opt{8}; + + // imod flag + let Inst{10-9} = opt{10-9}; } // A6.3.4 Branches and miscellaneous control @@ -3082,53 +3102,75 @@ let Inst{31-27} = 0b11110; let Inst{26-20} = 0b1111111; let Inst{15-12} = 0b1000; + + bits<4> opt; + let Inst{19-16} = opt{3-0}; +} + +class T2SRS pattern> + : T2I { + bits<5> mode; + let Inst{4-0} = mode{4-0}; } // Store Return State is a system instruction -- for disassembly only -def t2SRSDBW : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode", +def t2SRSDBW : T2SRS< + (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0000010; // W = 1 } -def t2SRSDB : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode", +def t2SRSDB : T2SRS< + (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0000000; // W = 0 } -def t2SRSIAW : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode", +def t2SRSIAW : T2SRS< + (outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0011010; // W = 1 } -def t2SRSIA : T2I<(outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode", +def t2SRSIA : T2SRS< + (outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0011000; // W = 0 } // Return From Exception is a system instruction -- for disassembly only -def t2RFEDBW : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfedb", "\t$base!", + +class T2RFE pattern> + : T2I { + bits<4> Rn; + let Inst{19-16} = Rn{3-0}; +} + +def t2RFEDBW : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfedb", "\t$Rn!", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0000011; // W = 1 } -def t2RFEDB : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfeab", "\t$base", +def t2RFEDB : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeab", "\t$Rn", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0000001; // W = 0 } -def t2RFEIAW : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfeia", "\t$base!", +def t2RFEIAW : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn!", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0011011; // W = 1 } -def t2RFEIA : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfeia", "\t$base", +def t2RFEIA : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11101; let Inst{26-20} = 0b0011001; // W = 0 From clattner at apple.com Mon Nov 29 13:26:48 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 11:26:48 -0800 Subject: [llvm-commits] [llvm] r120307 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td In-Reply-To: <20101129192208.524192A6C12D@llvm.org> References: <20101129192208.524192A6C12D@llvm.org> Message-ID: <979FC999-FA41-4FFE-8D1E-449F5F067904@apple.com> On Nov 29, 2010, at 11:22 AM, Owen Anderson wrote: > Author: resistor > Date: Mon Nov 29 13:22:08 2010 > New Revision: 120307 > > URL: http://llvm.org/viewvc/llvm-project?rev=120307&view=rev > Log: > Thumb2 encodings for system instructions. Hi Owen, Following my harassment of Bill yesterday, why not add arguments to T2SRS that take the bit values instead of assigning them with 'let' statements? -Chris > > Modified: > llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td > > Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120307&r1=120306&r2=120307&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) > +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 13:22:08 2010 > @@ -3045,6 +3045,26 @@ > let Inst{25-20} = 0b111010; > let Inst{15-14} = 0b10; > let Inst{12} = 0; > + > + bits<11> opt; > + > + // mode number > + let Inst{4-0} = opt{4-0}; > + > + // M flag > + let Inst{8} = opt{5}; > + > + // F flag > + let Inst{5} = opt{6}; > + > + // I flag > + let Inst{6} = opt{7}; > + > + // A flag > + let Inst{7} = opt{8}; > + > + // imod flag > + let Inst{10-9} = opt{10-9}; > } > > // A6.3.4 Branches and miscellaneous control > @@ -3082,53 +3102,75 @@ > let Inst{31-27} = 0b11110; > let Inst{26-20} = 0b1111111; > let Inst{15-12} = 0b1000; > + > + bits<4> opt; > + let Inst{19-16} = opt{3-0}; > +} > + > +class T2SRS + string opc, string asm, list pattern> > + : T2I { > + bits<5> mode; > + let Inst{4-0} = mode{4-0}; > } > > // Store Return State is a system instruction -- for disassembly only > -def t2SRSDBW : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode", > +def t2SRSDBW : T2SRS< > + (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0000010; // W = 1 > } > > -def t2SRSDB : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode", > +def t2SRSDB : T2SRS< > + (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0000000; // W = 0 > } > > -def t2SRSIAW : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode", > +def t2SRSIAW : T2SRS< > + (outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0011010; // W = 1 > } > > -def t2SRSIA : T2I<(outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode", > +def t2SRSIA : T2SRS< > + (outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0011000; // W = 0 > } > > // Return From Exception is a system instruction -- for disassembly only > -def t2RFEDBW : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfedb", "\t$base!", > + > +class T2RFE + string opc, string asm, list pattern> > + : T2I { > + bits<4> Rn; > + let Inst{19-16} = Rn{3-0}; > +} > + > +def t2RFEDBW : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfedb", "\t$Rn!", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0000011; // W = 1 > } > > -def t2RFEDB : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfeab", "\t$base", > +def t2RFEDB : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeab", "\t$Rn", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0000001; // W = 0 > } > > -def t2RFEIAW : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfeia", "\t$base!", > +def t2RFEIAW : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn!", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0011011; // W = 1 > } > > -def t2RFEIA : T2I<(outs), (ins rGPR:$base), NoItinerary, "rfeia", "\t$base", > +def t2RFEIA : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn", > [/* For disassembly only; pattern left blank */]> { > let Inst{31-27} = 0b11101; > let Inst{26-20} = 0b0011001; // W = 0 > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From clattner at apple.com Mon Nov 29 13:28:20 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 11:28:20 -0800 Subject: [llvm-commits] [Review request] Constant folding insertvalue instructions. In-Reply-To: References: Message-ID: Looks great! Please commit, -Chris On Nov 27, 2010, at 2:05 PM, Frits van Bommel wrote: > Okay, so this is a bit embarrassing. I somehow completely missed > ConstantExpr::get{Insert,Extract}Value() methods. Instead of > reinventing the wheel, here's a much simpler patch that uses those > methods to add both insertvalue and extractvalue folding to > ConstantFoldInstruction(). > > Okay to commit? > <005-constfold-insert-extract-value.patch><002-constprop-insertvalue-test.patch><004-constprop-extractvalue-test.patch>_______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From bigcheesegs at gmail.com Mon Nov 29 13:28:48 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 19:28:48 -0000 Subject: [llvm-commits] [llvm] r120308 - /llvm/trunk/cmake/modules/LLVMLibDeps.cmake Message-ID: <20101129192848.7C40B2A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 13:28:48 2010 New Revision: 120308 URL: http://llvm.org/viewvc/llvm-project?rev=120308&view=rev Log: Update library dependencies changed in the System -> Support merge. Modified: llvm/trunk/cmake/modules/LLVMLibDeps.cmake Modified: llvm/trunk/cmake/modules/LLVMLibDeps.cmake URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/modules/LLVMLibDeps.cmake?rev=120308&r1=120307&r2=120308&view=diff ============================================================================== --- llvm/trunk/cmake/modules/LLVMLibDeps.cmake (original) +++ llvm/trunk/cmake/modules/LLVMLibDeps.cmake Mon Nov 29 13:28:48 2010 @@ -1,68 +1,67 @@ set(MSVC_LIB_DEPS_LLVMARMAsmParser LLVMARMCodeGen LLVMARMInfo LLVMMC LLVMMCParser LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMARMAsmPrinter LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMARMCodeGen LLVMARMAsmPrinter LLVMARMInfo LLVMAnalysis LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget) -set(MSVC_LIB_DEPS_LLVMARMDisassembler LLVMARMCodeGen LLVMARMInfo LLVMMC LLVMSupport LLVMSystem) +set(MSVC_LIB_DEPS_LLVMARMCodeGen LLVMARMAsmPrinter LLVMARMInfo LLVMAnalysis LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMTarget) +set(MSVC_LIB_DEPS_LLVMARMDisassembler LLVMARMCodeGen LLVMARMInfo LLVMMC LLVMSupport) set(MSVC_LIB_DEPS_LLVMARMInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMAlphaCodeGen LLVMAlphaInfo LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMAlphaCodeGen LLVMAlphaInfo LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMAlphaInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMAnalysis LLVMCore LLVMSupport LLVMSystem LLVMTarget) -set(MSVC_LIB_DEPS_LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMAsmParser LLVMCore LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMAsmPrinter LLVMAnalysis LLVMCodeGen LLVMCore LLVMMC LLVMMCParser LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMAnalysis LLVMCore LLVMSupport LLVMTarget) +set(MSVC_LIB_DEPS_LLVMArchive LLVMBitReader LLVMCore LLVMSupport) +set(MSVC_LIB_DEPS_LLVMAsmParser LLVMCore LLVMSupport) +set(MSVC_LIB_DEPS_LLVMAsmPrinter LLVMAnalysis LLVMCodeGen LLVMCore LLVMMC LLVMMCParser LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMBitReader LLVMCore LLVMSupport) set(MSVC_LIB_DEPS_LLVMBitWriter LLVMCore LLVMSupport) set(MSVC_LIB_DEPS_LLVMBlackfinCodeGen LLVMAsmPrinter LLVMBlackfinInfo LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMBlackfinInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMCBackend LLVMAnalysis LLVMCBackendInfo LLVMCodeGen LLVMCore LLVMMC LLVMScalarOpts LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils LLVMipa) +set(MSVC_LIB_DEPS_LLVMCBackend LLVMAnalysis LLVMCBackendInfo LLVMCodeGen LLVMCore LLVMMC LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa) set(MSVC_LIB_DEPS_LLVMCBackendInfo LLVMMC LLVMSupport) set(MSVC_LIB_DEPS_LLVMCellSPUCodeGen LLVMAsmPrinter LLVMCellSPUInfo LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMCellSPUInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMCodeGen LLVMAnalysis LLVMCore LLVMMC LLVMScalarOpts LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils) -set(MSVC_LIB_DEPS_LLVMCore LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMCppBackend LLVMCore LLVMCppBackendInfo LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMCodeGen LLVMAnalysis LLVMCore LLVMMC LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils) +set(MSVC_LIB_DEPS_LLVMCore LLVMSupport) +set(MSVC_LIB_DEPS_LLVMCppBackend LLVMCore LLVMCppBackendInfo LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMCppBackendInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMExecutionEngine LLVMCore LLVMSupport LLVMSystem LLVMTarget) -set(MSVC_LIB_DEPS_LLVMInstCombine LLVMAnalysis LLVMCore LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils) -set(MSVC_LIB_DEPS_LLVMInstrumentation LLVMAnalysis LLVMCore LLVMSupport LLVMSystem LLVMTransformUtils) -set(MSVC_LIB_DEPS_LLVMInterpreter LLVMCodeGen LLVMCore LLVMExecutionEngine LLVMSupport LLVMSystem LLVMTarget) -set(MSVC_LIB_DEPS_LLVMJIT LLVMCodeGen LLVMCore LLVMExecutionEngine LLVMMC LLVMSupport LLVMSystem LLVMTarget) -set(MSVC_LIB_DEPS_LLVMLinker LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMSystem LLVMTransformUtils) -set(MSVC_LIB_DEPS_LLVMMBlazeAsmParser LLVMMBlazeCodeGen LLVMMBlazeInfo LLVMMC LLVMMCParser LLVMSupport LLVMSystem LLVMTarget) -set(MSVC_LIB_DEPS_LLVMMBlazeAsmPrinter LLVMMC LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMMBlazeCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMBlazeAsmPrinter LLVMMBlazeInfo LLVMMC LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMExecutionEngine LLVMCore LLVMSupport LLVMTarget) +set(MSVC_LIB_DEPS_LLVMInstCombine LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMTransformUtils) +set(MSVC_LIB_DEPS_LLVMInstrumentation LLVMAnalysis LLVMCore LLVMSupport LLVMTransformUtils) +set(MSVC_LIB_DEPS_LLVMInterpreter LLVMCodeGen LLVMCore LLVMExecutionEngine LLVMSupport LLVMTarget) +set(MSVC_LIB_DEPS_LLVMJIT LLVMCodeGen LLVMCore LLVMExecutionEngine LLVMMC LLVMSupport LLVMTarget) +set(MSVC_LIB_DEPS_LLVMLinker LLVMArchive LLVMBitReader LLVMCore LLVMSupport LLVMTransformUtils) +set(MSVC_LIB_DEPS_LLVMMBlazeAsmParser LLVMMBlazeCodeGen LLVMMBlazeInfo LLVMMC LLVMMCParser LLVMSupport LLVMTarget) +set(MSVC_LIB_DEPS_LLVMMBlazeAsmPrinter LLVMMC LLVMSupport) +set(MSVC_LIB_DEPS_LLVMMBlazeCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMBlazeAsmPrinter LLVMMBlazeInfo LLVMMC LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMMBlazeDisassembler LLVMMBlazeCodeGen LLVMMBlazeInfo LLVMMC LLVMSupport) set(MSVC_LIB_DEPS_LLVMMBlazeInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMMC LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMMCDisassembler LLVMARMAsmParser LLVMARMCodeGen LLVMARMDisassembler LLVMARMInfo LLVMAlphaCodeGen LLVMAlphaInfo LLVMBlackfinCodeGen LLVMBlackfinInfo LLVMCBackend LLVMCBackendInfo LLVMCellSPUCodeGen LLVMCellSPUInfo LLVMCppBackend LLVMCppBackendInfo LLVMMBlazeAsmParser LLVMMBlazeCodeGen LLVMMBlazeDisassembler LLVMMBlazeInfo LLVMMC LLVMMCParser LLVMMSP430CodeGen LLVMMSP430Info LLVMMipsCodeGen LLVMMipsInfo LLVMPTXCodeGen LLVMPTXInfo LLVMPowerPCCodeGen LLVMPowerPCInfo LLVMSparcCodeGen LLVMSparcInfo LLVMSupport LLVMSystem LLVMSystemZCodeGen LLVMSystemZInfo LLVMX86AsmParser LLVMX86CodeGen LLVMX86Disassembler LLVMX86Info LLVMXCoreCodeGen LLVMXCoreInfo) -set(MSVC_LIB_DEPS_LLVMMCJIT LLVMExecutionEngine LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMMC LLVMSupport) +set(MSVC_LIB_DEPS_LLVMMCDisassembler LLVMARMAsmParser LLVMARMCodeGen LLVMARMDisassembler LLVMARMInfo LLVMAlphaCodeGen LLVMAlphaInfo LLVMBlackfinCodeGen LLVMBlackfinInfo LLVMCBackend LLVMCBackendInfo LLVMCellSPUCodeGen LLVMCellSPUInfo LLVMCppBackend LLVMCppBackendInfo LLVMMBlazeAsmParser LLVMMBlazeCodeGen LLVMMBlazeDisassembler LLVMMBlazeInfo LLVMMC LLVMMCParser LLVMMSP430CodeGen LLVMMSP430Info LLVMMipsCodeGen LLVMMipsInfo LLVMPTXCodeGen LLVMPTXInfo LLVMPowerPCCodeGen LLVMPowerPCInfo LLVMSparcCodeGen LLVMSparcInfo LLVMSupport LLVMSystemZCodeGen LLVMSystemZInfo LLVMX86AsmParser LLVMX86CodeGen LLVMX86Disassembler LLVMX86Info LLVMXCoreCodeGen LLVMXCoreInfo) +set(MSVC_LIB_DEPS_LLVMMCJIT LLVMExecutionEngine LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMMCParser LLVMMC LLVMSupport) set(MSVC_LIB_DEPS_LLVMMSP430AsmPrinter LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMMSP430CodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMMSP430AsmPrinter LLVMMSP430Info LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMMSP430CodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMMSP430AsmPrinter LLVMMSP430Info LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMMSP430Info LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMMipsCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMMipsInfo LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMMipsCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMMipsInfo LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMMipsInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMObject LLVMSupport LLVMSystem) +set(MSVC_LIB_DEPS_LLVMObject LLVMSupport) set(MSVC_LIB_DEPS_LLVMPTXCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMPTXInfo LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMPTXInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMPowerPCAsmPrinter LLVMMC LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMPowerPCCodeGen LLVMAnalysis LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMPowerPCAsmPrinter LLVMPowerPCInfo LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMPowerPCAsmPrinter LLVMMC LLVMSupport) +set(MSVC_LIB_DEPS_LLVMPowerPCCodeGen LLVMAnalysis LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMPowerPCAsmPrinter LLVMPowerPCInfo LLVMSelectionDAG LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMPowerPCInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMScalarOpts LLVMAnalysis LLVMCore LLVMInstCombine LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils) -set(MSVC_LIB_DEPS_LLVMSelectionDAG LLVMAnalysis LLVMCodeGen LLVMCore LLVMMC LLVMSupport LLVMSystem LLVMTarget) -set(MSVC_LIB_DEPS_LLVMSparcCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSparcInfo LLVMSupport LLVMSystem LLVMTarget) +set(MSVC_LIB_DEPS_LLVMScalarOpts LLVMAnalysis LLVMCore LLVMInstCombine LLVMSupport LLVMTarget LLVMTransformUtils) +set(MSVC_LIB_DEPS_LLVMSelectionDAG LLVMAnalysis LLVMCodeGen LLVMCore LLVMMC LLVMSupport LLVMTarget) +set(MSVC_LIB_DEPS_LLVMSparcCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSparcInfo LLVMSupport LLVMTarget) set(MSVC_LIB_DEPS_LLVMSparcInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMSystem ) +set(MSVC_LIB_DEPS_LLVMSupport ) set(MSVC_LIB_DEPS_LLVMSystemZCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMSystemZInfo LLVMTarget) set(MSVC_LIB_DEPS_LLVMSystemZInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMTarget LLVMCore LLVMMC LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMTransformUtils LLVMAnalysis LLVMCore LLVMSupport LLVMSystem LLVMTarget LLVMipa) -set(MSVC_LIB_DEPS_LLVMX86AsmParser LLVMMC LLVMMCParser LLVMSupport LLVMSystem LLVMTarget LLVMX86Info) -set(MSVC_LIB_DEPS_LLVMX86AsmPrinter LLVMMC LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMX86CodeGen LLVMAnalysis LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMSystem LLVMTarget LLVMX86AsmPrinter LLVMX86Info) +set(MSVC_LIB_DEPS_LLVMTarget LLVMCore LLVMMC LLVMSupport) +set(MSVC_LIB_DEPS_LLVMTransformUtils LLVMAnalysis LLVMCore LLVMSupport LLVMTarget LLVMipa) +set(MSVC_LIB_DEPS_LLVMX86AsmParser LLVMMC LLVMMCParser LLVMSupport LLVMTarget LLVMX86Info) +set(MSVC_LIB_DEPS_LLVMX86AsmPrinter LLVMMC LLVMSupport) +set(MSVC_LIB_DEPS_LLVMX86CodeGen LLVMAnalysis LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMTarget LLVMX86AsmPrinter LLVMX86Info) set(MSVC_LIB_DEPS_LLVMX86Disassembler LLVMMC LLVMSupport LLVMX86Info) set(MSVC_LIB_DEPS_LLVMX86Info LLVMMC LLVMSupport) set(MSVC_LIB_DEPS_LLVMXCoreCodeGen LLVMAsmPrinter LLVMCodeGen LLVMCore LLVMMC LLVMSelectionDAG LLVMSupport LLVMTarget LLVMXCoreInfo) set(MSVC_LIB_DEPS_LLVMXCoreInfo LLVMMC LLVMSupport) -set(MSVC_LIB_DEPS_LLVMipa LLVMAnalysis LLVMCore LLVMSupport LLVMSystem) -set(MSVC_LIB_DEPS_LLVMipo LLVMAnalysis LLVMCore LLVMScalarOpts LLVMSupport LLVMSystem LLVMTarget LLVMTransformUtils LLVMipa) +set(MSVC_LIB_DEPS_LLVMipa LLVMAnalysis LLVMCore LLVMSupport) +set(MSVC_LIB_DEPS_LLVMipo LLVMAnalysis LLVMCore LLVMScalarOpts LLVMSupport LLVMTarget LLVMTransformUtils LLVMipa) From resistor at mac.com Mon Nov 29 13:29:15 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 29 Nov 2010 19:29:15 -0000 Subject: [llvm-commits] [llvm] r120309 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101129192915.8BD0B2A6C12D@llvm.org> Author: resistor Date: Mon Nov 29 13:29:15 2010 New Revision: 120309 URL: http://llvm.org/viewvc/llvm-project?rev=120309&view=rev Log: Thumb2 encodings for MSR and MRS. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120309&r1=120308&r2=120309&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 13:29:15 2010 @@ -3212,8 +3212,14 @@ // Move between special register and ARM core register -- for disassembly only // -// Rd = Instr{11-8} -def t2MRS : T2I<(outs rGPR:$dst), (ins), NoItinerary, "mrs", "\t$dst, cpsr", +class T2MRS pattern> + : T2I { + bits<4> Rd; + let Inst{11-8} = Rd{3-0}; +} + +def t2MRS : T2MRS<(outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, cpsr", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; let Inst{26} = 0; @@ -3223,8 +3229,8 @@ let Inst{12} = 0; } -// Rd = Instr{11-8} -def t2MRSsys : T2I<(outs rGPR:$dst), (ins), NoItinerary, "mrs", "\t$dst, spsr", +def t2MRSsys : T2MRS< + (outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, spsr", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; let Inst{26} = 0; @@ -3234,9 +3240,17 @@ let Inst{12} = 0; } -// Rn = Inst{19-16} -def t2MSR : T2I<(outs), (ins rGPR:$src, msr_mask:$mask), NoItinerary, "msr", - "\tcpsr$mask, $src", +class T2MSR pattern> + : T2I { + bits<4> Rn; + bits<4> mask; + let Inst{19-16} = Rn{3-0}; + let Inst{11-8} = mask{3-0}; +} + +def t2MSR : T2MSR<(outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr", + "\tcpsr$mask, $Rn", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; let Inst{26} = 0; @@ -3246,9 +3260,9 @@ let Inst{12} = 0; } -// Rn = Inst{19-16} -def t2MSRsys : T2I<(outs), (ins rGPR:$src, msr_mask:$mask), NoItinerary, "msr", - "\tspsr$mask, $src", +def t2MSRsys : T2MSR< + (outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr", + "\tspsr$mask, $Rn", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; let Inst{26} = 0; From grosbach at apple.com Mon Nov 29 13:32:47 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 19:32:47 -0000 Subject: [llvm-commits] [llvm] r120310 - in /llvm/trunk/lib/Target/ARM: ARMAsmPrinter.cpp ARMInstrFormats.td ARMInstrInfo.td ARMInstrThumb.td InstPrinter/ARMInstPrinter.h Message-ID: <20101129193247.C985D2A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 13:32:47 2010 New Revision: 120310 URL: http://llvm.org/viewvc/llvm-project?rev=120310&view=rev Log: ARM Pseudo-ize tBR_JTr. Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrInfo.td llvm/trunk/lib/Target/ARM/ARMInstrThumb.td llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120310&r1=120309&r2=120310&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Nov 29 13:32:47 2010 @@ -936,23 +936,13 @@ EmitJump2Table(MI); return; } - case ARM::tBR_JTr: { - // Lower and emit the instruction itself, then the jump table following it. - MCInst TmpInst; - // FIXME: The branch instruction is really a pseudo. We should xform it - // explicitly. - LowerARMMachineInstrToMCInst(MI, TmpInst, *this); - OutStreamer.EmitInstruction(TmpInst); - - // Output the data for the jump table itself - EmitJumpTable(MI); - return; - } + case ARM::tBR_JTr: case ARM::BR_JTr: { // Lower and emit the instruction itself, then the jump table following it. // mov pc, target MCInst TmpInst; - TmpInst.setOpcode(ARM::MOVr); + unsigned Opc = MI->getOpcode() == ARM::BR_JTr ? ARM::MOVr : ARM::tMOVr; + TmpInst.setOpcode(Opc); TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); // Add predicate operands. @@ -960,6 +950,10 @@ TmpInst.addOperand(MCOperand::CreateReg(0)); OutStreamer.EmitInstruction(TmpInst); + // Make sure the Thumb jump table is 4-byte aligned. + if (Opc == ARM::tMOVr) + EmitAlignment(2); + // Output the data for the jump table itself EmitJumpTable(MI); return; Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120310&r1=120309&r2=120310&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Mon Nov 29 13:32:47 2010 @@ -255,6 +255,13 @@ list Predicates = [IsARM]; } +// PseudoInst that's Thumb-mode only. +class tPseudoInst pattern> + : PseudoInst { + let SZ = sz; + list Predicates = [IsThumb]; +} // Almost all ARM instructions are predicable. class I pattern> : Thumb1I; -class T1JTI pattern> - : Thumb1I; // Two-address instructions class T1It { - let PrintMethod = "printJTBlockOperand"; -} def jt2block_operand : Operand { let PrintMethod = "printJT2BlockOperand"; } Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120310&r1=120309&r2=120310&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 13:32:47 2010 @@ -439,14 +439,11 @@ def tBfar : TIx2<0b11110, 0b11, 1, (outs), (ins brtarget:$target), IIC_Br, "bl\t$target",[]>; - let isCodeGenOnly = 1 in - def tBR_JTr : T1JTI<(outs), - (ins tGPR:$target, jtblock_operand:$jt, i32imm:$id), - IIC_Br, "mov\tpc, $target\n\t.align\t2$jt", - [(ARMbrjt tGPR:$target, tjumptable:$jt, imm:$id)]>, - Encoding16 { - let Inst{15-7} = 0b010001101; - let Inst{2-0} = 0b111; + def tBR_JTr : tPseudoInst<(outs), + (ins tGPR:$target, i32imm:$jt, i32imm:$id), + Size2Bytes, IIC_Br, + [(ARMbrjt tGPR:$target, tjumptable:$jt, imm:$id)]> { + list Predicates = [IsThumb, IsThumb1Only]; } } } Modified: llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h?rev=120310&r1=120309&r2=120310&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h (original) +++ llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h Mon Nov 29 13:32:47 2010 @@ -96,7 +96,6 @@ void printRegisterList(const MCInst *MI, unsigned OpNum, raw_ostream &O); // The jump table instructions have custom handling in ARMAsmPrinter // to output the jump table. Nothing further is necessary here. - void printJTBlockOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {} void printJT2BlockOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {} void printTBAddrMode(const MCInst *MI, unsigned OpNum, raw_ostream &O); void printNoHashImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O); From bob.wilson at apple.com Mon Nov 29 13:35:23 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 29 Nov 2010 19:35:23 -0000 Subject: [llvm-commits] [llvm] r120311 - in /llvm/trunk/lib/Target/ARM: ARMScheduleA8.td ARMScheduleA9.td Message-ID: <20101129193523.3E9A52A6C12D@llvm.org> Author: bwilson Date: Mon Nov 29 13:35:23 2010 New Revision: 120311 URL: http://llvm.org/viewvc/llvm-project?rev=120311&view=rev Log: Fix copy-and-paste errors in VLD2-dup scheduling itineraries. Modified: llvm/trunk/lib/Target/ARM/ARMScheduleA8.td llvm/trunk/lib/Target/ARM/ARMScheduleA9.td Modified: llvm/trunk/lib/Target/ARM/ARMScheduleA8.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMScheduleA8.td?rev=120311&r1=120310&r2=120311&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMScheduleA8.td (original) +++ llvm/trunk/lib/Target/ARM/ARMScheduleA8.td Mon Nov 29 13:35:23 2010 @@ -527,13 +527,13 @@ InstrItinData, InstrStage<2, [A8_NLSPipe], 0>, InstrStage<2, [A8_LSPipe]>], - [2, 1]>, + [2, 2, 1]>, // // VLD2dupu InstrItinData, InstrStage<2, [A8_NLSPipe], 0>, InstrStage<2, [A8_LSPipe]>], - [2, 2, 1, 1]>, + [2, 2, 2, 1, 1]>, // // VLD3 InstrItinData, Modified: llvm/trunk/lib/Target/ARM/ARMScheduleA9.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMScheduleA9.td?rev=120311&r1=120310&r2=120311&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMScheduleA9.td (original) +++ llvm/trunk/lib/Target/ARM/ARMScheduleA9.td Mon Nov 29 13:35:23 2010 @@ -894,7 +894,7 @@ InstrStage<8, [A9_DRegsVFP], 0, Reserved>, InstrStage<2, [A9_NPipe], 0>, InstrStage<2, [A9_LSUnit]>], - [3, 1]>, + [3, 3, 1]>, // // VLD2dupu InstrItinData, @@ -903,7 +903,7 @@ InstrStage<8, [A9_DRegsVFP], 0, Reserved>, InstrStage<2, [A9_NPipe], 0>, InstrStage<2, [A9_LSUnit]>], - [3, 2, 1, 1]>, + [3, 3, 2, 1, 1]>, // // VLD3 InstrItinData, From bob.wilson at apple.com Mon Nov 29 13:35:29 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Mon, 29 Nov 2010 19:35:29 -0000 Subject: [llvm-commits] [llvm] r120312 - in /llvm/trunk: lib/Target/ARM/ARMExpandPseudoInsts.cpp lib/Target/ARM/ARMISelDAGToDAG.cpp lib/Target/ARM/ARMInstrNEON.td lib/Target/ARM/ARMSchedule.td lib/Target/ARM/ARMScheduleA8.td lib/Target/ARM/ARMScheduleA9.td test/CodeGen/ARM/vlddup.ll Message-ID: <20101129193529.6E0922A6C12F@llvm.org> Author: bwilson Date: Mon Nov 29 13:35:29 2010 New Revision: 120312 URL: http://llvm.org/viewvc/llvm-project?rev=120312&view=rev Log: Add support for NEON VLD3-dup instructions. Modified: llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp llvm/trunk/lib/Target/ARM/ARMInstrNEON.td llvm/trunk/lib/Target/ARM/ARMSchedule.td llvm/trunk/lib/Target/ARM/ARMScheduleA8.td llvm/trunk/lib/Target/ARM/ARMScheduleA9.td llvm/trunk/test/CodeGen/ARM/vlddup.ll Modified: llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp?rev=120312&r1=120311&r2=120312&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp Mon Nov 29 13:35:29 2010 @@ -172,6 +172,13 @@ { ARM::VLD2q8Pseudo, ARM::VLD2q8, true, false, SingleSpc, 4, 8 }, { ARM::VLD2q8Pseudo_UPD, ARM::VLD2q8_UPD, true, true, SingleSpc, 4, 8 }, +{ ARM::VLD3DUPd16Pseudo, ARM::VLD3DUPd16, true, false, SingleSpc, 3, 4}, +{ ARM::VLD3DUPd16Pseudo_UPD, ARM::VLD3DUPd16_UPD, true, true, SingleSpc, 3, 4}, +{ ARM::VLD3DUPd32Pseudo, ARM::VLD3DUPd32, true, false, SingleSpc, 3, 2}, +{ ARM::VLD3DUPd32Pseudo_UPD, ARM::VLD3DUPd32_UPD, true, true, SingleSpc, 3, 2}, +{ ARM::VLD3DUPd8Pseudo, ARM::VLD3DUPd8, true, false, SingleSpc, 3, 8}, +{ ARM::VLD3DUPd8Pseudo_UPD, ARM::VLD3DUPd8_UPD, true, true, SingleSpc, 3, 8}, + { ARM::VLD3LNd16Pseudo, ARM::VLD3LNd16, true, false, SingleSpc, 3, 4 }, { ARM::VLD3LNd16Pseudo_UPD, ARM::VLD3LNd16_UPD, true, true, SingleSpc, 3, 4 }, { ARM::VLD3LNd32Pseudo, ARM::VLD3LNd32, true, false, SingleSpc, 3, 2 }, @@ -946,6 +953,12 @@ case ARM::VLD2DUPd8Pseudo_UPD: case ARM::VLD2DUPd16Pseudo_UPD: case ARM::VLD2DUPd32Pseudo_UPD: + case ARM::VLD3DUPd8Pseudo: + case ARM::VLD3DUPd16Pseudo: + case ARM::VLD3DUPd32Pseudo: + case ARM::VLD3DUPd8Pseudo_UPD: + case ARM::VLD3DUPd16Pseudo_UPD: + case ARM::VLD3DUPd32Pseudo_UPD: ExpandVLD(MBBI); break; Modified: llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp?rev=120312&r1=120311&r2=120312&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Nov 29 13:35:29 2010 @@ -2361,6 +2361,12 @@ return SelectVLDDup(N, 2, Opcodes); } + case ARMISD::VLD3DUP: { + unsigned Opcodes[] = { ARM::VLD3DUPd8Pseudo, ARM::VLD3DUPd16Pseudo, + ARM::VLD3DUPd32Pseudo }; + return SelectVLDDup(N, 3, Opcodes); + } + case ISD::INTRINSIC_VOID: case ISD::INTRINSIC_W_CHAIN: { unsigned IntNo = cast(N->getOperand(1))->getZExtValue(); Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrNEON.td?rev=120312&r1=120311&r2=120312&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrNEON.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Mon Nov 29 13:35:29 2010 @@ -896,6 +896,48 @@ def VLD2DUPd32Pseudo_UPD : VLDQWBPseudo; // VLD3DUP : Vector Load (single 3-element structure to all lanes) +class VLD3DUP op7_4, string Dt> + : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3), + (ins addrmode6:$Rn), IIC_VLD3dup, + "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn", "", []> { + let Rm = 0b1111; + let Inst{4} = Rn{4}; +} + +def VLD3DUPd8 : VLD3DUP<{0,0,0,?}, "8">; +def VLD3DUPd16 : VLD3DUP<{0,1,0,?}, "16">; +def VLD3DUPd32 : VLD3DUP<{1,0,0,?}, "32">; + +def VLD3DUPd8Pseudo : VLDQQPseudo; +def VLD3DUPd16Pseudo : VLDQQPseudo; +def VLD3DUPd32Pseudo : VLDQQPseudo; + +// ...with double-spaced registers (not used for codegen): +def VLD3DUPd8T : VLD3DUP<{0,0,1,?}, "8">; +def VLD3DUPd16T : VLD3DUP<{0,1,1,?}, "16">; +def VLD3DUPd32T : VLD3DUP<{1,0,1,?}, "32">; + +// ...with address register writeback: +class VLD3DUPWB op7_4, string Dt> + : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb), + (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD3dupu, + "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn$Rm", + "$Rn.addr = $wb", []> { + let Inst{4} = Rn{4}; +} + +def VLD3DUPd8_UPD : VLD3DUPWB<{0,0,0,0}, "8">; +def VLD3DUPd16_UPD : VLD3DUPWB<{0,1,0,?}, "16">; +def VLD3DUPd32_UPD : VLD3DUPWB<{1,0,0,?}, "32">; + +def VLD3DUPd8T_UPD : VLD3DUPWB<{0,0,1,0}, "8">; +def VLD3DUPd16T_UPD : VLD3DUPWB<{0,1,1,?}, "16">; +def VLD3DUPd32T_UPD : VLD3DUPWB<{1,0,1,?}, "32">; + +def VLD3DUPd8Pseudo_UPD : VLDQQWBPseudo; +def VLD3DUPd16Pseudo_UPD : VLDQQWBPseudo; +def VLD3DUPd32Pseudo_UPD : VLDQQWBPseudo; + // VLD4DUP : Vector Load (single 4-element structure to all lanes) // FIXME: Not yet implemented. } // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 Modified: llvm/trunk/lib/Target/ARM/ARMSchedule.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMSchedule.td?rev=120312&r1=120311&r2=120312&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMSchedule.td (original) +++ llvm/trunk/lib/Target/ARM/ARMSchedule.td Mon Nov 29 13:35:29 2010 @@ -152,6 +152,8 @@ def IIC_VLD3ln : InstrItinClass; def IIC_VLD3u : InstrItinClass; def IIC_VLD3lnu : InstrItinClass; +def IIC_VLD3dup : InstrItinClass; +def IIC_VLD3dupu : InstrItinClass; def IIC_VLD4 : InstrItinClass; def IIC_VLD4ln : InstrItinClass; def IIC_VLD4u : InstrItinClass; Modified: llvm/trunk/lib/Target/ARM/ARMScheduleA8.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMScheduleA8.td?rev=120312&r1=120311&r2=120312&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMScheduleA8.td (original) +++ llvm/trunk/lib/Target/ARM/ARMScheduleA8.td Mon Nov 29 13:35:29 2010 @@ -559,6 +559,18 @@ InstrStage<5, [A8_LSPipe]>], [4, 4, 5, 2, 1, 1, 1, 1, 1, 2]>, // + // VLD3dup + InstrItinData, + InstrStage<3, [A8_NLSPipe], 0>, + InstrStage<3, [A8_LSPipe]>], + [2, 2, 3, 1]>, + // + // VLD3dupu + InstrItinData, + InstrStage<3, [A8_NLSPipe], 0>, + InstrStage<3, [A8_LSPipe]>], + [2, 2, 3, 2, 1, 1]>, + // // VLD4 InstrItinData, InstrStage<4, [A8_NLSPipe], 0>, Modified: llvm/trunk/lib/Target/ARM/ARMScheduleA9.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMScheduleA9.td?rev=120312&r1=120311&r2=120312&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMScheduleA9.td (original) +++ llvm/trunk/lib/Target/ARM/ARMScheduleA9.td Mon Nov 29 13:35:29 2010 @@ -941,6 +941,24 @@ InstrStage<5, [A9_LSUnit]>], [5, 5, 6, 2, 1, 1, 1, 1, 1, 2]>, // + // VLD3dup + InstrItinData, + InstrStage<1, [A9_MUX0], 0>, + InstrStage<1, [A9_DRegsN], 0, Required>, + InstrStage<9, [A9_DRegsVFP], 0, Reserved>, + InstrStage<3, [A9_NPipe], 0>, + InstrStage<3, [A9_LSUnit]>], + [3, 3, 4, 1]>, + // + // VLD3dupu + InstrItinData, + InstrStage<1, [A9_MUX0], 0>, + InstrStage<1, [A9_DRegsN], 0, Required>, + InstrStage<9, [A9_DRegsVFP], 0, Reserved>, + InstrStage<3, [A9_NPipe], 0>, + InstrStage<3, [A9_LSUnit]>], + [3, 3, 4, 2, 1, 1]>, + // // VLD4 InstrItinData, InstrStage<1, [A9_MUX0], 0>, Modified: llvm/trunk/test/CodeGen/ARM/vlddup.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vlddup.ll?rev=120312&r1=120311&r2=120312&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vlddup.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vlddup.ll Mon Nov 29 13:35:29 2010 @@ -71,3 +71,23 @@ declare %struct.__neon_int8x8x2_t @llvm.arm.neon.vld2lane.v8i8(i8*, <8 x i8>, <8 x i8>, i32, i32) nounwind readonly declare %struct.__neon_int2x32x2_t @llvm.arm.neon.vld2lane.v2i32(i32*, <2 x i32>, <2 x i32>, i32, i32) nounwind readonly + +%struct.__neon_int16x4x3_t = type { <4 x i16>, <4 x i16>, <4 x i16> } + +define <4 x i16> @vld3dupi16(i16* %A) nounwind { +;CHECK: vld3dupi16: +;Check the (default) alignment value. VLD3 does not support alignment. +;CHECK: vld3.16 {d16[], d17[], d18[]}, [r0] + %tmp0 = tail call %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3lane.v4i16(i16* %A, <4 x i16> undef, <4 x i16> undef, <4 x i16> undef, i32 0, i32 8) + %tmp1 = extractvalue %struct.__neon_int16x4x3_t %tmp0, 0 + %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer + %tmp3 = extractvalue %struct.__neon_int16x4x3_t %tmp0, 1 + %tmp4 = shufflevector <4 x i16> %tmp3, <4 x i16> undef, <4 x i32> zeroinitializer + %tmp5 = extractvalue %struct.__neon_int16x4x3_t %tmp0, 2 + %tmp6 = shufflevector <4 x i16> %tmp5, <4 x i16> undef, <4 x i32> zeroinitializer + %tmp7 = add <4 x i16> %tmp2, %tmp4 + %tmp8 = add <4 x i16> %tmp7, %tmp6 + ret <4 x i16> %tmp8 +} + +declare %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3lane.v4i16(i16*, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind readonly From dmalyshev at accesssoftek.com Mon Nov 29 13:38:52 2010 From: dmalyshev at accesssoftek.com (Danil Malyshev) Date: Mon, 29 Nov 2010 11:38:52 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> Message-ID: <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> Hello Jakob, > Can you find a way of doing this without increasing the size of the raw_ostream object, and without imposing any overhead on users that don't need it? Ok, I did it. Attached file fix-cout-02.diff is the new patch. It change only llvm-ar, llvm-ranlib, and attributes of *.toc files in Archive tests. Thank you, Danil ________________________________ From: Jakob Stoklund Olesen [mailto:stoklund at 2pi.dk] Sent: Sunday, November 28, 2010 1:48 AM To: Danil Malyshev Cc: llvm-commits at cs.uiuc.edu Subject: Re: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW On Nov 24, 2010, at 9:07 AM, Danil Malyshev wrote: Hi Danil, Thanks for working on this. 1. Adds support for setw() method to the llvm::raw_ostream. Please don't do that, though. Part of the idea behind raw_ostream is that it doesn't have any of the overhead from formatting and so on. Can you find a way of doing this without increasing the size of the raw_ostream object, and without imposing any overhead on users that don't need it? Thanks, /jakob -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/15b12036/attachment.html -------------- next part -------------- A non-text attachment was scrubbed... Name: fix-cout-02.diff Type: application/octet-stream Size: 6257 bytes Desc: fix-cout-02.diff Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/15b12036/attachment.obj From benny.kra at googlemail.com Mon Nov 29 13:36:46 2010 From: benny.kra at googlemail.com (Benjamin Kramer) Date: Mon, 29 Nov 2010 19:36:46 -0000 Subject: [llvm-commits] [llvm] r120313 - in /llvm/trunk: include/llvm/System/ lib/System/ Message-ID: <20101129193646.5CA152A6C12D@llvm.org> Author: d0k Date: Mon Nov 29 13:36:46 2010 New Revision: 120313 URL: http://llvm.org/viewvc/llvm-project?rev=120313&view=rev Log: Remove empty directories. Removed: llvm/trunk/include/llvm/System/ llvm/trunk/lib/System/ From dmalyshev at accesssoftek.com Mon Nov 29 13:43:41 2010 From: dmalyshev at accesssoftek.com (Danil Malyshev) Date: Mon, 29 Nov 2010 11:43:41 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: <4931539F-BC52-4235-B421-C9140759527B@apple.com> References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <4931539F-BC52-4235-B421-C9140759527B@apple.com> Message-ID: <6AE1604EE3EC5F4296C096518C6B77EE1705A19B34@mail.accesssoftek.com> Hello Dan, Thanks, I just did so in the second patch. Thank you, Danil -----Original Message----- From: Dan Gohman [mailto:gohman at apple.com] Sent: Monday, November 29, 2010 10:20 PM To: Danil Malyshev Cc: llvm-commits at cs.uiuc.edu Subject: Re: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW On Nov 24, 2010, at 9:07 AM, Danil Malyshev wrote: > Hello everyone, > > Please find attached a patch to review. > > This patch > > 1. Adds support for setw() method to the llvm::raw_ostream. An alternative to unpopular iostream-style manipulators is llvm/Support/Format.h. Dan From stoklund at 2pi.dk Mon Nov 29 13:44:20 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Mon, 29 Nov 2010 11:44:20 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> Message-ID: On Nov 29, 2010, at 11:38 AM, Danil Malyshev wrote: > Hello Jakob, > > > Can you find a way of doing this without increasing the size of the raw_ostream object, and without imposing any overhead on users that don't need it? > > Ok, I did it. > Attached file fix-cout-02.diff is the new patch. It change only llvm-ar, llvm-ranlib, and attributes of *.toc files in Archive tests. That is much better, thanks! Somebody else should have an opinion about how we handle newlines and binary files in SVN on Windows. /jakob From cdavis at mines.edu Mon Nov 29 13:44:50 2010 From: cdavis at mines.edu (Charles Davis) Date: Mon, 29 Nov 2010 19:44:50 -0000 Subject: [llvm-commits] [llvm] r120314 - in /llvm/trunk: ./ include/llvm/Support/ lib/CompilerDriver/ lib/Support/ lib/Support/Unix/ lib/Support/Windows/ tools/gold/ Message-ID: <20101129194451.376922A6C12D@llvm.org> Author: cdavis Date: Mon Nov 29 13:44:50 2010 New Revision: 120314 URL: http://llvm.org/viewvc/llvm-project?rev=120314&view=rev Log: Now to chant the magical incantation that will exorcise the System library from LLVM forever: grep -lR "llvm/System" * | grep -v .svn | xargs sed -ie 's#llvm/System#llvm/Support#g' Modified: llvm/trunk/Makefile.rules llvm/trunk/include/llvm/Support/AIXDataTypesFix.h llvm/trunk/include/llvm/Support/Alarm.h llvm/trunk/include/llvm/Support/Atomic.h llvm/trunk/include/llvm/Support/DynamicLibrary.h llvm/trunk/include/llvm/Support/Errno.h llvm/trunk/include/llvm/Support/FEnv.h llvm/trunk/include/llvm/Support/Host.h llvm/trunk/include/llvm/Support/IncludeFile.h llvm/trunk/include/llvm/Support/Memory.h llvm/trunk/include/llvm/Support/Mutex.h llvm/trunk/include/llvm/Support/Path.h llvm/trunk/include/llvm/Support/PathV2.h llvm/trunk/include/llvm/Support/Process.h llvm/trunk/include/llvm/Support/Program.h llvm/trunk/include/llvm/Support/Signals.h llvm/trunk/include/llvm/Support/Solaris.h llvm/trunk/include/llvm/Support/ThreadLocal.h llvm/trunk/include/llvm/Support/Threading.h llvm/trunk/include/llvm/Support/Valgrind.h llvm/trunk/lib/CompilerDriver/CMakeLists.txt llvm/trunk/lib/CompilerDriver/Makefile llvm/trunk/lib/Support/IncludeFile.cpp llvm/trunk/lib/Support/Threading.cpp llvm/trunk/lib/Support/Unix/Host.inc llvm/trunk/lib/Support/Unix/Mutex.inc llvm/trunk/lib/Support/Unix/Path.inc llvm/trunk/lib/Support/Unix/Program.inc llvm/trunk/lib/Support/Unix/RWMutex.inc llvm/trunk/lib/Support/Unix/ThreadLocal.inc llvm/trunk/lib/Support/Unix/Unix.h llvm/trunk/lib/Support/Unix/system_error.inc llvm/trunk/lib/Support/Windows/Host.inc llvm/trunk/lib/Support/Windows/Mutex.inc llvm/trunk/lib/Support/Windows/Path.inc llvm/trunk/lib/Support/Windows/RWMutex.inc llvm/trunk/lib/Support/Windows/ThreadLocal.inc llvm/trunk/lib/Support/Windows/system_error.inc llvm/trunk/tools/gold/Makefile Modified: llvm/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.rules?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/Makefile.rules (original) +++ llvm/trunk/Makefile.rules Mon Nov 29 13:44:50 2010 @@ -205,7 +205,7 @@ TOOLNAME = $(LLVMC_BASED_DRIVER) LLVMLIBS = CompilerDriver.a -LINK_COMPONENTS = support system +LINK_COMPONENTS = support endif # LLVMC_BASED_DRIVER Modified: llvm/trunk/include/llvm/Support/AIXDataTypesFix.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/AIXDataTypesFix.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/AIXDataTypesFix.h (original) +++ llvm/trunk/include/llvm/Support/AIXDataTypesFix.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===-- llvm/System/AIXDataTypesFix.h - Fix datatype defs ------*- C++ -*-===// +//===-- llvm/Support/AIXDataTypesFix.h - Fix datatype defs ------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Alarm.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Alarm.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Alarm.h (original) +++ llvm/trunk/include/llvm/Support/Alarm.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Alarm.h - Alarm Generation support ----------*- C++ -*-===// +//===- llvm/Support/Alarm.h - Alarm Generation support ----------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Atomic.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Atomic.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Atomic.h (original) +++ llvm/trunk/include/llvm/Support/Atomic.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Atomic.h - Atomic Operations -----------------*- C++ -*-===// +//===- llvm/Support/Atomic.h - Atomic Operations -----------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/DynamicLibrary.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/DynamicLibrary.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/DynamicLibrary.h (original) +++ llvm/trunk/include/llvm/Support/DynamicLibrary.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===-- llvm/System/DynamicLibrary.h - Portable Dynamic Library -*- C++ -*-===// +//===-- llvm/Support/DynamicLibrary.h - Portable Dynamic Library -*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Errno.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Errno.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Errno.h (original) +++ llvm/trunk/include/llvm/Support/Errno.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Errno.h - Portable+convenient errno handling -*- C++ -*-===// +//===- llvm/Support/Errno.h - Portable+convenient errno handling -*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/FEnv.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FEnv.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/FEnv.h (original) +++ llvm/trunk/include/llvm/Support/FEnv.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/FEnv.h - Host floating-point exceptions ------*- C++ -*-===// +//===- llvm/Support/FEnv.h - Host floating-point exceptions ------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Host.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Host.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Host.h (original) +++ llvm/trunk/include/llvm/Support/Host.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Host.h - Host machine characteristics --------*- C++ -*-===// +//===- llvm/Support/Host.h - Host machine characteristics --------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/IncludeFile.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/IncludeFile.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/IncludeFile.h (original) +++ llvm/trunk/include/llvm/Support/IncludeFile.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/IncludeFile.h - Ensure Linking Of Library ---*- C++ -*-===// +//===- llvm/Support/IncludeFile.h - Ensure Linking Of Library ---*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Memory.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Memory.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Memory.h (original) +++ llvm/trunk/include/llvm/Support/Memory.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Memory.h - Memory Support --------------------*- C++ -*-===// +//===- llvm/Support/Memory.h - Memory Support --------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Mutex.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Mutex.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Mutex.h (original) +++ llvm/trunk/include/llvm/Support/Mutex.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Mutex.h - Mutex Operating System Concept -----*- C++ -*-===// +//===- llvm/Support/Mutex.h - Mutex Operating System Concept -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Path.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Path.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Path.h (original) +++ llvm/trunk/include/llvm/Support/Path.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Path.h - Path Operating System Concept -------*- C++ -*-===// +//===- llvm/Support/Path.h - Path Operating System Concept -------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/PathV2.h - Path Operating System Concept -----*- C++ -*-===// +//===- llvm/Support/PathV2.h - Path Operating System Concept -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Process.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Process.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Process.h (original) +++ llvm/trunk/include/llvm/Support/Process.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Process.h ------------------------------------*- C++ -*-===// +//===- llvm/Support/Process.h ------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Program.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Program.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Program.h (original) +++ llvm/trunk/include/llvm/Support/Program.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Program.h ------------------------------------*- C++ -*-===// +//===- llvm/Support/Program.h ------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Signals.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Signals.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Signals.h (original) +++ llvm/trunk/include/llvm/Support/Signals.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Signals.h - Signal Handling support ----------*- C++ -*-===// +//===- llvm/Support/Signals.h - Signal Handling support ----------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Solaris.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Solaris.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Solaris.h (original) +++ llvm/trunk/include/llvm/Support/Solaris.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -/*===- llvm/System/Solaris.h ------------------------------------*- C++ -*-===* +/*===- llvm/Support/Solaris.h ------------------------------------*- C++ -*-===* * * The LLVM Compiler Infrastructure * Modified: llvm/trunk/include/llvm/Support/ThreadLocal.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ThreadLocal.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/ThreadLocal.h (original) +++ llvm/trunk/include/llvm/Support/ThreadLocal.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/ThreadLocal.h - Thread Local Data ------------*- C++ -*-===// +//===- llvm/Support/ThreadLocal.h - Thread Local Data ------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Threading.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Threading.h (original) +++ llvm/trunk/include/llvm/Support/Threading.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===-- llvm/System/Threading.h - Control multithreading mode --*- C++ -*-===// +//===-- llvm/Support/Threading.h - Control multithreading mode --*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/include/llvm/Support/Valgrind.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Valgrind.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Valgrind.h (original) +++ llvm/trunk/include/llvm/Support/Valgrind.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Valgrind.h - Communication with Valgrind -----*- C++ -*-===// +//===- llvm/Support/Valgrind.h - Communication with Valgrind -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/CompilerDriver/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/CMakeLists.txt?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/CompilerDriver/CMakeLists.txt (original) +++ llvm/trunk/lib/CompilerDriver/CMakeLists.txt Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -set(LLVM_LINK_COMPONENTS support system) +set(LLVM_LINK_COMPONENTS support) set(LLVM_REQUIRES_EH 1) add_llvm_tool(llvmc Modified: llvm/trunk/lib/CompilerDriver/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Makefile?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/CompilerDriver/Makefile (original) +++ llvm/trunk/lib/CompilerDriver/Makefile Mon Nov 29 13:44:50 2010 @@ -13,7 +13,7 @@ # name doesn't start with "LLVM" and NO_LLVM_CONFIG is set. LIBRARYNAME = CompilerDriver -LINK_COMPONENTS = support system +LINK_COMPONENTS = support NO_LLVM_CONFIG = 1 Modified: llvm/trunk/lib/Support/IncludeFile.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/IncludeFile.cpp?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/IncludeFile.cpp (original) +++ llvm/trunk/lib/Support/IncludeFile.cpp Mon Nov 29 13:44:50 2010 @@ -16,5 +16,5 @@ using namespace llvm; // This constructor is used to ensure linking of other modules. See the -// llvm/System/IncludeFile.h header for details. +// llvm/Support/IncludeFile.h header for details. IncludeFile::IncludeFile(const void*) {} Modified: llvm/trunk/lib/Support/Threading.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Threading.cpp (original) +++ llvm/trunk/lib/Support/Threading.cpp Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===-- llvm/System/Threading.cpp- Control multithreading mode --*- C++ -*-==// +//===-- llvm/Support/Threading.cpp- Control multithreading mode --*- C++ -*-==// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/Host.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Host.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/Host.inc (original) +++ llvm/trunk/lib/Support/Unix/Host.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ - //===- llvm/System/Unix/Host.inc -------------------------------*- C++ -*-===// + //===- llvm/Support/Unix/Host.inc -------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/Mutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Mutex.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/Mutex.inc (original) +++ llvm/trunk/lib/Support/Unix/Mutex.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Unix/Mutex.inc - Unix Mutex Implementation ---*- C++ -*-===// +//===- llvm/Support/Unix/Mutex.inc - Unix Mutex Implementation ---*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Path.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/Path.inc (original) +++ llvm/trunk/lib/Support/Unix/Path.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Unix/Path.cpp - Unix Path Implementation -----*- C++ -*-===// +//===- llvm/Support/Unix/Path.cpp - Unix Path Implementation -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/Program.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Program.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/Program.inc (original) +++ llvm/trunk/lib/Support/Unix/Program.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Unix/Program.cpp -----------------------------*- C++ -*-===// +//===- llvm/Support/Unix/Program.cpp -----------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/RWMutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/RWMutex.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/RWMutex.inc (original) +++ llvm/trunk/lib/Support/Unix/RWMutex.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//= llvm/System/Unix/RWMutex.inc - Unix Reader/Writer Mutual Exclusion Lock =// +//= llvm/Support/Unix/RWMutex.inc - Unix Reader/Writer Mutual Exclusion Lock =// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/ThreadLocal.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/ThreadLocal.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/ThreadLocal.inc (original) +++ llvm/trunk/lib/Support/Unix/ThreadLocal.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//=== llvm/System/Unix/ThreadLocal.inc - Unix Thread Local Data -*- C++ -*-===// +//=== llvm/Support/Unix/ThreadLocal.inc - Unix Thread Local Data -*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/Unix.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Unix.h?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/Unix.h (original) +++ llvm/trunk/lib/Support/Unix/Unix.h Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Unix/Unix.h - Common Unix Include File -------*- C++ -*-===// +//===- llvm/Support/Unix/Unix.h - Common Unix Include File -------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Unix/system_error.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/system_error.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Unix/system_error.inc (original) +++ llvm/trunk/lib/Support/Unix/system_error.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Unix/system_error.inc - Unix error_code ------*- C++ -*-===// +//===- llvm/Support/Unix/system_error.inc - Unix error_code ------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Windows/Host.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Host.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Windows/Host.inc (original) +++ llvm/trunk/lib/Support/Windows/Host.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Win32/Host.inc -------------------------------*- C++ -*-===// +//===- llvm/Support/Win32/Host.inc -------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Windows/Mutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Mutex.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Windows/Mutex.inc (original) +++ llvm/trunk/lib/Support/Windows/Mutex.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Win32/Mutex.inc - Win32 Mutex Implementation -*- C++ -*-===// +//===- llvm/Support/Win32/Mutex.inc - Win32 Mutex Implementation -*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Windows/Path.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Path.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Windows/Path.inc (original) +++ llvm/trunk/lib/Support/Windows/Path.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Win32/Path.cpp - Win32 Path Implementation ---*- C++ -*-===// +//===- llvm/Support/Win32/Path.cpp - Win32 Path Implementation ---*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Windows/RWMutex.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/RWMutex.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Windows/RWMutex.inc (original) +++ llvm/trunk/lib/Support/Windows/RWMutex.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//= llvm/System/Win32/Mutex.inc - Win32 Reader/Writer Mutual Exclusion Lock =// +//= llvm/Support/Win32/Mutex.inc - Win32 Reader/Writer Mutual Exclusion Lock =// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Windows/ThreadLocal.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/ThreadLocal.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Windows/ThreadLocal.inc (original) +++ llvm/trunk/lib/Support/Windows/ThreadLocal.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//= llvm/System/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -*-===// +//= llvm/Support/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/lib/Support/Windows/system_error.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/system_error.inc?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/lib/Support/Windows/system_error.inc (original) +++ llvm/trunk/lib/Support/Windows/system_error.inc Mon Nov 29 13:44:50 2010 @@ -1,4 +1,4 @@ -//===- llvm/System/Win32/system_error.inc - Windows error_code --*- C++ -*-===// +//===- llvm/Support/Win32/system_error.inc - Windows error_code --*- C++ -*-===// // // The LLVM Compiler Infrastructure // Modified: llvm/trunk/tools/gold/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/Makefile?rev=120314&r1=120313&r2=120314&view=diff ============================================================================== --- llvm/trunk/tools/gold/Makefile (original) +++ llvm/trunk/tools/gold/Makefile Mon Nov 29 13:44:50 2010 @@ -21,7 +21,7 @@ SHARED_LIBRARY = 1 LOADABLE_MODULE = 1 -LINK_COMPONENTS := support system +LINK_COMPONENTS := support LIBS += -llto # Because off_t is used in the public API, the largefile parts are required for From fvbommel at gmail.com Mon Nov 29 14:28:35 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Mon, 29 Nov 2010 21:28:35 +0100 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> References: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> Message-ID: On Mon, Nov 29, 2010 at 8:20 PM, Dan Gohman wrote: > On Nov 28, 2010, at 2:43 AM, Frits van Bommel wrote: > >> <006-instcombine-extractvalue-load-v3.patch><007-instcombine-extractvalue-load-test-v2.patch>_______________________________________________ > > Why is this needed? Front-ends should emit gep+load instead of > load+extractvalue. Not all front ends might do that. For instance, it might load both fields of a struct if thinks it's going to need them anyway but then one gets optimized out. Also, when I accidentally messed this up so it asserted every time it fired clang could no longer compile LLVM. I think the problem was in the passmanager, but I might be misremembering. Anyway, I bugpointed it to a file that contained several instances of this pattern so apparently it *does* occur for clang-generated code. I didn't investigate where they came from, but maybe some other optimization pass is generating extractvalue instructions? Honestly, the main reason I did this was because I was bored and disagreed with the comment, but apparently it does occur in real code... From fvbommel at gmail.com Mon Nov 29 14:34:50 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Mon, 29 Nov 2010 21:34:50 +0100 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> Message-ID: On Mon, Nov 29, 2010 at 9:28 PM, Frits van Bommel wrote: > Also, when I accidentally messed this up so it asserted every time it > fired clang could no longer compile LLVM. I think the problem was in > the passmanager, but I might be misremembering. Looks like I misremembered; I just found the file I bugpointed and it's called PreAllocSplitting.ll. It doesn't contain any extractvalue instructions, so they must've been generated by one or more of the passes clang runs at -O3. From fvbommel at gmail.com Mon Nov 29 14:36:52 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Mon, 29 Nov 2010 20:36:52 -0000 Subject: [llvm-commits] [llvm] r120316 - in /llvm/trunk: lib/Analysis/ConstantFolding.cpp test/Transforms/ConstProp/extractvalue.ll test/Transforms/ConstProp/insertvalue.ll Message-ID: <20101129203652.593DC2A6C12D@llvm.org> Author: fvbommel Date: Mon Nov 29 14:36:52 2010 New Revision: 120316 URL: http://llvm.org/viewvc/llvm-project?rev=120316&view=rev Log: Teach ConstantFoldInstruction() how to fold insertvalue and extractvalue. Added: llvm/trunk/test/Transforms/ConstProp/extractvalue.ll llvm/trunk/test/Transforms/ConstProp/insertvalue.ll Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=120316&r1=120315&r2=120316&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original) +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Mon Nov 29 14:36:52 2010 @@ -740,7 +740,18 @@ if (const LoadInst *LI = dyn_cast(I)) return ConstantFoldLoadInst(LI, TD); - + + if (InsertValueInst *IVI = dyn_cast(I)) + return ConstantExpr::getInsertValue( + cast(IVI->getAggregateOperand()), + cast(IVI->getInsertedValueOperand()), + IVI->idx_begin(), IVI->getNumIndices()); + + if (ExtractValueInst *EVI = dyn_cast(I)) + return ConstantExpr::getExtractValue( + cast(EVI->getAggregateOperand()), + EVI->idx_begin(), EVI->getNumIndices()); + return ConstantFoldInstOperands(I->getOpcode(), I->getType(), Ops.data(), Ops.size(), TD); } Added: llvm/trunk/test/Transforms/ConstProp/extractvalue.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ConstProp/extractvalue.ll?rev=120316&view=auto ============================================================================== --- llvm/trunk/test/Transforms/ConstProp/extractvalue.ll (added) +++ llvm/trunk/test/Transforms/ConstProp/extractvalue.ll Mon Nov 29 14:36:52 2010 @@ -0,0 +1,68 @@ +; RUN: opt < %s -constprop -S | FileCheck %s + +%struct = type { i32, [4 x i8] } +%array = type [3 x %struct] + +define i32 @test1() { + %A = extractvalue %struct { i32 2, [4 x i8] c"foo\00" }, 0 + ret i32 %A +; CHECK: @test1 +; CHECK: ret i32 2 +} + +define i8 @test2() { + %A = extractvalue %struct { i32 2, [4 x i8] c"foo\00" }, 1, 2 + ret i8 %A +; CHECK: @test2 +; CHECK: ret i8 111 +} + +define i32 @test3() { + %A = extractvalue %array [ %struct { i32 0, [4 x i8] c"aaaa" }, %struct { i32 1, [4 x i8] c"bbbb" }, %struct { i32 2, [4 x i8] c"cccc" } ], 1, 0 + ret i32 %A +; CHECK: @test3 +; CHECK: ret i32 1 +} + +define i32 @zeroinitializer-test1() { + %A = extractvalue %struct zeroinitializer, 0 + ret i32 %A +; CHECK: @zeroinitializer-test1 +; CHECK: ret i32 0 +} + +define i8 @zeroinitializer-test2() { + %A = extractvalue %struct zeroinitializer, 1, 2 + ret i8 %A +; CHECK: @zeroinitializer-test2 +; CHECK: ret i8 0 +} + +define i32 @zeroinitializer-test3() { + %A = extractvalue %array zeroinitializer, 1, 0 + ret i32 %A +; CHECK: @zeroinitializer-test3 +; CHECK: ret i32 0 +} + +define i32 @undef-test1() { + %A = extractvalue %struct undef, 0 + ret i32 %A +; CHECK: @undef-test1 +; CHECK: ret i32 undef +} + +define i8 @undef-test2() { + %A = extractvalue %struct undef, 1, 2 + ret i8 %A +; CHECK: @undef-test2 +; CHECK: ret i8 undef +} + +define i32 @undef-test3() { + %A = extractvalue %array undef, 1, 0 + ret i32 %A +; CHECK: @undef-test3 +; CHECK: ret i32 undef +} + Added: llvm/trunk/test/Transforms/ConstProp/insertvalue.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/ConstProp/insertvalue.ll?rev=120316&view=auto ============================================================================== --- llvm/trunk/test/Transforms/ConstProp/insertvalue.ll (added) +++ llvm/trunk/test/Transforms/ConstProp/insertvalue.ll Mon Nov 29 14:36:52 2010 @@ -0,0 +1,68 @@ +; RUN: opt < %s -constprop -S | FileCheck %s + +%struct = type { i32, [4 x i8] } +%array = type [3 x %struct] + +define %struct @test1() { + %A = insertvalue %struct { i32 2, [4 x i8] c"foo\00" }, i32 1, 0 + ret %struct %A +; CHECK: @test1 +; CHECK: ret %struct { i32 1, [4 x i8] c"foo\00" } +} + +define %struct @test2() { + %A = insertvalue %struct { i32 2, [4 x i8] c"foo\00" }, i8 1, 1, 2 + ret %struct %A +; CHECK: @test2 +; CHECK: ret %struct { i32 2, [4 x i8] c"fo\01\00" } +} + +define %array @test3() { + %A = insertvalue %array [ %struct { i32 0, [4 x i8] c"aaaa" }, %struct { i32 1, [4 x i8] c"bbbb" }, %struct { i32 2, [4 x i8] c"cccc" } ], i32 -1, 1, 0 + ret %array %A +; CHECK: @test3 +; CHECK:ret %array [%struct { i32 0, [4 x i8] c"aaaa" }, %struct { i32 -1, [4 x i8] c"bbbb" }, %struct { i32 2, [4 x i8] c"cccc" }] +} + +define %struct @zeroinitializer-test1() { + %A = insertvalue %struct zeroinitializer, i32 1, 0 + ret %struct %A +; CHECK: @zeroinitializer-test1 +; CHECK: ret %struct { i32 1, [4 x i8] zeroinitializer } +} + +define %struct @zeroinitializer-test2() { + %A = insertvalue %struct zeroinitializer, i8 1, 1, 2 + ret %struct %A +; CHECK: @zeroinitializer-test2 +; CHECK: ret %struct { i32 0, [4 x i8] c"\00\00\01\00" } +} + +define %array @zeroinitializer-test3() { + %A = insertvalue %array zeroinitializer, i32 1, 1, 0 + ret %array %A +; CHECK: @zeroinitializer-test3 +; CHECK: ret %array [%struct zeroinitializer, %struct { i32 1, [4 x i8] zeroinitializer }, %struct zeroinitializer] +} + +define %struct @undef-test1() { + %A = insertvalue %struct undef, i32 1, 0 + ret %struct %A +; CHECK: @undef-test1 +; CHECK: ret %struct { i32 1, [4 x i8] undef } +} + +define %struct @undef-test2() { + %A = insertvalue %struct undef, i8 0, 1, 2 + ret %struct %A +; CHECK: @undef-test2 +; CHECK: ret %struct { i32 undef, [4 x i8] [i8 undef, i8 undef, i8 0, i8 undef] } +} + +define %array @undef-test3() { + %A = insertvalue %array undef, i32 0, 1, 0 + ret %array %A +; CHECK: @undef-test3 +; CHECK: ret %array [%struct undef, %struct { i32 0, [4 x i8] undef }, %struct undef] +} + From fvbommel at gmail.com Mon Nov 29 14:40:01 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Mon, 29 Nov 2010 21:40:01 +0100 Subject: [llvm-commits] [Review request] Constant folding insertvalue instructions. In-Reply-To: References: Message-ID: On Mon, Nov 29, 2010 at 8:28 PM, Chris Lattner wrote: > Looks great! Please commit, r120316. From resistor at mac.com Mon Nov 29 14:38:48 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 29 Nov 2010 20:38:48 -0000 Subject: [llvm-commits] [llvm] r120317 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101129203849.057D02A6C12D@llvm.org> Author: resistor Date: Mon Nov 29 14:38:48 2010 New Revision: 120317 URL: http://llvm.org/viewvc/llvm-project?rev=120317&view=rev Log: Improving the factoring of several instruction encodings. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120317&r1=120316&r2=120317&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 14:38:48 2010 @@ -3107,74 +3107,53 @@ let Inst{19-16} = opt{3-0}; } -class T2SRS op31_20, + dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> : T2I { + let Inst{31-20} = op31_20{11-0}; + bits<5> mode; let Inst{4-0} = mode{4-0}; } // Store Return State is a system instruction -- for disassembly only -def t2SRSDBW : T2SRS< +def t2SRSDBW : T2SRS<0b111010000010, (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0000010; // W = 1 -} - -def t2SRSDB : T2SRS< + [/* For disassembly only; pattern left blank */]>; +def t2SRSDB : T2SRS<0b111010000000, (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0000000; // W = 0 -} - -def t2SRSIAW : T2SRS< + [/* For disassembly only; pattern left blank */]>; +def t2SRSIAW : T2SRS<0b111010011010, (outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0011010; // W = 1 -} - -def t2SRSIA : T2SRS< + [/* For disassembly only; pattern left blank */]>; +def t2SRSIA : T2SRS<0b111010011000, (outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0011000; // W = 0 -} + [/* For disassembly only; pattern left blank */]>; // Return From Exception is a system instruction -- for disassembly only -class T2RFE op31_20, dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> : T2I { + let Inst{31-20} = op31_20{11-0}; + bits<4> Rn; let Inst{19-16} = Rn{3-0}; } -def t2RFEDBW : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfedb", "\t$Rn!", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0000011; // W = 1 -} - -def t2RFEDB : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeab", "\t$Rn", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0000001; // W = 0 -} - -def t2RFEIAW : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn!", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0011011; // W = 1 -} - -def t2RFEIA : T2RFE<(outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0011001; // W = 0 -} +def t2RFEDBW : T2RFE<0b111010000011, + (outs), (ins rGPR:$Rn), NoItinerary, "rfedb", "\t$Rn!", + [/* For disassembly only; pattern left blank */]>; +def t2RFEDB : T2RFE<0b111010000001, + (outs), (ins rGPR:$Rn), NoItinerary, "rfeab", "\t$Rn", + [/* For disassembly only; pattern left blank */]>; +def t2RFEIAW : T2RFE<0b111010011011, + (outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn!", + [/* For disassembly only; pattern left blank */]>; +def t2RFEIA : T2RFE<0b111010011001, + (outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn", + [/* For disassembly only; pattern left blank */]>; //===----------------------------------------------------------------------===// // Non-Instruction Patterns @@ -3212,62 +3191,45 @@ // Move between special register and ARM core register -- for disassembly only // -class T2MRS op31_20, bits<2> op15_14, bits<1> op12, + dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> : T2I { - bits<4> Rd; - let Inst{11-8} = Rd{3-0}; + let Inst{31-20} = op31_20{11-0}; + let Inst{15-14} = op15_14{1-0}; + let Inst{12} = op12{0}; } -def t2MRS : T2MRS<(outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, cpsr", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11110; - let Inst{26} = 0; - let Inst{25-21} = 0b11111; - let Inst{20} = 0; // The R bit. - let Inst{15-14} = 0b10; - let Inst{12} = 0; +class T2MRS op31_20, bits<2> op15_14, bits<1> op12, + dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T2SpecialReg { + bits<4> Rd; + let Inst{11-8} = Rd{3-0}; } -def t2MRSsys : T2MRS< +def t2MRS : T2MRS<0b111100111110, 0b10, 0, + (outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, cpsr", + [/* For disassembly only; pattern left blank */]>; +def t2MRSsys : T2MRS<0b111100111111, 0b10, 0, (outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, spsr", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11110; - let Inst{26} = 0; - let Inst{25-21} = 0b11111; - let Inst{20} = 1; // The R bit. - let Inst{15-14} = 0b10; - let Inst{12} = 0; -} + [/* For disassembly only; pattern left blank */]>; -class T2MSR op31_20, bits<2> op15_14, bits<1> op12, + dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> - : T2I { + : T2SpecialReg { bits<4> Rn; bits<4> mask; let Inst{19-16} = Rn{3-0}; let Inst{11-8} = mask{3-0}; } -def t2MSR : T2MSR<(outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr", +def t2MSR : T2MSR<0b111100111000, 0b10, 0, + (outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr", "\tcpsr$mask, $Rn", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11110; - let Inst{26} = 0; - let Inst{25-21} = 0b11100; - let Inst{20} = 0; // The R bit. - let Inst{15-14} = 0b10; - let Inst{12} = 0; -} - -def t2MSRsys : T2MSR< + [/* For disassembly only; pattern left blank */]>; +def t2MSRsys : T2MSR<0b111100111001, 0b10, 0, (outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr", "\tspsr$mask, $Rn", - [/* For disassembly only; pattern left blank */]> { - let Inst{31-27} = 0b11110; - let Inst{26} = 0; - let Inst{25-21} = 0b11100; - let Inst{20} = 1; // The R bit. - let Inst{15-14} = 0b10; - let Inst{12} = 0; -} + [/* For disassembly only; pattern left blank */]>; From clattner at apple.com Mon Nov 29 14:48:00 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 12:48:00 -0800 Subject: [llvm-commits] [llvm] r120314 - in /llvm/trunk: ./ include/llvm/Support/ lib/CompilerDriver/ lib/Support/ lib/Support/Unix/ lib/Support/Windows/ tools/gold/ In-Reply-To: <20101129194451.376922A6C12D@llvm.org> References: <20101129194451.376922A6C12D@llvm.org> Message-ID: On Nov 29, 2010, at 11:44 AM, Charles Davis wrote: > Author: cdavis > Date: Mon Nov 29 13:44:50 2010 > New Revision: 120314 > > URL: http://llvm.org/viewvc/llvm-project?rev=120314&view=rev > Log: > Now to chant the magical incantation that will exorcise the System library > from LLVM forever: Thanks! Please fix the file header lines to fit in 80 columns though :) -Chris From fvbommel at gmail.com Mon Nov 29 14:55:40 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Mon, 29 Nov 2010 20:55:40 -0000 Subject: [llvm-commits] [llvm] r120319 - /llvm/trunk/test/Transforms/InstCombine/extractvalue.ll Message-ID: <20101129205540.BFFFE2A6C12D@llvm.org> Author: fvbommel Date: Mon Nov 29 14:55:40 2010 New Revision: 120319 URL: http://llvm.org/viewvc/llvm-project?rev=120319&view=rev Log: Update this test to keep testing the -instcombine transform it's supposed to be testing instead of triggering the improved constant folding for insertvalue and extractvalue. Modified: llvm/trunk/test/Transforms/InstCombine/extractvalue.ll Modified: llvm/trunk/test/Transforms/InstCombine/extractvalue.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/extractvalue.ll?rev=120319&r1=120318&r2=120319&view=diff ============================================================================== --- llvm/trunk/test/Transforms/InstCombine/extractvalue.ll (original) +++ llvm/trunk/test/Transforms/InstCombine/extractvalue.ll Mon Nov 29 14:55:40 2010 @@ -4,10 +4,10 @@ ; together declare void @bar({i32, i32} %a) -define i32 @foo() { +define i32 @foo(i32 %a, i32 %b) { ; Build a simple struct and pull values out again - %s1.1 = insertvalue {i32, i32} undef, i32 0, 0 - %s1 = insertvalue {i32, i32} %s1.1, i32 1, 1 + %s1.1 = insertvalue {i32, i32} undef, i32 %a, 0 + %s1 = insertvalue {i32, i32} %s1.1, i32 %b, 1 %v1 = extractvalue {i32, i32} %s1, 0 %v2 = extractvalue {i32, i32} %s1, 1 From kennethuil at gmail.com Mon Nov 29 15:08:35 2010 From: kennethuil at gmail.com (Kenneth Uildriks) Date: Mon, 29 Nov 2010 15:08:35 -0600 Subject: [llvm-commits] [PATCH] Fix llvm.invariant support In-Reply-To: <0C0069DC-258D-45D1-877E-3921693D2221@apple.com> References: <0C0069DC-258D-45D1-877E-3921693D2221@apple.com> Message-ID: On Mon, Nov 29, 2010 at 1:20 PM, Dan Gohman wrote: > > On Nov 22, 2010, at 7:14 PM, Kenneth Uildriks wrote: > >> Ping. >> >> On Sat, Nov 13, 2010 at 7:00 PM, Kenneth Uildriks wrote: >>> A less drastic attempt to fix issues with support for >>> llvm.invariant.start and llvm.invariant.end. ?It involves adding >>> invariant tracking by block to MemoryDependenceAnalysis. ?When a load >>> is analyzed, the invariant information for that block and its >>> predecessors is lazily computed and consulted. ?If the load's target >>> is not invariant anywhere in the block, there is no need to look for >>> invariant markers during the scan. ?If it is invariant throughout the >>> block, no def or clobber can be in that block, so we can skip >>> backwards to the block(s) that began the invariance. ?If it is >>> invariant through part of the block, we need to continue scanning >>> backwards past clobbers until we find the def or an invariant marker - >>> we can't assume that the scan starts after the invariant end, but >>> instead assume that we *might* have started scanning in the middle of >>> an invariant region until we can prove otherwise. > > How do @llvm.invariant.start and @llvm.invariant.end work? > > There are at least two interesting situations. > > First, is this valid? > > define void @callee(i8* %p) { > ?call void @llvm.invariant.end(i8* %p) > ?ret void > } > > If so, then any call can call @llvm.invariant.end on any pointer it has > access to, which substantially weakens what MemDep can do. If not, then > it seems to violate high-level IR design principles -- it should always > be valid to out-line code regions. My understanding from previous discussions was that llvm.invariant is a function local thing, so that construct would not be recognized. You can always outline code inside of the llvm.invariant markers without outlining the invariant markers themselves. > > Next, what about this? > > ?%a = alloca i32 > ?%b = bitcast i32* %a to i8* > ?%c = call {}* @llvm.invariant.begin(i8* %b) > ?%d = bitcast {}* %c to i8* > ?call void @llvm.invariant.end(i8* %d) > > If I read your patch correctly, it won't notice that the invariant > region for %b is ended here, because it's ended with a different > pointer. The results for subsequent getPointerDependencyFrom queries > will depend on which pointer happens to land first in the std::map. > Or did I miss something? I believe a given query uses alias analysis to determine whether an invariant begin/end marker applies to the pointer being queried. > > Here are a few specific comments on the patch: > >> + ?struct InvariantInfo { >> + ? ?unsigned Size; > > AliasAnalysis uses uint64_t for sizes now. OK, I'll change it. > >> + ? ? ?else if (F->getName() == "llvm.invariant.start" > >> + ? ? ?else if (F->getName() == "llvm.invariant.end" > > These should use F->getIntrinsicID(). Thanks for the heads up. I'll change that too. > >> @@ -321,8 +367,11 @@ >> >> ? ? ? ?if (R == AliasAnalysis::NoAlias) >> ? ? ? ? ?continue; >> - ? ? ?if (R == AliasAnalysis::MayAlias) >> - ? ? ? ?return MemDepResult::getClobber(Inst); >> + ? ? ?if (R == AliasAnalysis::MayAlias) { >> + ? ? ? ?if (!InvariantInside) >> + ? ? ? ? ?return MemDepResult::getClobber(Inst); >> + ? ? ? ?MayBeClobbered = true; >> + ? ? ?} >> ? ? ? ?return MemDepResult::getDef(Inst); >> ? ? ?} > > It's not obvious what's happening here. If the pointer is > invariant inside the block, why is it marked MayBeClobbered? Beause we don't know yet whether the specific instruction inside the block is inside of an invariant region or not. The load and the store might both be in the invariant region, and since we start scanning backward from the load, we don't know whether that's the case until we see an invariant marker. > > And, a testcase demonstrating the basic functionality would > be helpful. > > Dan > > > I had meant to include two testcases... I'll try again. From clattner at apple.com Mon Nov 29 15:30:28 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 13:30:28 -0800 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: Message-ID: <7CBC704A-3752-4146-9B04-867EE9F3EDED@apple.com> On Nov 28, 2010, at 2:43 AM, Frits van Bommel wrote: > On Sun, Nov 28, 2010 at 3:52 AM, Frits van Bommel wrote: >> No, definitely not okay. It inserts the new load at the location of >> the extractvalue instead of the location of the old load. Fixed >> version attached. I'll provide an extra test case once I've had some >> sleep... > > So apparently 4 AM is not the best time to try to fix bugs. Who knew? > I forgot to even run the testcase. > That version is even more broken than the one it replaced; it asserts > every time it fires. > > Here's the real fix, as well as the promised adjusted testcase that > checks for the original problem. I think that Dan is pointing out that it is unwise for an frontend to generate a ton of aggregate values, because that will cause fastisel to be defeated and lead to slower compile times. However, despite Dan's objections, I think this is a perfectly reasonable xform for instcombine to do. A comment on the patch: + return ReplaceInstUsesWith(EV, Builder->CreateLoad(GEP)); Please just use: "return new LoadInst(GEP);", assuming that it will be inserted in the correct place. If not, then your code is fine with an added comment explaining what is going on. Thanks Frits! -Chris From grosbach at apple.com Mon Nov 29 15:28:32 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 21:28:32 -0000 Subject: [llvm-commits] [llvm] r120320 - in /llvm/trunk: lib/Target/ARM/ARMAsmPrinter.cpp lib/Target/ARM/ARMBaseInstrInfo.cpp lib/Target/ARM/ARMConstantIslandPass.cpp lib/Target/ARM/ARMInstrThumb2.td lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp utils/TableGen/ARMDecoderEmitter.cpp Message-ID: <20101129212832.7243C2A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 15:28:32 2010 New Revision: 120320 URL: http://llvm.org/viewvc/llvm-project?rev=120320&view=rev Log: Rename t2 TBB and TBH instructions to reference that they encode the jump table data. Next up, pseudo-izing them. Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120320&r1=120319&r2=120320&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Nov 29 15:28:32 2010 @@ -740,9 +740,9 @@ const std::vector &JT = MJTI->getJumpTables(); const std::vector &JTBBs = JT[JTI].MBBs; unsigned OffsetWidth = 4; - if (MI->getOpcode() == ARM::t2TBB) + if (MI->getOpcode() == ARM::t2TBB_JT) OffsetWidth = 1; - else if (MI->getOpcode() == ARM::t2TBH) + else if (MI->getOpcode() == ARM::t2TBH_JT) OffsetWidth = 2; for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) { @@ -777,7 +777,7 @@ // Make sure the instruction that follows TBB is 2-byte aligned. // FIXME: Constant island pass should insert an "ALIGN" instruction instead. - if (MI->getOpcode() == ARM::t2TBB) + if (MI->getOpcode() == ARM::t2TBB_JT) EmitAlignment(1); } @@ -924,8 +924,8 @@ return; } - case ARM::t2TBB: - case ARM::t2TBH: + case ARM::t2TBB_JT: + case ARM::t2TBH_JT: case ARM::t2BR_JT: { // Lower and emit the instruction itself, then the jump table following it. MCInst TmpInst; Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=120320&r1=120319&r2=120320&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Mon Nov 29 15:28:32 2010 @@ -518,13 +518,13 @@ case ARM::BR_JTadd: case ARM::tBR_JTr: case ARM::t2BR_JT: - case ARM::t2TBB: - case ARM::t2TBH: { + case ARM::t2TBB_JT: + case ARM::t2TBH_JT: { // These are jumptable branches, i.e. a branch followed by an inlined // jumptable. The size is 4 + 4 * number of entries. For TBB, each // entry is one byte; TBH two byte each. - unsigned EntrySize = (Opc == ARM::t2TBB) - ? 1 : ((Opc == ARM::t2TBH) ? 2 : 4); + unsigned EntrySize = (Opc == ARM::t2TBB_JT) + ? 1 : ((Opc == ARM::t2TBH_JT) ? 2 : 4); unsigned NumOps = TID.getNumOperands(); MachineOperand JTOP = MI->getOperand(NumOps - (TID.isPredicable() ? 3 : 2)); @@ -542,7 +542,7 @@ // alignment issue. unsigned InstSize = (Opc == ARM::tBR_JTr || Opc == ARM::t2BR_JT) ? 2 : 4; unsigned NumEntries = getNumJTEntries(JT, JTI); - if (Opc == ARM::t2TBB && (NumEntries & 1)) + if (Opc == ARM::t2TBB_JT && (NumEntries & 1)) // Make sure the instruction that follows TBB is 2-byte aligned. // FIXME: Constant island pass should insert an "ALIGN" instruction // instead. Modified: llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp?rev=120320&r1=120319&r2=120320&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp Mon Nov 29 15:28:32 2010 @@ -1766,7 +1766,7 @@ if (!OptOk) continue; - unsigned Opc = ByteOk ? ARM::t2TBB : ARM::t2TBH; + unsigned Opc = ByteOk ? ARM::t2TBB_JT : ARM::t2TBH_JT; MachineInstr *NewJTMI = BuildMI(MBB, MI->getDebugLoc(), TII->get(Opc)) .addReg(IdxReg, getKillRegState(IdxRegKill)) .addJumpTableIndex(JTI, JTOP.getTargetFlags()) Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120320&r1=120319&r2=120320&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 15:28:32 2010 @@ -2947,7 +2947,7 @@ // FIXME: Add a non-pc based case that can be predicated. let isCodeGenOnly = 1 in // $id doesn't exist in asm string, should be lowered. -def t2TBB : +def t2TBB_JT : T2JTI<(outs), (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), IIC_Br, "tbb\t$index$jt", []> { @@ -2959,7 +2959,7 @@ } let isCodeGenOnly = 1 in // $id doesn't exist in asm string, should be lowered. -def t2TBH : +def t2TBH_JT : T2JTI<(outs), (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), IIC_Br, "tbh\t$index$jt", []> { Modified: llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp?rev=120320&r1=120319&r2=120320&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp Mon Nov 29 15:28:32 2010 @@ -531,7 +531,7 @@ void ARMInstPrinter::printTBAddrMode(const MCInst *MI, unsigned OpNum, raw_ostream &O) { O << "[pc, " << getRegisterName(MI->getOperand(OpNum).getReg()); - if (MI->getOpcode() == ARM::t2TBH) + if (MI->getOpcode() == ARM::t2TBH_JT) O << ", lsl #1"; O << ']'; } Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=120320&r1=120319&r2=120320&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Mon Nov 29 15:28:32 2010 @@ -1719,7 +1719,7 @@ return false; // Ignore t2TBB, t2TBH and prefer the generic t2TBBgen, t2TBHgen. - if (Name == "t2TBB" || Name == "t2TBH") + if (Name == "t2TBB_JT" || Name == "t2TBH_JT") return false; // Resolve conflicts: From baldrick at free.fr Mon Nov 29 15:36:12 2010 From: baldrick at free.fr (Duncan Sands) Date: Mon, 29 Nov 2010 21:36:12 -0000 Subject: [llvm-commits] [dragonegg] r120321 - in /dragonegg/trunk: Makefile llvm-convert.cpp llvm-tree.cpp llvm-tree.h llvm-types.cpp Message-ID: <20101129213612.A47672A6C12D@llvm.org> Author: baldrick Date: Mon Nov 29 15:36:12 2010 New Revision: 120321 URL: http://llvm.org/viewvc/llvm-project?rev=120321&view=rev Log: Factorize out various bits of code that give types and values helpful names in the LLVM IR. Added: dragonegg/trunk/llvm-tree.cpp dragonegg/trunk/llvm-tree.h Modified: dragonegg/trunk/Makefile dragonegg/trunk/llvm-convert.cpp dragonegg/trunk/llvm-types.cpp Modified: dragonegg/trunk/Makefile URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/Makefile?rev=120321&r1=120320&r2=120321&view=diff ============================================================================== --- dragonegg/trunk/Makefile (original) +++ dragonegg/trunk/Makefile Mon Nov 29 15:36:12 2010 @@ -38,7 +38,7 @@ PLUGIN=dragonegg.so PLUGIN_OBJECTS=llvm-cache.o llvm-convert.o llvm-backend.o llvm-debug.o \ - llvm-types.o bits_and_bobs.o llvm-abi-default.o + llvm-types.o bits_and_bobs.o llvm-abi-default.o llvm-tree.o TARGET_OBJECT=llvm-target.o TARGET_SOURCE=$(SRC_DIR)/$(shell $(TARGET_UTIL) -p)/llvm-target.cpp Modified: dragonegg/trunk/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=120321&r1=120320&r2=120321&view=diff ============================================================================== --- dragonegg/trunk/llvm-convert.cpp (original) +++ dragonegg/trunk/llvm-convert.cpp Mon Nov 29 15:36:12 2010 @@ -27,6 +27,7 @@ #include "llvm-abi.h" #include "llvm-debug.h" #include "llvm-internal.h" +#include "llvm-tree.h" // LLVM headers #include "llvm/CallingConv.h" @@ -166,47 +167,11 @@ /// NameValue - Try to name the given value after the given GCC tree node. If /// the GCC tree node has no sensible name then it does nothing. If the value /// already has a name then it is not changed. -static void NameValue(Value *V, tree t, Twine Prefix = Twine(), - Twine Postfix = Twine()) { - // If the value already has a name, do not change it. - if (V->hasName()) - return; - - // No sensible name - give up, discarding any pre- and post-fixes. - if (!t) - return; - - switch (TREE_CODE(t)) { - default: - // Unhandled case - give up. - return; - - case CONST_DECL: - case FIELD_DECL: - case FUNCTION_DECL: - case NAMESPACE_DECL: - case PARM_DECL: - case VAR_DECL: { - if (DECL_NAME(t)) { - StringRef Ident(IDENTIFIER_POINTER(DECL_NAME(t)), - IDENTIFIER_LENGTH(DECL_NAME(t))); - V->setName(Prefix + Ident + Postfix); - return; - } - const char *Annotation = TREE_CODE(t) == CONST_DECL ? "C." : "D."; - Twine UID(DECL_UID(t)); - V->setName(Prefix + Annotation + UID + Postfix); - return; - } - - case RESULT_DECL: - V->setName(Prefix + "" + Postfix); - return; - - case SSA_NAME: - Twine NameVersion(SSA_NAME_VERSION(t)); - NameValue(V, SSA_NAME_VAR(t), Prefix, "_" + NameVersion + Postfix); - return; +static void NameValue(Value *V, tree t) { + if (!V->hasName()) { + const std::string &Name = getDescriptiveName(t); + if (!Name.empty()) + V->setName(Name); } } @@ -1069,19 +1034,9 @@ gimple stmt = first_stmt(bb); if (stmt && gimple_code(stmt) == GIMPLE_LABEL) { tree label = gimple_label_label(stmt); - if (tree name = DECL_NAME(label)) { - // If the label has a name then use it. - StringRef Ident(IDENTIFIER_POINTER(name), IDENTIFIER_LENGTH(name)); - BB->setName(Ident); - } else if (LABEL_DECL_UID(label) != -1) { - // If the label has a UID then use it. - Twine UID(LABEL_DECL_UID(label)); - BB->setName(""); - } else { - // Otherwise use the generic UID. - Twine UID(DECL_UID(label)); - BB->setName(""); - } + const std::string &LabelName = getDescriptiveName(label); + if (!LabelName.empty()) + BB->setName("<" + LabelName + ">"); } else { // When there is no label, use the same name scheme as the GCC tree dumps. Twine Index(bb->index); Added: dragonegg/trunk/llvm-tree.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-tree.cpp?rev=120321&view=auto ============================================================================== --- dragonegg/trunk/llvm-tree.cpp (added) +++ dragonegg/trunk/llvm-tree.cpp Mon Nov 29 15:36:12 2010 @@ -0,0 +1,129 @@ +//===---- llvm-tree.cpp - Utility functions for working with GCC trees ----===// +// +// Copyright (C) 2010 Duncan Sands. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// This file defines utility functions for working with GCC trees. +//===----------------------------------------------------------------------===// + +// Plugin headers +#include "llvm-tree.h" + +// LLVM headers +#include "llvm/ADT/Twine.h" + +// System headers +#include + +// GCC headers +extern "C" { +#include "config.h" +// Stop GCC declaring 'getopt' as it can clash with the system's declaration. +#undef HAVE_DECL_GETOPT +#include "system.h" +#include "coretypes.h" +#include "target.h" +#include "tree.h" +} + +using namespace llvm; + +/// concatIfNotEmpty - Concatenate the given strings if they are both non-empty. +/// Otherwise return the empty string. +static std::string concatIfNotEmpty(const std::string &Left, + const std::string &Right) { + if (Left.empty() || Right.empty()) + return std::string(); + return Left + Right; +} + +/// getDescriptiveName - Return a helpful name for the given tree, or an empty +/// string if no sensible name was found. These names are used to make the IR +/// more readable, and have no official status. +std::string llvm::getDescriptiveName(tree t) { + if (!t) return std::string(); // Occurs when recursing. + + // Name identifier nodes after their contents. This gives the desired effect + // when called recursively. + if (TREE_CODE(t) == IDENTIFIER_NODE) + return std::string(IDENTIFIER_POINTER(t), IDENTIFIER_LENGTH(t)); + + // Handle declarations of all kinds. + if (DECL_P(t)) { + // If the declaration comes with a name then use it. + if (DECL_NAME(t)) // Always an identifier node. + return std::string(IDENTIFIER_POINTER(DECL_NAME(t)), + IDENTIFIER_LENGTH(DECL_NAME(t))); + // Use a generic name for function results. + if (TREE_CODE(t) == RESULT_DECL) + return ""; + // Labels have their own numeric unique identifiers. + if (TREE_CODE(t) == LABEL_DECL && LABEL_DECL_UID(t) != -1) { + Twine LUID(LABEL_DECL_UID(t)); + return ("L" + LUID).str(); + } + // Otherwise use the generic UID. + const char *Annotation = TREE_CODE(t) == CONST_DECL ? "C." : "D."; + Twine UID(DECL_UID(t)); + return (Annotation + UID).str(); + } + + // Handle types of all kinds. + if (TYPE_P(t)) { + // If the type comes with a name then use it. + const std::string &TypeName = getDescriptiveName(TYPE_NAME(t)); + if (!TypeName.empty()) { + // Annotate the name with a description of the type's class. + if (TREE_CODE(t) == ENUMERAL_TYPE) + return "enum." + TypeName; + if (TREE_CODE(t) == RECORD_TYPE) + return "struct." + TypeName; + if (TREE_CODE(t) == QUAL_UNION_TYPE) + return "qualunion." + TypeName; + if (TREE_CODE(t) == UNION_TYPE) + return "union." + TypeName; + return TypeName; + } + + // Try to deduce a useful name. + if (TREE_CODE(t) == ARRAY_TYPE) + // If the element type is E, name the array E[] (regardless of the number + // of dimensions). + return concatIfNotEmpty(getDescriptiveName(TREE_TYPE(t)), "[]"); + if (TREE_CODE(t) == COMPLEX_TYPE) + // If the element type is E, name the complex number complex.E. + return concatIfNotEmpty("complex.", getDescriptiveName(TREE_TYPE(t))); + if (TREE_CODE(t) == POINTER_TYPE) + // If the element type is E, name the pointer E*. + return concatIfNotEmpty(getDescriptiveName(TREE_TYPE(t)), "*"); + if (TREE_CODE(t) == REFERENCE_TYPE) + // If the element type is E, name the reference E&. + return concatIfNotEmpty(getDescriptiveName(TREE_TYPE(t)), "&"); + + return TypeName; + } + + // Handle SSA names. + if (TREE_CODE(t) == SSA_NAME) { + Twine NameVersion(SSA_NAME_VERSION(t)); + return concatIfNotEmpty(getDescriptiveName(SSA_NAME_VAR(t)), + ("_" + NameVersion).str()); + } + + // A mysterious tree, just give up. + return std::string(); +} Added: dragonegg/trunk/llvm-tree.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-tree.h?rev=120321&view=auto ============================================================================== --- dragonegg/trunk/llvm-tree.h (added) +++ dragonegg/trunk/llvm-tree.h Mon Nov 29 15:36:12 2010 @@ -0,0 +1,40 @@ +//=-- llvm-tree.h - Utility functions for working with GCC trees --*- C++ -*-=// +// +// Copyright (C) 2010 Duncan Sands. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// This file declares utility functions for working with GCC trees. +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TREE_H +#define LLVM_TREE_H + +// System headers +#include + +union tree_node; + +namespace llvm { + +/// getDescriptiveName - Return a helpful name for the given tree, or an empty +/// string if no sensible name was found. These names are used to make the IR +/// more readable, and have no official status. +std::string getDescriptiveName(union tree_node *t); + +} + +#endif /* LLVM_TREE_H */ Modified: dragonegg/trunk/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-types.cpp?rev=120321&r1=120320&r2=120321&view=diff ============================================================================== --- dragonegg/trunk/llvm-types.cpp (original) +++ dragonegg/trunk/llvm-types.cpp Mon Nov 29 15:36:12 2010 @@ -25,6 +25,7 @@ // Plugin headers #include "llvm-abi.h" +#include "llvm-tree.h" extern "C" { #include "llvm-cache.h" } @@ -280,74 +281,6 @@ return isInt64(DECL_FIELD_OFFSET(field_decl), true); } -/// NameType - Try to name the given type after the given GCC tree node. If -/// the GCC tree node has no sensible name then it does nothing. -static void NameType(const Type *Ty, tree t, Twine Prefix = Twine(), - Twine Postfix = Twine()) { - // No sensible name - give up, discarding any pre- and post-fixes. - if (!t) - return; - - switch (TREE_CODE(t)) { - default: - // Unhandled case - give up. - return; - - case ARRAY_TYPE: - // If the element type is E, name the array E[] (regardless of the number - // of dimensions). - for (; TREE_CODE(t) == ARRAY_TYPE; t = TREE_TYPE(t)) ; - NameType(Ty, t, Prefix, "[]" + Postfix); - return; - - case BOOLEAN_TYPE: - case COMPLEX_TYPE: - case ENUMERAL_TYPE: - case FIXED_POINT_TYPE: - case FUNCTION_TYPE: - case INTEGER_TYPE: - case METHOD_TYPE: - case QUAL_UNION_TYPE: - case REAL_TYPE: - case RECORD_TYPE: - case UNION_TYPE: - case VECTOR_TYPE: { - // If the type has a name then use that, otherwise bail out. - if (!TYPE_NAME(t)) - return; // Unnamed type. - - tree identifier = NULL_TREE; - if (TREE_CODE(TYPE_NAME(t)) == IDENTIFIER_NODE) - identifier = TYPE_NAME(t); - else if (TREE_CODE(TYPE_NAME(t)) == TYPE_DECL) - identifier = DECL_NAME(TYPE_NAME(t)); - - if (identifier) { - const char *Class = ""; - if (TREE_CODE(t) == ENUMERAL_TYPE) - Class = "enum "; - if (TREE_CODE(t) == RECORD_TYPE) - Class = "struct "; - else if (TREE_CODE(t) == UNION_TYPE) - Class = "union "; - StringRef Ident(IDENTIFIER_POINTER(identifier), - IDENTIFIER_LENGTH(identifier)); - TheModule->addTypeName((Prefix + Class + Ident + Postfix).str(), Ty); - } - return; - } - - case POINTER_TYPE: - // If the element type is E, LLVM already calls this E*. - return; - - case REFERENCE_TYPE: - // If the element type is E, name the reference E&. - NameType(Ty, TREE_TYPE(t), Prefix, "&" + Postfix); - return; - } -} - /// isBitfield - Returns whether to treat the specified field as a bitfield. bool isBitfield(tree_node *field_decl) { if (!DECL_BIT_FIELD(field_decl)) @@ -943,7 +876,15 @@ } } - NameType(Ty, type); + // Try to give the type a helpful name. There is no point in doing this for + // array and pointer types since LLVM automatically gives them a useful name + // based on the element type. + if (!isa(Ty)) { + const std::string &TypeName = getDescriptiveName(type); + if (!TypeName.empty()) + TheModule->addTypeName(TypeName, Ty); + } + return Ty; } From rafael.espindola at gmail.com Mon Nov 29 15:44:55 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Mon, 29 Nov 2010 16:44:55 -0500 Subject: [llvm-commits] [Review request] Add the feature "sh" for LLVM::Other/close-stderr.ll, for MSVC In-Reply-To: References: Message-ID: > ?Activate the feature. A feature for one test? Isn't it better to use XFAIL? > ...Takumi Cheers, Rafael From fvbommel at gmail.com Mon Nov 29 15:56:20 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Mon, 29 Nov 2010 21:56:20 -0000 Subject: [llvm-commits] [llvm] r120323 - in /llvm/trunk: lib/Transforms/InstCombine/InstructionCombining.cpp test/Transforms/InstCombine/extractvalue.ll Message-ID: <20101129215620.EDC052A6C12D@llvm.org> Author: fvbommel Date: Mon Nov 29 15:56:20 2010 New Revision: 120323 URL: http://llvm.org/viewvc/llvm-project?rev=120323&view=rev Log: Transform (extractvalue (load P), ...) to (load (gep P, 0, ...)) if the load has no other uses, shrinking the load. Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp llvm/trunk/test/Transforms/InstCombine/extractvalue.ll Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=120323&r1=120322&r2=120323&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp Mon Nov 29 15:56:20 2010 @@ -1171,10 +1171,37 @@ } } } - // Can't simplify extracts from other values. Note that nested extracts are - // already simplified implicitely by the above (extract ( extract (insert) ) + if (LoadInst *L = dyn_cast(Agg)) + // If the (non-volatile) load only has one use, we can rewrite this to a + // load from a GEP. This reduces the size of the load. + // FIXME: If a load is used only by extractvalue instructions then this + // could be done regardless of having multiple uses. + if (!L->isVolatile() && L->hasOneUse()) { + // extractvalue has integer indices, getelementptr has Value*s. Convert. + SmallVector Indices; + // Prefix an i32 0 since we need the first element. + Indices.push_back(Builder->getInt32(0)); + for (ExtractValueInst::idx_iterator I = EV.idx_begin(), E = EV.idx_end(); + I != E; ++I) + Indices.push_back(Builder->getInt32(*I)); + + // We need to insert these at the location of the old load, not at that of + // the extractvalue. + Builder->SetInsertPoint(L->getParent(), L); + Value *GEP = Builder->CreateInBoundsGEP(L->getPointerOperand(), + Indices.begin(), Indices.end()); + // Returning the load directly will cause the main loop to insert it in + // the wrong spot, so use ReplaceInstUsesWith(). + return ReplaceInstUsesWith(EV, Builder->CreateLoad(GEP)); + } + // We could simplify extracts from other values. Note that nested extracts may + // already be simplified implicitly by the above: extract (extract (insert) ) // will be translated into extract ( insert ( extract ) ) first and then just - // the value inserted, if appropriate). + // the value inserted, if appropriate. Similarly for extracts from single-use + // loads: extract (extract (load)) will be translated to extract (load (gep)) + // and if again single-use then via load (gep (gep)) to load (gep). + // However, double extracts from e.g. function arguments or return values + // aren't handled yet. return 0; } Modified: llvm/trunk/test/Transforms/InstCombine/extractvalue.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/extractvalue.ll?rev=120323&r1=120322&r2=120323&view=diff ============================================================================== --- llvm/trunk/test/Transforms/InstCombine/extractvalue.ll (original) +++ llvm/trunk/test/Transforms/InstCombine/extractvalue.ll Mon Nov 29 15:56:20 2010 @@ -1,10 +1,13 @@ -; RUN: opt < %s -instcombine -S | not grep extractvalue +; RUN: opt < %s -instcombine -S | FileCheck %s -; Instcombine should fold various combinations of insertvalue and extractvalue -; together declare void @bar({i32, i32} %a) +declare i32 @baz(i32 %a) +; CHECK: define i32 @foo +; CHECK-NOT: extractvalue define i32 @foo(i32 %a, i32 %b) { +; Instcombine should fold various combinations of insertvalue and extractvalue +; together ; Build a simple struct and pull values out again %s1.1 = insertvalue {i32, i32} undef, i32 %a, 0 %s1 = insertvalue {i32, i32} %s1.1, i32 %b, 1 @@ -36,3 +39,69 @@ ret i32 %v5 } +; CHECK: define i32 @extract2gep +; CHECK-NEXT: [[GEP:%[a-z0-9]+]] = getelementptr inbounds {{.*}}* %pair, i32 0, i32 1 +; CHECK-NEXT: [[LOAD:%[A-Za-z0-9]+]] = load i32* [[GEP]] +; CHECK-NEXT: store +; CHECK-NEXT: br label %loop +; CHECK-NOT: extractvalue +; CHECK: call {{.*}}(i32 [[LOAD]]) +; CHECK-NOT: extractvalue +; CHECK: ret i32 [[LOAD]] +define i32 @extract2gep({i32, i32}* %pair, i32* %P) { + ; The load + extractvalue should be converted + ; to an inbounds gep + smaller load. + ; The new load should be in the same spot as the old load. + %L = load {i32, i32}* %pair + store i32 0, i32* %P + br label %loop + +loop: + %E = extractvalue {i32, i32} %L, 1 + %C = call i32 @baz(i32 %E) + store i32 %C, i32* %P + %cond = icmp eq i32 %C, 0 + br i1 %cond, label %end, label %loop + +end: + ret i32 %E +} + +; CHECK: define i32 @doubleextract2gep +; CHECK-NEXT: [[GEP:%[a-z0-9]+]] = getelementptr inbounds {{.*}}* %arg, i32 0, i32 1, i32 1 +; CHECK-NEXT: [[LOAD:%[A-Za-z0-9]+]] = load i32* [[GEP]] +; CHECK-NEXT: ret i32 [[LOAD]] +define i32 @doubleextract2gep({i32, {i32, i32}}* %arg) { + ; The load + extractvalues should be converted + ; to a 3-index inbounds gep + smaller load. + %L = load {i32, {i32, i32}}* %arg + %E1 = extractvalue {i32, {i32, i32}} %L, 1 + %E2 = extractvalue {i32, i32} %E1, 1 + ret i32 %E2 +} + +; CHECK: define i32 @nogep-multiuse +; CHECK-NEXT: load {{.*}} %pair +; CHECK-NEXT: extractvalue +; CHECK-NEXT: extractvalue +; CHECK-NEXT: add +; CHECK-NEXT: ret +define i32 @nogep-multiuse({i32, i32}* %pair) { + ; The load should be left unchanged since both parts are needed. + %L = volatile load {i32, i32}* %pair + %LHS = extractvalue {i32, i32} %L, 0 + %RHS = extractvalue {i32, i32} %L, 1 + %R = add i32 %LHS, %RHS + ret i32 %R +} + +; CHECK: define i32 @nogep-volatile +; CHECK-NEXT: volatile load {{.*}} %pair +; CHECK-NEXT: extractvalue +; CHECK-NEXT: ret +define i32 @nogep-volatile({i32, i32}* %pair) { + ; The volatile load should be left unchanged. + %L = volatile load {i32, i32}* %pair + %E = extractvalue {i32, i32} %L, 1 + ret i32 %E +} From echristo at apple.com Mon Nov 29 15:56:23 2010 From: echristo at apple.com (Eric Christopher) Date: Mon, 29 Nov 2010 21:56:23 -0000 Subject: [llvm-commits] [llvm] r120324 - /llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Message-ID: <20101129215623.4BDED2A6C12F@llvm.org> Author: echristo Date: Mon Nov 29 15:56:23 2010 New Revision: 120324 URL: http://llvm.org/viewvc/llvm-project?rev=120324&view=rev Log: Update fastisel for the changes in r120272. Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFastISel.cpp?rev=120324&r1=120323&r2=120324&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMFastISel.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Mon Nov 29 15:56:23 2010 @@ -1740,7 +1740,9 @@ CallOpc = Subtarget->isTargetDarwin() ? ARM::tBLXi_r9 : ARM::tBLXi; else CallOpc = Subtarget->isTargetDarwin() ? ARM::BLr9 : ARM::BL; - MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CallOpc)) + // Explicitly adding the predicate here. + MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, + TII.get(CallOpc))) .addExternalSymbol(TLI.getLibcallName(Call)); // Add implicit physical register uses to the call. @@ -1849,8 +1851,10 @@ CallOpc = Subtarget->isTargetDarwin() ? ARM::tBLXi_r9 : ARM::tBLXi; else CallOpc = Subtarget->isTargetDarwin() ? ARM::BLr9 : ARM::BL; - MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CallOpc)) - .addGlobalAddress(GV, 0, 0); + // Explicitly adding the predicate here. + MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, + TII.get(CallOpc))) + .addGlobalAddress(GV, 0, 0); // Add implicit physical register uses to the call. for (unsigned i = 0, e = RegArgs.size(); i != e; ++i) From geek4civic at gmail.com Mon Nov 29 15:59:16 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Tue, 30 Nov 2010 06:59:16 +0900 Subject: [llvm-commits] [Review request] Add the feature "sh" for LLVM::Other/close-stderr.ll, for MSVC In-Reply-To: References: Message-ID: Good morning, Rafael. 2010/11/30 Rafael Esp?ndola : >> ?Activate the feature. > > A feature for one test? Isn't it better to use XFAIL? It *succeeds unexpected* on MSYS-mingw bash. :) IMHO I prefer to avoid XFAIL as possible. ps. my all proposals are; https://github.com/chapuni/llvm-mirror/tree/msys-shared (excuse me, some commits have Japanese logs) ...Takumi From sabre at nondot.org Mon Nov 29 15:59:31 2010 From: sabre at nondot.org (Chris Lattner) Date: Mon, 29 Nov 2010 21:59:31 -0000 Subject: [llvm-commits] [llvm] r120325 - in /llvm/trunk: lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/simple.ll Message-ID: <20101129215931.88D672A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 15:59:31 2010 New Revision: 120325 URL: http://llvm.org/viewvc/llvm-project?rev=120325&view=rev Log: fix PR8677, patch by Jakub Staszak! Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120325&r1=120324&r2=120325&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 15:59:31 2010 @@ -235,8 +235,10 @@ &BB); } - // If not a definite must-alias dependency, ignore it. - if (!InstDep.isDef()) + // If not a definite must-alias store dependency, ignore it. If this is a + // load from the same pointer, we don't want to transform load+store into + // a noop. + if (!InstDep.isDef() || !isa(InstDep.getInst())) continue; } Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120325&r1=120324&r2=120325&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 15:59:31 2010 @@ -20,3 +20,17 @@ ; CHECK: @test2 ; CHECK-NEXT: store i32 20 } + + +; PR8677 + at g = global i32 1 + +define i32 @test3(i32* %g_addr) nounwind { +; CHECK: @test3 +; CHEcK: load i32* %g_addr + %g_value = load i32* %g_addr, align 4 + store i32 -1, i32* @g, align 4 + store i32 %g_value, i32* %g_addr, align 4 + %tmp3 = load i32* @g, align 4 + ret i32 %tmp3 +} From isanbard at gmail.com Mon Nov 29 16:15:03 2010 From: isanbard at gmail.com (Bill Wendling) Date: Mon, 29 Nov 2010 22:15:03 -0000 Subject: [llvm-commits] [llvm] r120326 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101129221503.E88D02A6C12D@llvm.org> Author: void Date: Mon Nov 29 16:15:03 2010 New Revision: 120326 URL: http://llvm.org/viewvc/llvm-project?rev=120326&view=rev Log: Refactor some of the "disassembly-only" instructions into a base class. This reduces some code duplication. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120326&r1=120325&r2=120326&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 16:15:03 2010 @@ -136,45 +136,41 @@ Requires<[IsThumb, IsThumb1Only]>; } +class T1Disassembly op1, bits<8> op2> + : T1Encoding<0b101111> { + let Inst{9-8} = op1; + let Inst{7-0} = op2; +} + def tNOP : T1pI<(outs), (ins), NoItinerary, "nop", "", [/* For disassembly only; pattern left blank */]>, - T1Encoding<0b101111> { - // A8.6.110 - let Inst{9-8} = 0b11; - let Inst{7-0} = 0x00; -} + T1Disassembly<0b11, 0x00>; // A8.6.110 def tYIELD : T1pI<(outs), (ins), NoItinerary, "yield", "", [/* For disassembly only; pattern left blank */]>, - T1Encoding<0b101111> { - // A8.6.410 - let Inst{9-8} = 0b11; - let Inst{7-0} = 0x10; -} + T1Disassembly<0b11, 0x10>; // A8.6.410 def tWFE : T1pI<(outs), (ins), NoItinerary, "wfe", "", [/* For disassembly only; pattern left blank */]>, - T1Encoding<0b101111> { - // A8.6.408 - let Inst{9-8} = 0b11; - let Inst{7-0} = 0x20; -} + T1Disassembly<0b11, 0x20>; // A8.6.408 def tWFI : T1pI<(outs), (ins), NoItinerary, "wfi", "", [/* For disassembly only; pattern left blank */]>, - T1Encoding<0b101111> { - // A8.6.409 - let Inst{9-8} = 0b11; - let Inst{7-0} = 0x30; -} + T1Disassembly<0b11, 0x30>; // A8.6.409 def tSEV : T1pI<(outs), (ins), NoItinerary, "sev", "", [/* For disassembly only; pattern left blank */]>, - T1Encoding<0b101111> { - // A8.6.157 - let Inst{9-8} = 0b11; - let Inst{7-0} = 0x40; -} + T1Disassembly<0b11, 0x40>; // A8.6.157 + +// The i32imm operand $val can be used by a debugger to store more information +// about the breakpoint. +def tBKPT : T1I<(outs), (ins i32imm:$val), NoItinerary, "bkpt\t$val", + [/* For disassembly only; pattern left blank */]>, + T1Disassembly<0b10, {?,?,?,?,?,?,?,?}> { + // A8.6.22 + bits<8> val; + let Inst{7-0} = val; +} def tSETENDBE : T1I<(outs), (ins), NoItinerary, "setend\tbe", [/* For disassembly only; pattern left blank */]>, @@ -196,17 +192,6 @@ let Inst{2-0} = 0b000; } -// The i32imm operand $val can be used by a debugger to store more information -// about the breakpoint. -def tBKPT : T1I<(outs), (ins i32imm:$val), NoItinerary, "bkpt\t$val", - [/* For disassembly only; pattern left blank */]>, - T1Encoding<0b101111> { - // A8.6.22 - bits<8> val; - let Inst{9-8} = 0b10; - let Inst{7-0} = val; -} - // Change Processor State is a system instruction -- for disassembly only. // The singleton $opt operand contains the following information: // opt{4-0} = mode ==> don't care From fvbommel at gmail.com Mon Nov 29 16:21:00 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Mon, 29 Nov 2010 23:21:00 +0100 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: <7CBC704A-3752-4146-9B04-867EE9F3EDED@apple.com> References: <7CBC704A-3752-4146-9B04-867EE9F3EDED@apple.com> Message-ID: On Mon, Nov 29, 2010 at 10:30 PM, Chris Lattner wrote: > I think that Dan is pointing out that it is unwise for an frontend to generate a ton of aggregate values, because that will cause fastisel to be defeated and lead to slower compile times. ?However, despite Dan's objections, I think this is a perfectly reasonable xform for instcombine to do. I agree that it's probably not a very good thing to do, but apparently they do occur "in the wild" even with clang. Also, I've found aggregate values can really make a simple frontend easier to write sometimes when you can just assume that any expression will generate (at most) a single llvm::Value* even if the result logically has two fields, e.g. a pointer and length for a dynamic array. So if you prefer ease of implementation, this is at least a useful hack. One way extractvalues can enter the code, by the way, is return values of functions. For instance, on x86-64 9-16 byte structs are returned as a 2-field struct value. When such a function gets inlined, this optimization may fire if the frontend used a single load + ret instead of two loads + two insertvalues + ret to construct the return value. (The fact that using more instructions causes it to optimize better can be a bit counter-intuitive) We could also add a "load %struct*" --> load fields + construct %struct with insertvalues transform... > A comment on the patch: > > + ? ? ?return ReplaceInstUsesWith(EV, Builder->CreateLoad(GEP)); > > Please just use: "return new LoadInst(GEP);", assuming that it will be inserted in the correct place. ?If not, then your code is fine with an added comment explaining what is going on. That's what the first version did, and the exact reason it was horribly broken :). Doing that causes -instcombine to try to insert it at the current location, which is that of the extractvalue. Adding an explicit insert point causes an assert when trying to insert it because it's already in a basic block. I changed the last bit to // We need to insert these at the location of the old load, not at that of // the extractvalue. Builder->SetInsertPoint(L->getParent(), L); Value *GEP = Builder->CreateInBoundsGEP(L->getPointerOperand(), Indices.begin(), Indices.end()); // Returning the load directly will cause the main loop to insert it in // the wrong spot, so use ReplaceInstUsesWith(). return ReplaceInstUsesWith(EV, Builder->CreateLoad(GEP)); (only the comments have changed) Committed as r120323. From bigcheesegs at gmail.com Mon Nov 29 16:28:22 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 22:28:22 -0000 Subject: [llvm-commits] [llvm] r120327 - /llvm/trunk/include/llvm/Support/PathV2.h Message-ID: <20101129222822.430342A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 16:28:22 2010 New Revision: 120327 URL: http://llvm.org/viewvc/llvm-project?rev=120327&view=rev Log: Support/PathV2: Just about every function call requires the Twine header. Modified: llvm/trunk/include/llvm/Support/PathV2.h Modified: llvm/trunk/include/llvm/Support/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?rev=120327&r1=120326&r2=120327&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Mon Nov 29 16:28:22 2010 @@ -25,6 +25,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/Twine.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/system_error.h" #include From bigcheesegs at gmail.com Mon Nov 29 16:28:32 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 22:28:32 -0000 Subject: [llvm-commits] [llvm] r120328 - /llvm/trunk/include/llvm/Support/system_error.h Message-ID: <20101129222832.BE6192A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 16:28:32 2010 New Revision: 120328 URL: http://llvm.org/viewvc/llvm-project?rev=120328&view=rev Log: system_error: Remove Windows headers. Modified: llvm/trunk/include/llvm/Support/system_error.h Modified: llvm/trunk/include/llvm/Support/system_error.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/system_error.h?rev=120328&r1=120327&r2=120328&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/system_error.h (original) +++ llvm/trunk/include/llvm/Support/system_error.h Mon Nov 29 16:28:32 2010 @@ -230,129 +230,127 @@ // This must be here instead of a .inc file because it is used in the definition // of the enum values below. #ifdef LLVM_ON_WIN32 - // VS 2008 needs this for some of the defines below. -# include // The following numbers were taken from VS2010. # ifndef EAFNOSUPPORT -# define EAFNOSUPPORT WSAEAFNOSUPPORT +# define EAFNOSUPPORT 102 # endif # ifndef EADDRINUSE -# define EADDRINUSE WSAEADDRINUSE +# define EADDRINUSE 100 # endif # ifndef EADDRNOTAVAIL -# define EADDRNOTAVAIL WSAEADDRNOTAVAIL +# define EADDRNOTAVAIL 101 # endif # ifndef EISCONN -# define EISCONN WSAEISCONN +# define EISCONN 113 # endif # ifndef E2BIG -# define E2BIG WSAE2BIG +# define E2BIG 7 # endif # ifndef EDOM -# define EDOM WSAEDOM +# define EDOM 33 # endif # ifndef EFAULT -# define EFAULT WSAEFAULT +# define EFAULT 14 # endif # ifndef EBADF -# define EBADF WSAEBADF +# define EBADF 9 # endif # ifndef EBADMSG # define EBADMSG 104 # endif # ifndef EPIPE -# define EPIPE WSAEPIPE +# define EPIPE 32 # endif # ifndef ECONNABORTED -# define ECONNABORTED WSAECONNABORTED +# define ECONNABORTED 106 # endif # ifndef EALREADY -# define EALREADY WSAEALREADY +# define EALREADY 103 # endif # ifndef ECONNREFUSED -# define ECONNREFUSED WSAECONNREFUSED +# define ECONNREFUSED 107 # endif # ifndef ECONNRESET -# define ECONNRESET WSAECONNRESET +# define ECONNRESET 108 # endif # ifndef EXDEV -# define EXDEV WSAEXDEV +# define EXDEV 18 # endif # ifndef EDESTADDRREQ -# define EDESTADDRREQ WSAEDESTADDRREQ +# define EDESTADDRREQ 109 # endif # ifndef EBUSY -# define EBUSY WSAEBUSY +# define EBUSY 16 # endif # ifndef ENOTEMPTY -# define ENOTEMPTY WSAENOTEMPTY +# define ENOTEMPTY 41 # endif # ifndef ENOEXEC -# define ENOEXEC WSAENOEXEC +# define ENOEXEC 8 # endif # ifndef EEXIST -# define EEXIST WSAEEXIST +# define EEXIST 17 # endif # ifndef EFBIG -# define EFBIG WSAEFBIG +# define EFBIG 27 # endif # ifndef ENAMETOOLONG -# define ENAMETOOLONG WSAENAMETOOLONG +# define ENAMETOOLONG 38 # endif # ifndef ENOSYS -# define ENOSYS WSAENOSYS +# define ENOSYS 40 # endif # ifndef EHOSTUNREACH -# define EHOSTUNREACH WSAEHOSTUNREACH +# define EHOSTUNREACH 110 # endif # ifndef EIDRM # define EIDRM 111 # endif # ifndef EILSEQ -# define EILSEQ WSAEILSEQ +# define EILSEQ 42 # endif # ifndef ENOTTY -# define ENOTTY WSAENOTTY +# define ENOTTY 25 # endif # ifndef EINTR -# define EINTR WSAEINTR +# define EINTR 4 # endif # ifndef EINVAL -# define EINVAL WSAEINVAL +# define EINVAL 22 # endif # ifndef ESPIPE -# define ESPIPE WSAESPIPE +# define ESPIPE 29 # endif # ifndef EIO -# define EIO WSAEIO +# define EIO 5 # endif # ifndef EISDIR -# define EISDIR WSAEISDIR +# define EISDIR 21 # endif # ifndef EMSGSIZE -# define EMSGSIZE WSAEMSGSIZE +# define EMSGSIZE 115 # endif # ifndef ENETDOWN -# define ENETDOWN WSAENETDOWN +# define ENETDOWN 116 # endif # ifndef ENETRESET -# define ENETRESET WSAENETRESET +# define ENETRESET 117 # endif # ifndef ENETUNREACH -# define ENETUNREACH WSAENETUNREACH +# define ENETUNREACH 118 # endif # ifndef ENOBUFS -# define ENOBUFS WSAENOBUFS +# define ENOBUFS 119 # endif # ifndef ECHILD -# define ECHILD WSAECHILD +# define ECHILD 10 # endif # ifndef ENOLINK # define ENOLINK 121 # endif # ifndef ENOLCK -# define ENOLCK WSAENOLCK +# define ENOLCK 39 # endif # ifndef ENODATA # define ENODATA 120 @@ -361,40 +359,40 @@ # define ENOMSG 122 # endif # ifndef ENOPROTOOPT -# define ENOPROTOOPT WSAENOPROTOOPT +# define ENOPROTOOPT 123 # endif # ifndef ENOSPC -# define ENOSPC WSAENOSPC +# define ENOSPC 28 # endif # ifndef ENOSR # define ENOSR 124 # endif # ifndef ENXIO -# define ENXIO WSAENXIO +# define ENXIO 6 # endif # ifndef ENODEV -# define ENODEV WSAENODEV +# define ENODEV 19 # endif # ifndef ENOENT -# define ENOENT WSAENOENT +# define ENOENT 2 # endif # ifndef ESRCH -# define ESRCH WSAESRCH +# define ESRCH 3 # endif # ifndef ENOTDIR -# define ENOTDIR WSAENOTDIR +# define ENOTDIR 20 # endif # ifndef ENOTSOCK -# define ENOTSOCK WSAENOTSOCK +# define ENOTSOCK 128 # endif # ifndef ENOSTR # define ENOSTR 125 # endif # ifndef ENOTCONN -# define ENOTCONN WSAENOTCONN +# define ENOTCONN 126 # endif # ifndef ENOMEM -# define ENOMEM WSAENOMEM +# define ENOMEM 12 # endif # ifndef ENOTSUP # define ENOTSUP 129 @@ -403,40 +401,40 @@ # define ECANCELED 105 # endif # ifndef EINPROGRESS -# define EINPROGRESS WSAEINPROGRESS +# define EINPROGRESS 112 # endif # ifndef EPERM -# define EPERM WSAEPERM +# define EPERM 1 # endif # ifndef EOPNOTSUPP -# define EOPNOTSUPP WSAEOPNOTSUPP +# define EOPNOTSUPP 130 # endif # ifndef EWOULDBLOCK -# define EWOULDBLOCK WSAEWOULDBLOCK +# define EWOULDBLOCK 140 # endif # ifndef EOWNERDEAD # define EOWNERDEAD 133 # endif # ifndef EACCES -# define EACCES WSAEACCES +# define EACCES 13 # endif # ifndef EPROTO # define EPROTO 134 # endif # ifndef EPROTONOSUPPORT -# define EPROTONOSUPPORT WSAEPROTONOSUPPORT +# define EPROTONOSUPPORT 135 # endif # ifndef EROFS -# define EROFS WSAEROFS +# define EROFS 30 # endif # ifndef EDEADLK -# define EDEADLK WSAEDEADLK +# define EDEADLK 36 # endif # ifndef EAGAIN -# define EAGAIN WSAEAGAIN +# define EAGAIN 11 # endif # ifndef ERANGE -# define ERANGE WSAERANGE +# define ERANGE 34 # endif # ifndef ENOTRECOVERABLE # define ENOTRECOVERABLE 127 @@ -448,25 +446,25 @@ # define ETXTBSY 139 # endif # ifndef ETIMEDOUT -# define ETIMEDOUT WSAETIMEDOUT +# define ETIMEDOUT 138 # endif # ifndef ENFILE -# define ENFILE WSAENFILE +# define ENFILE 23 # endif # ifndef EMFILE -# define EMFILE WSAEMFILE +# define EMFILE 24 # endif # ifndef EMLINK -# define EMLINK WSAEMLINK +# define EMLINK 31 # endif # ifndef ELOOP -# define ELOOP WSAELOOP +# define ELOOP 114 # endif # ifndef EOVERFLOW # define EOVERFLOW 132 # endif # ifndef EPROTOTYPE -# define EPROTOTYPE WSAEPROTOTYPE +# define EPROTOTYPE 136 # endif #endif @@ -815,19 +813,7 @@ return !(_x == _y); } -// system_error - -} // end namespace llvm - -// This needs to stay here for KillTheDoctor. -#ifdef LLVM_ON_WIN32 -// FIXME: These two headers really really really need to be removed from here. -// Not only is it a violation of System, they define the stupid min and -// max macros :(. -#include -#include - -namespace llvm { +// Windows errors. // To construct an error_code after an API error: // @@ -835,63 +821,65 @@ struct windows_error { enum _ { success = 0, - // These names and values are based on Windows winerror.h - // This is not a complete list. - invalid_function = ERROR_INVALID_FUNCTION, - file_not_found = ERROR_FILE_NOT_FOUND, - path_not_found = ERROR_PATH_NOT_FOUND, - too_many_open_files = ERROR_TOO_MANY_OPEN_FILES, - access_denied = ERROR_ACCESS_DENIED, - invalid_handle = ERROR_INVALID_HANDLE, - arena_trashed = ERROR_ARENA_TRASHED, - not_enough_memory = ERROR_NOT_ENOUGH_MEMORY, - invalid_block = ERROR_INVALID_BLOCK, - bad_environment = ERROR_BAD_ENVIRONMENT, - bad_format = ERROR_BAD_FORMAT, - invalid_access = ERROR_INVALID_ACCESS, - outofmemory = ERROR_OUTOFMEMORY, - invalid_drive = ERROR_INVALID_DRIVE, - current_directory = ERROR_CURRENT_DIRECTORY, - not_same_device = ERROR_NOT_SAME_DEVICE, - no_more_files = ERROR_NO_MORE_FILES, - write_protect = ERROR_WRITE_PROTECT, - bad_unit = ERROR_BAD_UNIT, - not_ready = ERROR_NOT_READY, - bad_command = ERROR_BAD_COMMAND, - crc = ERROR_CRC, - bad_length = ERROR_BAD_LENGTH, - seek = ERROR_SEEK, - not_dos_disk = ERROR_NOT_DOS_DISK, - sector_not_found = ERROR_SECTOR_NOT_FOUND, - out_of_paper = ERROR_OUT_OF_PAPER, - write_fault = ERROR_WRITE_FAULT, - read_fault = ERROR_READ_FAULT, - gen_failure = ERROR_GEN_FAILURE, - sharing_violation = ERROR_SHARING_VIOLATION, - lock_violation = ERROR_LOCK_VIOLATION, - wrong_disk = ERROR_WRONG_DISK, - sharing_buffer_exceeded = ERROR_SHARING_BUFFER_EXCEEDED, - handle_eof = ERROR_HANDLE_EOF, - handle_disk_full = ERROR_HANDLE_DISK_FULL, - rem_not_list = ERROR_REM_NOT_LIST, - dup_name = ERROR_DUP_NAME, - bad_net_path = ERROR_BAD_NETPATH, - network_busy = ERROR_NETWORK_BUSY, - file_exists = ERROR_FILE_EXISTS, - cannot_make = ERROR_CANNOT_MAKE, - broken_pipe = ERROR_BROKEN_PIPE, - open_failed = ERROR_OPEN_FAILED, - buffer_overflow = ERROR_BUFFER_OVERFLOW, - disk_full = ERROR_DISK_FULL, - lock_failed = ERROR_LOCK_FAILED, - busy = ERROR_BUSY, - cancel_violation = ERROR_CANCEL_VIOLATION, - already_exists = ERROR_ALREADY_EXISTS + // These names and values are based on Windows WinError.h + // This is not a complete list. Add to this list if you need to explicitly + // check for it. + invalid_function = 1, // ERROR_INVALID_FUNCTION, + file_not_found = 2, // ERROR_FILE_NOT_FOUND, + path_not_found = 3, // ERROR_PATH_NOT_FOUND, + too_many_open_files = 4, // ERROR_TOO_MANY_OPEN_FILES, + access_denied = 5, // ERROR_ACCESS_DENIED, + invalid_handle = 6, // ERROR_INVALID_HANDLE, + arena_trashed = 7, // ERROR_ARENA_TRASHED, + not_enough_memory = 8, // ERROR_NOT_ENOUGH_MEMORY, + invalid_block = 9, // ERROR_INVALID_BLOCK, + bad_environment = 10, // ERROR_BAD_ENVIRONMENT, + bad_format = 11, // ERROR_BAD_FORMAT, + invalid_access = 12, // ERROR_INVALID_ACCESS, + outofmemory = 14, // ERROR_OUTOFMEMORY, + invalid_drive = 15, // ERROR_INVALID_DRIVE, + current_directory = 16, // ERROR_CURRENT_DIRECTORY, + not_same_device = 17, // ERROR_NOT_SAME_DEVICE, + no_more_files = 18, // ERROR_NO_MORE_FILES, + write_protect = 19, // ERROR_WRITE_PROTECT, + bad_unit = 20, // ERROR_BAD_UNIT, + not_ready = 21, // ERROR_NOT_READY, + bad_command = 22, // ERROR_BAD_COMMAND, + crc = 23, // ERROR_CRC, + bad_length = 24, // ERROR_BAD_LENGTH, + seek = 25, // ERROR_SEEK, + not_dos_disk = 26, // ERROR_NOT_DOS_DISK, + sector_not_found = 27, // ERROR_SECTOR_NOT_FOUND, + out_of_paper = 28, // ERROR_OUT_OF_PAPER, + write_fault = 29, // ERROR_WRITE_FAULT, + read_fault = 30, // ERROR_READ_FAULT, + gen_failure = 31, // ERROR_GEN_FAILURE, + sharing_violation = 32, // ERROR_SHARING_VIOLATION, + lock_violation = 33, // ERROR_LOCK_VIOLATION, + wrong_disk = 34, // ERROR_WRONG_DISK, + sharing_buffer_exceeded = 36, // ERROR_SHARING_BUFFER_EXCEEDED, + handle_eof = 38, // ERROR_HANDLE_EOF, + handle_disk_full = 39, // ERROR_HANDLE_DISK_FULL, + rem_not_list = 51, // ERROR_REM_NOT_LIST, + dup_name = 52, // ERROR_DUP_NAME, + bad_net_path = 53, // ERROR_BAD_NETPATH, + network_busy = 54, // ERROR_NETWORK_BUSY, + file_exists = 80, // ERROR_FILE_EXISTS, + cannot_make = 82, // ERROR_CANNOT_MAKE, + broken_pipe = 109, // ERROR_BROKEN_PIPE, + open_failed = 110, // ERROR_OPEN_FAILED, + buffer_overflow = 111, // ERROR_BUFFER_OVERFLOW, + disk_full = 112, // ERROR_DISK_FULL, + insufficient_buffer = 122, // ERROR_INSUFFICIENT_BUFFER, + lock_failed = 167, // ERROR_LOCK_FAILED, + busy = 170, // ERROR_BUSY, + cancel_violation = 173, // ERROR_CANCEL_VIOLATION, + already_exists = 183 // ERROR_ALREADY_EXISTS }; _ v_; windows_error(_ v) : v_(v) {} - explicit windows_error(DWORD v) : v_(_(v)) {} + explicit windows_error(int v) : v_(_(v)) {} operator int() const {return v_;} }; @@ -906,6 +894,4 @@ } // end namespace llvm -#endif // LLVM_ON_WINDOWS - #endif From bigcheesegs at gmail.com Mon Nov 29 16:28:52 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 22:28:52 -0000 Subject: [llvm-commits] [llvm] r120329 - in /llvm/trunk: include/llvm/Support/PathV2.h lib/Support/CMakeLists.txt lib/Support/PathV2.cpp lib/Support/Unix/PathV2.inc lib/Support/Windows/PathV2.inc unittests/System/Path.cpp Message-ID: <20101129222852.257B82A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 16:28:51 2010 New Revision: 120329 URL: http://llvm.org/viewvc/llvm-project?rev=120329&view=rev Log: Support: Add PathV2 implementation. Added: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/lib/Support/Unix/PathV2.inc llvm/trunk/lib/Support/Windows/PathV2.inc Modified: llvm/trunk/include/llvm/Support/PathV2.h llvm/trunk/lib/Support/CMakeLists.txt llvm/trunk/unittests/System/Path.cpp Modified: llvm/trunk/include/llvm/Support/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?rev=120329&r1=120328&r2=120329&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Mon Nov 29 16:28:51 2010 @@ -24,6 +24,9 @@ // //===----------------------------------------------------------------------===// +#ifndef LLVM_SYSTEM_PATHV2_H +#define LLVM_SYSTEM_PATHV2_H + #include "llvm/ADT/SmallString.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/DataTypes.h" @@ -64,13 +67,20 @@ /// class const_iterator { StringRef Path; //< The entire path. - StringRef Component; //< The current component. + StringRef Component; //< The current component. Not necessarily in Path. + size_t Position; //< The iterators current position within Path. + + // An end iterator has Position = Path.size() + 1. + friend const_iterator begin(const StringRef &path); + friend const_iterator end(const StringRef &path); public: typedef const StringRef value_type; + typedef ptrdiff_t difference_type; typedef value_type &reference; typedef value_type *pointer; typedef std::bidirectional_iterator_tag iterator_category; + reference operator*() const; pointer operator->() const; const_iterator &operator++(); // preincrement @@ -79,11 +89,18 @@ const_iterator &operator--(int); // postdecrement bool operator==(const const_iterator &RHS) const; bool operator!=(const const_iterator &RHS) const; - - const_iterator(); //< Default construct end iterator. - const_iterator(const StringRef &path); }; +/// @brief Get begin iterator over \a path. +/// @param path Input path. +/// @returns Iterator initialized with the first component of \a path. +const_iterator begin(const StringRef &path); + +/// @brief Get end iterator over \a path. +/// @param path Input path. +/// @returns Iterator initialized to the end of \a path. +const_iterator end(const StringRef &path); + /// @} /// @name Lexical Modifiers /// @{ @@ -136,7 +153,10 @@ /// @param component The component to be appended to \a path. /// @returns errc::success if \a component has been appended to \a path, /// otherwise a platform specific error_code. -error_code append(SmallVectorImpl &path, const Twine &component); +error_code append(SmallVectorImpl &path, const Twine &a, + const Twine &b = "", + const Twine &c = "", + const Twine &d = ""); /// @brief Append to path. /// @@ -978,3 +998,5 @@ } // end namespace fs } // end namespace sys } // end namespace llvm + +#endif Modified: llvm/trunk/lib/Support/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CMakeLists.txt?rev=120329&r1=120328&r2=120329&view=diff ============================================================================== --- llvm/trunk/lib/Support/CMakeLists.txt (original) +++ llvm/trunk/lib/Support/CMakeLists.txt Mon Nov 29 16:28:51 2010 @@ -64,6 +64,7 @@ Memory.cpp Mutex.cpp Path.cpp + PathV2.cpp Process.cpp Program.cpp RWMutex.cpp @@ -79,6 +80,7 @@ Unix/Memory.inc Unix/Mutex.inc Unix/Path.inc + Unix/PathV2.inc Unix/Process.inc Unix/Program.inc Unix/RWMutex.inc @@ -92,6 +94,7 @@ Windows/Memory.inc Windows/Mutex.inc Windows/Path.inc + Windows/PathV2.inc Windows/Process.inc Windows/Program.inc Windows/RWMutex.inc Added: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120329&view=auto ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (added) +++ llvm/trunk/lib/Support/PathV2.cpp Mon Nov 29 16:28:51 2010 @@ -0,0 +1,409 @@ +//===-- PathV2.cpp - Implement OS Path Concept ------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the operating system PathV2 API. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/PathV2.h" +#include "llvm/Support/ErrorHandling.h" +#include + +namespace { + using llvm::StringRef; + + bool is_separator(const char value) { + switch(value) { +#ifdef LLVM_ON_WIN32 + case '\\': // fall through +#endif + case '/': return true; + default: return false; + } + } + +#ifdef LLVM_ON_WIN32 + const StringRef separators = "\\/"; + const char prefered_separator = '\\'; +#else + const StringRef separators = "/"; + const char prefered_separator = '/'; +#endif + + StringRef find_first_component(const StringRef &path) { + // Look for this first component in the following order. + // * empty (in this case we return an empty string) + // * either C: or {//,\\}net. + // * {/,\} + // * {.,..} + // * {file,directory}name + + if (path.empty()) + return path; + + // C: + if (path.size() >= 2 && std::isalpha(path[0]) && path[1] == ':') + return StringRef(path.begin(), 2); + + // //net + if ((path.size() > 2) && + (path.startswith("\\\\") || path.startswith("//")) && + (path[2] != '\\' && path[2] != '/')) { + // Find the next directory separator. + size_t end = path.find_first_of("\\/", 2); + if (end == StringRef::npos) + return path; + else + return StringRef(path.begin(), end); + } + + // {/,\} + if (path[0] == '\\' || path[0] == '/') + return StringRef(path.begin(), 1); + + if (path.startswith("..")) + return StringRef(path.begin(), 2); + + if (path[0] == '.') + return StringRef(path.begin(), 1); + + // * {file,directory}name + size_t end = path.find_first_of("\\/", 2); + if (end == StringRef::npos) + return path; + else + return StringRef(path.begin(), end); + + return StringRef(); + } +} + +namespace llvm { +namespace sys { +namespace path { + +const_iterator begin(const StringRef &path) { + const_iterator i; + i.Path = path; + i.Component = find_first_component(path); + i.Position = 0; + return i; +} + +const_iterator end(const StringRef &path) { + const_iterator i; + i.Path = path; + i.Position = path.size(); + return i; +} + +const_iterator::reference const_iterator::operator*() const { + return Component; +} + +const_iterator::pointer const_iterator::operator->() const { + return &Component; +} + +const_iterator &const_iterator::operator++() { + assert(Position < Path.size() && "Tried to increment past end!"); + + // Increment Position to past the current component + Position += Component.size(); + + // Check for end. + if (Position == Path.size()) { + Component = StringRef(); + return *this; + } + + // Both POSIX and Windows treat paths that begin with exactly two separators + // specially. + bool was_net = Component.size() > 2 && + is_separator(Component[0]) && + Component[1] == Component[0] && + !is_separator(Component[2]); + + // Handle separators. + if (is_separator(Path[Position])) { + // Root dir. + if (was_net +#ifdef LLVM_ON_WIN32 + // c:/ + || Component.endswith(":") +#endif + ) { + Component = StringRef(Path.begin() + Position, 1); + return *this; + } + + // Skip extra separators. + while (Position != Path.size() && + is_separator(Path[Position])) { + ++Position; + } + + // Treat trailing '/' as a '.'. + if (Position == Path.size()) { + --Position; + Component = "."; + return *this; + } + } + + // Find next component. + size_t end_pos = Path.find_first_of(separators, Position); + if (end_pos == StringRef::npos) + end_pos = Path.size(); + Component = StringRef(Path.begin() + Position, end_pos - Position); + + return *this; +} + +bool const_iterator::operator==(const const_iterator &RHS) const { + return Path.begin() == RHS.Path.begin() && + Position == RHS.Position; +} + +bool const_iterator::operator!=(const const_iterator &RHS) const { + return !(*this == RHS); +} + +error_code root_path(const StringRef &path, StringRef &result) { + const_iterator b = begin(path), + pos = b, + e = end(path); + if (b != e) { + bool has_net = b->size() > 2 && is_separator((*b)[0]) && (*b)[1] == (*b)[0]; + bool has_drive = +#ifdef LLVM_ON_WIN32 + b->endswith(":"); +#else + false; +#endif + + if (has_net || has_drive) { + if ((++pos != e) && is_separator((*pos)[0])) { + // {C:/,//net/}, so get the first two components. + result = StringRef(path.begin(), b->size() + pos->size()); + return make_error_code(errc::success); + } else { + // just {C:,//net}, return the first component. + result = *b; + return make_error_code(errc::success); + } + } + + // POSIX style root directory. + if (is_separator((*b)[0])) { + result = *b; + return make_error_code(errc::success); + } + + // No root_path. + result = StringRef(); + return make_error_code(errc::success); + } + + // No path :(. + result = StringRef(); + return make_error_code(errc::success); +} + +error_code root_name(const StringRef &path, StringRef &result) { + const_iterator b = begin(path), + e = end(path); + if (b != e) { + bool has_net = b->size() > 2 && is_separator((*b)[0]) && (*b)[1] == (*b)[0]; + bool has_drive = +#ifdef LLVM_ON_WIN32 + b->endswith(":"); +#else + false; +#endif + + if (has_net || has_drive) { + // just {C:,//net}, return the first component. + result = *b; + return make_error_code(errc::success); + } + } + + // No path or no name. + result = StringRef(); + return make_error_code(errc::success); +} + +error_code root_directory(const StringRef &path, StringRef &result) { + const_iterator b = begin(path), + pos = b, + e = end(path); + if (b != e) { + bool has_net = b->size() > 2 && is_separator((*b)[0]) && (*b)[1] == (*b)[0]; + bool has_drive = +#ifdef LLVM_ON_WIN32 + b->endswith(":"); +#else + false; +#endif + + if ((has_net || has_drive) && + // {C:,//net}, skip to the next component. + (++pos != e) && is_separator((*pos)[0])) { + result = *pos; + return make_error_code(errc::success); + } + + // POSIX style root directory. + if (!has_net && is_separator((*b)[0])) { + result = *b; + return make_error_code(errc::success); + } + } + + // No path or no root. + result = StringRef(); + return make_error_code(errc::success); +} + +error_code has_root_name(const Twine &path, bool &result) { + SmallString<128> storage; + StringRef p = path.toStringRef(storage); + + if (error_code ec = root_name(p, p)) return ec; + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code has_root_directory(const Twine &path, bool &result) { + SmallString<128> storage; + StringRef p = path.toStringRef(storage); + + if (error_code ec = root_directory(p, p)) return ec; + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code relative_path(const StringRef &path, StringRef &result) { + StringRef root; + if (error_code ec = root_path(path, root)) return ec; + result = StringRef(path.begin() + root.size(), path.size() - root.size()); + return make_error_code(errc::success); +} + +error_code append(SmallVectorImpl &path, const Twine &a, + const Twine &b, + const Twine &c, + const Twine &d) { + SmallString<32> a_storage; + SmallString<32> b_storage; + SmallString<32> c_storage; + SmallString<32> d_storage; + + SmallVector components; + if (!a.isTriviallyEmpty()) components.push_back(a.toStringRef(a_storage)); + if (!b.isTriviallyEmpty()) components.push_back(b.toStringRef(b_storage)); + if (!c.isTriviallyEmpty()) components.push_back(c.toStringRef(c_storage)); + if (!d.isTriviallyEmpty()) components.push_back(d.toStringRef(d_storage)); + + for (SmallVectorImpl::const_iterator i = components.begin(), + e = components.end(); + i != e; ++i) { + bool path_has_sep = !path.empty() && is_separator(path[path.size() - 1]); + bool component_has_sep = !i->empty() && is_separator((*i)[0]); + bool is_root_name; + if (error_code ec = has_root_name(*i, is_root_name)) return ec; + + if (path_has_sep) { + // Strip separators from beginning of component. + size_t loc = i->find_first_not_of(separators); + StringRef c = StringRef(i->begin() + loc, i->size() - loc); + + // Append it. + path.append(c.begin(), c.end()); + continue; + } + + if (!component_has_sep && !(path.empty() && is_root_name)) { + // Add a separator. + path.push_back(prefered_separator); + } + + path.append(i->begin(), i->end()); + } + + return make_error_code(errc::success); +} + +error_code make_absolute(SmallVectorImpl &path) { + StringRef p(path.data(), path.size()); + + bool rootName, rootDirectory; + if (error_code ec = has_root_name(p, rootName)) return ec; + if (error_code ec = has_root_directory(p, rootDirectory)) return ec; + + // Already absolute. + if (rootName && rootDirectory) + return make_error_code(errc::success); + + // All of the following conditions will need the current directory. + SmallString<128> current_dir; + if (error_code ec = current_path(current_dir)) return ec; + + // Relative path. Prepend the current directory. + if (!rootName && !rootDirectory) { + // Append path to the current directory. + if (error_code ec = append(current_dir, p)) return ec; + // Set path to the result. + path.swap(current_dir); + return make_error_code(errc::success); + } + + if (!rootName && rootDirectory) { + StringRef cdrn; + if (error_code ec = root_name(current_dir, cdrn)) return ec; + SmallString<128> curDirRootName(cdrn.begin(), cdrn.end()); + if (error_code ec = append(curDirRootName, p)) return ec; + // Set path to the result. + path.swap(curDirRootName); + return make_error_code(errc::success); + } + + if (rootName && !rootDirectory) { + StringRef pRootName; + StringRef bRootDirectory; + StringRef bRelativePath; + StringRef pRelativePath; + if (error_code ec = root_name(p, pRootName)) return ec; + if (error_code ec = root_directory(current_dir, bRootDirectory)) return ec; + if (error_code ec = relative_path(current_dir, bRelativePath)) return ec; + if (error_code ec = relative_path(p, pRelativePath)) return ec; + + SmallString<128> res; + if (error_code ec = append(res, pRootName, bRootDirectory, + bRelativePath, pRelativePath)) return ec; + path.swap(res); + return make_error_code(errc::success); + } + + llvm_unreachable("All rootName and rootDirectory combinations should have " + "occurred above!"); +} + +} +} +} + +// Include the truly platform-specific parts. +#if defined(LLVM_ON_UNIX) +#include "Unix/PathV2.inc" +#endif +#if defined(LLVM_ON_WIN32) +#include "Windows/PathV2.inc" +#endif Added: llvm/trunk/lib/Support/Unix/PathV2.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/PathV2.inc?rev=120329&view=auto ============================================================================== --- llvm/trunk/lib/Support/Unix/PathV2.inc (added) +++ llvm/trunk/lib/Support/Unix/PathV2.inc Mon Nov 29 16:28:51 2010 @@ -0,0 +1,39 @@ +//===- llvm/Support/Unix/PathV2.cpp - Unix Path Implementation --*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Unix specific implementation of the PathV2 API. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only generic UNIX code that +//=== is guaranteed to work on *all* UNIX variants. +//===----------------------------------------------------------------------===// + +#include "Unix.h" + +namespace llvm { +namespace sys { +namespace path { + +error_code current_path(SmallVectorImpl &result) { + long size = ::pathconf(".", _PC_PATH_MAX); + result.reserve(size + 1); + result.set_size(size + 1); + + if (::getcwd(result.data(), result.size()) == 0) + return error_code(errno, system_category()); + + result.set_size(strlen(result.data())); + return make_error_code(errc::success); +} + +} // end namespace path +} // end namespace sys +} // end namespace llvm Added: llvm/trunk/lib/Support/Windows/PathV2.inc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/PathV2.inc?rev=120329&view=auto ============================================================================== --- llvm/trunk/lib/Support/Windows/PathV2.inc (added) +++ llvm/trunk/lib/Support/Windows/PathV2.inc Mon Nov 29 16:28:51 2010 @@ -0,0 +1,71 @@ +//===- llvm/Support/Win32/PathV2.cpp - Windows Path Impl --------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Windows specific implementation of the PathV2 API. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +//=== WARNING: Implementation here must contain only generic Windows code that +//=== is guaranteed to work on *all* Windows variants. +//===----------------------------------------------------------------------===// + +#include "Windows.h" + +namespace llvm { +namespace sys { +namespace path { + +error_code current_path(SmallVectorImpl &result) { + SmallVector cur_path; + cur_path.reserve(128); +retry_cur_dir: + DWORD len = ::GetCurrentDirectoryW(cur_path.capacity(), cur_path.data()); + + // A zero return value indicates a failure other than insufficient space. + if (len == 0) + return make_error_code(windows_error(::GetLastError())); + + // If there's insufficient space, the len returned is larger than the len + // given. + if (len > cur_path.capacity()) { + cur_path.reserve(len); + goto retry_cur_dir; + } + + cur_path.set_size(len); + // cur_path now holds the current directory in utf-16. Convert to utf-8. + + // Find out how much space we need. Sadly, this function doesn't return the + // size needed unless you tell it the result size is 0, which means you + // _always_ have to call it twice. + len = ::WideCharToMultiByte(CP_UTF8, NULL, + cur_path.data(), cur_path.size(), + result.data(), 0, + NULL, NULL); + + if (len == 0) + return make_error_code(windows_error(::GetLastError())); + + result.reserve(len); + result.set_size(len); + // Now do the actual conversion. + len = ::WideCharToMultiByte(CP_UTF8, NULL, + cur_path.data(), cur_path.size(), + result.data(), result.size(), + NULL, NULL); + if (len == 0) + return make_error_code(windows_error(::GetLastError())); + + return make_error_code(errc::success); +} + +} // end namespace path +} // end namespace sys +} // end namespace llvm Modified: llvm/trunk/unittests/System/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/System/Path.cpp?rev=120329&r1=120328&r2=120329&view=diff ============================================================================== --- llvm/trunk/unittests/System/Path.cpp (original) +++ llvm/trunk/unittests/System/Path.cpp Mon Nov 29 16:28:51 2010 @@ -7,15 +7,85 @@ // //===----------------------------------------------------------------------===// -// For now, just test that the header file parses. #include "llvm/Support/PathV2.h" #include "gtest/gtest.h" +using namespace llvm; + namespace { TEST(System, Path) { - // TODO: Add tests! + SmallVector paths; + paths.push_back(""); + paths.push_back("."); + paths.push_back(".."); + paths.push_back("foo"); + paths.push_back("/"); + paths.push_back("/foo"); + paths.push_back("foo/"); + paths.push_back("/foo/"); + paths.push_back("foo/bar"); + paths.push_back("/foo/bar"); + paths.push_back("//net"); + paths.push_back("//net/foo"); + paths.push_back("///foo///"); + paths.push_back("///foo///bar"); + paths.push_back("/."); + paths.push_back("./"); + paths.push_back("/.."); + paths.push_back("../"); + paths.push_back("foo/."); + paths.push_back("foo/.."); + paths.push_back("foo/./"); + paths.push_back("foo/./bar"); + paths.push_back("foo/.."); + paths.push_back("foo/../"); + paths.push_back("foo/../bar"); + paths.push_back("c:"); + paths.push_back("c:/"); + paths.push_back("c:foo"); + paths.push_back("c:/foo"); + paths.push_back("c:foo/"); + paths.push_back("c:/foo/"); + paths.push_back("c:/foo/bar"); + paths.push_back("prn:"); + paths.push_back("c:\\"); + paths.push_back("c:foo"); + paths.push_back("c:\\foo"); + paths.push_back("c:foo\\"); + paths.push_back("c:\\foo\\"); + paths.push_back("c:\\foo/"); + paths.push_back("c:/foo\\bar"); + + for (SmallVector::const_iterator i = paths.begin(), + e = paths.end(); + i != e; + ++i) { + outs() << *i << " =>\n Iteration: ["; + for (sys::path::const_iterator ci = sys::path::begin(*i), + ce = sys::path::end(*i); + ci != ce; + ++ci) { + outs() << *ci << ','; + } + outs() << "]\n"; + + StringRef res; + SmallString<16> temp_store; + if (error_code ec = sys::path::root_path(*i, res)) ASSERT_FALSE(ec.message().c_str()); + outs() << " root_path: " << res << '\n'; + if (error_code ec = sys::path::root_name(*i, res)) ASSERT_FALSE(ec.message().c_str()); + outs() << " root_name: " << res << '\n'; + if (error_code ec = sys::path::root_directory(*i, res)) ASSERT_FALSE(ec.message().c_str()); + outs() << " root_directory: " << res << '\n'; + + temp_store = *i; + if (error_code ec = sys::path::make_absolute(temp_store)) ASSERT_FALSE(ec.message().c_str()); + outs() << " make_absolute: " << temp_store << '\n'; + + outs().flush(); + } } } // anonymous namespace From bigcheesegs at gmail.com Mon Nov 29 16:29:04 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 22:29:04 -0000 Subject: [llvm-commits] [llvm] r120330 - in /llvm/trunk/unittests: CMakeLists.txt Support/Path.cpp Support/TimeValue.cpp System/Makefile System/Path.cpp System/TimeValue.cpp Message-ID: <20101129222904.9399B2A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 16:29:04 2010 New Revision: 120330 URL: http://llvm.org/viewvc/llvm-project?rev=120330&view=rev Log: unittests: Merge SystemTests back into SupportTests. Added: llvm/trunk/unittests/Support/Path.cpp - copied, changed from r120329, llvm/trunk/unittests/System/Path.cpp llvm/trunk/unittests/Support/TimeValue.cpp - copied, changed from r120329, llvm/trunk/unittests/System/TimeValue.cpp Removed: llvm/trunk/unittests/System/Makefile llvm/trunk/unittests/System/Path.cpp llvm/trunk/unittests/System/TimeValue.cpp Modified: llvm/trunk/unittests/CMakeLists.txt Modified: llvm/trunk/unittests/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CMakeLists.txt?rev=120330&r1=120329&r2=120330&view=diff ============================================================================== --- llvm/trunk/unittests/CMakeLists.txt (original) +++ llvm/trunk/unittests/CMakeLists.txt Mon Nov 29 16:29:04 2010 @@ -120,18 +120,11 @@ Support/EndianTest.cpp Support/LeakDetectorTest.cpp Support/MathExtrasTest.cpp + Support/Path.cpp Support/raw_ostream_test.cpp Support/RegexTest.cpp Support/SwapByteOrderTest.cpp + Support/TimeValue.cpp Support/TypeBuilderTest.cpp Support/ValueHandleTest.cpp ) - -set(LLVM_LINK_COMPONENTS - Support - ) - -add_llvm_unittest(System - System/Path.cpp - System/TimeValue.cpp - ) Copied: llvm/trunk/unittests/Support/Path.cpp (from r120329, llvm/trunk/unittests/System/Path.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?p2=llvm/trunk/unittests/Support/Path.cpp&p1=llvm/trunk/unittests/System/Path.cpp&r1=120329&r2=120330&rev=120330&view=diff ============================================================================== --- llvm/trunk/unittests/System/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Mon Nov 29 16:29:04 2010 @@ -1,4 +1,4 @@ -//===- llvm/unittest/System/Path.cpp - Path tests -------------------------===// +//===- llvm/unittest/Support/Path.cpp - Path tests ------------------------===// // // The LLVM Compiler Infrastructure // @@ -15,7 +15,7 @@ namespace { -TEST(System, Path) { +TEST(Support, Path) { SmallVector paths; paths.push_back(""); paths.push_back("."); Copied: llvm/trunk/unittests/Support/TimeValue.cpp (from r120329, llvm/trunk/unittests/System/TimeValue.cpp) URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/TimeValue.cpp?p2=llvm/trunk/unittests/Support/TimeValue.cpp&p1=llvm/trunk/unittests/System/TimeValue.cpp&r1=120329&r2=120330&rev=120330&view=diff ============================================================================== --- llvm/trunk/unittests/System/TimeValue.cpp (original) +++ llvm/trunk/unittests/Support/TimeValue.cpp Mon Nov 29 16:29:04 2010 @@ -1,4 +1,4 @@ -//===- llvm/unittest/System/TimeValue.cpp - Time Vlaue tests --------------===// +//===- llvm/unittest/Support/TimeValue.cpp - Time Value tests -------------===// // // The LLVM Compiler Infrastructure // @@ -14,7 +14,7 @@ using namespace llvm; namespace { -TEST(System, TimeValue) { +TEST(Support, TimeValue) { sys::TimeValue now = sys::TimeValue::now(); time_t now_t = time(NULL); EXPECT_TRUE(abs(static_cast(now_t - now.toEpochTime())) < 2); Removed: llvm/trunk/unittests/System/Makefile URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/System/Makefile?rev=120329&view=auto ============================================================================== --- llvm/trunk/unittests/System/Makefile (original) +++ llvm/trunk/unittests/System/Makefile (removed) @@ -1,15 +0,0 @@ -##===- unittests/System/Makefile ---------------------------*- Makefile -*-===## -# -# The LLVM Compiler Infrastructure -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -##===----------------------------------------------------------------------===## - -LEVEL = ../.. -TESTNAME = System -LINK_COMPONENTS := support - -include $(LEVEL)/Makefile.config -include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest Removed: llvm/trunk/unittests/System/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/System/Path.cpp?rev=120329&view=auto ============================================================================== --- llvm/trunk/unittests/System/Path.cpp (original) +++ llvm/trunk/unittests/System/Path.cpp (removed) @@ -1,91 +0,0 @@ -//===- llvm/unittest/System/Path.cpp - Path tests -------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/PathV2.h" - -#include "gtest/gtest.h" - -using namespace llvm; - -namespace { - -TEST(System, Path) { - SmallVector paths; - paths.push_back(""); - paths.push_back("."); - paths.push_back(".."); - paths.push_back("foo"); - paths.push_back("/"); - paths.push_back("/foo"); - paths.push_back("foo/"); - paths.push_back("/foo/"); - paths.push_back("foo/bar"); - paths.push_back("/foo/bar"); - paths.push_back("//net"); - paths.push_back("//net/foo"); - paths.push_back("///foo///"); - paths.push_back("///foo///bar"); - paths.push_back("/."); - paths.push_back("./"); - paths.push_back("/.."); - paths.push_back("../"); - paths.push_back("foo/."); - paths.push_back("foo/.."); - paths.push_back("foo/./"); - paths.push_back("foo/./bar"); - paths.push_back("foo/.."); - paths.push_back("foo/../"); - paths.push_back("foo/../bar"); - paths.push_back("c:"); - paths.push_back("c:/"); - paths.push_back("c:foo"); - paths.push_back("c:/foo"); - paths.push_back("c:foo/"); - paths.push_back("c:/foo/"); - paths.push_back("c:/foo/bar"); - paths.push_back("prn:"); - paths.push_back("c:\\"); - paths.push_back("c:foo"); - paths.push_back("c:\\foo"); - paths.push_back("c:foo\\"); - paths.push_back("c:\\foo\\"); - paths.push_back("c:\\foo/"); - paths.push_back("c:/foo\\bar"); - - for (SmallVector::const_iterator i = paths.begin(), - e = paths.end(); - i != e; - ++i) { - outs() << *i << " =>\n Iteration: ["; - for (sys::path::const_iterator ci = sys::path::begin(*i), - ce = sys::path::end(*i); - ci != ce; - ++ci) { - outs() << *ci << ','; - } - outs() << "]\n"; - - StringRef res; - SmallString<16> temp_store; - if (error_code ec = sys::path::root_path(*i, res)) ASSERT_FALSE(ec.message().c_str()); - outs() << " root_path: " << res << '\n'; - if (error_code ec = sys::path::root_name(*i, res)) ASSERT_FALSE(ec.message().c_str()); - outs() << " root_name: " << res << '\n'; - if (error_code ec = sys::path::root_directory(*i, res)) ASSERT_FALSE(ec.message().c_str()); - outs() << " root_directory: " << res << '\n'; - - temp_store = *i; - if (error_code ec = sys::path::make_absolute(temp_store)) ASSERT_FALSE(ec.message().c_str()); - outs() << " make_absolute: " << temp_store << '\n'; - - outs().flush(); - } -} - -} // anonymous namespace Removed: llvm/trunk/unittests/System/TimeValue.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/System/TimeValue.cpp?rev=120329&view=auto ============================================================================== --- llvm/trunk/unittests/System/TimeValue.cpp (original) +++ llvm/trunk/unittests/System/TimeValue.cpp (removed) @@ -1,23 +0,0 @@ -//===- llvm/unittest/System/TimeValue.cpp - Time Vlaue tests --------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "gtest/gtest.h" -#include "llvm/Support/TimeValue.h" -#include - -using namespace llvm; -namespace { - -TEST(System, TimeValue) { - sys::TimeValue now = sys::TimeValue::now(); - time_t now_t = time(NULL); - EXPECT_TRUE(abs(static_cast(now_t - now.toEpochTime())) < 2); -} - -} From benny.kra at googlemail.com Mon Nov 29 16:34:56 2010 From: benny.kra at googlemail.com (Benjamin Kramer) Date: Mon, 29 Nov 2010 22:34:56 -0000 Subject: [llvm-commits] [llvm] r120332 - in /llvm/trunk/test: CodeGen/X86/atomic_op.ll MC/ELF/relocation.s Transforms/DeadStoreElimination/simple.ll Transforms/SimplifyLibCalls/StrSpn.ll Message-ID: <20101129223456.304562A6C12D@llvm.org> Author: d0k Date: Mon Nov 29 16:34:55 2010 New Revision: 120332 URL: http://llvm.org/viewvc/llvm-project?rev=120332&view=rev Log: Fix some broken CHECK lines. Modified: llvm/trunk/test/CodeGen/X86/atomic_op.ll llvm/trunk/test/MC/ELF/relocation.s llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll llvm/trunk/test/Transforms/SimplifyLibCalls/StrSpn.ll Modified: llvm/trunk/test/CodeGen/X86/atomic_op.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/atomic_op.ll?rev=120332&r1=120331&r2=120332&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/atomic_op.ll (original) +++ llvm/trunk/test/CodeGen/X86/atomic_op.ll Mon Nov 29 16:34:55 2010 @@ -112,7 +112,7 @@ define void @test2(i32 addrspace(256)* nocapture %P) nounwind { entry: ; CHECK: lock -; CEHCK: cmpxchgl %{{.*}}, %gs:(%{{.*}}) +; CHECK: cmpxchgl %{{.*}}, %gs:(%{{.*}}) %0 = tail call i32 @llvm.atomic.cmp.swap.i32.p256i32(i32 addrspace(256)* %P, i32 0, i32 1) ret void Modified: llvm/trunk/test/MC/ELF/relocation.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/relocation.s?rev=120332&r1=120331&r2=120332&view=diff ============================================================================== --- llvm/trunk/test/MC/ELF/relocation.s (original) +++ llvm/trunk/test/MC/ELF/relocation.s Mon Nov 29 16:34:55 2010 @@ -21,7 +21,7 @@ // CHECK: # Symbol 0x00000002 // CHECK: (('st_name', 0x00000000) # '' // CHECK: ('st_bind', 0x00000000) -// CHECK ('st_type', 0x00000003) +// CHECK: ('st_type', 0x00000003) // CHECK: ('st_other', 0x00000000) // CHECK: ('st_shndx', 0x00000001) Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120332&r1=120331&r2=120332&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 16:34:55 2010 @@ -27,7 +27,7 @@ define i32 @test3(i32* %g_addr) nounwind { ; CHECK: @test3 -; CHEcK: load i32* %g_addr +; CHECK: load i32* %g_addr %g_value = load i32* %g_addr, align 4 store i32 -1, i32* @g, align 4 store i32 %g_value, i32* %g_addr, align 4 Modified: llvm/trunk/test/Transforms/SimplifyLibCalls/StrSpn.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyLibCalls/StrSpn.ll?rev=120332&r1=120331&r2=120332&view=diff ============================================================================== --- llvm/trunk/test/Transforms/SimplifyLibCalls/StrSpn.ll (original) +++ llvm/trunk/test/Transforms/SimplifyLibCalls/StrSpn.ll Mon Nov 29 16:34:55 2010 @@ -19,7 +19,7 @@ %test4 = call i64 @strspn(i8* %s1, i8* %s2) ; CHECK: call i64 @strspn(i8* %s1, i8* %s2) ret i64 %test3 -; CHECK ret i64 5 +; CHECK: ret i64 5 } declare i64 @strcspn(i8*, i8*) From grosbach at apple.com Mon Nov 29 16:37:40 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 22:37:40 -0000 Subject: [llvm-commits] [llvm] r120333 - in /llvm/trunk: lib/Target/ARM/ARMAsmPrinter.cpp lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMInstrThumb2.td lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp lib/Target/ARM/InstPrinter/ARMInstPrinter.h utils/TableGen/ARMDecoderEmitter.cpp Message-ID: <20101129223740.544822A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 16:37:40 2010 New Revision: 120333 URL: http://llvm.org/viewvc/llvm-project?rev=120333&view=rev Log: Pseudo-ize Thumb2 jump tables with explicit MC lowering to the raw instructions. This simplifies instruction printing and disassembly. Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMInstrInfo.td llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Nov 29 16:37:40 2010 @@ -774,11 +774,6 @@ OutContext); OutStreamer.EmitValue(Expr, OffsetWidth); } - - // Make sure the instruction that follows TBB is 2-byte aligned. - // FIXME: Constant island pass should insert an "ALIGN" instruction instead. - if (MI->getOpcode() == ARM::t2TBB_JT) - EmitAlignment(1); } void ARMAsmPrinter::PrintDebugValueComment(const MachineInstr *MI, @@ -924,15 +919,49 @@ return; } - case ARM::t2TBB_JT: - case ARM::t2TBH_JT: case ARM::t2BR_JT: { // Lower and emit the instruction itself, then the jump table following it. MCInst TmpInst; - // FIXME: The branch instruction is really a pseudo. We should xform it - // explicitly. - LowerARMMachineInstrToMCInst(MI, TmpInst, *this); + TmpInst.setOpcode(ARM::tMOVgpr2gpr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); OutStreamer.EmitInstruction(TmpInst); + // Output the data for the jump table itself + EmitJump2Table(MI); + return; + } + case ARM::t2TBB_JT: { + // Lower and emit the instruction itself, then the jump table following it. + MCInst TmpInst; + + TmpInst.setOpcode(ARM::t2TBB); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + // Output the data for the jump table itself + EmitJump2Table(MI); + // Make sure the next instruction is 2-byte aligned. + EmitAlignment(1); + return; + } + case ARM::t2TBH_JT: { + // Lower and emit the instruction itself, then the jump table following it. + MCInst TmpInst; + + TmpInst.setOpcode(ARM::t2TBH); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + // Output the data for the jump table itself EmitJump2Table(MI); return; } @@ -941,7 +970,8 @@ // Lower and emit the instruction itself, then the jump table following it. // mov pc, target MCInst TmpInst; - unsigned Opc = MI->getOpcode() == ARM::BR_JTr ? ARM::MOVr : ARM::tMOVr; + unsigned Opc = MI->getOpcode() == ARM::BR_JTr ? + ARM::MOVr : ARM::tMOVgpr2gpr; TmpInst.setOpcode(Opc); TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 16:37:40 2010 @@ -333,10 +333,6 @@ let PrintMethod = "printCPInstOperand"; } -def jt2block_operand : Operand { - let PrintMethod = "printJT2BlockOperand"; -} - // Local PC labels. def pclabel : Operand { let PrintMethod = "printPCLabel"; Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 16:37:40 2010 @@ -21,11 +21,6 @@ let PrintMethod = "printThumbITMask"; } -// Table branch address -def tb_addrmode : Operand { - let PrintMethod = "printTBAddrMode"; -} - // Shifted operands. No register controlled shifts for Thumb2. // Note: We do not support rrx shifted operands yet. def t2_so_reg : Operand, // reg imm @@ -2933,59 +2928,40 @@ let isNotDuplicable = 1, isIndirectBranch = 1, isCodeGenOnly = 1 in { // $id doesn't exist in asmstring, should be lowered. def t2BR_JT : - T2JTI<(outs), - (ins GPR:$target, GPR:$index, jt2block_operand:$jt, i32imm:$id), - IIC_Br, "mov\tpc, $target$jt", - [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0100100; - let Inst{19-16} = 0b1111; - let Inst{14-12} = 0b000; - let Inst{11-8} = 0b1111; // Rd = pc - let Inst{7-4} = 0b0000; -} + tPseudoInst<(outs), + (ins GPR:$target, GPR:$index, i32imm:$jt, i32imm:$id), + SizeSpecial, IIC_Br,// "mov\tpc, $target$jt", + [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]>; // FIXME: Add a non-pc based case that can be predicated. -let isCodeGenOnly = 1 in // $id doesn't exist in asm string, should be lowered. -def t2TBB_JT : - T2JTI<(outs), - (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), - IIC_Br, "tbb\t$index$jt", []> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0001101; - let Inst{19-16} = 0b1111; // Rn = pc (table follows this instruction) - let Inst{15-8} = 0b11110000; - let Inst{7-4} = 0b0000; // B form -} - -let isCodeGenOnly = 1 in // $id doesn't exist in asm string, should be lowered. -def t2TBH_JT : - T2JTI<(outs), - (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), - IIC_Br, "tbh\t$index$jt", []> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0001101; - let Inst{19-16} = 0b1111; // Rn = pc (table follows this instruction) - let Inst{15-8} = 0b11110000; - let Inst{7-4} = 0b0001; // H form -} - -// Generic versions of the above two instructions, for disassembly only +def t2TBB_JT : tPseudoInst<(outs), + (ins GPR:$index, i32imm:$jt, i32imm:$id), + SizeSpecial, IIC_Br, []>; + +def t2TBH_JT : tPseudoInst<(outs), + (ins GPR:$index, i32imm:$jt, i32imm:$id), + SizeSpecial, IIC_Br, []>; -def t2TBBgen : T2I<(outs), (ins GPR:$a, GPR:$b), IIC_Br, - "tbb", "\t[$a, $b]", []>{ - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0001101; - let Inst{15-8} = 0b11110000; - let Inst{7-4} = 0b0000; // B form +def t2TBB : T2I<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_Br, + "tbb", "\t[$Rn, $Rm]", []> { + bits<4> Rn; + bits<4> Rm; + let Inst{27-20} = 0b10001101; + let Inst{19-16} = Rn; + let Inst{15-5} = 0b11110000000; + let Inst{4} = 0; // B form + let Inst{3-0} = Rm; } -def t2TBHgen : T2I<(outs), (ins GPR:$a, GPR:$b), IIC_Br, - "tbh", "\t[$a, $b, lsl #1]", []> { - let Inst{31-27} = 0b11101; - let Inst{26-20} = 0b0001101; - let Inst{15-8} = 0b11110000; - let Inst{7-4} = 0b0001; // H form +def t2TBH : T2I<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_Br, + "tbh", "\t[$Rn, $Rm, lsl #1]", []> { + bits<4> Rn; + bits<4> Rm; + let Inst{27-20} = 0b10001101; + let Inst{19-16} = Rn; + let Inst{15-5} = 0b11110000000; + let Inst{4} = 1; // H form + let Inst{3-0} = Rm; } } // isNotDuplicable, isIndirectBranch Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Mon Nov 29 16:37:40 2010 @@ -789,7 +789,6 @@ } // Misc. Branch Instructions. -// BR_JTadd, BR_JTr, BR_JTm // BLXr9, BXr9 // BRIND, BX_RET static bool DisassembleBrMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn, @@ -816,72 +815,6 @@ return true; } - // BR_JTadd is an ADD with Rd = PC, (Rn, Rm) as the target and index regs. - if (Opcode == ARM::BR_JTadd) { - // InOperandList with GPR:$target and GPR:$idx regs. - - assert(NumOps == 4 && "Expect 4 operands"); - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, - decodeRn(insn)))); - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, - decodeRm(insn)))); - - // Fill in the two remaining imm operands to signify build completion. - MI.addOperand(MCOperand::CreateImm(0)); - MI.addOperand(MCOperand::CreateImm(0)); - - OpIdx = 4; - return true; - } - - // BR_JTr is a MOV with Rd = PC, and Rm as the source register. - if (Opcode == ARM::BR_JTr) { - // InOperandList with GPR::$target reg. - - assert(NumOps == 3 && "Expect 3 operands"); - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, - decodeRm(insn)))); - - // Fill in the two remaining imm operands to signify build completion. - MI.addOperand(MCOperand::CreateImm(0)); - MI.addOperand(MCOperand::CreateImm(0)); - - OpIdx = 3; - return true; - } - - // BR_JTm is an LDR with Rt = PC. - if (Opcode == ARM::BR_JTm) { - // This is the reg/reg form, with base reg followed by +/- reg shop imm. - // See also ARMAddressingModes.h (Addressing Mode #2). - - assert(NumOps == 5 && getIBit(insn) == 1 && "Expect 5 operands && I-bit=1"); - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, - decodeRn(insn)))); - - ARM_AM::AddrOpc AddrOpcode = getUBit(insn) ? ARM_AM::add : ARM_AM::sub; - - // Disassemble the offset reg (Rm), shift type, and immediate shift length. - MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, - decodeRm(insn)))); - // Inst{6-5} encodes the shift opcode. - ARM_AM::ShiftOpc ShOp = getShiftOpcForBits(slice(insn, 6, 5)); - // Inst{11-7} encodes the imm5 shift amount. - unsigned ShImm = slice(insn, 11, 7); - - // A8.4.1. Possible rrx or shift amount of 32... - getImmShiftSE(ShOp, ShImm); - MI.addOperand(MCOperand::CreateImm( - ARM_AM::getAM2Opc(AddrOpcode, ShImm, ShOp))); - - // Fill in the two remaining imm operands to signify build completion. - MI.addOperand(MCOperand::CreateImm(0)); - MI.addOperand(MCOperand::CreateImm(0)); - - OpIdx = 5; - return true; - } - return false; } Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Mon Nov 29 16:37:40 2010 @@ -1248,13 +1248,7 @@ return true; } -// PC-based defined for Codegen, which do not get decoded by design: -// -// t2TBB, t2TBH: Rm immDontCare immDontCare -// -// Generic version defined for disassembly: -// -// t2TBBgen, t2TBHgen: Rn Rm Pred-Imm Pred-CCR +// t2TBB, t2TBH: Rn Rm Pred-Imm Pred-CCR static bool DisassembleThumb2TB(MCInst &MI, unsigned Opcode, uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) { @@ -2125,7 +2119,7 @@ return DisassembleThumb2LdStDual(MI, Opcode, insn, NumOps, NumOpsAdded, B); } - if (Opcode == ARM::t2TBBgen || Opcode == ARM::t2TBHgen) { + if (Opcode == ARM::t2TBB || Opcode == ARM::t2TBH) { // Table branch. return DisassembleThumb2TB(MI, Opcode, insn, NumOps, NumOpsAdded, B); } Modified: llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp Mon Nov 29 16:37:40 2010 @@ -528,14 +528,6 @@ O << "]"; } -void ARMInstPrinter::printTBAddrMode(const MCInst *MI, unsigned OpNum, - raw_ostream &O) { - O << "[pc, " << getRegisterName(MI->getOperand(OpNum).getReg()); - if (MI->getOpcode() == ARM::t2TBH_JT) - O << ", lsl #1"; - O << ']'; -} - // Constant shifts t2_so_reg is a 2-operand unit corresponding to the Thumb2 // register with shift forms. // REG 0 0 - e.g. R5 Modified: llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h (original) +++ llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.h Mon Nov 29 16:37:40 2010 @@ -94,10 +94,6 @@ void printSBitModifierOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); void printRegisterList(const MCInst *MI, unsigned OpNum, raw_ostream &O); - // The jump table instructions have custom handling in ARMAsmPrinter - // to output the jump table. Nothing further is necessary here. - void printJT2BlockOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {} - void printTBAddrMode(const MCInst *MI, unsigned OpNum, raw_ostream &O); void printNoHashImmediate(const MCInst *MI, unsigned OpNum, raw_ostream &O); void printVFPf32ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); void printVFPf64ImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O); Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=120333&r1=120332&r2=120333&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Mon Nov 29 16:37:40 2010 @@ -1718,10 +1718,6 @@ if (Name == "t2LDRDpci") return false; - // Ignore t2TBB, t2TBH and prefer the generic t2TBBgen, t2TBHgen. - if (Name == "t2TBB_JT" || Name == "t2TBH_JT") - return false; - // Resolve conflicts: // // tBfar conflicts with tBLr9 @@ -1729,7 +1725,6 @@ // tPOP_RET/t2LDMIA_RET conflict with tPOP/t2LDM (ditto) // tMOVCCi conflicts with tMOVi8 // tMOVCCr conflicts with tMOVgpr2gpr - // tBR_JTr conflicts with tBRIND // tSpill conflicts with tSTRspi // tLDRcp conflicts with tLDRspi // tRestore conflicts with tLDRspi @@ -1740,7 +1735,7 @@ Name == "tCMPzhir" || /* Name == "t2CMNzrr" || Name == "t2CMNzrs" || Name == "t2CMNzri" || */ Name == "t2CMPzrr" || Name == "t2CMPzrs" || Name == "t2CMPzri" || Name == "tPOP_RET" || Name == "t2LDMIA_RET" || - Name == "tMOVCCi" || Name == "tMOVCCr" || Name == "tBR_JTr" || + Name == "tMOVCCi" || Name == "tMOVCCr" || Name == "tSpill" || Name == "tLDRcp" || Name == "tRestore" || Name == "t2LEApcrelJT" || Name == "t2MOVCCi16") return false; From isanbard at gmail.com Mon Nov 29 16:37:47 2010 From: isanbard at gmail.com (Bill Wendling) Date: Mon, 29 Nov 2010 22:37:47 -0000 Subject: [llvm-commits] [llvm] r120334 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101129223747.1B22D2A6C12F@llvm.org> Author: void Date: Mon Nov 29 16:37:46 2010 New Revision: 120334 URL: http://llvm.org/viewvc/llvm-project?rev=120334&view=rev Log: Thumb encodings for conditional moves. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120334&r1=120333&r2=120334&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 16:37:46 2010 @@ -1210,12 +1210,24 @@ let neverHasSideEffects = 1 in { def tMOVCCr : T1pIt<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iCMOVr, "mov", "\t$dst, $rhs", []>, - T1Special<{1,0,?,?}>; + T1Special<{1,0,?,?}> { + bits<4> rhs; + bits<4> dst; + let Inst{7} = dst{3}; + let Inst{6-3} = rhs; + let Inst{2-0} = dst{2-0}; +} let isMoveImm = 1 in def tMOVCCi : T1pIt<(outs tGPR:$dst), (ins tGPR:$lhs, i32imm:$rhs), IIC_iCMOVi, "mov", "\t$dst, $rhs", []>, - T1General<{1,0,0,?,?}>; + T1General<{1,0,0,?,?}> { + bits<8> rhs; + bits<3> dst; + let Inst{10-8} = dst; + let Inst{7-0} = rhs; +} + } // neverHasSideEffects // tLEApcrel - Load a pc-relative address into a register without offending the From grosbach at apple.com Mon Nov 29 16:38:48 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 22:38:48 -0000 Subject: [llvm-commits] [llvm] r120335 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101129223848.54BAB2A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 16:38:48 2010 New Revision: 120335 URL: http://llvm.org/viewvc/llvm-project?rev=120335&view=rev Log: tidy up. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120335&r1=120334&r2=120335&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 16:38:48 2010 @@ -2927,8 +2927,7 @@ let isNotDuplicable = 1, isIndirectBranch = 1, isCodeGenOnly = 1 in { // $id doesn't exist in asmstring, should be lowered. -def t2BR_JT : - tPseudoInst<(outs), +def t2BR_JT : tPseudoInst<(outs), (ins GPR:$target, GPR:$index, i32imm:$jt, i32imm:$id), SizeSpecial, IIC_Br,// "mov\tpc, $target$jt", [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]>; From benny.kra at googlemail.com Mon Nov 29 16:39:38 2010 From: benny.kra at googlemail.com (Benjamin Kramer) Date: Mon, 29 Nov 2010 22:39:38 -0000 Subject: [llvm-commits] [llvm] r120336 - /llvm/trunk/test/CodeGen/ARM/vbits.ll Message-ID: <20101129223938.46E622A6C12D@llvm.org> Author: d0k Date: Mon Nov 29 16:39:38 2010 New Revision: 120336 URL: http://llvm.org/viewvc/llvm-project?rev=120336&view=rev Log: Add missing colon. Modified: llvm/trunk/test/CodeGen/ARM/vbits.ll Modified: llvm/trunk/test/CodeGen/ARM/vbits.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vbits.ll?rev=120336&r1=120335&r2=120336&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vbits.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vbits.ll Mon Nov 29 16:39:38 2010 @@ -529,7 +529,7 @@ define <8 x i8> @v_bicimm(<8 x i8>* %A) nounwind { ; CHECK: v_bicimm: ; CHECK-NOT: vmov -; CHECK-NOT vmvn +; CHECK-NOT: vmvn ; CHECK: vbic %tmp1 = load <8 x i8>* %A %tmp3 = and <8 x i8> %tmp1, < i8 -1, i8 -1, i8 -1, i8 0, i8 -1, i8 -1, i8 -1, i8 0 > From dalej at apple.com Mon Nov 29 16:40:26 2010 From: dalej at apple.com (Dale Johannesen) Date: Mon, 29 Nov 2010 22:40:26 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r120337 - in /llvm-gcc-4.2/trunk/gcc: llvm-backend.cpp llvm-convert.cpp Message-ID: <20101129224026.3F6652A6C12D@llvm.org> Author: johannes Date: Mon Nov 29 16:40:26 2010 New Revision: 120337 URL: http://llvm.org/viewvc/llvm-project?rev=120337&view=rev Log: Catch up with some header files that moved, unbreaking the build. Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp?rev=120337&r1=120336&r2=120337&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Mon Nov 29 16:40:26 2010 @@ -49,7 +49,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/StandardPasses.h" #include "llvm/Support/FormattedStream.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Program.h" #include extern "C" { Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=120337&r1=120336&r2=120337&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Mon Nov 29 16:40:26 2010 @@ -33,7 +33,7 @@ #include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/Analysis/ConstantFolding.h" -#include "llvm/System/Host.h" +#include "llvm/Support/Host.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetLowering.h" From grosbach at apple.com Mon Nov 29 16:40:58 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 22:40:58 -0000 Subject: [llvm-commits] [llvm] r120338 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101129224058.B34612A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 16:40:58 2010 New Revision: 120338 URL: http://llvm.org/viewvc/llvm-project?rev=120338&view=rev Log: Nuke dead isCodeGenOnly annotation and extraneous comment. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120338&r1=120337&r2=120338&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 16:40:58 2010 @@ -2925,11 +2925,10 @@ let Inst{10-0} = target{10-0}; } -let isNotDuplicable = 1, isIndirectBranch = 1, - isCodeGenOnly = 1 in { // $id doesn't exist in asmstring, should be lowered. +let isNotDuplicable = 1, isIndirectBranch = 1 in { def t2BR_JT : tPseudoInst<(outs), (ins GPR:$target, GPR:$index, i32imm:$jt, i32imm:$id), - SizeSpecial, IIC_Br,// "mov\tpc, $target$jt", + SizeSpecial, IIC_Br, [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]>; // FIXME: Add a non-pc based case that can be predicated. From evan.cheng at apple.com Mon Nov 29 16:43:27 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 29 Nov 2010 22:43:27 -0000 Subject: [llvm-commits] [llvm] r120339 - in /llvm/trunk: lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMInstrThumb.td lib/Target/ARM/ARMInstrThumb2.td test/CodeGen/ARM/2010-11-29-PrologueBug.ll Message-ID: <20101129224327.F02842A6C12D@llvm.org> Author: evancheng Date: Mon Nov 29 16:43:27 2010 New Revision: 120339 URL: http://llvm.org/viewvc/llvm-project?rev=120339&view=rev Log: Mark Darwin call instructions as using "r7" to prevent the frame-register assignment instructions from being moved below / above calls. rdar://8690640 Added: llvm/trunk/test/CodeGen/ARM/2010-11-29-PrologueBug.ll Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td llvm/trunk/lib/Target/ARM/ARMInstrThumb.td llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120339&r1=120338&r2=120339&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 16:43:27 2010 @@ -1232,12 +1232,16 @@ } } -// On non-Darwin platforms R9 is callee-saved. +// All calls clobber the non-callee saved registers. SP is marked as +// a use to prevent stack-pointer assignments that appear immediately +// before calls from potentially appearing dead. let isCall = 1, + // On non-Darwin platforms R9 is callee-saved. Defs = [R0, R1, R2, R3, R12, LR, D0, D1, D2, D3, D4, D5, D6, D7, D16, D17, D18, D19, D20, D21, D22, D23, - D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR] in { + D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR], + Uses = [SP] in { def BL : ABXI<0b1011, (outs), (ins bltarget:$func, variable_ops), IIC_Br, "bl\t$func", [(ARMcall tglobaladdr:$func)]>, @@ -1288,12 +1292,15 @@ } } -// On Darwin R9 is call-clobbered. let isCall = 1, + // On Darwin R9 is call-clobbered. + // R7 is marked as a use to prevent frame-pointer assignments from being + // moved above / below calls. Defs = [R0, R1, R2, R3, R9, R12, LR, D0, D1, D2, D3, D4, D5, D6, D7, D16, D17, D18, D19, D20, D21, D22, D23, - D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR] in { + D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR], + Uses = [R7, SP] in { def BLr9 : ABXI<0b1011, (outs), (ins bltarget:$func, variable_ops), IIC_Br, "bl\t$func", [(ARMcall tglobaladdr:$func)]>, Requires<[IsARM, IsDarwin]> { @@ -1473,7 +1480,7 @@ } // Supervisor Call (Software Interrupt) -- for disassembly only -let isCall = 1 in { +let isCall = 1, Uses = [SP] in { def SVC : ABI<0b1111, (outs), (ins i32imm:$svc), IIC_Br, "svc", "\t$svc", [/* For disassembly only; pattern left blank */]> { bits<24> svc; @@ -3241,7 +3248,7 @@ // FIXME: This needs to be a pseudo of some sort so that we can get the // encoding right, complete with fixup for the aeabi_read_tp function. let isCall = 1, - Defs = [R0, R12, LR, CPSR] in { + Defs = [R0, R12, LR, CPSR], Uses = [SP] in { def TPsoft : ABXI<0b1011, (outs), (ins), IIC_Br, "bl\t__aeabi_read_tp", [(set R0, ARMthread_pointer)]>; Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120339&r1=120338&r2=120339&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 16:43:27 2010 @@ -336,11 +336,16 @@ let Inst{7-0} = regs{7-0}; } +// All calls clobber the non-callee saved registers. SP is marked as +// a use to prevent stack-pointer assignments that appear immediately +// before calls from potentially appearing dead. let isCall = 1, + // On non-Darwin platforms R9 is callee-saved. Defs = [R0, R1, R2, R3, R12, LR, D0, D1, D2, D3, D4, D5, D6, D7, D16, D17, D18, D19, D20, D21, D22, D23, - D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR] in { + D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR], + Uses = [SP] in { // Also used for Thumb2 def tBL : TIx2<0b11110, 0b11, 1, (outs), (ins i32imm:$func, variable_ops), IIC_Br, @@ -371,12 +376,15 @@ Requires<[IsThumb, IsThumb1Only, IsNotDarwin]>; } -// On Darwin R9 is call-clobbered. let isCall = 1, + // On Darwin R9 is call-clobbered. + // R7 is marked as a use to prevent frame-pointer assignments from being + // moved above / below calls. Defs = [R0, R1, R2, R3, R9, R12, LR, D0, D1, D2, D3, D4, D5, D6, D7, D16, D17, D18, D19, D20, D21, D22, D23, - D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR] in { + D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR], + Uses = [R7, SP] in { // Also used for Thumb2 def tBLr9 : TIx2<0b11110, 0b11, 1, (outs), (ins pred:$p, i32imm:$func, variable_ops), IIC_Br, @@ -469,7 +477,7 @@ // A8.6.218 Supervisor Call (Software Interrupt) -- for disassembly only // A8.6.16 B: Encoding T1 // If Inst{11-8} == 0b1111 then SEE SVC -let isCall = 1 in +let isCall = 1, Uses = [SP] in def tSVC : T1pI<(outs), (ins i32imm:$imm), IIC_Br, "svc", "\t$imm", []>, Encoding16 { bits<8> imm; @@ -1250,7 +1258,7 @@ // __aeabi_read_tp preserves the registers r1-r3. let isCall = 1, - Defs = [R0, LR] in { + Defs = [R0, LR], Uses = [SP] in { def tTPsoft : TIx2<0b11110, 0b11, 1, (outs), (ins), IIC_Br, "bl\t__aeabi_read_tp", [(set R0, ARMthread_pointer)]>; Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120339&r1=120338&r2=120339&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 16:43:27 2010 @@ -2836,7 +2836,7 @@ // __aeabi_read_tp preserves the registers r1-r3. let isCall = 1, - Defs = [R0, R12, LR, CPSR] in { + Defs = [R0, R12, LR, CPSR], Uses = [SP] in { def t2TPsoft : T2XI<(outs), (ins), IIC_Br, "bl\t__aeabi_read_tp", [(set R0, ARMthread_pointer)]> { Added: llvm/trunk/test/CodeGen/ARM/2010-11-29-PrologueBug.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/2010-11-29-PrologueBug.ll?rev=120339&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/ARM/2010-11-29-PrologueBug.ll (added) +++ llvm/trunk/test/CodeGen/ARM/2010-11-29-PrologueBug.ll Mon Nov 29 16:43:27 2010 @@ -0,0 +1,28 @@ +; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM +; RUN: llc < %s -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB2 +; rdar://8690640 + +define i32* @t(i32* %x) nounwind { +entry: +; ARM: t: +; ARM: push +; ARM: mov r7, sp +; ARM: bl _foo +; ARM: bl _foo +; ARM: bl _foo +; ARM: ldmia sp!, {r7, pc} + +; THUMB2: t: +; THUMB2: push +; THUMB2: mov r7, sp +; THUMB2: blx _foo +; THUMB2: blx _foo +; THUMB2: blx _foo +; THUMB2: pop + %0 = tail call i32* @foo(i32* %x) nounwind + %1 = tail call i32* @foo(i32* %0) nounwind + %2 = tail call i32* @foo(i32* %1) nounwind + ret i32* %2 +} + +declare i32* @foo(i32*) From resistor at mac.com Mon Nov 29 16:44:32 2010 From: resistor at mac.com (Owen Anderson) Date: Mon, 29 Nov 2010 22:44:32 -0000 Subject: [llvm-commits] [llvm] r120340 - in /llvm/trunk: lib/Target/ARM/ARMCodeEmitter.cpp lib/Target/ARM/ARMInstrThumb2.td lib/Target/ARM/ARMMCCodeEmitter.cpp test/MC/ARM/thumb2.s Message-ID: <20101129224432.C02C32A6C12D@llvm.org> Author: resistor Date: Mon Nov 29 16:44:32 2010 New Revision: 120340 URL: http://llvm.org/viewvc/llvm-project?rev=120340&view=rev Log: Provide Thumb2 encodings for basic loads and stores. Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp llvm/trunk/test/MC/ARM/thumb2.s Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=120340&r1=120339&r2=120340&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Mon Nov 29 16:44:32 2010 @@ -177,6 +177,12 @@ const { return 0; } unsigned getSORegOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } + unsigned getT2AddrModeImm12OpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } + unsigned getT2AddrModeImm8OpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } + unsigned getT2AddrModeSORegOpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } unsigned getT2SORegOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } unsigned getRotImmOpValue(const MachineInstr &MI, unsigned Op) Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120340&r1=120339&r2=120340&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 16:44:32 2010 @@ -127,6 +127,7 @@ def t2addrmode_imm12 : Operand, ComplexPattern { let PrintMethod = "printAddrModeImm12Operand"; + string EncoderMethod = "getT2AddrModeImm12OpValue"; let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm); } @@ -134,6 +135,7 @@ def t2addrmode_imm8 : Operand, ComplexPattern { let PrintMethod = "printT2AddrModeImm8Operand"; + string EncoderMethod = "getT2AddrModeImm8OpValue"; let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm); } @@ -157,6 +159,7 @@ def t2addrmode_so_reg : Operand, ComplexPattern { let PrintMethod = "printT2AddrModeSoRegOperand"; + string EncoderMethod = "getT2AddrModeSORegOpValue"; let MIOperandInfo = (ops GPR:$base, rGPR:$offsreg, i32imm:$offsimm); } @@ -823,19 +826,26 @@ /// T2I_ld - Defines a set of (op r, {imm12|imm8|so_reg}) load patterns. multiclass T2I_ld opcod, string opc, InstrItinClass iii, InstrItinClass iis, PatFrag opnode> { - def i12 : T2Ii12<(outs GPR:$dst), (ins t2addrmode_imm12:$addr), iii, - opc, ".w\t$dst, $addr", - [(set GPR:$dst, (opnode t2addrmode_imm12:$addr))]> { + def i12 : T2Ii12<(outs GPR:$Rt), (ins t2addrmode_imm12:$addr), iii, + opc, ".w\t$Rt, $addr", + [(set GPR:$Rt, (opnode t2addrmode_imm12:$addr))]> { let Inst{31-27} = 0b11111; let Inst{26-25} = 0b00; let Inst{24} = signed; let Inst{23} = 1; let Inst{22-21} = opcod; let Inst{20} = 1; // load - } - def i8 : T2Ii8 <(outs GPR:$dst), (ins t2addrmode_imm8:$addr), iii, - opc, "\t$dst, $addr", - [(set GPR:$dst, (opnode t2addrmode_imm8:$addr))]> { + + bits<4> Rt; + let Inst{15-12} = Rt{3-0}; + + bits<16> addr; + let Inst{19-16} = addr{15-12}; // Rn + let Inst{11-0} = addr{11-0}; // imm + } + def i8 : T2Ii8 <(outs GPR:$Rt), (ins t2addrmode_imm8:$addr), iii, + opc, "\t$Rt, $addr", + [(set GPR:$Rt, (opnode t2addrmode_imm8:$addr))]> { let Inst{31-27} = 0b11111; let Inst{26-25} = 0b00; let Inst{24} = signed; @@ -846,10 +856,18 @@ // Offset: index==TRUE, wback==FALSE let Inst{10} = 1; // The P bit. let Inst{8} = 0; // The W bit. - } - def s : T2Iso <(outs GPR:$dst), (ins t2addrmode_so_reg:$addr), iis, - opc, ".w\t$dst, $addr", - [(set GPR:$dst, (opnode t2addrmode_so_reg:$addr))]> { + + bits<4> Rt; + let Inst{15-12} = Rt{3-0}; + + bits<13> addr; + let Inst{19-16} = addr{12-9}; // Rn + let Inst{9} = addr{8}; // U + let Inst{7-0} = addr{7-0}; // imm + } + def s : T2Iso <(outs GPR:$Rt), (ins t2addrmode_so_reg:$addr), iis, + opc, ".w\t$Rt, $addr", + [(set GPR:$Rt, (opnode t2addrmode_so_reg:$addr))]> { let Inst{31-27} = 0b11111; let Inst{26-25} = 0b00; let Inst{24} = signed; @@ -857,12 +875,20 @@ let Inst{22-21} = opcod; let Inst{20} = 1; // load let Inst{11-6} = 0b000000; + + bits<4> Rt; + let Inst{15-12} = Rt{3-0}; + + bits<10> addr; + let Inst{19-16} = addr{9-6}; // Rn + let Inst{3-0} = addr{5-2}; // Rm + let Inst{5-4} = addr{1-0}; // imm } // FIXME: Is the pci variant actually needed? - def pci : T2Ipc <(outs GPR:$dst), (ins i32imm:$addr), iii, - opc, ".w\t$dst, $addr", - [(set GPR:$dst, (opnode (ARMWrapper tconstpool:$addr)))]> { + def pci : T2Ipc <(outs GPR:$Rt), (ins i32imm:$addr), iii, + opc, ".w\t$Rt, $addr", + [(set GPR:$Rt, (opnode (ARMWrapper tconstpool:$addr)))]> { let isReMaterializable = 1; let Inst{31-27} = 0b11111; let Inst{26-25} = 0b00; @@ -871,23 +897,35 @@ let Inst{22-21} = opcod; let Inst{20} = 1; // load let Inst{19-16} = 0b1111; // Rn + + bits<4> Rt; + bits<12> addr; + let Inst{15-12} = Rt{3-0}; + let Inst{11-0} = addr{11-0}; } } /// T2I_st - Defines a set of (op r, {imm12|imm8|so_reg}) store patterns. multiclass T2I_st opcod, string opc, InstrItinClass iii, InstrItinClass iis, PatFrag opnode> { - def i12 : T2Ii12<(outs), (ins GPR:$src, t2addrmode_imm12:$addr), iii, - opc, ".w\t$src, $addr", - [(opnode GPR:$src, t2addrmode_imm12:$addr)]> { + def i12 : T2Ii12<(outs), (ins GPR:$Rt, t2addrmode_imm12:$addr), iii, + opc, ".w\t$Rt, $addr", + [(opnode GPR:$Rt, t2addrmode_imm12:$addr)]> { let Inst{31-27} = 0b11111; let Inst{26-23} = 0b0001; let Inst{22-21} = opcod; let Inst{20} = 0; // !load - } - def i8 : T2Ii8 <(outs), (ins GPR:$src, t2addrmode_imm8:$addr), iii, - opc, "\t$src, $addr", - [(opnode GPR:$src, t2addrmode_imm8:$addr)]> { + + bits<4> Rt; + let Inst{19-16} = Rt{3-0}; + + bits<16> addr; + let Inst{19-16} = addr{15-12}; // Rn + let Inst{11-0} = addr{11-0}; // imm + } + def i8 : T2Ii8 <(outs), (ins GPR:$Rt, t2addrmode_imm8:$addr), iii, + opc, "\t$Rt, $addr", + [(opnode GPR:$Rt, t2addrmode_imm8:$addr)]> { let Inst{31-27} = 0b11111; let Inst{26-23} = 0b0000; let Inst{22-21} = opcod; @@ -896,15 +934,31 @@ // Offset: index==TRUE, wback==FALSE let Inst{10} = 1; // The P bit. let Inst{8} = 0; // The W bit. - } - def s : T2Iso <(outs), (ins GPR:$src, t2addrmode_so_reg:$addr), iis, - opc, ".w\t$src, $addr", - [(opnode GPR:$src, t2addrmode_so_reg:$addr)]> { + + bits<4> Rt; + let Inst{19-16} = Rt{3-0}; + + bits<13> addr; + let Inst{19-16} = addr{12-9}; // Rn + let Inst{9} = addr{8}; // U + let Inst{7-0} = addr{7-0}; // imm + } + def s : T2Iso <(outs), (ins GPR:$Rt, t2addrmode_so_reg:$addr), iis, + opc, ".w\t$Rt, $addr", + [(opnode GPR:$Rt, t2addrmode_so_reg:$addr)]> { let Inst{31-27} = 0b11111; let Inst{26-23} = 0b0000; let Inst{22-21} = opcod; let Inst{20} = 0; // !load let Inst{11-6} = 0b000000; + + bits<4> Rt; + let Inst{15-12} = Rt{3-0}; + + bits<10> addr; + let Inst{19-16} = addr{9-6}; // Rn + let Inst{3-0} = addr{5-2}; // Rm + let Inst{5-4} = addr{1-0}; // imm } } Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120340&r1=120339&r2=120340&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Mon Nov 29 16:44:32 2010 @@ -173,6 +173,13 @@ return Encoded; } + unsigned getT2AddrModeSORegOpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const; + unsigned getT2AddrModeImm8OpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const; + unsigned getT2AddrModeImm12OpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const; + /// getSORegOpValue - Return an encoded so_reg shifted register value. unsigned getSORegOpValue(const MCInst &MI, unsigned Op, SmallVectorImpl &Fixups) const; @@ -633,6 +640,54 @@ } unsigned ARMMCCodeEmitter:: +getT2AddrModeSORegOpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const { + const MCOperand &MO1 = MI.getOperand(OpNum); + const MCOperand &MO2 = MI.getOperand(OpNum+1); + const MCOperand &MO3 = MI.getOperand(OpNum+2); + + // Encoded as [Rn, Rm, imm]. + // FIXME: Needs fixup support. + unsigned Value = getARMRegisterNumbering(MO1.getReg()); + Value <<= 4; + Value |= getARMRegisterNumbering(MO2.getReg()); + Value <<= 2; + Value |= MO3.getImm(); + + return Value; +} + +unsigned ARMMCCodeEmitter:: +getT2AddrModeImm8OpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const { + const MCOperand &MO1 = MI.getOperand(OpNum); + const MCOperand &MO2 = MI.getOperand(OpNum+1); + + // FIXME: Needs fixup support. + unsigned Value = getARMRegisterNumbering(MO1.getReg()); + + // Even though the immediate is 8 bits long, we need 9 bits in order + // to represent the (inverse of the) sign bit. + Value <<= 9; + Value |= ((int32_t)MO2.getImm()) & 511; + Value ^= 256; // Invert the sign bit. + return Value; +} + +unsigned ARMMCCodeEmitter:: +getT2AddrModeImm12OpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const { + const MCOperand &MO1 = MI.getOperand(OpNum); + const MCOperand &MO2 = MI.getOperand(OpNum+1); + + // FIXME: Needs fixup support. + unsigned Value = getARMRegisterNumbering(MO1.getReg()); + Value <<= 12; + Value |= MO2.getImm() & 4095; + return Value; +} + +unsigned ARMMCCodeEmitter:: getT2SORegOpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const { // Sub-operands are [reg, imm]. The first register is Rm, the reg to be Modified: llvm/trunk/test/MC/ARM/thumb2.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb2.s?rev=120340&r1=120339&r2=120340&view=diff ============================================================================== --- llvm/trunk/test/MC/ARM/thumb2.s (original) +++ llvm/trunk/test/MC/ARM/thumb2.s Mon Nov 29 16:44:32 2010 @@ -101,4 +101,17 @@ @ CHECK: dmb ish @ encoding: [0x5b,0x8f,0xbf,0xf3] dmb ish - \ No newline at end of file +@ CHECK: str.w r0, [r1, #4092] @ encoding: [0xfc,0x0f,0xc1,0xf8] + str.w r0, [r1, #4092] +@ CHECK: str r0, [r1, #-128] @ encoding: [0x80,0x0c,0x41,0xf8] + str r0, [r1, #-128] +@ CHECK: str.w r0, [r1, r2, lsl #2] @ encoding: [0x22,0x00,0x41,0xf8 + str.w r0, [r1, r2, lsl #2] + +@ CHECK: ldr.w r0, [r0, #4092] @ encoding: [0xfc,0x0f,0xd0,0xf8] + ldr.w r0, [r0, #4092] +@ CHECK: ldr r0, [r0, #-128] @ encoding: [0x80,0x0c,0x50,0xf8] + ldr r0, [r0, #-128] +@ CHECK: ldr.w r0, [r0, r1, lsl #2] @ encoding: [0x21,0x00,0x50,0xf8] + ldr.w r0, [r0, r1, lsl #2] + From clattner at apple.com Mon Nov 29 16:49:12 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 14:49:12 -0800 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: <7CBC704A-3752-4146-9B04-867EE9F3EDED@apple.com> Message-ID: <775F6367-3D8F-4803-B91B-7AC19DACF8DC@apple.com> On Nov 29, 2010, at 2:21 PM, Frits van Bommel wrote: > On Mon, Nov 29, 2010 at 10:30 PM, Chris Lattner wrote: >> I think that Dan is pointing out that it is unwise for an frontend to generate a ton of aggregate values, because that will cause fastisel to be defeated and lead to slower compile times. However, despite Dan's objections, I think this is a perfectly reasonable xform for instcombine to do. > > I agree that it's probably not a very good thing to do, but apparently > they do occur "in the wild" even with clang. Yep, clang generates them on x86-64 for ABI reasons. > Also, I've found aggregate values can really make a simple frontend > easier to write sometimes when you can just assume that any expression > will generate (at most) a single llvm::Value* even if the result > logically has two fields, e.g. a pointer and length for a dynamic > array. > So if you prefer ease of implementation, this is at least a useful hack. Completely agreed. It's also useful for complex numbers and a variety of other things. > One way extractvalues can enter the code, by the way, is return values > of functions. For instance, on x86-64 9-16 byte structs are returned > as a 2-field struct value. When such a function gets inlined, this > optimization may fire if the frontend used a single load + ret instead > of two loads + two insertvalues + ret to construct the return value. > (The fact that using more instructions causes it to optimize better > can be a bit counter-intuitive) Yep. > We could also add a "load %struct*" --> load fields + construct > %struct with insertvalues transform... Not a bad idea, though probably not worth it. At -O0 (when fastisel kicks in) no optimization passes are run :) > That's what the first version did, and the exact reason it was > horribly broken :). Doing that causes -instcombine to try to insert it > at the current location, which is that of the extractvalue. Adding an > explicit insert point causes an assert when trying to insert it > because it's already in a basic block. Thanks again Frits, -Chris From evan.cheng at apple.com Mon Nov 29 16:57:32 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 29 Nov 2010 14:57:32 -0800 Subject: [llvm-commits] [llvm] r119947 - /llvm/trunk/lib/Target/X86/README.txt In-Reply-To: <20101121185921.3269C2A6C12C@llvm.org> References: <20101121185921.3269C2A6C12C@llvm.org> Message-ID: <42812564-79B7-4366-8957-C9B8ABA4C5CB@apple.com> Actually, this doesn't appear to be working on Darwin either. The issue is the call is turned into a fsin node and the "tailcall" property is apparently lost by the time legalizer expands it back into a call. This needs to be fixed but I am not sure how. Evan On Nov 21, 2010, at 10:59 AM, Chris Lattner wrote: > Author: lattner > Date: Sun Nov 21 12:59:20 2010 > New Revision: 119947 > > URL: http://llvm.org/viewvc/llvm-project?rev=119947&view=rev > Log: > apparently tailcalls are better on darwin/x86-64 than on linux? > > Modified: > llvm/trunk/lib/Target/X86/README.txt > > Modified: llvm/trunk/lib/Target/X86/README.txt > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/README.txt?rev=119947&r1=119946&r2=119947&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/X86/README.txt (original) > +++ llvm/trunk/lib/Target/X86/README.txt Sun Nov 21 12:59:20 2010 > @@ -895,6 +895,24 @@ > > //===---------------------------------------------------------------------===// > > +Linux is missing some basic tail call support: > + > +#include > +double foo(double a) { return sin(a); } > + > +This compiles into this on x86-64 Linux (but not darwin): > +foo: > + subq $8, %rsp > + call sin > + addq $8, %rsp > + ret > +vs: > + > +foo: > + jmp sin > + > +//===---------------------------------------------------------------------===// > + > Tail call optimization improvements: Tail call optimization currently > pushes all arguments on the top of the stack (their normal place for > non-tail call optimized calls) that source from the callers arguments > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/ee939a6e/attachment.html From clattner at apple.com Mon Nov 29 17:00:15 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 15:00:15 -0800 Subject: [llvm-commits] [llvm] r119947 - /llvm/trunk/lib/Target/X86/README.txt In-Reply-To: <42812564-79B7-4366-8957-C9B8ABA4C5CB@apple.com> References: <20101121185921.3269C2A6C12C@llvm.org> <42812564-79B7-4366-8957-C9B8ABA4C5CB@apple.com> Message-ID: <5735D164-6BF5-429A-8B72-F1950DA4A517@apple.com> On Nov 29, 2010, at 2:57 PM, Evan Cheng wrote: > Actually, this doesn't appear to be working on Darwin either. The issue is the call is turned into a fsin node and the "tailcall" property is apparently lost by the time legalizer expands it back into a call. This needs to be fixed but I am not sure how. Ah, I thought it was working for me. It should always be safe to add this for sin/cos/etc. The "tailcall" property just means that the callee is known to not access the callers stack frame. -Chris From sabre at nondot.org Mon Nov 29 17:02:20 2010 From: sabre at nondot.org (Chris Lattner) Date: Mon, 29 Nov 2010 23:02:20 -0000 Subject: [llvm-commits] [llvm] r120341 - in /llvm/trunk/tools: llvm-ar/llvm-ar.cpp llvm-ranlib/llvm-ranlib.cpp Message-ID: <20101129230220.CBBD32A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 17:02:20 2010 New Revision: 120341 URL: http://llvm.org/viewvc/llvm-project?rev=120341&view=rev Log: convert llvm-ar and llvm-ranlib to raw_ostream from iostreams. Patch by Danil Malyshev! Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=120341&r1=120340&r2=120341&view=diff ============================================================================== --- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original) +++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Mon Nov 29 17:02:20 2010 @@ -18,11 +18,10 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/Format.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Signals.h" -#include #include -#include #include #include using namespace llvm; @@ -335,12 +334,12 @@ // printSymbolTable - print out the archive's symbol table. void printSymbolTable() { - std::cout << "\nArchive Symbol Table:\n"; + outs() << "\nArchive Symbol Table:\n"; const Archive::SymTabType& symtab = TheArchive->getSymbolTable(); for (Archive::SymTabType::const_iterator I=symtab.begin(), E=symtab.end(); I != E; ++I ) { unsigned offset = TheArchive->getFirstFileOffset() + I->second; - std::cout << " " << std::setw(9) << offset << "\t" << I->first <<"\n"; + outs() << " " << format("%9u", offset) << "\t" << I->first <<"\n"; } } @@ -365,10 +364,10 @@ continue; if (Verbose) - std::cout << "Printing " << I->getPath().str() << "\n"; + outs() << "Printing " << I->getPath().str() << "\n"; unsigned len = I->getSize(); - std::cout.write(data, len); + outs().write(data, len); } else { countDown--; } @@ -382,17 +381,17 @@ void printMode(unsigned mode) { if (mode & 004) - std::cout << "r"; + outs() << "r"; else - std::cout << "-"; + outs() << "-"; if (mode & 002) - std::cout << "w"; + outs() << "w"; else - std::cout << "-"; + outs() << "-"; if (mode & 001) - std::cout << "x"; + outs() << "x"; else - std::cout << "-"; + outs() << "-"; } // doDisplayTable - Implement the 't' operation. This function prints out just @@ -411,22 +410,22 @@ // FIXME: Output should be this format: // Zrw-r--r-- 500/ 500 525 Nov 8 17:42 2004 Makefile if (I->isBitcode()) - std::cout << "b"; + outs() << "b"; else if (I->isCompressed()) - std::cout << "Z"; + outs() << "Z"; else - std::cout << " "; + outs() << " "; unsigned mode = I->getMode(); printMode((mode >> 6) & 007); printMode((mode >> 3) & 007); printMode(mode & 007); - std::cout << " " << std::setw(4) << I->getUser(); - std::cout << "/" << std::setw(4) << I->getGroup(); - std::cout << " " << std::setw(8) << I->getSize(); - std::cout << " " << std::setw(20) << I->getModTime().str().substr(4); - std::cout << " " << I->getPath().str() << "\n"; + outs() << " " << format("%4u", I->getUser()); + outs() << "/" << format("%4u", I->getGroup()); + outs() << " " << format("%8u", I->getSize()); + outs() << " " << format("%20s", I->getModTime().str().substr(4).c_str()); + outs() << " " << I->getPath().str() << "\n"; } else { - std::cout << I->getPath().str() << "\n"; + outs() << I->getPath().str() << "\n"; } } } Modified: llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp?rev=120341&r1=120340&r2=120341&view=diff ============================================================================== --- llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp (original) +++ llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp Mon Nov 29 17:02:20 2010 @@ -17,12 +17,10 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/Format.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Signals.h" -#include -#include #include - using namespace llvm; // llvm-ar operation code and modifier flags @@ -35,12 +33,12 @@ // printSymbolTable - print out the archive's symbol table. void printSymbolTable(Archive* TheArchive) { - std::cout << "\nArchive Symbol Table:\n"; + outs() << "\nArchive Symbol Table:\n"; const Archive::SymTabType& symtab = TheArchive->getSymbolTable(); for (Archive::SymTabType::const_iterator I=symtab.begin(), E=symtab.end(); I != E; ++I ) { unsigned offset = TheArchive->getFirstFileOffset() + I->second; - std::cout << " " << std::setw(9) << offset << "\t" << I->first <<"\n"; + outs() << " " << format("%9u", offset) << "\t" << I->first <<"\n"; } } From clattner at apple.com Mon Nov 29 17:05:35 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 15:05:35 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> Message-ID: On Nov 29, 2010, at 11:38 AM, Danil Malyshev wrote: > Hello Jakob, > > > Can you find a way of doing this without increasing the size of the raw_ostream object, and without imposing any overhead on users that don't need it? > > Ok, I did it. > Attached file fix-cout-02.diff is the new patch. It change only llvm-ar, llvm-ranlib, and attributes of *.toc files in Archive tests. The llvm-ar and llvm-ranlib changes look great, committed in r120341. I also removed the #include of , saving us a static ctor. I don't understand or have an opinion on the archive tests though, can you explain it more? Can someone on windows review them? -Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/e50ad696/attachment.html From dalej at apple.com Mon Nov 29 17:07:23 2010 From: dalej at apple.com (Dale Johannesen) Date: Mon, 29 Nov 2010 23:07:23 -0000 Subject: [llvm-commits] [llvm-gcc-4.2] r120342 - /llvm-gcc-4.2/trunk/gcc/llvm-internal.h Message-ID: <20101129230723.951172A6C12D@llvm.org> Author: johannes Date: Mon Nov 29 17:07:23 2010 New Revision: 120342 URL: http://llvm.org/viewvc/llvm-project?rev=120342&view=rev Log: Track down one more moved header, so even a clean build will work. Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=120342&r1=120341&r2=120342&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Mon Nov 29 17:07:23 2010 @@ -37,7 +37,7 @@ #include "llvm/ADT/IndexedMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SetVector.h" -#include "llvm/System/DataTypes.h" +#include "llvm/Support/DataTypes.h" #include "llvm/Support/IRBuilder.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/TargetFolder.h" From clattner at apple.com Mon Nov 29 17:10:09 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 15:10:09 -0800 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: References: Message-ID: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> On Nov 23, 2010, at 1:39 PM, Villmow, Micah wrote: > Reposting bug report here, any chance that it can get reviewed? > Patch that adds a boolean where a backend can specify whether to disable > certain optimizations because jumps are expensive. Hi Micah, The patch looks ok, except for some minor issues: + void setSelectIsExpensive(bool isExpensive = true) { + SelectIsExpensive = isExpensive; Please avoid tabs. + /// isJumpExpensive() - Return true if true if Flow Control is an + /// expensive operation that should be avoided Please end the comment with a . + /// JumpIsExpensive - Tells the code generator not to expand operations + /// into sequences that increase the amount of flow control if possible + void setJumpIsExpensive(bool isExpensive = true) { + JumpIsExpensive = isExpensive; likewise ^2 + /// JumpIsExpensive - Tells the code generator that it shouldn't + /// generate extra flow control instructions and should attempt to + /// combine flow control instructions via predication end comment with a . I was planning to just apply this for you and tweak it, but your patch format isn't accepted by the 'patch' command. -Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/073bd0cd/attachment.html From grosbach at apple.com Mon Nov 29 17:09:21 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 23:09:21 -0000 Subject: [llvm-commits] [llvm] r120343 - /llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h Message-ID: <20101129230921.1C11A2A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 17:09:20 2010 New Revision: 120343 URL: http://llvm.org/viewvc/llvm-project?rev=120343&view=rev Log: Nuke a FIXME. No need to be fancier here, as ARM handles constant pools locations and formatting specially. rdar://7353441 Modified: llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h Modified: llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h?rev=120343&r1=120342&r2=120343&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h (original) +++ llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.h Mon Nov 29 17:09:20 2010 @@ -96,11 +96,7 @@ bool isBlockAddress() { return Kind == ARMCP::CPBlockAddress; } bool isLSDA() { return Kind == ARMCP::CPLSDA; } - virtual unsigned getRelocationInfo() const { - // FIXME: This is conservatively claiming that these entries require a - // relocation, we may be able to do better than this. - return 2; - } + virtual unsigned getRelocationInfo() const { return 2; } virtual int getExistingMachineCPValue(MachineConstantPool *CP, unsigned Alignment); From clattner at apple.com Mon Nov 29 17:11:43 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 15:11:43 -0800 Subject: [llvm-commits] [PATCH] Bug 5207: make APInt set(), clear() and flip() return void In-Reply-To: References: Message-ID: <83AE4010-3184-4075-8F82-2B006FDC0D12@apple.com> On Nov 29, 2010, at 2:51 AM, Jay Foad wrote: > http://llvm.org/bugs/show_bug.cgi?id=5207 > > The bug says, among other things, that APInt methods "that update in > place should return void to make it really clear that they do not > return a new APInt". The attached patch does this for the methods > set(), clear() and flip(). It passes "make check". I don't think any > changes are needed in cfe/trunk/ or llvm-gcc-4.2/trunk/. > > This does make some code more long-winded, e.g.: > > static APInt getMaxValue(unsigned numBits) { > - return APInt(numBits, 0).set(); > + APInt API(numBits, 0); > + API.set(); > + return API; > } > > Do you still think it's a good idea? If so, OK to commit? Looks great to me, please commit. I'd also suggest renaming the methods to "setAllBits()" "clearAllBits" "flipAllBits" etc. Thanks for working on this Jay! -Chris From evan.cheng at apple.com Mon Nov 29 17:11:15 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 29 Nov 2010 15:11:15 -0800 Subject: [llvm-commits] [llvm] r119947 - /llvm/trunk/lib/Target/X86/README.txt In-Reply-To: <5735D164-6BF5-429A-8B72-F1950DA4A517@apple.com> References: <20101121185921.3269C2A6C12C@llvm.org> <42812564-79B7-4366-8957-C9B8ABA4C5CB@apple.com> <5735D164-6BF5-429A-8B72-F1950DA4A517@apple.com> Message-ID: On Nov 29, 2010, at 3:00 PM, Chris Lattner wrote: > > On Nov 29, 2010, at 2:57 PM, Evan Cheng wrote: > >> Actually, this doesn't appear to be working on Darwin either. The issue is the call is turned into a fsin node and the "tailcall" property is apparently lost by the time legalizer expands it back into a call. This needs to be fixed but I am not sure how. > > Ah, I thought it was working for me. It should always be safe to add this for sin/cos/etc. The "tailcall" property just means that the callee is known to not access the callers stack frame. Right, it should be safe to mark it tailcall when the node does not take a chain operand. Evan > > -Chris > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/f09cdde4/attachment.html From clattner at apple.com Mon Nov 29 17:12:18 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 15:12:18 -0800 Subject: [llvm-commits] [llvm] r119947 - /llvm/trunk/lib/Target/X86/README.txt In-Reply-To: References: <20101121185921.3269C2A6C12C@llvm.org> <42812564-79B7-4366-8957-C9B8ABA4C5CB@apple.com> <5735D164-6BF5-429A-8B72-F1950DA4A517@apple.com> Message-ID: <136FE9C8-A9B3-4F5C-86C6-7932C4AE525C@apple.com> On Nov 29, 2010, at 3:11 PM, Evan Cheng wrote: > > On Nov 29, 2010, at 3:00 PM, Chris Lattner wrote: > >> >> On Nov 29, 2010, at 2:57 PM, Evan Cheng wrote: >> >>> Actually, this doesn't appear to be working on Darwin either. The issue is the call is turned into a fsin node and the "tailcall" property is apparently lost by the time legalizer expands it back into a call. This needs to be fixed but I am not sure how. >> >> Ah, I thought it was working for me. It should always be safe to add this for sin/cos/etc. The "tailcall" property just means that the callee is known to not access the callers stack frame. > > Right, it should be safe to mark it tailcall when the node does not take a chain operand. Yes, certainly! -Chris From grosbach at apple.com Mon Nov 29 17:18:02 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 23:18:02 -0000 Subject: [llvm-commits] [llvm] r120344 - /llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Message-ID: <20101129231802.1E9232A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 17:18:01 2010 New Revision: 120344 URL: http://llvm.org/viewvc/llvm-project?rev=120344&view=rev Log: Nuke trailing whitespace. Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=120344&r1=120343&r2=120344&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original) +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Nov 29 17:18:01 2010 @@ -521,7 +521,7 @@ SMLoc E = RCurlyTok.getLoc(); Parser.Lex(); // Eat right curly brace token. - + // Verify the register list. SmallVectorImpl >::const_iterator RI = Registers.begin(), RE = Registers.end(); @@ -605,7 +605,7 @@ E = RBracTok.getLoc(); Parser.Lex(); // Eat right bracket token. - + const AsmToken &ExclaimTok = Parser.getTok(); ARMOperand *WBOp = 0; if (ExclaimTok.is(AsmToken::Exclaim)) { @@ -639,7 +639,7 @@ const MCExpr *Offset = 0; const AsmToken &NextTok = Parser.getTok(); - + if (NextTok.isNot(AsmToken::EndOfStatement)) { Postindexed = true; Writeback = true; From gohman at apple.com Mon Nov 29 17:20:40 2010 From: gohman at apple.com (Dan Gohman) Date: Mon, 29 Nov 2010 15:20:40 -0800 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> Message-ID: On Nov 29, 2010, at 12:28 PM, Frits van Bommel wrote: > On Mon, Nov 29, 2010 at 8:20 PM, Dan Gohman wrote: >> On Nov 28, 2010, at 2:43 AM, Frits van Bommel wrote: >> >>> <006-instcombine-extractvalue-load-v3.patch><007-instcombine-extractvalue-load-test-v2.patch>_______________________________________________ >> >> Why is this needed? Front-ends should emit gep+load instead of >> load+extractvalue. > > Not all front ends might do that. For instance, it might load both > fields of a struct if thinks it's going to need them anyway but then > one gets optimized out. If it emits both fields as gep+load, then there's no problem. Basically, it's never desirable to actually do an aggregate load or store. It may be the case they they can be eliminated by optimization much of the time, but this can fail in various ways, and when it does, you can get quite unpleasant results. And even when it does work, the best you'll get is emit the same gep+load that the front-end could have emitted itself without any extra analysis. On Nov 29, 2010, at 12:34 PM, Frits van Bommel wrote: > On Mon, Nov 29, 2010 at 9:28 PM, Frits van Bommel wrote: >> Also, when I accidentally messed this up so it asserted every time it >> fired clang could no longer compile LLVM. I think the problem was in >> the passmanager, but I might be misremembering. > > Looks like I misremembered; I just found the file I bugpointed and > it's called PreAllocSplitting.ll. It doesn't contain any extractvalue > instructions, so they must've been generated by one or more of the > passes clang runs at -O3. This merits a bug report. Dan From clattner at apple.com Mon Nov 29 17:22:32 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 15:22:32 -0800 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> Message-ID: <447B9721-968B-4AB0-9569-316F53E2C1D5@apple.com> On Nov 29, 2010, at 3:20 PM, Dan Gohman wrote: > If it emits both fields as gep+load, then there's no problem. > > Basically, it's never desirable to actually do an aggregate load or store. > It may be the case they they can be eliminated by optimization much of the > time, but this can fail in various ways, and when it does, you can get > quite unpleasant results. And even when it does work, the best you'll get > is emit the same gep+load that the front-end could have emitted itself > without any extra analysis. Dan, we require frontends to generate first class aggregates for ABI reasons in some cases. This happens on X86-64 for example. -Chris From sabre at nondot.org Mon Nov 29 17:29:54 2010 From: sabre at nondot.org (Chris Lattner) Date: Mon, 29 Nov 2010 23:29:54 -0000 Subject: [llvm-commits] [llvm] r120346 - /llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Message-ID: <20101129232955.012F12A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 17:29:54 2010 New Revision: 120346 URL: http://llvm.org/viewvc/llvm-project?rev=120346&view=rev Log: Generalize the darwin wrapper hack to work with generic macho triples as well as darwin ones. Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=120346&r1=120345&r2=120346&view=diff ============================================================================== --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original) +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Mon Nov 29 17:29:54 2010 @@ -1642,9 +1642,12 @@ /// WriteBitcodeToStream - Write the specified module to the specified output /// stream. void llvm::WriteBitcodeToStream(const Module *M, BitstreamWriter &Stream) { - // If this is darwin, emit a file header and trailer if needed. - bool isDarwin = M->getTargetTriple().find("-darwin") != std::string::npos; - if (isDarwin) + // If this is darwin or another generic macho target, emit a file header and + // trailer if needed. + bool isMacho = + M->getTargetTriple().find("-darwin") != std::string::npos || + M->getTargetTriple().find("-macho") != std::string::npos; + if (isMacho) EmitDarwinBCHeader(Stream, M->getTargetTriple()); // Emit the file header. @@ -1658,6 +1661,6 @@ // Emit the module. WriteModule(M, Stream); - if (isDarwin) + if (isMacho) EmitDarwinBCTrailer(Stream, Stream.getBuffer().size()); } From fvbommel at gmail.com Mon Nov 29 17:33:42 2010 From: fvbommel at gmail.com (Frits van Bommel) Date: Tue, 30 Nov 2010 00:33:42 +0100 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: <447B9721-968B-4AB0-9569-316F53E2C1D5@apple.com> References: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> <447B9721-968B-4AB0-9569-316F53E2C1D5@apple.com> Message-ID: On Tue, Nov 30, 2010 at 12:22 AM, Chris Lattner wrote: > > On Nov 29, 2010, at 3:20 PM, Dan Gohman wrote: >> If it emits both fields as gep+load, then there's no problem. >> >> Basically, it's never desirable to actually do an aggregate load or store. >> It may be the case they they can be eliminated by optimization much of the >> time, but this can fail in various ways, and when it does, you can get >> quite unpleasant results. And even when it does work, the best you'll get >> is emit the same gep+load that the front-end could have emitted itself >> without any extra analysis. > > Dan, we require frontends to generate first class aggregates for ABI reasons in some cases. ?This happens on X86-64 for example. I think Dan is saying that even when they're generated, they should never be loaded / stored directly. Presumably, they should instead be assembled using insertvalue after being loaded piecewise / broken up into pieces using extractvalue before being stored. From clattner at apple.com Mon Nov 29 17:35:21 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 15:35:21 -0800 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: <272A49D7-AFC1-4830-A1EB-CA05EB773B03@apple.com> <447B9721-968B-4AB0-9569-316F53E2C1D5@apple.com> Message-ID: On Nov 29, 2010, at 3:33 PM, Frits van Bommel wrote: >>> >>> Basically, it's never desirable to actually do an aggregate load or store. >>> It may be the case they they can be eliminated by optimization much of the >>> time, but this can fail in various ways, and when it does, you can get >>> quite unpleasant results. And even when it does work, the best you'll get >>> is emit the same gep+load that the front-end could have emitted itself >>> without any extra analysis. >> >> Dan, we require frontends to generate first class aggregates for ABI reasons in some cases. This happens on X86-64 for example. > > I think Dan is saying that even when they're generated, they should > never be loaded / stored directly. Presumably, they should instead be > assembled using insertvalue after being loaded piecewise / broken up > into pieces using extractvalue before being stored. Ah, that's a good point! It still doesn't hurt to have the code in instcombine though. -Chris From sabre at nondot.org Mon Nov 29 17:35:33 2010 From: sabre at nondot.org (Chris Lattner) Date: Mon, 29 Nov 2010 23:35:33 -0000 Subject: [llvm-commits] [llvm] r120347 - /llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Message-ID: <20101129233533.37F522A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 17:35:33 2010 New Revision: 120347 URL: http://llvm.org/viewvc/llvm-project?rev=120347&view=rev Log: prune an llvmcontext include and simplify some code. Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=120347&r1=120346&r2=120347&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Mon Nov 29 17:35:33 2010 @@ -16,7 +16,6 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/IntrinsicInst.h" #include "llvm/Instructions.h" -#include "llvm/LLVMContext.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/Dominators.h" @@ -39,8 +38,6 @@ /// i16 0xF0F0, double 0.0 etc. If the value can't be handled with a repeated /// byte store (e.g. i16 0x1234), return null. static Value *isBytewiseValue(Value *V) { - LLVMContext &Context = V->getContext(); - // All byte-wide stores are splatable, even of arbitrary variables. if (V->getType()->isIntegerTy(8)) return V; @@ -48,9 +45,9 @@ // corresponding integer value is "byteable". An important case is 0.0. if (ConstantFP *CFP = dyn_cast(V)) { if (CFP->getType()->isFloatTy()) - V = ConstantExpr::getBitCast(CFP, Type::getInt32Ty(Context)); + V = ConstantExpr::getBitCast(CFP, Type::getInt32Ty(V->getContext())); if (CFP->getType()->isDoubleTy()) - V = ConstantExpr::getBitCast(CFP, Type::getInt64Ty(Context)); + V = ConstantExpr::getBitCast(CFP, Type::getInt64Ty(V->getContext())); // Don't handle long double formats, which have strange constraints. } @@ -73,7 +70,7 @@ if (Val != Val2) return 0; } - return ConstantInt::get(Context, Val); + return ConstantInt::get(V->getContext(), Val); } } From bigcheesegs at gmail.com Mon Nov 29 17:35:35 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 23:35:35 -0000 Subject: [llvm-commits] [llvm] r120348 - /llvm/trunk/include/llvm/Support/PathV2.h Message-ID: <20101129233535.69BA02A6C12F@llvm.org> Author: mspencer Date: Mon Nov 29 17:35:35 2010 New Revision: 120348 URL: http://llvm.org/viewvc/llvm-project?rev=120348&view=rev Log: Support/PathV2: Update comments. Modified: llvm/trunk/include/llvm/Support/PathV2.h Modified: llvm/trunk/include/llvm/Support/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?rev=120348&r1=120347&r2=120348&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Mon Nov 29 17:35:35 2010 @@ -1,4 +1,4 @@ -//===- llvm/Support/PathV2.h - Path Operating System Concept -----*- C++ -*-===// +//===- llvm/Support/PathV2.h - Path Operating System Concept ----*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// // -// This file declares the llvm::sys::path namespace. It is designed after +// This file declares the llvm::sys::{path,fs} namespaces. It is designed after // TR2/boost filesystem (v3), but modified to remove exception handling and the // path class. // From bigcheesegs at gmail.com Mon Nov 29 17:35:49 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Mon, 29 Nov 2010 23:35:49 -0000 Subject: [llvm-commits] [llvm] r120349 - /llvm/trunk/unittests/Support/Path.cpp Message-ID: <20101129233549.77DB62A6C12D@llvm.org> Author: mspencer Date: Mon Nov 29 17:35:49 2010 New Revision: 120349 URL: http://llvm.org/viewvc/llvm-project?rev=120349&view=rev Log: Support/PathV2: Fix 80 col. Modified: llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120349&r1=120348&r2=120349&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Mon Nov 29 17:35:49 2010 @@ -73,15 +73,19 @@ StringRef res; SmallString<16> temp_store; - if (error_code ec = sys::path::root_path(*i, res)) ASSERT_FALSE(ec.message().c_str()); + if (error_code ec = sys::path::root_path(*i, res)) + ASSERT_FALSE(ec.message().c_str()); outs() << " root_path: " << res << '\n'; - if (error_code ec = sys::path::root_name(*i, res)) ASSERT_FALSE(ec.message().c_str()); + if (error_code ec = sys::path::root_name(*i, res)) + ASSERT_FALSE(ec.message().c_str()); outs() << " root_name: " << res << '\n'; - if (error_code ec = sys::path::root_directory(*i, res)) ASSERT_FALSE(ec.message().c_str()); + if (error_code ec = sys::path::root_directory(*i, res)) + ASSERT_FALSE(ec.message().c_str()); outs() << " root_directory: " << res << '\n'; temp_store = *i; - if (error_code ec = sys::path::make_absolute(temp_store)) ASSERT_FALSE(ec.message().c_str()); + if (error_code ec = sys::path::make_absolute(temp_store)) + ASSERT_FALSE(ec.message().c_str()); outs() << " make_absolute: " << temp_store << '\n'; outs().flush(); From Micah.Villmow at amd.com Mon Nov 29 17:42:45 2010 From: Micah.Villmow at amd.com (Villmow, Micah) Date: Mon, 29 Nov 2010 17:42:45 -0600 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> References: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> Message-ID: Thanks for the tips, I'll regenerate the patch, what is the command you usually use to generate a patch? Thanks, Micah From: Chris Lattner [mailto:clattner at apple.com] Sent: Monday, November 29, 2010 3:10 PM To: Villmow, Micah Cc: llvm-commits Subject: Re: [llvm-commits] Patch for Bug7696 On Nov 23, 2010, at 1:39 PM, Villmow, Micah wrote: Reposting bug report here, any chance that it can get reviewed? Patch that adds a boolean where a backend can specify whether to disable certain optimizations because jumps are expensive. Hi Micah, The patch looks ok, except for some minor issues: + void setSelectIsExpensive(bool isExpensive = true) { + SelectIsExpensive = isExpensive; Please avoid tabs. + /// isJumpExpensive() - Return true if true if Flow Control is an + /// expensive operation that should be avoided Please end the comment with a . + /// JumpIsExpensive - Tells the code generator not to expand operations + /// into sequences that increase the amount of flow control if possible + void setJumpIsExpensive(bool isExpensive = true) { + JumpIsExpensive = isExpensive; likewise ^2 + /// JumpIsExpensive - Tells the code generator that it shouldn't + /// generate extra flow control instructions and should attempt to + /// combine flow control instructions via predication end comment with a . I was planning to just apply this for you and tweak it, but your patch format isn't accepted by the 'patch' command. -Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/edd6cc73/attachment-0001.html From grosbach at apple.com Mon Nov 29 17:41:11 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 23:41:11 -0000 Subject: [llvm-commits] [llvm] r120350 - /llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Message-ID: <20101129234111.0E7C22A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 17:41:10 2010 New Revision: 120350 URL: http://llvm.org/viewvc/llvm-project?rev=120350&view=rev Log: Add a few missing initializers. Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=120350&r1=120349&r2=120350&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original) +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Nov 29 17:41:10 2010 @@ -634,8 +634,8 @@ int OffsetRegNum = 0; bool OffsetRegShifted = false; - enum ShiftType ShiftType; - const MCExpr *ShiftAmount; + enum ShiftType ShiftType = Lsl; + const MCExpr *ShiftAmount = 0; const MCExpr *Offset = 0; const AsmToken &NextTok = Parser.getTok(); From echristo at apple.com Mon Nov 29 17:46:15 2010 From: echristo at apple.com (Eric Christopher) Date: Mon, 29 Nov 2010 15:46:15 -0800 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: References: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> Message-ID: On Nov 29, 2010, at 3:42 PM, Villmow, Micah wrote: > Thanks for the tips, I'll regenerate the patch, what is the command you usually use to generate a patch? > > 'svn diff' usually, what were you using? -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/1dedf0bd/attachment.html From Micah.Villmow at amd.com Mon Nov 29 17:50:42 2010 From: Micah.Villmow at amd.com (Villmow, Micah) Date: Mon, 29 Nov 2010 17:50:42 -0600 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: References: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> Message-ID: p4 diff :) From: Eric Christopher [mailto:echristo at apple.com] Sent: Monday, November 29, 2010 3:46 PM To: Villmow, Micah Cc: llvm-commits Subject: Re: [llvm-commits] Patch for Bug7696 On Nov 29, 2010, at 3:42 PM, Villmow, Micah wrote: Thanks for the tips, I'll regenerate the patch, what is the command you usually use to generate a patch? 'svn diff' usually, what were you using? -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/34254857/attachment.html From grosbach at apple.com Mon Nov 29 17:48:41 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 23:48:41 -0000 Subject: [llvm-commits] [llvm] r120353 - in /llvm/trunk/lib/Target/ARM: ARMInstrFormats.td ARMInstrInfo.td Message-ID: <20101129234841.600D72A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 17:48:41 2010 New Revision: 120353 URL: http://llvm.org/viewvc/llvm-project?rev=120353&view=rev Log: Parameterize ARMPseudoInst size property. Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120353&r1=120352&r2=120353&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Mon Nov 29 17:48:41 2010 @@ -246,12 +246,10 @@ } // PseudoInst that's ARM-mode only. -class ARMPseudoInst pattern> : PseudoInst { - // Default these to 4byte size, as they're almost always expanded to a - // single instruction. Any exceptions can override the SZ field value. - let SZ = Size4Bytes; + let SZ = sz; list Predicates = [IsARM]; } Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120353&r1=120352&r2=120353&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 17:48:41 2010 @@ -1128,40 +1128,40 @@ // Address computation and loads and stores in PIC mode. let isNotDuplicable = 1 in { -def PICADD : ARMPseudoInst<(outs GPR:$dst), (ins GPR:$a, pclabel:$cp, pred:$p), - IIC_iALUr, - [(set GPR:$dst, (ARMpic_add GPR:$a, imm:$cp))]>; +def PICADD : ARMPseudoInst<(outs GPR:$dst), (ins GPR:$a, pclabel:$cp, pred:$p), + Size4Bytes, IIC_iALUr, + [(set GPR:$dst, (ARMpic_add GPR:$a, imm:$cp))]>; let AddedComplexity = 10 in { def PICLDR : ARMPseudoInst<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p), - IIC_iLoad_r, + Size4Bytes, IIC_iLoad_r, [(set GPR:$dst, (load addrmodepc:$addr))]>; def PICLDRH : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p), - IIC_iLoad_bh_r, + Size4Bytes, IIC_iLoad_bh_r, [(set GPR:$Rt, (zextloadi16 addrmodepc:$addr))]>; def PICLDRB : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p), - IIC_iLoad_bh_r, + Size4Bytes, IIC_iLoad_bh_r, [(set GPR:$Rt, (zextloadi8 addrmodepc:$addr))]>; def PICLDRSH : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p), - IIC_iLoad_bh_r, + Size4Bytes, IIC_iLoad_bh_r, [(set GPR:$Rt, (sextloadi16 addrmodepc:$addr))]>; def PICLDRSB : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p), - IIC_iLoad_bh_r, + Size4Bytes, IIC_iLoad_bh_r, [(set GPR:$Rt, (sextloadi8 addrmodepc:$addr))]>; } let AddedComplexity = 10 in { def PICSTR : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p), - IIC_iStore_r, [(store GPR:$src, addrmodepc:$addr)]>; + Size4Bytes, IIC_iStore_r, [(store GPR:$src, addrmodepc:$addr)]>; def PICSTRH : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p), - IIC_iStore_bh_r, [(truncstorei16 GPR:$src, addrmodepc:$addr)]>; + Size4Bytes, IIC_iStore_bh_r, [(truncstorei16 GPR:$src, addrmodepc:$addr)]>; def PICSTRB : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p), - IIC_iStore_bh_r, [(truncstorei8 GPR:$src, addrmodepc:$addr)]>; + Size4Bytes, IIC_iStore_bh_r, [(truncstorei8 GPR:$src, addrmodepc:$addr)]>; } } // isNotDuplicable = 1 @@ -1430,26 +1430,20 @@ let isNotDuplicable = 1, isIndirectBranch = 1 in { def BR_JTr : ARMPseudoInst<(outs), (ins GPR:$target, i32imm:$jt, i32imm:$id), - IIC_Br, - [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]> { - let SZ = SizeSpecial; - } + SizeSpecial, IIC_Br, + [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]>; // FIXME: This shouldn't use the generic "addrmode2," but rather be split // into i12 and rs suffixed versions. def BR_JTm : ARMPseudoInst<(outs), (ins addrmode2:$target, i32imm:$jt, i32imm:$id), - IIC_Br, + SizeSpecial, IIC_Br, [(ARMbrjt (i32 (load addrmode2:$target)), tjumptable:$jt, - imm:$id)]> { - let SZ = SizeSpecial; - } + imm:$id)]>; def BR_JTadd : ARMPseudoInst<(outs), (ins GPR:$target, GPR:$idx, i32imm:$jt, i32imm:$id), - IIC_Br, + SizeSpecial, IIC_Br, [(ARMbrjt (add GPR:$target, GPR:$idx), tjumptable:$jt, - imm:$id)]> { - let SZ = SizeSpecial; - } + imm:$id)]>; } // isNotDuplicable = 1, isIndirectBranch = 1 } // isBarrier = 1 From echristo at apple.com Mon Nov 29 17:52:08 2010 From: echristo at apple.com (Eric Christopher) Date: Mon, 29 Nov 2010 15:52:08 -0800 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: References: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> Message-ID: <9FD2A1AA-071C-48C2-9EDE-B521F62ECC10@apple.com> On Nov 29, 2010, at 3:50 PM, Villmow, Micah wrote: > p4 diff :) > > Aiee :) From looking at the docs it looks like you want: -du unified output format, showing added and deleted lines with sufficient context for compatibility with the patch(1) utility. with p4 diff. -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/34b1772c/attachment.html From rafael.espindola at gmail.com Mon Nov 29 17:53:28 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Mon, 29 Nov 2010 18:53:28 -0500 Subject: [llvm-commits] [Review request] Add the feature "sh" for LLVM::Other/close-stderr.ll, for MSVC In-Reply-To: References: Message-ID: > It *succeeds unexpected* on MSYS-mingw bash. :) > IMHO I prefer to avoid XFAIL as possible. I see, and I take there is no way to XFAIL this on "regular" Windows but not mingw. I am no shell expert. Chandler, is there a portable way to cause stderr to be closed? We could write this in python, but having an extra script for just for this test is bad too. If no one has a better idea, the patch is fine. Just use a more descriptive name like "posix_shell" or just "shell" :-) > ps. my all proposals are; > https://github.com/chapuni/llvm-mirror/tree/msys-shared > (excuse me, some commits have Japanese logs) > > ...Takumi > Cheers, Rafael From grosbach at apple.com Mon Nov 29 17:51:31 2010 From: grosbach at apple.com (Jim Grosbach) Date: Mon, 29 Nov 2010 23:51:31 -0000 Subject: [llvm-commits] [llvm] r120354 - /llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Message-ID: <20101129235131.C68862A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 17:51:31 2010 New Revision: 120354 URL: http://llvm.org/viewvc/llvm-project?rev=120354&view=rev Log: Simplify definitions of the ARM eh.sjlj.*jmp pseudo instructions. Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120354&r1=120353&r2=120354&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 17:51:31 2010 @@ -3269,9 +3269,8 @@ D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31 ], hasSideEffects = 1, isBarrier = 1 in { - def Int_eh_sjlj_setjmp : XI<(outs), (ins GPR:$src, GPR:$val), - AddrModeNone, SizeSpecial, IndexModeNone, - Pseudo, NoItinerary, "", "", + def Int_eh_sjlj_setjmp : PseudoInst<(outs), (ins GPR:$src, GPR:$val), + NoItinerary, [(set R0, (ARMeh_sjlj_setjmp GPR:$src, GPR:$val))]>, Requires<[IsARM, HasVFP2]>; } @@ -3279,9 +3278,8 @@ let Defs = [ R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, LR ], hasSideEffects = 1, isBarrier = 1 in { - def Int_eh_sjlj_setjmp_nofp : XI<(outs), (ins GPR:$src, GPR:$val), - AddrModeNone, SizeSpecial, IndexModeNone, - Pseudo, NoItinerary, "", "", + def Int_eh_sjlj_setjmp_nofp : PseudoInst<(outs), (ins GPR:$src, GPR:$val), + NoItinerary, [(set R0, (ARMeh_sjlj_setjmp GPR:$src, GPR:$val))]>, Requires<[IsARM, NoVFP]>; } @@ -3289,9 +3287,8 @@ // FIXME: Non-Darwin version(s) let isBarrier = 1, hasSideEffects = 1, isTerminator = 1, Defs = [ R7, LR, SP ] in { -def Int_eh_sjlj_longjmp : XI<(outs), (ins GPR:$src, GPR:$scratch), - AddrModeNone, SizeSpecial, IndexModeNone, - Pseudo, NoItinerary, "", "", +def Int_eh_sjlj_longjmp : PseudoInst<(outs), (ins GPR:$src, GPR:$scratch), + NoItinerary, [(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>, Requires<[IsARM, IsDarwin]>; } From bob.wilson at apple.com Mon Nov 29 18:00:36 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Tue, 30 Nov 2010 00:00:36 -0000 Subject: [llvm-commits] [llvm] r120356 - in /llvm/trunk: lib/Target/ARM/ARMExpandPseudoInsts.cpp lib/Target/ARM/ARMISelDAGToDAG.cpp lib/Target/ARM/ARMInstrNEON.td lib/Target/ARM/ARMSchedule.td lib/Target/ARM/ARMScheduleA8.td lib/Target/ARM/ARMScheduleA9.td test/CodeGen/ARM/vlddup.ll Message-ID: <20101130000036.411A92A6C12D@llvm.org> Author: bwilson Date: Mon Nov 29 18:00:35 2010 New Revision: 120356 URL: http://llvm.org/viewvc/llvm-project?rev=120356&view=rev Log: Add support for NEON VLD3-dup instructions. The encoding for alignment in VLD4-dup instructions is still a work in progress. Modified: llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp llvm/trunk/lib/Target/ARM/ARMInstrNEON.td llvm/trunk/lib/Target/ARM/ARMSchedule.td llvm/trunk/lib/Target/ARM/ARMScheduleA8.td llvm/trunk/lib/Target/ARM/ARMScheduleA9.td llvm/trunk/test/CodeGen/ARM/vlddup.ll Modified: llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp?rev=120356&r1=120355&r2=120356&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMExpandPseudoInsts.cpp Mon Nov 29 18:00:35 2010 @@ -204,6 +204,13 @@ { ARM::VLD3q8Pseudo_UPD, ARM::VLD3q8_UPD, true, true, EvenDblSpc, 3, 8 }, { ARM::VLD3q8oddPseudo_UPD, ARM::VLD3q8_UPD, true, true, OddDblSpc, 3, 8 }, +{ ARM::VLD4DUPd16Pseudo, ARM::VLD4DUPd16, true, false, SingleSpc, 4, 4}, +{ ARM::VLD4DUPd16Pseudo_UPD, ARM::VLD4DUPd16_UPD, true, true, SingleSpc, 4, 4}, +{ ARM::VLD4DUPd32Pseudo, ARM::VLD4DUPd32, true, false, SingleSpc, 4, 2}, +{ ARM::VLD4DUPd32Pseudo_UPD, ARM::VLD4DUPd32_UPD, true, true, SingleSpc, 4, 2}, +{ ARM::VLD4DUPd8Pseudo, ARM::VLD4DUPd8, true, false, SingleSpc, 4, 8}, +{ ARM::VLD4DUPd8Pseudo_UPD, ARM::VLD4DUPd8_UPD, true, true, SingleSpc, 4, 8}, + { ARM::VLD4LNd16Pseudo, ARM::VLD4LNd16, true, false, SingleSpc, 4, 4 }, { ARM::VLD4LNd16Pseudo_UPD, ARM::VLD4LNd16_UPD, true, true, SingleSpc, 4, 4 }, { ARM::VLD4LNd32Pseudo, ARM::VLD4LNd32, true, false, SingleSpc, 4, 2 }, @@ -959,6 +966,12 @@ case ARM::VLD3DUPd8Pseudo_UPD: case ARM::VLD3DUPd16Pseudo_UPD: case ARM::VLD3DUPd32Pseudo_UPD: + case ARM::VLD4DUPd8Pseudo: + case ARM::VLD4DUPd16Pseudo: + case ARM::VLD4DUPd32Pseudo: + case ARM::VLD4DUPd8Pseudo_UPD: + case ARM::VLD4DUPd16Pseudo_UPD: + case ARM::VLD4DUPd32Pseudo_UPD: ExpandVLD(MBBI); break; Modified: llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp?rev=120356&r1=120355&r2=120356&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Nov 29 18:00:35 2010 @@ -2367,6 +2367,12 @@ return SelectVLDDup(N, 3, Opcodes); } + case ARMISD::VLD4DUP: { + unsigned Opcodes[] = { ARM::VLD4DUPd8Pseudo, ARM::VLD4DUPd16Pseudo, + ARM::VLD4DUPd32Pseudo }; + return SelectVLDDup(N, 4, Opcodes); + } + case ISD::INTRINSIC_VOID: case ISD::INTRINSIC_W_CHAIN: { unsigned IntNo = cast(N->getOperand(1))->getZExtValue(); Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrNEON.td?rev=120356&r1=120355&r2=120356&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrNEON.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Mon Nov 29 18:00:35 2010 @@ -939,7 +939,59 @@ def VLD3DUPd32Pseudo_UPD : VLDQQWBPseudo; // VLD4DUP : Vector Load (single 4-element structure to all lanes) -// FIXME: Not yet implemented. +class VLD4DUP op7_4, string Dt> + : NLdSt<1, 0b10, 0b1111, op7_4, + (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4), + (ins addrmode6:$Rn), IIC_VLD4dup, + "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn", "", []> { + let Rm = 0b1111; +} + +def VLD4DUPd8 : VLD4DUP<{0,0,0,?}, "8"> { let Inst{4} = Rn{4}; } +def VLD4DUPd16 : VLD4DUP<{0,1,0,?}, "16"> { let Inst{4} = Rn{4}; } +def VLD4DUPd32 : VLD4DUP<{1,?,0,?}, "32"> { + let Inst{6} = Rn{5}; + let Inst{4} = Rn{5}; +} + +def VLD4DUPd8Pseudo : VLDQQPseudo; +def VLD4DUPd16Pseudo : VLDQQPseudo; +def VLD4DUPd32Pseudo : VLDQQPseudo; + +// ...with double-spaced registers (not used for codegen): +def VLD4DUPd8x2 : VLD4DUP<{0,0,1,?}, "8"> { let Inst{4} = Rn{4}; } +def VLD4DUPd16x2 : VLD4DUP<{0,1,1,?}, "16"> { let Inst{4} = Rn{4}; } +def VLD4DUPd32x2 : VLD4DUP<{1,?,1,?}, "32"> { + let Inst{6} = Rn{5}; + let Inst{4} = Rn{5}; +} + +// ...with address register writeback: +class VLD4DUPWB op7_4, string Dt> + : NLdSt<1, 0b10, 0b1111, op7_4, + (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb), + (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD4dupu, + "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn$Rm", + "$Rn.addr = $wb", []>; + +def VLD4DUPd8_UPD : VLD4DUPWB<{0,0,0,0}, "8"> { let Inst{4} = Rn{4}; } +def VLD4DUPd16_UPD : VLD4DUPWB<{0,1,0,?}, "16"> { let Inst{4} = Rn{4}; } +def VLD4DUPd32_UPD : VLD4DUPWB<{1,?,0,?}, "32"> { + let Inst{6} = Rn{5}; + let Inst{4} = Rn{5}; +} + +def VLD4DUPd8x2_UPD : VLD4DUPWB<{0,0,1,0}, "8"> { let Inst{4} = Rn{4}; } +def VLD4DUPd16x2_UPD : VLD4DUPWB<{0,1,1,?}, "16"> { let Inst{4} = Rn{4}; } +def VLD4DUPd32x2_UPD : VLD4DUPWB<{1,?,1,?}, "32"> { + let Inst{6} = Rn{5}; + let Inst{4} = Rn{5}; +} + +def VLD4DUPd8Pseudo_UPD : VLDQQWBPseudo; +def VLD4DUPd16Pseudo_UPD : VLDQQWBPseudo; +def VLD4DUPd32Pseudo_UPD : VLDQQWBPseudo; + } // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in { Modified: llvm/trunk/lib/Target/ARM/ARMSchedule.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMSchedule.td?rev=120356&r1=120355&r2=120356&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMSchedule.td (original) +++ llvm/trunk/lib/Target/ARM/ARMSchedule.td Mon Nov 29 18:00:35 2010 @@ -158,6 +158,8 @@ def IIC_VLD4ln : InstrItinClass; def IIC_VLD4u : InstrItinClass; def IIC_VLD4lnu : InstrItinClass; +def IIC_VLD4dup : InstrItinClass; +def IIC_VLD4dupu : InstrItinClass; def IIC_VST1 : InstrItinClass; def IIC_VST1x2 : InstrItinClass; def IIC_VST1x3 : InstrItinClass; Modified: llvm/trunk/lib/Target/ARM/ARMScheduleA8.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMScheduleA8.td?rev=120356&r1=120355&r2=120356&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMScheduleA8.td (original) +++ llvm/trunk/lib/Target/ARM/ARMScheduleA8.td Mon Nov 29 18:00:35 2010 @@ -595,6 +595,18 @@ InstrStage<5, [A8_LSPipe]>], [4, 4, 5, 5, 2, 1, 1, 1, 1, 1, 2, 2]>, // + // VLD4dup + InstrItinData, + InstrStage<3, [A8_NLSPipe], 0>, + InstrStage<3, [A8_LSPipe]>], + [2, 2, 3, 3, 1]>, + // + // VLD4dupu + InstrItinData, + InstrStage<3, [A8_NLSPipe], 0>, + InstrStage<3, [A8_LSPipe]>], + [2, 2, 3, 3, 2, 1, 1]>, + // // VST1 InstrItinData, InstrStage<2, [A8_NLSPipe], 0>, Modified: llvm/trunk/lib/Target/ARM/ARMScheduleA9.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMScheduleA9.td?rev=120356&r1=120355&r2=120356&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMScheduleA9.td (original) +++ llvm/trunk/lib/Target/ARM/ARMScheduleA9.td Mon Nov 29 18:00:35 2010 @@ -995,6 +995,24 @@ InstrStage<5, [A9_LSUnit]>], [5, 5, 6, 6, 2, 1, 1, 1, 1, 1, 2, 2]>, // + // VLD4dup + InstrItinData, + InstrStage<1, [A9_MUX0], 0>, + InstrStage<1, [A9_DRegsN], 0, Required>, + InstrStage<9, [A9_DRegsVFP], 0, Reserved>, + InstrStage<3, [A9_NPipe], 0>, + InstrStage<3, [A9_LSUnit]>], + [3, 3, 4, 4, 1]>, + // + // VLD4dupu + InstrItinData, + InstrStage<1, [A9_MUX0], 0>, + InstrStage<1, [A9_DRegsN], 0, Required>, + InstrStage<9, [A9_DRegsVFP], 0, Reserved>, + InstrStage<3, [A9_NPipe], 0>, + InstrStage<3, [A9_LSUnit]>], + [3, 3, 4, 4, 2, 1, 1]>, + // // VST1 InstrItinData, InstrStage<1, [A9_MUX0], 0>, Modified: llvm/trunk/test/CodeGen/ARM/vlddup.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/vlddup.ll?rev=120356&r1=120355&r2=120356&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/vlddup.ll (original) +++ llvm/trunk/test/CodeGen/ARM/vlddup.ll Mon Nov 29 18:00:35 2010 @@ -91,3 +91,26 @@ } declare %struct.__neon_int16x4x3_t @llvm.arm.neon.vld3lane.v4i16(i16*, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind readonly + +%struct.__neon_int32x2x4_t = type { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } + +define <2 x i32> @vld4dupi32(i32* %A) nounwind { +;CHECK: vld4dupi32: +;Check the alignment value. Max for this instruction is 128 bits: +;CHECK: vld4.32 {d16[], d17[], d18[], d19[]}, [r0, :128] + %tmp0 = tail call %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i32* %A, <2 x i32> undef, <2 x i32> undef, <2 x i32> undef, <2 x i32> undef, i32 0, i32 32) + %tmp1 = extractvalue %struct.__neon_int32x2x4_t %tmp0, 0 + %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer + %tmp3 = extractvalue %struct.__neon_int32x2x4_t %tmp0, 1 + %tmp4 = shufflevector <2 x i32> %tmp3, <2 x i32> undef, <2 x i32> zeroinitializer + %tmp5 = extractvalue %struct.__neon_int32x2x4_t %tmp0, 2 + %tmp6 = shufflevector <2 x i32> %tmp5, <2 x i32> undef, <2 x i32> zeroinitializer + %tmp7 = extractvalue %struct.__neon_int32x2x4_t %tmp0, 3 + %tmp8 = shufflevector <2 x i32> %tmp7, <2 x i32> undef, <2 x i32> zeroinitializer + %tmp9 = add <2 x i32> %tmp2, %tmp4 + %tmp10 = add <2 x i32> %tmp6, %tmp8 + %tmp11 = add <2 x i32> %tmp9, %tmp10 + ret <2 x i32> %tmp11 +} + +declare %struct.__neon_int32x2x4_t @llvm.arm.neon.vld4lane.v2i32(i32*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind readonly From bob.wilson at apple.com Mon Nov 29 18:00:38 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Tue, 30 Nov 2010 00:00:38 -0000 Subject: [llvm-commits] [llvm] r120357 - /llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Message-ID: <20101130000039.0EF592A6C12F@llvm.org> Author: bwilson Date: Mon Nov 29 18:00:38 2010 New Revision: 120357 URL: http://llvm.org/viewvc/llvm-project?rev=120357&view=rev Log: Rename VLDnDUP instructions with double-spaced registers in an attempt to make things a little more consistent. Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrNEON.td?rev=120357&r1=120356&r2=120357&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrNEON.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Mon Nov 29 18:00:38 2010 @@ -871,9 +871,9 @@ def VLD2DUPd32Pseudo : VLDQPseudo; // ...with double-spaced registers (not used for codegen): -def VLD2DUPd8Q : VLD2DUP<{0,0,1,?}, "8">; -def VLD2DUPd16Q : VLD2DUP<{0,1,1,?}, "16">; -def VLD2DUPd32Q : VLD2DUP<{1,0,1,?}, "32">; +def VLD2DUPd8x2 : VLD2DUP<{0,0,1,?}, "8">; +def VLD2DUPd16x2 : VLD2DUP<{0,1,1,?}, "16">; +def VLD2DUPd32x2 : VLD2DUP<{1,0,1,?}, "32">; // ...with address register writeback: class VLD2DUPWB op7_4, string Dt> @@ -887,9 +887,9 @@ def VLD2DUPd16_UPD : VLD2DUPWB<{0,1,0,?}, "16">; def VLD2DUPd32_UPD : VLD2DUPWB<{1,0,0,?}, "32">; -def VLD2DUPd8Q_UPD : VLD2DUPWB<{0,0,1,0}, "8">; -def VLD2DUPd16Q_UPD : VLD2DUPWB<{0,1,1,?}, "16">; -def VLD2DUPd32Q_UPD : VLD2DUPWB<{1,0,1,?}, "32">; +def VLD2DUPd8x2_UPD : VLD2DUPWB<{0,0,1,0}, "8">; +def VLD2DUPd16x2_UPD : VLD2DUPWB<{0,1,1,?}, "16">; +def VLD2DUPd32x2_UPD : VLD2DUPWB<{1,0,1,?}, "32">; def VLD2DUPd8Pseudo_UPD : VLDQWBPseudo; def VLD2DUPd16Pseudo_UPD : VLDQWBPseudo; @@ -913,9 +913,9 @@ def VLD3DUPd32Pseudo : VLDQQPseudo; // ...with double-spaced registers (not used for codegen): -def VLD3DUPd8T : VLD3DUP<{0,0,1,?}, "8">; -def VLD3DUPd16T : VLD3DUP<{0,1,1,?}, "16">; -def VLD3DUPd32T : VLD3DUP<{1,0,1,?}, "32">; +def VLD3DUPd8x2 : VLD3DUP<{0,0,1,?}, "8">; +def VLD3DUPd16x2 : VLD3DUP<{0,1,1,?}, "16">; +def VLD3DUPd32x2 : VLD3DUP<{1,0,1,?}, "32">; // ...with address register writeback: class VLD3DUPWB op7_4, string Dt> @@ -930,9 +930,9 @@ def VLD3DUPd16_UPD : VLD3DUPWB<{0,1,0,?}, "16">; def VLD3DUPd32_UPD : VLD3DUPWB<{1,0,0,?}, "32">; -def VLD3DUPd8T_UPD : VLD3DUPWB<{0,0,1,0}, "8">; -def VLD3DUPd16T_UPD : VLD3DUPWB<{0,1,1,?}, "16">; -def VLD3DUPd32T_UPD : VLD3DUPWB<{1,0,1,?}, "32">; +def VLD3DUPd8x2_UPD : VLD3DUPWB<{0,0,1,0}, "8">; +def VLD3DUPd16x2_UPD : VLD3DUPWB<{0,1,1,?}, "16">; +def VLD3DUPd32x2_UPD : VLD3DUPWB<{1,0,1,?}, "32">; def VLD3DUPd8Pseudo_UPD : VLDQQWBPseudo; def VLD3DUPd16Pseudo_UPD : VLDQQWBPseudo; From bob.wilson at apple.com Mon Nov 29 18:00:42 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Tue, 30 Nov 2010 00:00:42 -0000 Subject: [llvm-commits] [llvm] r120358 - in /llvm/trunk: lib/Target/ARM/ARMCodeEmitter.cpp lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMInstrNEON.td lib/Target/ARM/ARMMCCodeEmitter.cpp utils/TableGen/EDEmitter.cpp Message-ID: <20101130000042.DBCE32A6C130@llvm.org> Author: bwilson Date: Mon Nov 29 18:00:42 2010 New Revision: 120358 URL: http://llvm.org/viewvc/llvm-project?rev=120358&view=rev Log: Fix the encoding of VLD4-dup alignment. The only reasonable way I could find to do this is to provide an alternate version of the addrmode6 operand with a different encoding function. Use it for all the VLD-dup instructions for the sake of consistency. Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp llvm/trunk/lib/Target/ARM/ARMInstrInfo.td llvm/trunk/lib/Target/ARM/ARMInstrNEON.td llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp llvm/trunk/utils/TableGen/EDEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=120358&r1=120357&r2=120358&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Mon Nov 29 18:00:42 2010 @@ -191,6 +191,8 @@ const { return 0; } unsigned getAddrMode6AddressOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } + unsigned getAddrMode6DupAddressOpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } unsigned getAddrMode6OffsetOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } unsigned getBitfieldInvertedMaskOpValue(const MachineInstr &MI, Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120358&r1=120357&r2=120358&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 18:00:42 2010 @@ -540,6 +540,15 @@ let EncoderMethod = "getAddrMode6OffsetOpValue"; } +// Special version of addrmode6 to handle alignment encoding for VLD-dup +// instructions, specifically VLD4-dup. +def addrmode6dup : Operand, + ComplexPattern{ + let PrintMethod = "printAddrMode6Operand"; + let MIOperandInfo = (ops GPR:$addr, i32imm); + let EncoderMethod = "getAddrMode6DupAddressOpValue"; +} + // addrmodepc := pc + reg // def addrmodepc : Operand, Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrNEON.td?rev=120358&r1=120357&r2=120358&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrNEON.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Mon Nov 29 18:00:42 2010 @@ -794,15 +794,15 @@ // VLD1DUP : Vector Load (single element to all lanes) class VLD1DUP op7_4, string Dt, ValueType Ty, PatFrag LoadOp> - : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd), (ins addrmode6:$Rn), + : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd), (ins addrmode6dup:$Rn), IIC_VLD1dup, "vld1", Dt, "\\{$Vd[]\\}, $Rn", "", - [(set DPR:$Vd, (Ty (NEONvdup (i32 (LoadOp addrmode6:$Rn)))))]> { + [(set DPR:$Vd, (Ty (NEONvdup (i32 (LoadOp addrmode6dup:$Rn)))))]> { let Rm = 0b1111; let Inst{4} = Rn{4}; } class VLD1QDUPPseudo : VLDQPseudo { let Pattern = [(set QPR:$dst, - (Ty (NEONvdup (i32 (LoadOp addrmode6:$addr)))))]; + (Ty (NEONvdup (i32 (LoadOp addrmode6dup:$addr)))))]; } def VLD1DUPd8 : VLD1DUP<{0,0,0,?}, "8", v8i8, extloadi8>; @@ -817,7 +817,7 @@ class VLD1QDUP op7_4, string Dt, ValueType Ty, PatFrag LoadOp> : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, DPR:$dst2), - (ins addrmode6:$Rn), IIC_VLD1dup, + (ins addrmode6dup:$Rn), IIC_VLD1dup, "vld1", Dt, "\\{$Vd[], $dst2[]\\}, $Rn", "", []> { let Rm = 0b1111; let Inst{4} = Rn{4}; @@ -830,13 +830,13 @@ // ...with address register writeback: class VLD1DUPWB op7_4, string Dt> : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, GPR:$wb), - (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD1dupu, + (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD1dupu, "vld1", Dt, "\\{$Vd[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> { let Inst{4} = Rn{4}; } class VLD1QDUPWB op7_4, string Dt> : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb), - (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD1dupu, + (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD1dupu, "vld1", Dt, "\\{$Vd[], $dst2[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> { let Inst{4} = Rn{4}; } @@ -856,7 +856,7 @@ // VLD2DUP : Vector Load (single 2-element structure to all lanes) class VLD2DUP op7_4, string Dt> : NLdSt<1, 0b10, 0b1101, op7_4, (outs DPR:$Vd, DPR:$dst2), - (ins addrmode6:$Rn), IIC_VLD2dup, + (ins addrmode6dup:$Rn), IIC_VLD2dup, "vld2", Dt, "\\{$Vd[], $dst2[]\\}, $Rn", "", []> { let Rm = 0b1111; let Inst{4} = Rn{4}; @@ -878,7 +878,7 @@ // ...with address register writeback: class VLD2DUPWB op7_4, string Dt> : NLdSt<1, 0b10, 0b1101, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb), - (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD2dupu, + (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD2dupu, "vld2", Dt, "\\{$Vd[], $dst2[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> { let Inst{4} = Rn{4}; } @@ -898,7 +898,7 @@ // VLD3DUP : Vector Load (single 3-element structure to all lanes) class VLD3DUP op7_4, string Dt> : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3), - (ins addrmode6:$Rn), IIC_VLD3dup, + (ins addrmode6dup:$Rn), IIC_VLD3dup, "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn", "", []> { let Rm = 0b1111; let Inst{4} = Rn{4}; @@ -920,7 +920,7 @@ // ...with address register writeback: class VLD3DUPWB op7_4, string Dt> : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb), - (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD3dupu, + (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD3dupu, "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> { let Inst{4} = Rn{4}; @@ -942,51 +942,42 @@ class VLD4DUP op7_4, string Dt> : NLdSt<1, 0b10, 0b1111, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4), - (ins addrmode6:$Rn), IIC_VLD4dup, + (ins addrmode6dup:$Rn), IIC_VLD4dup, "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn", "", []> { let Rm = 0b1111; + let Inst{4} = Rn{4}; } -def VLD4DUPd8 : VLD4DUP<{0,0,0,?}, "8"> { let Inst{4} = Rn{4}; } -def VLD4DUPd16 : VLD4DUP<{0,1,0,?}, "16"> { let Inst{4} = Rn{4}; } -def VLD4DUPd32 : VLD4DUP<{1,?,0,?}, "32"> { - let Inst{6} = Rn{5}; - let Inst{4} = Rn{5}; -} +def VLD4DUPd8 : VLD4DUP<{0,0,0,?}, "8">; +def VLD4DUPd16 : VLD4DUP<{0,1,0,?}, "16">; +def VLD4DUPd32 : VLD4DUP<{1,?,0,?}, "32"> { let Inst{6} = Rn{5}; } def VLD4DUPd8Pseudo : VLDQQPseudo; def VLD4DUPd16Pseudo : VLDQQPseudo; def VLD4DUPd32Pseudo : VLDQQPseudo; // ...with double-spaced registers (not used for codegen): -def VLD4DUPd8x2 : VLD4DUP<{0,0,1,?}, "8"> { let Inst{4} = Rn{4}; } -def VLD4DUPd16x2 : VLD4DUP<{0,1,1,?}, "16"> { let Inst{4} = Rn{4}; } -def VLD4DUPd32x2 : VLD4DUP<{1,?,1,?}, "32"> { - let Inst{6} = Rn{5}; - let Inst{4} = Rn{5}; -} +def VLD4DUPd8x2 : VLD4DUP<{0,0,1,?}, "8">; +def VLD4DUPd16x2 : VLD4DUP<{0,1,1,?}, "16">; +def VLD4DUPd32x2 : VLD4DUP<{1,?,1,?}, "32"> { let Inst{6} = Rn{5}; } // ...with address register writeback: class VLD4DUPWB op7_4, string Dt> : NLdSt<1, 0b10, 0b1111, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb), - (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD4dupu, + (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD4dupu, "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn$Rm", - "$Rn.addr = $wb", []>; - -def VLD4DUPd8_UPD : VLD4DUPWB<{0,0,0,0}, "8"> { let Inst{4} = Rn{4}; } -def VLD4DUPd16_UPD : VLD4DUPWB<{0,1,0,?}, "16"> { let Inst{4} = Rn{4}; } -def VLD4DUPd32_UPD : VLD4DUPWB<{1,?,0,?}, "32"> { - let Inst{6} = Rn{5}; - let Inst{4} = Rn{5}; + "$Rn.addr = $wb", []> { + let Inst{4} = Rn{4}; } -def VLD4DUPd8x2_UPD : VLD4DUPWB<{0,0,1,0}, "8"> { let Inst{4} = Rn{4}; } -def VLD4DUPd16x2_UPD : VLD4DUPWB<{0,1,1,?}, "16"> { let Inst{4} = Rn{4}; } -def VLD4DUPd32x2_UPD : VLD4DUPWB<{1,?,1,?}, "32"> { - let Inst{6} = Rn{5}; - let Inst{4} = Rn{5}; -} +def VLD4DUPd8_UPD : VLD4DUPWB<{0,0,0,0}, "8">; +def VLD4DUPd16_UPD : VLD4DUPWB<{0,1,0,?}, "16">; +def VLD4DUPd32_UPD : VLD4DUPWB<{1,?,0,?}, "32"> { let Inst{6} = Rn{5}; } + +def VLD4DUPd8x2_UPD : VLD4DUPWB<{0,0,1,0}, "8">; +def VLD4DUPd16x2_UPD : VLD4DUPWB<{0,1,1,?}, "16">; +def VLD4DUPd32x2_UPD : VLD4DUPWB<{1,?,1,?}, "32"> { let Inst{6} = Rn{5}; } def VLD4DUPd8Pseudo_UPD : VLDQQWBPseudo; def VLD4DUPd16Pseudo_UPD : VLDQQWBPseudo; Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120358&r1=120357&r2=120358&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Mon Nov 29 18:00:42 2010 @@ -214,6 +214,8 @@ SmallVectorImpl &Fixups) const; unsigned getAddrMode6AddressOpValue(const MCInst &MI, unsigned Op, SmallVectorImpl &Fixups) const; + unsigned getAddrMode6DupAddressOpValue(const MCInst &MI, unsigned Op, + SmallVectorImpl &Fixups) const; unsigned getAddrMode6OffsetOpValue(const MCInst &MI, unsigned Op, SmallVectorImpl &Fixups) const; @@ -775,6 +777,8 @@ return Binary; } +/// getAddrMode6AddressOpValue - Encode an addrmode6 register number along +/// with the alignment operand. unsigned ARMMCCodeEmitter:: getAddrMode6AddressOpValue(const MCInst &MI, unsigned Op, SmallVectorImpl &Fixups) const { @@ -796,6 +800,30 @@ return RegNo | (Align << 4); } +/// getAddrMode6DupAddressOpValue - Encode an addrmode6 register number and +/// alignment operand for use in VLD-dup instructions. This is the same as +/// getAddrMode6AddressOpValue except for the alignment encoding, which is +/// different for VLD4-dup. +unsigned ARMMCCodeEmitter:: +getAddrMode6DupAddressOpValue(const MCInst &MI, unsigned Op, + SmallVectorImpl &Fixups) const { + const MCOperand &Reg = MI.getOperand(Op); + const MCOperand &Imm = MI.getOperand(Op + 1); + + unsigned RegNo = getARMRegisterNumbering(Reg.getReg()); + unsigned Align = 0; + + switch (Imm.getImm()) { + default: break; + case 2: + case 4: + case 8: Align = 0x01; break; + case 16: Align = 0x03; break; + } + + return RegNo | (Align << 4); +} + unsigned ARMMCCodeEmitter:: getAddrMode6OffsetOpValue(const MCInst &MI, unsigned Op, SmallVectorImpl &Fixups) const { Modified: llvm/trunk/utils/TableGen/EDEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/EDEmitter.cpp?rev=120358&r1=120357&r2=120358&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/EDEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/EDEmitter.cpp Mon Nov 29 18:00:42 2010 @@ -606,6 +606,7 @@ MISC("addrmode5", "kOperandTypeARMAddrMode5"); // R, I MISC("addrmode6", "kOperandTypeARMAddrMode6"); // R, R, I, I MISC("am6offset", "kOperandTypeARMAddrMode6Offset"); // R, I, I + MISC("addrmode6dup", "kOperandTypeARMAddrMode6"); // R, R, I, I MISC("addrmodepc", "kOperandTypeARMAddrModePC"); // R, I MISC("reglist", "kOperandTypeARMRegisterList"); // I, R, ... MISC("dpr_reglist", "kOperandTypeARMDPRRegisterList"); // I, R, ... From sabre at nondot.org Mon Nov 29 18:01:19 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 00:01:19 -0000 Subject: [llvm-commits] [llvm] r120359 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130000119.B59932A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 18:01:19 2010 New Revision: 120359 URL: http://llvm.org/viewvc/llvm-project?rev=120359&view=rev Log: two changes to DSE that shouldn't affect anything: 1. Don't bother trying to optimize: lifetime.end(ptr) store(ptr) as it is undefined, and therefore shouldn't exist. 2. Move the 'storing a loaded pointer' xform up, simplifying the may-aliased store code. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120359&r1=120358&r2=120359&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 18:01:19 2010 @@ -204,10 +204,10 @@ // If we find a store or a free, get its memory dependence. if (!doesClobberMemory(Inst) && !isFreeCall(Inst)) continue; - + MemDepResult InstDep = MD.getDependency(Inst); - // Ignore non-local stores. + // Ignore non-local store liveness. // FIXME: cross-block DSE would be fun. :) if (InstDep.isNonLocal()) continue; @@ -216,7 +216,30 @@ MadeChange |= handleFreeWithNonTrivialDependency(F, Inst, InstDep); continue; } - + + // If we're storing the same value back to a pointer that we just + // loaded from, then the store can be removed. + if (StoreInst *SI = dyn_cast(Inst)) { + if (LoadInst *DepLoad = dyn_cast(InstDep.getInst())) { + if (SI->getPointerOperand() == DepLoad->getPointerOperand() && + SI->getOperand(0) == DepLoad) { + // DeleteDeadInstruction can delete the current instruction. Save BBI + // in case we need it. + WeakVH NextInst(BBI); + + DeleteDeadInstruction(SI); + + if (NextInst == 0) // Next instruction deleted. + BBI = BB.begin(); + else if (BBI != BB.begin()) // Revisit this instruction if possible. + --BBI; + ++NumFastStores; + MadeChange = true; + continue; + } + } + } + if (!InstDep.isDef()) { // If this is a may-aliased store that is clobbering the store value, we // can keep searching past it for another must-aliased pointer that stores @@ -234,20 +257,13 @@ InstDep = MD.getPointerDependencyFrom(Loc, false, InstDep.getInst(), &BB); } - - // If not a definite must-alias store dependency, ignore it. If this is a - // load from the same pointer, we don't want to transform load+store into - // a noop. - if (!InstDep.isDef() || !isa(InstDep.getInst())) - continue; } // If this is a store-store dependence, then the previous store is dead so // long as this store is at least as big as it. - if (doesClobberMemory(InstDep.getInst())) { + if (InstDep.isDef() && doesClobberMemory(InstDep.getInst())) { Instruction *DepStore = InstDep.getInst(); - if (isStoreAtLeastAsWideAs(Inst, DepStore, TD) && - isElidable(DepStore)) { + if (isStoreAtLeastAsWideAs(Inst, DepStore, TD) && isElidable(DepStore)) { // Delete the store and now-dead instructions that feed it. DeleteDeadInstruction(DepStore); ++NumFastStores; @@ -261,52 +277,6 @@ continue; } } - - if (!isElidable(Inst)) - continue; - - // If we're storing the same value back to a pointer that we just - // loaded from, then the store can be removed. - if (StoreInst *SI = dyn_cast(Inst)) { - if (LoadInst *DepLoad = dyn_cast(InstDep.getInst())) { - if (SI->getPointerOperand() == DepLoad->getPointerOperand() && - SI->getOperand(0) == DepLoad) { - // DeleteDeadInstruction can delete the current instruction. Save BBI - // in case we need it. - WeakVH NextInst(BBI); - - DeleteDeadInstruction(SI); - - if (NextInst == 0) // Next instruction deleted. - BBI = BB.begin(); - else if (BBI != BB.begin()) // Revisit this instruction if possible. - --BBI; - ++NumFastStores; - MadeChange = true; - continue; - } - } - } - - // If this is a lifetime end marker, we can throw away the store. - if (IntrinsicInst *II = dyn_cast(InstDep.getInst())) { - if (II->getIntrinsicID() == Intrinsic::lifetime_end) { - // Delete the store and now-dead instructions that feed it. - // DeleteDeadInstruction can delete the current instruction. Save BBI - // in case we need it. - WeakVH NextInst(BBI); - - DeleteDeadInstruction(Inst); - - if (NextInst == 0) // Next instruction deleted. - BBI = BB.begin(); - else if (BBI != BB.begin()) // Revisit this instruction if possible. - --BBI; - ++NumFastStores; - MadeChange = true; - continue; - } - } } // If this block ends in a return, unwind, or unreachable, all allocas are From isanbard at gmail.com Mon Nov 29 18:05:25 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 00:05:25 -0000 Subject: [llvm-commits] [llvm] r120360 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101130000525.EF2952A6C12D@llvm.org> Author: void Date: Mon Nov 29 18:05:25 2010 New Revision: 120360 URL: http://llvm.org/viewvc/llvm-project?rev=120360&view=rev Log: Predicate encoding should be withing {}s. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120360&r1=120359&r2=120360&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 18:05:25 2010 @@ -1243,13 +1243,13 @@ let neverHasSideEffects = 1 in { let isReMaterializable = 1 in def tLEApcrel : T1I<(outs tGPR:$dst), (ins i32imm:$label, pred:$p), IIC_iALUi, - "adr$p\t$dst, #$label", []>, + "adr${p}\t$dst, #$label", []>, T1Encoding<{1,0,1,0,0,?}>; // A6.2 & A8.6.10 } // neverHasSideEffects def tLEApcrelJT : T1I<(outs tGPR:$dst), (ins i32imm:$label, nohash_imm:$id, pred:$p), - IIC_iALUi, "adr$p\t$dst, #${label}_${id}", []>, + IIC_iALUi, "adr${p}\t$dst, #${label}_${id}", []>, T1Encoding<{1,0,1,0,0,?}>; // A6.2 & A8.6.10 //===----------------------------------------------------------------------===// From isanbard at gmail.com Mon Nov 29 18:08:20 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 00:08:20 -0000 Subject: [llvm-commits] [llvm] r120361 - in /llvm/trunk/lib/Target/ARM: ARMInstrInfo.td ARMInstrThumb.td Message-ID: <20101130000821.050D62A6C12D@llvm.org> Author: void Date: Mon Nov 29 18:08:20 2010 New Revision: 120361 URL: http://llvm.org/viewvc/llvm-project?rev=120361&view=rev Log: Predicate encoding should be withing {}s. And general cleanup. Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120361&r1=120360&r2=120361&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 18:08:20 2010 @@ -1177,19 +1177,17 @@ // LEApcrel - Load a pc-relative address into a register without offending the // assembler. -let neverHasSideEffects = 1 in { -let isReMaterializable = 1 in +let neverHasSideEffects = 1, isReMaterializable = 1 in // FIXME: We want one cannonical LEApcrel instruction and to express one or // both of these as pseudo-instructions that get expanded to it. def LEApcrel : AXI1<0, (outs GPR:$Rd), (ins i32imm:$label, pred:$p), MiscFrm, IIC_iALUi, - "adr$p\t$Rd, #$label", []>; + "adr${p}\t$Rd, #$label", []>; -} // neverHasSideEffects def LEApcrelJT : AXI1<0b0100, (outs GPR:$Rd), (ins i32imm:$label, nohash_imm:$id, pred:$p), MiscFrm, IIC_iALUi, - "adr$p\t$Rd, #${label}_${id}", []> { + "adr${p}\t$Rd, #${label}_${id}", []> { bits<4> p; bits<4> Rd; let Inst{31-28} = p; Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120361&r1=120360&r2=120361&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 18:08:20 2010 @@ -1240,13 +1240,11 @@ // tLEApcrel - Load a pc-relative address into a register without offending the // assembler. -let neverHasSideEffects = 1 in { -let isReMaterializable = 1 in +let neverHasSideEffects = 1, isReMaterializable = 1 in def tLEApcrel : T1I<(outs tGPR:$dst), (ins i32imm:$label, pred:$p), IIC_iALUi, "adr${p}\t$dst, #$label", []>, T1Encoding<{1,0,1,0,0,?}>; // A6.2 & A8.6.10 -} // neverHasSideEffects def tLEApcrelJT : T1I<(outs tGPR:$dst), (ins i32imm:$label, nohash_imm:$id, pred:$p), IIC_iALUi, "adr${p}\t$dst, #${label}_${id}", []>, From grosbach at apple.com Mon Nov 29 18:09:06 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 00:09:06 -0000 Subject: [llvm-commits] [llvm] r120362 - /llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Message-ID: <20101130000907.005A72A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 18:09:06 2010 New Revision: 120362 URL: http://llvm.org/viewvc/llvm-project?rev=120362&view=rev Log: Make a few more ARM pseudo instructions actually use the PseudoInst base class. Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120362&r1=120361&r2=120362&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 18:09:06 2010 @@ -1359,6 +1359,9 @@ // FIXME: These should probably be xformed into the non-TC versions of the // instructions as part of MC lowering. +// FIXME: These seem to be used for both Thumb and ARM instruction selection. +// Thumb should have its own version since the instruction is actually +// different, even though the mnemonic is the same. let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in { // Darwin versions. let Defs = [R0, R1, R2, R3, R9, R12, @@ -1366,21 +1369,19 @@ D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31, PC], Uses = [SP] in { - def TCRETURNdi : AInoP<(outs), (ins i32imm:$dst, variable_ops), - Pseudo, IIC_Br, - "@TC_RETURN","\t$dst", []>, Requires<[IsDarwin]>; - - def TCRETURNri : AInoP<(outs), (ins tcGPR:$dst, variable_ops), - Pseudo, IIC_Br, - "@TC_RETURN","\t$dst", []>, Requires<[IsDarwin]>; + def TCRETURNdi : PseudoInst<(outs), (ins i32imm:$dst, variable_ops), + IIC_Br, []>, Requires<[IsDarwin]>; + + def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops), + IIC_Br, []>, Requires<[IsDarwin]>; def TAILJMPd : ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops), IIC_Br, "b\t$dst @ TAILCALL", - []>, Requires<[IsDarwin]>; + []>, Requires<[IsARM, IsDarwin]>; def TAILJMPdt: ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops), IIC_Br, "b.w\t$dst @ TAILCALL", - []>, Requires<[IsDarwin]>; + []>, Requires<[IsThumb, IsDarwin]>; def TAILJMPr : AXI<(outs), (ins tcGPR:$dst, variable_ops), BrMiscFrm, IIC_Br, "bx\t$dst @ TAILCALL", @@ -1397,13 +1398,11 @@ D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30, D31, PC], Uses = [SP] in { - def TCRETURNdiND : AInoP<(outs), (ins i32imm:$dst, variable_ops), - Pseudo, IIC_Br, - "@TC_RETURN","\t$dst", []>, Requires<[IsNotDarwin]>; - - def TCRETURNriND : AInoP<(outs), (ins tcGPR:$dst, variable_ops), - Pseudo, IIC_Br, - "@TC_RETURN","\t$dst", []>, Requires<[IsNotDarwin]>; + def TCRETURNdiND : PseudoInst<(outs), (ins i32imm:$dst, variable_ops), + IIC_Br, []>, Requires<[IsNotDarwin]>; + + def TCRETURNriND : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops), + IIC_Br, []>, Requires<[IsNotDarwin]>; def TAILJMPdND : ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops), IIC_Br, "b\t$dst @ TAILCALL", From sabre at nondot.org Mon Nov 29 18:12:39 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 00:12:39 -0000 Subject: [llvm-commits] [llvm] r120363 - in /llvm/trunk: lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/simple.ll Message-ID: <20101130001239.B3AAE2A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 18:12:39 2010 New Revision: 120363 URL: http://llvm.org/viewvc/llvm-project?rev=120363&view=rev Log: my previous patch would cause us to start deleting some volatile stores, fix and add a testcase. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120363&r1=120362&r2=120363&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 18:12:39 2010 @@ -222,7 +222,7 @@ if (StoreInst *SI = dyn_cast(Inst)) { if (LoadInst *DepLoad = dyn_cast(InstDep.getInst())) { if (SI->getPointerOperand() == DepLoad->getPointerOperand() && - SI->getOperand(0) == DepLoad) { + SI->getOperand(0) == DepLoad && !SI->isVolatile()) { // DeleteDeadInstruction can delete the current instruction. Save BBI // in case we need it. WeakVH NextInst(BBI); Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120363&r1=120362&r2=120363&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 18:12:39 2010 @@ -34,3 +34,23 @@ %tmp3 = load i32* @g, align 4 ret i32 %tmp3 } + + +define void @test4(i32* %Q) { + %a = load i32* %Q + volatile store i32 %a, i32* %Q + ret void +; CHECK: @test4 +; CHECK-NEXT: load i32 +; CHECK-NEXT: volatile store +; CHECK-NEXT: ret void +} + +define void @test5(i32* %Q) { + %a = volatile load i32* %Q + store i32 %a, i32* %Q + ret void +; CHECK: @test5 +; CHECK-NEXT: volatile load +; CHECK-NEXT: ret void +} From resistor at mac.com Mon Nov 29 18:14:31 2010 From: resistor at mac.com (Owen Anderson) Date: Tue, 30 Nov 2010 00:14:31 -0000 Subject: [llvm-commits] [llvm] r120364 - in /llvm/trunk: lib/Target/ARM/ARMCodeEmitter.cpp lib/Target/ARM/ARMInstrFormats.td lib/Target/ARM/ARMInstrThumb2.td lib/Target/ARM/ARMMCCodeEmitter.cpp test/MC/ARM/thumb2.s Message-ID: <20101130001432.037C32A6C12D@llvm.org> Author: resistor Date: Mon Nov 29 18:14:31 2010 New Revision: 120364 URL: http://llvm.org/viewvc/llvm-project?rev=120364&view=rev Log: Correct Thumb2 encodings for a much wider range of loads and stores. Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp llvm/trunk/test/MC/ARM/thumb2.s Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=120364&r1=120363&r2=120364&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Mon Nov 29 18:14:31 2010 @@ -181,6 +181,8 @@ const { return 0; } unsigned getT2AddrModeImm8OpValue(const MachineInstr &MI, unsigned Op) const { return 0; } + unsigned getT2AddrModeImm8OffsetOpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } unsigned getT2AddrModeSORegOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } unsigned getT2SORegOpValue(const MachineInstr &MI, unsigned Op) Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120364&r1=120363&r2=120364&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Mon Nov 29 18:14:31 2010 @@ -1050,6 +1050,15 @@ // (P, W) = (1, 1) Pre-indexed or (0, 1) Post-indexed let Inst{10} = pre; // The P bit. let Inst{8} = 1; // The W bit. + + bits<9> addr; + let Inst{7-0} = addr{7-0}; + let Inst{9} = addr{8}; // Sign bit + + bits<4> Rt; + bits<4> Rn; + let Inst{15-12} = Rt{3-0}; + let Inst{19-16} = Rn{3-0}; } // Tv5Pat - Same as Pat<>, but requires V5T Thumb mode. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120364&r1=120363&r2=120364&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Nov 29 18:14:31 2010 @@ -143,6 +143,7 @@ ComplexPattern { let PrintMethod = "printT2AddrModeImm8OffsetOperand"; + string EncoderMethod = "getT2AddrModeImm8OffsetOpValue"; } // t2addrmode_imm8s4 := reg +/- (imm8 << 2) @@ -917,7 +918,7 @@ let Inst{20} = 0; // !load bits<4> Rt; - let Inst{19-16} = Rt{3-0}; + let Inst{15-12} = Rt{3-0}; bits<16> addr; let Inst{19-16} = addr{15-12}; // Rn @@ -936,7 +937,7 @@ let Inst{8} = 0; // The W bit. bits<4> Rt; - let Inst{19-16} = Rt{3-0}; + let Inst{15-12} = Rt{3-0}; bits<13> addr; let Inst{19-16} = addr{12-9}; // Rn @@ -1319,61 +1320,75 @@ // not via pattern. // Indexed loads + +class T2Iidxld opcod, bit pre, + dag oops, dag iops, + AddrMode am, IndexMode im, InstrItinClass itin, + string opc, string asm, string cstr, list pattern> + : T2Iidxldst; +class T2Iidxst opcod, bit pre, + dag oops, dag iops, + AddrMode am, IndexMode im, InstrItinClass itin, + string opc, string asm, string cstr, list pattern> + : T2Iidxldst; + let mayLoad = 1, neverHasSideEffects = 1 in { -def t2LDR_PRE : T2Iidxldst<0, 0b10, 1, 1, (outs GPR:$dst, GPR:$base_wb), +def t2LDR_PRE : T2Iidxld<0, 0b10, 1, (outs GPR:$Rt, GPR:$Rn), (ins t2addrmode_imm8:$addr), AddrModeT2_i8, IndexModePre, IIC_iLoad_iu, - "ldr", "\t$dst, $addr!", "$addr.base = $base_wb", + "ldr", "\t$Rt, $addr!", "$addr.base = $Rn", []>; -def t2LDR_POST : T2Iidxldst<0, 0b10, 1, 0, (outs GPR:$dst, GPR:$base_wb), +def t2LDR_POST : T2Iidxld<0, 0b10, 0, (outs GPR:$Rt, GPR:$Rn), (ins GPR:$base, t2am_imm8_offset:$offset), AddrModeT2_i8, IndexModePost, IIC_iLoad_iu, - "ldr", "\t$dst, [$base], $offset", "$base = $base_wb", + "ldr", "\t$Rt, [$Rn], $offset", "$base = $Rn", []>; -def t2LDRB_PRE : T2Iidxldst<0, 0b00, 1, 1, (outs GPR:$dst, GPR:$base_wb), +def t2LDRB_PRE : T2Iidxld<0, 0b00, 1, (outs GPR:$Rt, GPR:$Rn), (ins t2addrmode_imm8:$addr), AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu, - "ldrb", "\t$dst, $addr!", "$addr.base = $base_wb", + "ldrb", "\t$Rt, $addr!", "$addr.base = $Rn", []>; -def t2LDRB_POST : T2Iidxldst<0, 0b00, 1, 0, (outs GPR:$dst, GPR:$base_wb), +def t2LDRB_POST : T2Iidxld<0, 0b00, 0, (outs GPR:$Rt, GPR:$Rn), (ins GPR:$base, t2am_imm8_offset:$offset), AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu, - "ldrb", "\t$dst, [$base], $offset", "$base = $base_wb", + "ldrb", "\t$Rt, [$Rn], $offset", "$base = $Rn", []>; -def t2LDRH_PRE : T2Iidxldst<0, 0b01, 1, 1, (outs GPR:$dst, GPR:$base_wb), +def t2LDRH_PRE : T2Iidxld<0, 0b01, 1, (outs GPR:$Rt, GPR:$Rn), (ins t2addrmode_imm8:$addr), AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu, - "ldrh", "\t$dst, $addr!", "$addr.base = $base_wb", + "ldrh", "\t$Rt, $addr!", "$addr.base = $Rn", []>; -def t2LDRH_POST : T2Iidxldst<0, 0b01, 1, 0, (outs GPR:$dst, GPR:$base_wb), +def t2LDRH_POST : T2Iidxld<0, 0b01, 0, (outs GPR:$Rt, GPR:$Rn), (ins GPR:$base, t2am_imm8_offset:$offset), AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu, - "ldrh", "\t$dst, [$base], $offset", "$base = $base_wb", + "ldrh", "\t$Rt, [$Rn], $offset", "$base = $Rn", []>; -def t2LDRSB_PRE : T2Iidxldst<1, 0b00, 1, 1, (outs GPR:$dst, GPR:$base_wb), +def t2LDRSB_PRE : T2Iidxld<1, 0b00, 1, (outs GPR:$Rt, GPR:$Rn), (ins t2addrmode_imm8:$addr), AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu, - "ldrsb", "\t$dst, $addr!", "$addr.base = $base_wb", + "ldrsb", "\t$Rt, $addr!", "$addr.base = $Rn", []>; -def t2LDRSB_POST : T2Iidxldst<1, 0b00, 1, 0, (outs GPR:$dst, GPR:$base_wb), +def t2LDRSB_POST : T2Iidxld<1, 0b00, 0, (outs GPR:$Rt, GPR:$Rn), (ins GPR:$base, t2am_imm8_offset:$offset), AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu, - "ldrsb", "\t$dst, [$base], $offset", "$base = $base_wb", + "ldrsb", "\t$Rt, [$Rn], $offset", "$base = $Rn", []>; -def t2LDRSH_PRE : T2Iidxldst<1, 0b01, 1, 1, (outs GPR:$dst, GPR:$base_wb), +def t2LDRSH_PRE : T2Iidxld<1, 0b01, 1, (outs GPR:$Rt, GPR:$Rn), (ins t2addrmode_imm8:$addr), AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu, - "ldrsh", "\t$dst, $addr!", "$addr.base = $base_wb", + "ldrsh", "\t$Rt, $addr!", "$addr.base = $Rn", []>; -def t2LDRSH_POST : T2Iidxldst<1, 0b01, 1, 0, (outs GPR:$dst, GPR:$base_wb), +def t2LDRSH_POST : T2Iidxld<1, 0b01, 0, (outs GPR:$dst, GPR:$Rn), (ins GPR:$base, t2am_imm8_offset:$offset), AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu, - "ldrsh", "\t$dst, [$base], $offset", "$base = $base_wb", + "ldrsh", "\t$dst, [$Rn], $offset", "$base = $Rn", []>; } // mayLoad = 1, neverHasSideEffects = 1 @@ -1415,47 +1430,47 @@ IIC_iStore_d_r, "strd", "\t$src1, $addr", []>; // Indexed stores -def t2STR_PRE : T2Iidxldst<0, 0b10, 0, 1, (outs GPR:$base_wb), - (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), +def t2STR_PRE : T2Iidxst<0, 0b10, 1, (outs GPR:$base_wb), + (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr), AddrModeT2_i8, IndexModePre, IIC_iStore_iu, - "str", "\t$src, [$base, $offset]!", "$base = $base_wb", + "str", "\t$Rt, [$Rn, $addr]!", "$Rn = $base_wb", [(set GPR:$base_wb, - (pre_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; + (pre_store GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>; -def t2STR_POST : T2Iidxldst<0, 0b10, 0, 0, (outs GPR:$base_wb), - (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), +def t2STR_POST : T2Iidxst<0, 0b10, 0, (outs GPR:$base_wb), + (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr), AddrModeT2_i8, IndexModePost, IIC_iStore_iu, - "str", "\t$src, [$base], $offset", "$base = $base_wb", + "str", "\t$Rt, [$Rn], $addr", "$Rn = $base_wb", [(set GPR:$base_wb, - (post_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; + (post_store GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>; -def t2STRH_PRE : T2Iidxldst<0, 0b01, 0, 1, (outs GPR:$base_wb), - (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), +def t2STRH_PRE : T2Iidxst<0, 0b01, 1, (outs GPR:$base_wb), + (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr), AddrModeT2_i8, IndexModePre, IIC_iStore_iu, - "strh", "\t$src, [$base, $offset]!", "$base = $base_wb", + "strh", "\t$Rt, [$Rn, $addr]!", "$Rn = $base_wb", [(set GPR:$base_wb, - (pre_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; + (pre_truncsti16 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>; -def t2STRH_POST : T2Iidxldst<0, 0b01, 0, 0, (outs GPR:$base_wb), - (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), +def t2STRH_POST : T2Iidxst<0, 0b01, 0, (outs GPR:$base_wb), + (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr), AddrModeT2_i8, IndexModePost, IIC_iStore_bh_iu, - "strh", "\t$src, [$base], $offset", "$base = $base_wb", + "strh", "\t$Rt, [$Rn], $addr", "$Rn = $base_wb", [(set GPR:$base_wb, - (post_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; + (post_truncsti16 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>; -def t2STRB_PRE : T2Iidxldst<0, 0b00, 0, 1, (outs GPR:$base_wb), - (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), +def t2STRB_PRE : T2Iidxst<0, 0b00, 1, (outs GPR:$base_wb), + (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr), AddrModeT2_i8, IndexModePre, IIC_iStore_bh_iu, - "strb", "\t$src, [$base, $offset]!", "$base = $base_wb", + "strb", "\t$Rt, [$Rn, $addr]!", "$Rn = $base_wb", [(set GPR:$base_wb, - (pre_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; + (pre_truncsti8 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>; -def t2STRB_POST : T2Iidxldst<0, 0b00, 0, 0, (outs GPR:$base_wb), - (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), +def t2STRB_POST : T2Iidxst<0, 0b00, 0, (outs GPR:$base_wb), + (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr), AddrModeT2_i8, IndexModePost, IIC_iStore_bh_iu, - "strb", "\t$src, [$base], $offset", "$base = $base_wb", + "strb", "\t$Rt, [$Rn], $addr", "$Rn = $base_wb", [(set GPR:$base_wb, - (post_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; + (post_truncsti8 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>; // STRT, STRBT, STRHT all have offset mode (PUW=0b110) and are for disassembly // only. Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120364&r1=120363&r2=120364&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Mon Nov 29 18:14:31 2010 @@ -177,6 +177,8 @@ SmallVectorImpl &Fixups) const; unsigned getT2AddrModeImm8OpValue(const MCInst &MI, unsigned OpNum, SmallVectorImpl &Fixups) const; + unsigned getT2AddrModeImm8OffsetOpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const; unsigned getT2AddrModeImm12OpValue(const MCInst &MI, unsigned OpNum, SmallVectorImpl &Fixups) const; @@ -671,8 +673,28 @@ // Even though the immediate is 8 bits long, we need 9 bits in order // to represent the (inverse of the) sign bit. Value <<= 9; - Value |= ((int32_t)MO2.getImm()) & 511; - Value ^= 256; // Invert the sign bit. + int32_t tmp = (int32_t)MO2.getImm(); + if (tmp < 0) + tmp = abs(tmp); + else + Value |= 256; // Set the ADD bit + Value |= tmp & 255; + return Value; +} + +unsigned ARMMCCodeEmitter:: +getT2AddrModeImm8OffsetOpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const { + const MCOperand &MO1 = MI.getOperand(OpNum); + + // FIXME: Needs fixup support. + unsigned Value = 0; + int32_t tmp = (int32_t)MO1.getImm(); + if (tmp < 0) + tmp = abs(tmp); + else + Value |= 256; // Set the ADD bit + Value |= tmp & 255; return Value; } Modified: llvm/trunk/test/MC/ARM/thumb2.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb2.s?rev=120364&r1=120363&r2=120364&view=diff ============================================================================== --- llvm/trunk/test/MC/ARM/thumb2.s (original) +++ llvm/trunk/test/MC/ARM/thumb2.s Mon Nov 29 18:14:31 2010 @@ -115,3 +115,18 @@ @ CHECK: ldr.w r0, [r0, r1, lsl #2] @ encoding: [0x21,0x00,0x50,0xf8] ldr.w r0, [r0, r1, lsl #2] +@ CHECK: str r1, [r0, #16]! @ encoding: [0x10,0x1f,0x40,0xf8] + str r1, [r0, #16]! +@ CHECK: strh r1, [r0, #8]! @ encoding: [0x08,0x1f,0x20,0xf8] + strh r1, [r0, #8]! +@ CHECK: strh r2, [r0], #-4 @ encoding: [0x04,0x29,0x20,0xf8] + strh r2, [r0], #-4 +@ CHECK: str r2, [r0], #-4 @ encoding: [0x04,0x29,0x40,0xf8] + str r2, [r0], #-4 + +@ CHECK: ldr r2, [r0, #16]! @ encoding: [0x10,0x2f,0x50,0xf8] + ldr r2, [r0, #16]! +@ CHECK: ldr r2, [r0, #-64]! @ encoding: [0x40,0x2d,0x50,0xf8] + ldr r2, [r0, #-64]! +@ CHECK: ldrsb r2, [r0, #4]! @ encoding: [0x04,0x2f,0x10,0xf9] + ldrsb r2, [r0, #4]! From isanbard at gmail.com Mon Nov 29 18:18:30 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 00:18:30 -0000 Subject: [llvm-commits] [llvm] r120365 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101130001830.4718C2A6C12D@llvm.org> Author: void Date: Mon Nov 29 18:18:30 2010 New Revision: 120365 URL: http://llvm.org/viewvc/llvm-project?rev=120365&view=rev Log: Add some encoding for the adr instruction. Labels still need to be finished. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120365&r1=120364&r2=120365&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 18:18:30 2010 @@ -1241,14 +1241,24 @@ // tLEApcrel - Load a pc-relative address into a register without offending the // assembler. let neverHasSideEffects = 1, isReMaterializable = 1 in -def tLEApcrel : T1I<(outs tGPR:$dst), (ins i32imm:$label, pred:$p), IIC_iALUi, - "adr${p}\t$dst, #$label", []>, - T1Encoding<{1,0,1,0,0,?}>; // A6.2 & A8.6.10 +def tLEApcrel : T1I<(outs tGPR:$Rd), (ins i32imm:$label, pred:$p), IIC_iALUi, + "adr${p}\t$Rd, #$label", []>, + T1Encoding<{1,0,1,0,0,?}> { + // A6.2 & A8.6.10 + bits<3> Rd; + let Inst{10-8} = Rd; + // FIXME: Add label encoding/fixup +} -def tLEApcrelJT : T1I<(outs tGPR:$dst), +def tLEApcrelJT : T1I<(outs tGPR:$Rd), (ins i32imm:$label, nohash_imm:$id, pred:$p), - IIC_iALUi, "adr${p}\t$dst, #${label}_${id}", []>, - T1Encoding<{1,0,1,0,0,?}>; // A6.2 & A8.6.10 + IIC_iALUi, "adr${p}\t$Rd, #${label}_${id}", []>, + T1Encoding<{1,0,1,0,0,?}> { + // A6.2 & A8.6.10 + bits<3> Rd; + let Inst{10-8} = Rd; + // FIXME: Add label encoding/fixup +} //===----------------------------------------------------------------------===// // TLS Instructions From Micah.Villmow at amd.com Mon Nov 29 18:24:36 2010 From: Micah.Villmow at amd.com (Villmow, Micah) Date: Mon, 29 Nov 2010 18:24:36 -0600 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: <9FD2A1AA-071C-48C2-9EDE-B521F62ECC10@apple.com> References: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> <9FD2A1AA-071C-48C2-9EDE-B521F62ECC10@apple.com> Message-ID: Here is a new patch. This is against Rev120359(TOT around 4pm). This includes the comments from Chris about spaces and periods. From: Eric Christopher [mailto:echristo at apple.com] Sent: Monday, November 29, 2010 3:52 PM To: Villmow, Micah Cc: llvm-commits Subject: Re: [llvm-commits] Patch for Bug7696 On Nov 29, 2010, at 3:50 PM, Villmow, Micah wrote: p4 diff :) Aiee :) >From looking at the docs it looks like you want: -du unified output format, showing added and deleted lines with sufficient context for compatibility with the patch(1) utility. with p4 diff. -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/1d0c4135/attachment.html -------------- next part -------------- A non-text attachment was scrubbed... Name: jump_boolean_rev2.patch Type: application/octet-stream Size: 3449 bytes Desc: jump_boolean_rev2.patch Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101129/1d0c4135/attachment.obj From grosbach at apple.com Mon Nov 29 18:24:05 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 00:24:05 -0000 Subject: [llvm-commits] [llvm] r120366 - in /llvm/trunk/lib/Target/ARM: ARMCodeEmitter.cpp ARMInstrInfo.td Message-ID: <20101130002405.DD4472A6C12D@llvm.org> Author: grosbach Date: Mon Nov 29 18:24:05 2010 New Revision: 120366 URL: http://llvm.org/viewvc/llvm-project?rev=120366&view=rev Log: Rename BX/BRIND/etc patterns to clarify which is actually the BX instruction and which are pseudos. Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=120366&r1=120365&r2=120366&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Mon Nov 29 18:24:05 2010 @@ -779,10 +779,10 @@ switch (Opcode) { default: llvm_unreachable("ARMCodeEmitter::emitPseudoInstruction"); - case ARM::BX: - case ARM::BMOVPCRX: - case ARM::BXr9: - case ARM::BMOVPCRXr9: { + case ARM::BX_CALL: + case ARM::BMOVPCRX_CALL: + case ARM::BXr9_CALL: + case ARM::BMOVPCRXr9_CALL: { // First emit mov lr, pc unsigned Binary = 0x01a0e00f; Binary |= II->getPredicate(&MI) << ARMII::CondShift; Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120366&r1=120365&r2=120366&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Mon Nov 29 18:24:05 2010 @@ -1221,7 +1221,7 @@ // Indirect branches let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in { // ARMV4T and above - def BRIND : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "bx\t$dst", + def BX : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "bx\t$dst", [(brind GPR:$dst)]>, Requires<[IsARM, HasV4T]> { bits<4> dst; @@ -1279,7 +1279,7 @@ // ARMv4T // Note: Restrict $func to the tGPR regclass to prevent it being in LR. // FIXME: x2 insn patterns like this need to be pseudo instructions. - def BX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BX_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tbx\t$func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, HasV4T, IsNotDarwin]> { @@ -1289,7 +1289,7 @@ } // ARMv4 - def BMOVPCRX : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BMOVPCRX_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, NoV4T, IsNotDarwin]> { @@ -1335,7 +1335,7 @@ // ARMv4T // Note: Restrict $func to the tGPR regclass to prevent it being in LR. - def BXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BXr9_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tbx\t$func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, HasV4T, IsDarwin]> { @@ -1345,7 +1345,7 @@ } // ARMv4 - def BMOVPCRXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops), + def BMOVPCRXr9_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, NoV4T, IsDarwin]> { From sabre at nondot.org Mon Nov 29 18:28:45 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 00:28:45 -0000 Subject: [llvm-commits] [llvm] r120368 - in /llvm/trunk: lib/Analysis/BasicAliasAnalysis.cpp lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/simple.ll Message-ID: <20101130002845.DE4932A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 18:28:45 2010 New Revision: 120368 URL: http://llvm.org/viewvc/llvm-project?rev=120368&view=rev Log: Teach basicaa that memset's modref set is at worst "mod" and never contains "ref". Enhance DSE to use a modref query instead of a store-specific hack to generalize the "ignore may-alias stores" optimization to handle memset and memcpy. Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=120368&r1=120367&r2=120368&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Mon Nov 29 18:28:45 2010 @@ -703,6 +703,8 @@ if (isNoAlias(Location(Dest, Len), Loc)) return NoModRef; } + // We know that memset doesn't load anything. + Min = Mod; break; case Intrinsic::atomic_cmp_swap: case Intrinsic::atomic_swap: Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120368&r1=120367&r2=120368&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 18:28:45 2010 @@ -191,6 +191,7 @@ I1Size >= I2Size; } + bool DSE::runOnBasicBlock(BasicBlock &BB) { MemoryDependenceAnalysis &MD = getAnalysis(); TD = getAnalysisIfAvailable(); @@ -239,7 +240,7 @@ } } } - + if (!InstDep.isDef()) { // If this is a may-aliased store that is clobbering the store value, we // can keep searching past it for another must-aliased pointer that stores @@ -250,12 +251,16 @@ // we can remove the first store to P even though we don't know if P and Q // alias. if (StoreInst *SI = dyn_cast(Inst)) { - AliasAnalysis::Location Loc = - getAnalysis().getLocation(SI); - while (InstDep.isClobber() && isa(InstDep.getInst()) && - InstDep.getInst() != &BB.front()) - InstDep = MD.getPointerDependencyFrom(Loc, false, InstDep.getInst(), - &BB); + AliasAnalysis &AA = getAnalysis(); + AliasAnalysis::Location Loc = AA.getLocation(SI); + while (InstDep.isClobber() && InstDep.getInst() != &BB.front()) { + // Can't look past this instruction if it might read 'Loc'. + if (AA.getModRefInfo(InstDep.getInst(), Loc) & AliasAnalysis::Ref) + break; + + InstDep = MD.getPointerDependencyFrom(Loc, false, + InstDep.getInst(), &BB); + } } } Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120368&r1=120367&r2=120368&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 18:28:45 2010 @@ -54,3 +54,17 @@ ; CHECK-NEXT: volatile load ; CHECK-NEXT: ret void } + +declare void @llvm.memset.i32(i8*, i8, i32, i32) + +; Should delete store of 10 even though memset is a may-store to P (P and Q may +; alias). +define void @test6(i32 *%p, i8 *%q) { + store i32 10, i32* %p, align 4 ;; dead. + call void @llvm.memset.i32(i8* %q, i8 42, i32 900, i32 1) + store i32 30, i32* %p, align 4 + ret void +; CHECK: @test6 +; CHECK-NEXT: call void @llvm.memset +} + From isanbard at gmail.com Mon Nov 29 18:34:08 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 00:34:08 -0000 Subject: [llvm-commits] [llvm] r120369 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101130003408.C54FD2A6C12D@llvm.org> Author: void Date: Mon Nov 29 18:34:08 2010 New Revision: 120369 URL: http://llvm.org/viewvc/llvm-project?rev=120369&view=rev Log: Add correct encoding for "bl __aeabi_read_tp". However, the asm matcher isn't able to match this yet. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120369&r1=120368&r2=120369&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 18:34:08 2010 @@ -1265,11 +1265,13 @@ // // __aeabi_read_tp preserves the registers r1-r3. -let isCall = 1, - Defs = [R0, LR], Uses = [SP] in { +let isCall = 1, Defs = [R0, LR], Uses = [SP] in { def tTPsoft : TIx2<0b11110, 0b11, 1, (outs), (ins), IIC_Br, "bl\t__aeabi_read_tp", - [(set R0, ARMthread_pointer)]>; + [(set R0, ARMthread_pointer)]> { + // Encoding is 0xf7fffffe. + let Inst = 0xf7fffffe; + } } // SJLJ Exception handling intrinsics From sabre at nondot.org Mon Nov 29 18:43:16 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 00:43:16 -0000 Subject: [llvm-commits] [llvm] r120370 - in /llvm/trunk: lib/Analysis/BasicAliasAnalysis.cpp test/Transforms/DeadStoreElimination/simple.ll Message-ID: <20101130004316.3BC5F2A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 18:43:16 2010 New Revision: 120370 URL: http://llvm.org/viewvc/llvm-project?rev=120370&view=rev Log: enhance basicaa to return "Mod" for a memcpy call when the queried location doesn't overlap the source, and add a testcase. Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=120370&r1=120369&r2=120370&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Mon Nov 29 18:43:16 2010 @@ -687,10 +687,15 @@ Len = LenCI->getZExtValue(); Value *Dest = II->getArgOperand(0); Value *Src = II->getArgOperand(1); + // If it can't overlap the source dest, then it doesn't modref the loc. if (isNoAlias(Location(Dest, Len), Loc)) { if (isNoAlias(Location(Src, Len), Loc)) return NoModRef; + // If it can't overlap the dest, then worst case it reads the loc. Min = Ref; + } else if (isNoAlias(Location(Src, Len), Loc)) { + // If it can't overlap the source, then worst case it mutates the loc. + Min = Mod; } break; } Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120370&r1=120369&r2=120370&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 18:43:16 2010 @@ -55,16 +55,27 @@ ; CHECK-NEXT: ret void } -declare void @llvm.memset.i32(i8*, i8, i32, i32) +declare void @llvm.memset.i64(i8*, i8, i64, i32) +declare void @llvm.memcpy.i64(i8*, i8*, i64, i32) ; Should delete store of 10 even though memset is a may-store to P (P and Q may ; alias). define void @test6(i32 *%p, i8 *%q) { store i32 10, i32* %p, align 4 ;; dead. - call void @llvm.memset.i32(i8* %q, i8 42, i32 900, i32 1) + call void @llvm.memset.i64(i8* %q, i8 42, i64 900, i32 1) store i32 30, i32* %p, align 4 ret void ; CHECK: @test6 ; CHECK-NEXT: call void @llvm.memset } +; Should delete store of 10 even though memcpy is a may-store to P (P and Q may +; alias). +define void @test7(i32 *%p, i8 *%q, i8* noalias %r) { + store i32 10, i32* %p, align 4 ;; dead. + call void @llvm.memcpy.i64(i8* %q, i8* %r, i64 900, i32 1) + store i32 30, i32* %p, align 4 + ret void +; CHECK: @test7 +; CHECK-NEXT: call void @llvm.memcpy +} From isanbard at gmail.com Mon Nov 29 18:48:16 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 00:48:16 -0000 Subject: [llvm-commits] [llvm] r120371 - in /llvm/trunk/lib/Target/ARM: ARMAsmPrinter.cpp ARMBaseInstrInfo.h Disassembler/ARMDisassemblerCore.cpp Message-ID: <20101130004816.31A0D2A6C12D@llvm.org> Author: void Date: Mon Nov 29 18:48:15 2010 New Revision: 120371 URL: http://llvm.org/viewvc/llvm-project?rev=120371&view=rev Log: s/ARM::BRIND/ARM::BX/g to coincide with r120366. Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120371&r1=120370&r2=120371&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Nov 29 18:48:15 2010 @@ -1260,7 +1260,7 @@ } { MCInst TmpInst; - TmpInst.setOpcode(ARM::BRIND); + TmpInst.setOpcode(ARM::BX); TmpInst.addOperand(MCOperand::CreateReg(ScratchReg)); // Predicate. TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h?rev=120371&r1=120370&r2=120371&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h (original) +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h Mon Nov 29 18:48:15 2010 @@ -434,7 +434,7 @@ static inline bool isIndirectBranchOpcode(int Opc) { - return Opc == ARM::BRIND || Opc == ARM::MOVPCRX || Opc == ARM::tBRIND; + return Opc == ARM::BX || Opc == ARM::MOVPCRX || Opc == ARM::tBRIND; } /// getInstrPredicate - If instruction is predicated, returns its predicate Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp?rev=120371&r1=120370&r2=120371&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Mon Nov 29 18:48:15 2010 @@ -790,7 +790,7 @@ // Misc. Branch Instructions. // BLXr9, BXr9 -// BRIND, BX_RET +// BX, BX_RET static bool DisassembleBrMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn, unsigned short NumOps, unsigned &NumOpsAdded, BO B) { @@ -805,8 +805,8 @@ if (Opcode == ARM::BX_RET) return true; - // BLXr9 and BRIND take one GPR reg. - if (Opcode == ARM::BLXr9 || Opcode == ARM::BRIND) { + // BLXr9 and BX take one GPR reg. + if (Opcode == ARM::BLXr9 || Opcode == ARM::BX) { assert(NumOps >= 1 && OpInfo[OpIdx].RegClass == ARM::GPRRegClassID && "Reg operand expected"); MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID, From isanbard at gmail.com Mon Nov 29 18:50:23 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 00:50:23 -0000 Subject: [llvm-commits] [llvm] r120372 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101130005023.132E82A6C12D@llvm.org> Author: void Date: Mon Nov 29 18:50:22 2010 New Revision: 120372 URL: http://llvm.org/viewvc/llvm-project?rev=120372&view=rev Log: Minor cleanups. No functional change. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120372&r1=120371&r2=120372&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Nov 29 18:50:22 2010 @@ -136,6 +136,8 @@ Requires<[IsThumb, IsThumb1Only]>; } +// T1Disassembly - A simple class to make encoding some disassembly patterns +// easier and less verbose. class T1Disassembly op1, bits<8> op2> : T1Encoding<0b101111> { let Inst{9-8} = op1; @@ -205,7 +207,8 @@ [/* For disassembly only; pattern left blank */]>, T1Misc<0b0110011> { // A8.6.38 & B6.1.1 - let Inst{3} = 0; // FIXME: Finish encoding. + let Inst{3} = 0; + // FIXME: Finish encoding. } // For both thumb1 and thumb2. @@ -213,13 +216,13 @@ def tPICADD : TIt<(outs GPR:$dst), (ins GPR:$lhs, pclabel:$cp), IIC_iALUr, "", [(set GPR:$dst, (ARMpic_add GPR:$lhs, imm:$cp))]>, T1Special<{0,0,?,?}> { - // A8.6.6 Rm = pc + // A8.6.6 bits<3> dst; - let Inst{6-3} = 0b1111; + let Inst{6-3} = 0b1111; // Rm = pc let Inst{2-0} = dst; } -// PC relative add. +// PC relative add (ADR). def tADDrPCi : T1I<(outs tGPR:$dst), (ins t_imm_s4:$rhs), IIC_iALUi, "add\t$dst, pc, $rhs", []>, T1Encoding<{1,0,1,0,0,?}> { @@ -1265,13 +1268,12 @@ // // __aeabi_read_tp preserves the registers r1-r3. -let isCall = 1, Defs = [R0, LR], Uses = [SP] in { - def tTPsoft : TIx2<0b11110, 0b11, 1, (outs), (ins), IIC_Br, - "bl\t__aeabi_read_tp", - [(set R0, ARMthread_pointer)]> { - // Encoding is 0xf7fffffe. - let Inst = 0xf7fffffe; - } +let isCall = 1, Defs = [R0, LR], Uses = [SP] in +def tTPsoft : TIx2<0b11110, 0b11, 1, (outs), (ins), IIC_Br, + "bl\t__aeabi_read_tp", + [(set R0, ARMthread_pointer)]> { + // Encoding is 0xf7fffffe. + let Inst = 0xf7fffffe; } // SJLJ Exception handling intrinsics @@ -1286,23 +1288,20 @@ // doing so, we also cause the prologue/epilogue code to actively preserve // all of the callee-saved resgisters, which is exactly what we want. // $val is a scratch register for our use. -let Defs = - [ R0, R1, R2, R3, R4, R5, R6, R7, R12 ], hasSideEffects = 1, - isBarrier = 1, isCodeGenOnly = 1 in { - def tInt_eh_sjlj_setjmp : ThumbXI<(outs),(ins tGPR:$src, tGPR:$val), - AddrModeNone, SizeSpecial, NoItinerary, "", "", - [(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>; -} +let Defs = [ R0, R1, R2, R3, R4, R5, R6, R7, R12 ], + hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in +def tInt_eh_sjlj_setjmp : ThumbXI<(outs),(ins tGPR:$src, tGPR:$val), + AddrModeNone, SizeSpecial, NoItinerary, "","", + [(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>; // FIXME: Non-Darwin version(s) let isBarrier = 1, hasSideEffects = 1, isTerminator = 1, isCodeGenOnly = 1, - Defs = [ R7, LR, SP ] in { + Defs = [ R7, LR, SP ] in def tInt_eh_sjlj_longjmp : XI<(outs), (ins GPR:$src, GPR:$scratch), - AddrModeNone, SizeSpecial, IndexModeNone, - Pseudo, NoItinerary, "", "", - [(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>, - Requires<[IsThumb, IsDarwin]>; -} + AddrModeNone, SizeSpecial, IndexModeNone, + Pseudo, NoItinerary, "", "", + [(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>, + Requires<[IsThumb, IsDarwin]>; //===----------------------------------------------------------------------===// // Non-Instruction Patterns From sabre at nondot.org Mon Nov 29 19:00:34 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 01:00:34 -0000 Subject: [llvm-commits] [llvm] r120373 - in /llvm/trunk/test/Transforms/DeadStoreElimination: 2004-11-28-LiveStoreDeleted.ll 2004-12-28-PartialStore.ll 2005-11-30-vaarg.ll 2006-06-27-AST-Remove.ll 2008-07-28-load-store.ll 2008-11-28-MemDepUpdate.ll 2008-11-29-OffEndOfBlock.ll 2009-11-10-Trampoline.ll PartialStore.ll byval.ll crash.ll memcpy.ll simple.ll volatile-load.ll Message-ID: <20101130010034.B68002A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 19:00:34 2010 New Revision: 120373 URL: http://llvm.org/viewvc/llvm-project?rev=120373&view=rev Log: clean up DSE tests, removing some poorly reduced and useless old test, merging more into other larger .ll files, filecheckizing along the way. Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll llvm/trunk/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll llvm/trunk/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll llvm/trunk/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll llvm/trunk/test/Transforms/DeadStoreElimination/2008-07-28-load-store.ll llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-28-MemDepUpdate.ll llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-29-OffEndOfBlock.ll llvm/trunk/test/Transforms/DeadStoreElimination/2009-11-10-Trampoline.ll llvm/trunk/test/Transforms/DeadStoreElimination/byval.ll llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll llvm/trunk/test/Transforms/DeadStoreElimination/volatile-load.ll Modified: llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll llvm/trunk/test/Transforms/DeadStoreElimination/crash.ll llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2004-11-28-LiveStoreDeleted.ll (removed) @@ -1,14 +0,0 @@ -; RUN: opt < %s -dse -scalarrepl -instcombine | \ -; RUN: llvm-dis | not grep {ret i32 undef} - -define i32 @test(double %__x) { - %__u = alloca { [3 x i32] } ; <{ [3 x i32] }*> [#uses=2] - %tmp.1 = bitcast { [3 x i32] }* %__u to double* ; [#uses=1] - store double %__x, double* %tmp.1 - %tmp.4 = getelementptr { [3 x i32] }* %__u, i32 0, i32 0, i32 1 ; [#uses=1] - %tmp.5 = load i32* %tmp.4 ; [#uses=1] - %tmp.6 = icmp slt i32 %tmp.5, 0 ; [#uses=1] - %tmp.7 = zext i1 %tmp.6 to i32 ; [#uses=1] - ret i32 %tmp.7 -} - Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2004-12-28-PartialStore.ll (removed) @@ -1,13 +0,0 @@ -; RUN: opt < %s -dse -S | \ -; RUN: grep {store i32 1234567} - -; Do not delete stores that are only partially killed. - -define i32 @test() { - %V = alloca i32 ; [#uses=3] - store i32 1234567, i32* %V - %V2 = bitcast i32* %V to i8* ; [#uses=1] - store i8 0, i8* %V2 - %X = load i32* %V ; [#uses=1] - ret i32 %X -} Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2005-11-30-vaarg.ll (removed) @@ -1,9 +0,0 @@ -; RUN: opt < %s -dse -S | grep store - -define double @foo(i8* %X) { - %X_addr = alloca i8* ; [#uses=2] - store i8* %X, i8** %X_addr - %tmp.0 = va_arg i8** %X_addr, double ; [#uses=1] - ret double %tmp.0 -} - Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll (removed) @@ -1,1113 +0,0 @@ -; RUN: opt < %s -globalsmodref-aa -dse -disable-output -target datalayout = "E-p:32:32" -target triple = "powerpc-apple-darwin8" - %struct.ECacheType = type { i32, i32, i32 } - %struct.FILE = type { i8*, i32, i32, i16, i16, %struct.__sbuf, i32, i8*, i32 (i8*)*, i32 (i8*, i8*, i32)*, i64 (i8*, i64, i32)*, i32 (i8*, i8*, i32)*, %struct.__sbuf, %struct.__sFILEX*, i32, [3 x i8], [1 x i8], %struct.__sbuf, i32, i64 } - %struct.QTType = type { i8, i8, i16, i32, i32, i32 } - %struct.TType = type { i8, i8, i8, i8, i16, i32, i32, i32 } - %struct._RuneEntry = type { i32, i32, i32, i32* } - %struct._RuneLocale = type { [8 x i8], [32 x i8], i32 (i8*, i32, i8**)*, i32 (i32, i8*, i32, i8**)*, i32, [256 x i32], [256 x i32], [256 x i32], %struct._RuneRange, %struct._RuneRange, %struct._RuneRange, i8*, i32 } - %struct._RuneRange = type { i32, %struct._RuneEntry* } - %struct.__sFILEX = type opaque - %struct.__sbuf = type { i8*, i32 } - %struct.move_s = type { i32, i32, i32, i32, i32, i32 } - %struct.move_x = type { i32, i32, i32, i32 } - %struct.node_t = type { i8, i8, i8, i8, i32, i32, %struct.node_t**, %struct.node_t*, %struct.move_s } - %struct.see_data = type { i32, i32 } - at rook_o.2925 = internal global [4 x i32] [ i32 12, i32 -12, i32 1, i32 -1 ] ; <[4 x i32]*> [#uses=0] - at bishop_o.2926 = internal global [4 x i32] [ i32 11, i32 -11, i32 13, i32 -13 ] ; <[4 x i32]*> [#uses=0] - at knight_o.2927 = internal global [8 x i32] [ i32 10, i32 -10, i32 14, i32 -14, i32 23, i32 -23, i32 25, i32 -25 ] ; <[8 x i32]*> [#uses=0] - at board = internal global [144 x i32] zeroinitializer ; <[144 x i32]*> [#uses=0] - at holding = internal global [2 x [16 x i32]] zeroinitializer ; <[2 x [16 x i32]]*> [#uses=0] - at hold_hash = internal global i32 0 ; [#uses=0] - at white_hand_eval = internal global i32 0 ; [#uses=0] - at black_hand_eval = internal global i32 0 ; [#uses=0] - at num_holding = internal global [2 x i32] zeroinitializer ; <[2 x i32]*> [#uses=0] - at zobrist = internal global [14 x [144 x i32]] zeroinitializer ; <[14 x [144 x i32]]*> [#uses=0] - at Variant = internal global i32 0 ; [#uses=7] - at userealholdings.b = internal global i1 false ; [#uses=1] - at realholdings = internal global [255 x i8] zeroinitializer ; <[255 x i8]*> [#uses=0] - at comp_color = internal global i32 0 ; [#uses=0] - at C.97.3177 = internal global [13 x i32] [ i32 0, i32 2, i32 1, i32 4, i32 3, i32 0, i32 0, i32 8, i32 7, i32 10, i32 9, i32 12, i32 11 ] ; <[13 x i32]*> [#uses=0] - at str = internal global [30 x i8] c"%s:%u: failed assertion `%s'\0A\00" ; <[30 x i8]*> [#uses=0] - at str.upgrd.1 = internal global [81 x i8] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/crazy.c\00" ; <[81 x i8]*> [#uses=0] - at str.upgrd.2 = internal global [32 x i8] c"piece > frame && piece < npiece\00" ; <[32 x i8]*> [#uses=0] - at C.101.3190 = internal global [13 x i32] [ i32 0, i32 2, i32 1, i32 2, i32 1, i32 0, i32 0, i32 2, i32 1, i32 2, i32 1, i32 2, i32 1 ] ; <[13 x i32]*> [#uses=0] - at hand_value = internal global [13 x i32] [ i32 0, i32 100, i32 -100, i32 210, i32 -210, i32 0, i32 0, i32 250, i32 -250, i32 450, i32 -450, i32 230, i32 -230 ] ; <[13 x i32]*> [#uses=0] - at material = internal global [14 x i32] zeroinitializer ; <[14 x i32]*> [#uses=0] - at Material = internal global i32 0 ; [#uses=0] - at str.upgrd.3 = internal global [23 x i8] c"holding[who][what] > 0\00" ; <[23 x i8]*> [#uses=0] - at str.upgrd.4 = internal global [24 x i8] c"holding[who][what] < 20\00" ; <[24 x i8]*> [#uses=0] - at fifty = internal global i32 0 ; [#uses=0] - at move_number = internal global i32 0 ; [#uses=1] - at ply = internal global i32 0 ; [#uses=2] - at hash_history = internal global [600 x i32] zeroinitializer ; <[600 x i32]*> [#uses=1] - at hash = internal global i32 0 ; [#uses=1] - at ECacheSize.b = internal global i1 false ; [#uses=1] - at ECache = internal global %struct.ECacheType* null ; <%struct.ECacheType**> [#uses=1] - at ECacheProbes = internal global i32 0 ; [#uses=1] - at ECacheHits = internal global i32 0 ; [#uses=1] - at str.upgrd.5 = internal global [34 x i8] c"Out of memory allocating ECache.\0A\00" ; <[34 x i8]*> [#uses=0] - at rankoffsets.2930 = internal global [8 x i32] [ i32 110, i32 98, i32 86, i32 74, i32 62, i32 50, i32 38, i32 26 ] ; <[8 x i32]*> [#uses=0] - at white_castled = internal global i32 0 ; [#uses=0] - at black_castled = internal global i32 0 ; [#uses=0] - at book_ply = internal global i32 0 ; [#uses=0] - at bking_loc = internal global i32 0 ; [#uses=1] - at wking_loc = internal global i32 0 ; [#uses=1] - at white_to_move = internal global i32 0 ; [#uses=3] - at moved = internal global [144 x i32] zeroinitializer ; <[144 x i32]*> [#uses=0] - at ep_square = internal global i32 0 ; [#uses=0] - at _DefaultRuneLocale = external global %struct._RuneLocale ; <%struct._RuneLocale*> [#uses=0] - at str.upgrd.6 = internal global [3 x i8] c"bm\00" ; <[3 x i8]*> [#uses=0] - at str1 = internal global [3 x i8] c"am\00" ; <[3 x i8]*> [#uses=0] - at str1.upgrd.7 = internal global [34 x i8] c"No best-move or avoid-move found!\00" ; <[34 x i8]*> [#uses=0] - at str.upgrd.8 = internal global [25 x i8] c"\0AName of EPD testsuite: \00" ; <[25 x i8]*> [#uses=0] - at __sF = external global [0 x %struct.FILE] ; <[0 x %struct.FILE]*> [#uses=0] - at str.upgrd.9 = internal global [21 x i8] c"\0ATime per move (s): \00" ; <[21 x i8]*> [#uses=0] - at str.upgrd.10 = internal global [2 x i8] c"\0A\00" ; <[2 x i8]*> [#uses=0] - at str2 = internal global [2 x i8] c"r\00" ; <[2 x i8]*> [#uses=0] - at root_to_move = internal global i32 0 ; [#uses=1] - at forcedwin.b = internal global i1 false ; [#uses=2] - at fixed_time = internal global i32 0 ; [#uses=1] - at nodes = internal global i32 0 ; [#uses=1] - at qnodes = internal global i32 0 ; [#uses=1] - at str.upgrd.11 = internal global [29 x i8] c"\0ANodes: %i (%0.2f%% qnodes)\0A\00" ; <[29 x i8]*> [#uses=0] - at str.upgrd.12 = internal global [54 x i8] c"ECacheProbes : %u ECacheHits : %u HitRate : %f%%\0A\00" ; <[54 x i8]*> [#uses=0] - at TTStores = internal global i32 0 ; [#uses=1] - at TTProbes = internal global i32 0 ; [#uses=1] - at TTHits = internal global i32 0 ; [#uses=1] - at str.upgrd.13 = internal global [60 x i8] c"TTStores : %u TTProbes : %u TTHits : %u HitRate : %f%%\0A\00" ; <[60 x i8]*> [#uses=0] - at NTries = internal global i32 0 ; [#uses=1] - at NCuts = internal global i32 0 ; [#uses=1] - at TExt = internal global i32 0 ; [#uses=1] - at str.upgrd.14 = internal global [51 x i8] c"NTries : %u NCuts : %u CutRate : %f%% TExt: %u\0A\00" ; <[51 x i8]*> [#uses=0] - at ext_check = internal global i32 0 ; [#uses=1] - at razor_drop = internal global i32 0 ; [#uses=1] - at razor_material = internal global i32 0 ; [#uses=1] - at str.upgrd.15 = internal global [61 x i8] c"Check extensions: %u Razor drops : %u Razor Material : %u\0A\00" ; <[61 x i8]*> [#uses=0] - at FHF = internal global i32 0 ; [#uses=1] - at FH = internal global i32 0 ; [#uses=1] - at str.upgrd.16 = internal global [22 x i8] c"Move ordering : %f%%\0A\00" ; <[22 x i8]*> [#uses=0] - at maxposdiff = internal global i32 0 ; [#uses=1] - at str.upgrd.17 = internal global [47 x i8] c"Material score: %d Eval : %d MaxPosDiff: %d\0A\00" ; <[47 x i8]*> [#uses=0] - at str.upgrd.18 = internal global [17 x i8] c"Solution found.\0A\00" ; <[17 x i8]*> [#uses=0] - at str3 = internal global [21 x i8] c"Solution not found.\0A\00" ; <[21 x i8]*> [#uses=0] - at str.upgrd.19 = internal global [15 x i8] c"Solved: %d/%d\0A\00" ; <[15 x i8]*> [#uses=0] - at str.upgrd.20 = internal global [9 x i8] c"EPD: %s\0A\00" ; <[9 x i8]*> [#uses=0] - at str4 = internal global [21 x i8] c"Searching to %d ply\0A\00" ; <[21 x i8]*> [#uses=0] - at maxdepth = internal global i32 0 ; [#uses=0] - at std_material = internal global [14 x i32] [ i32 0, i32 100, i32 -100, i32 310, i32 -310, i32 4000, i32 -4000, i32 500, i32 -500, i32 900, i32 -900, i32 325, i32 -325, i32 0 ] ; <[14 x i32]*> [#uses=0] - at zh_material = internal global [14 x i32] [ i32 0, i32 100, i32 -100, i32 210, i32 -210, i32 4000, i32 -4000, i32 250, i32 -250, i32 450, i32 -450, i32 230, i32 -230, i32 0 ] ; <[14 x i32]*> [#uses=0] - at suicide_material = internal global [14 x i32] [ i32 0, i32 15, i32 -15, i32 150, i32 -150, i32 500, i32 -500, i32 150, i32 -150, i32 50, i32 -50, i32 0, i32 0, i32 0 ] ; <[14 x i32]*> [#uses=0] - at losers_material = internal global [14 x i32] [ i32 0, i32 80, i32 -80, i32 320, i32 -320, i32 1000, i32 -1000, i32 350, i32 -350, i32 400, i32 -400, i32 270, i32 -270, i32 0 ] ; <[14 x i32]*> [#uses=0] - at Xfile = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 , i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at Xrank = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 0, i32 0, i32 0, i32 0, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 0, i32 0, i32 0, i32 0, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 0, i32 0, i32 0, i32 0, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 0, i32 0, i32 0, i32 0, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 0, i32 0, i32 0, i32 0, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 0, i32 0, i32 0, i32 0, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 , i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at Xdiagl = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 9, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 0, i32 0, i32 0, i32 10, i32 9, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 0, i32 0, i32 0, i32 0, i32 11, i32 10, i32 9, i32 1, i32 2, i32 3, i32 4, i32 5, i32 0, i32 0, i32 0, i32 0, i32 12, i32 11, i32 10, i32 9, i32 1, i32 2, i32 3, i32 4, i32 0, i32 0, i32 0, i32 0, i32 13, i32 12, i32 11, i32 10, i32 9, i32 1, i32 2, i32 3, i32 0, i32 0, i32 0, i32 0, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 1, i32 2, i32 0, i32 0, i32 0, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at Xdiagr = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 1, i32 0, i32 0, i32 0, i32 0, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 1, i32 2, i32 0, i32 0, i32 0, i32 0, i32 13, i32 12, i32 11, i32 10, i32 9, i32 1, i32 2, i32 3, i32 0, i32 0, i32 0, i32 0, i32 12, i32 11, i32 10, i32 9, i32 1, i32 2, i32 3, i32 4, i32 0, i32 0, i32 0, i32 0, i32 11, i32 10, i32 9, i32 1, i32 2, i32 3, i32 4, i32 5, i32 0, i32 0, i32 0, i32 0, i32 10, i32 9, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 0, i32 0, i32 0, i32 0, i32 9, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at sqcolor = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at pcsqbishop = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 -5, i32 -10, i32 -5, i32 -5, i32 -10, i32 -5, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 10, i32 5, i32 10, i32 10, i32 5, i32 10, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 5, i32 6, i32 15, i32 15, i32 6, i32 5, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 3, i32 15, i32 10, i32 10, i32 15, i32 3, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 3, i32 15, i32 10, i32 10, i32 15, i32 3, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 5, i32 6, i32 15, i32 15, i32 6, i32 5, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 10, i32 5, i32 10, i32 10, i32 5, i32 10, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 -5, i32 -10, i32 -5, i32 -5, i32 -10, i32 -5, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at black_knight = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 15, i32 25, i32 25, i32 25, i32 25, i32 15, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 15, i32 25, i32 35, i32 35, i32 35, i32 15, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 10, i32 25, i32 20, i32 25, i32 25, i32 10, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 20, i32 20, i32 20, i32 20, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 15, i32 15, i32 15, i32 15, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 3, i32 3, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -35, i32 -10, i32 -10, i32 -10, i32 -10, i32 -35, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at white_knight = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -35, i32 -10, i32 -10, i32 -10, i32 -10, i32 -35, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 3, i32 3, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 15, i32 15, i32 15, i32 15, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 20, i32 20, i32 20, i32 20, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 10, i32 25, i32 20, i32 25, i32 25, i32 10, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 15, i32 25, i32 35, i32 35, i32 35, i32 15, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 15, i32 25, i32 25, i32 25, i32 25, i32 15, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at white_pawn = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 25, i32 25, i32 35, i32 5, i32 5, i32 50, i32 45, i32 30, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 7, i32 7, i32 5, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 14, i32 14, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 20, i32 20, i32 10, i32 5, i32 5, i32 0, i32 0, i32 0, i32 0, i32 12, i32 18, i32 18, i32 27, i32 27, i32 18, i32 18, i32 18, i32 0, i32 0, i32 0, i32 0, i32 25, i32 30, i32 30, i32 35, i32 35, i32 35, i32 30, i32 25, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at black_pawn = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 30, i32 30, i32 30, i32 35, i32 35, i32 35, i32 30, i32 25, i32 0, i32 0, i32 0, i32 0, i32 12, i32 18, i32 18, i32 27, i32 27, i32 18, i32 18, i32 18, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 20, i32 20, i32 10, i32 5, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 14, i32 14, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 7, i32 7, i32 5, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 25, i32 25, i32 35, i32 5, i32 5, i32 50, i32 45, i32 30, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at white_king = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -100, i32 7, i32 4, i32 0, i32 10, i32 4, i32 7, i32 -100, i32 0, i32 0, i32 0, i32 0, i32 -250, i32 -200, i32 -150, i32 -100, i32 -100, i32 -150, i32 -200, i32 -250, i32 0, i32 0, i32 0, i32 0, i32 -350, i32 -300, i32 -300, i32 -250, i32 -250, i32 -300, i32 -300, i32 -350, i32 0, i32 0, i32 0, i32 0, i32 -400, i32 -400, i32 -400, i32 -350, i32 -350, i32 -400, i32 -400, i32 -400, i32 0, i32 0, i32 0, i32 0, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 0, i32 0, i32 0, i32 0, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 0, i32 0, i32 0, i32 0, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 0, i32 0, i32 0, i32 0, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at black_king = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 0, i32 0, i32 0, i32 0, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 0, i32 0, i32 0, i32 0, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 -500, i32 0, i32 0, i32 0, i32 0, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 -450, i32 0, i32 0, i32 0, i32 0, i32 -400, i32 -400, i32 -400, i32 -350, i32 -350, i32 -400, i32 -400, i32 -400, i32 0, i32 0, i32 0, i32 0, i32 -350, i32 -300, i32 -300, i32 -250, i32 -250, i32 -300, i32 -300, i32 -350, i32 0, i32 0, i32 0, i32 0, i32 -250, i32 -200, i32 -150, i32 -100, i32 -100, i32 -150, i32 -200, i32 -250, i32 0, i32 0, i32 0, i32 0, i32 -10 0, i32 7, i32 4, i32 0, i32 10, i32 4, i32 7, i32 -100, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at black_queen = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 5, i32 5, i32 5, i32 10, i32 10, i32 5, i32 5, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 3, i32 3, i32 3, i32 3, i32 3, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 0, i32 0, i32 0, i32 0, i32 -60, i32 -40, i32 -40, i32 -60, i32 -60, i32 -40, i32 -40, i32 -60, i32 0, i32 0, i32 0, i32 0, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 -15, i32 -15, i32 -10, i32 -10, i32 -15, i32 -15, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 7, i32 10, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i3 2 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at white_queen = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 7, i32 10, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 -15, i32 -15, i32 -10, i32 -10, i32 -15, i32 -15, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 -40, i32 0, i32 0, i32 0, i32 0, i32 -60, i32 -40, i32 -40, i32 -60, i32 -60, i32 -40, i32 -40, i32 -60, i32 0, i32 0, i32 0, i32 0, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 -30, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 3, i32 3, i32 3, i32 3, i32 3, i32 0, i32 0, i32 0, i32 0, i32 0, i32 5, i32 5, i32 5, i32 10, i32 10, i32 5, i32 5, i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i3 2 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at black_rook = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 15, i32 20, i32 25, i32 25, i32 20, i32 15, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 15, i32 20, i32 20, i32 15, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -20, i32 -20, i32 -30, i32 -30, i32 -20, i32 -20, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 -15, i32 -15, i32 -10, i32 -10, i32 -15, i32 -15, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 7, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 , i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at white_rook = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 7, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 -15, i32 -15, i32 -10, i32 -10, i32 -15, i32 -15, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -20, i32 -20, i32 -30, i32 -30, i32 -20, i32 -20, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 15, i32 20, i32 20, i32 15, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 15, i32 20, i32 25, i32 25, i32 20, i32 15, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 , i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at upscale = internal global [64 x i32] [ i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 62, i32 63, i32 64, i32 65, i32 66, i32 67, i32 68, i32 69, i32 74, i32 75, i32 76, i32 77, i32 78, i32 79, i32 80, i32 81, i32 86, i32 87, i32 88, i32 89, i32 90, i32 91, i32 92, i32 93, i32 98, i32 99, i32 100, i32 101, i32 102, i32 103, i32 104, i32 105, i32 110, i32 111, i32 112, i32 113, i32 114, i32 115, i32 116, i32 117 ] ; <[64 x i32]*> [#uses=0] - at pre_p_tropism = internal global [9 x i32] [ i32 9999, i32 40, i32 20, i32 10, i32 3, i32 1, i32 1, i32 0, i32 9999 ] ; <[9 x i32]*> [#uses=0] - at pre_r_tropism = internal global [9 x i32] [ i32 9999, i32 50, i32 40, i32 15, i32 5, i32 1, i32 1, i32 0, i32 9999 ] ; <[9 x i32]*> [#uses=0] - at pre_n_tropism = internal global [9 x i32] [ i32 9999, i32 50, i32 70, i32 35, i32 10, i32 2, i32 1, i32 0, i32 9999 ] ; <[9 x i32]*> [#uses=0] - at pre_q_tropism = internal global [9 x i32] [ i32 9999, i32 100, i32 60, i32 20, i32 5, i32 2, i32 0, i32 0, i32 9999 ] ; <[9 x i32]*> [#uses=0] - at pre_b_tropism = internal global [9 x i32] [ i32 9999, i32 50, i32 25, i32 15, i32 5, i32 2, i32 2, i32 2, i32 9999 ] ; <[9 x i32]*> [#uses=0] - at rookdistance = internal global [144 x [144 x i32]] zeroinitializer ; <[144 x [144 x i32]]*> [#uses=0] - at distance = internal global [144 x [144 x i32]] zeroinitializer ; <[144 x [144 x i32]]*> [#uses=0] - at p_tropism = internal global [144 x [144 x i8]] zeroinitializer ; <[144 x [144 x i8]]*> [#uses=0] - at b_tropism = internal global [144 x [144 x i8]] zeroinitializer ; <[144 x [144 x i8]]*> [#uses=0] - at n_tropism = internal global [144 x [144 x i8]] zeroinitializer ; <[144 x [144 x i8]]*> [#uses=0] - at r_tropism = internal global [144 x [144 x i8]] zeroinitializer ; <[144 x [144 x i8]]*> [#uses=0] - at q_tropism = internal global [144 x [144 x i8]] zeroinitializer ; <[144 x [144 x i8]]*> [#uses=0] - at cfg_devscale.b = internal global i1 false ; [#uses=0] - at pieces = internal global [62 x i32] zeroinitializer ; <[62 x i32]*> [#uses=0] - at piece_count = internal global i32 0 ; [#uses=1] - at cfg_smarteval.b = internal global i1 false ; [#uses=0] - at lcentral = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -15, i32 -15, i32 -15, i32 -15, i32 -15, i32 -15, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 0, i32 3, i32 5, i32 5, i32 3, i32 0, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 0, i32 15, i32 15, i32 15, i32 15, i32 0, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 0, i32 15, i32 30, i32 30, i32 15, i32 0, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 0, i32 15, i32 30, i32 30, i32 15, i32 0, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 0, i32 15, i32 15, i32 15, i32 15, i32 0, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -15, i32 0, i32 3, i32 5, i32 5, i32 3, i32 0, i32 -15, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -15, i32 -15, i32 -15, i32 -15, i32 -15, i32 -15, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at str3.upgrd.21 = internal global [81 x i8] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/leval.c\00" ; <[81 x i8]*> [#uses=0] - at str5 = internal global [21 x i8] c"(i > 0) && (i < 145)\00" ; <[21 x i8]*> [#uses=0] - at kingcap.b = internal global i1 false ; [#uses=0] - at numb_moves = internal global i32 0 ; [#uses=2] - at genfor = internal global %struct.move_s* null ; <%struct.move_s**> [#uses=0] - at captures = internal global i32 0 ; [#uses=1] - at fcaptures.b = internal global i1 false ; [#uses=0] - at gfrom = internal global i32 0 ; [#uses=0] - at Giveaway.b = internal global i1 false ; [#uses=0] - at path_x = internal global [300 x %struct.move_x] zeroinitializer ; <[300 x %struct.move_x]*> [#uses=0] - at str7 = internal global [81 x i8] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/moves.c\00" ; <[81 x i8]*> [#uses=0] - at str8 = internal global [15 x i8] c"find_slot < 63\00" ; <[15 x i8]*> [#uses=0] - at is_promoted = internal global [62 x i32] zeroinitializer ; <[62 x i32]*> [#uses=0] - at squares = internal global [144 x i32] zeroinitializer ; <[144 x i32]*> [#uses=0] - at str.upgrd.22 = internal global [38 x i8] c"promoted > frame && promoted < npiece\00" ; <[38 x i8]*> [#uses=0] - at str1.upgrd.23 = internal global [38 x i8] c"promoted < npiece && promoted > frame\00" ; <[38 x i8]*> [#uses=0] - at evalRoutines = internal global [7 x i32 (i32, i32)*] [ i32 (i32, i32)* @ErrorIt, i32 (i32, i32)* @Pawn, i32 (i32, i32)* @Knight, i32 (i32, i32)* @King, i32 (i32, i32)* @Rook, i32 (i32, i32)* @Queen, i32 (i32, i32)* @Bishop ] ; <[7 x i32 (i32, i32)*]*> [#uses=0] - at sbishop = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 8, i32 5, i32 5, i32 5, i32 5, i32 8, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 3, i32 3, i32 5, i32 5, i32 3, i32 3, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 2, i32 5, i32 4, i32 4, i32 5, i32 2, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 2, i32 5, i32 4, i32 4, i32 5, i32 2, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 3, i32 3, i32 5, i32 5, i32 3, i32 3, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 8, i32 5, i32 5, i32 5, i32 5, i32 8, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 -2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at sknight = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 3, i32 3, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 5, i32 5, i32 5, i32 5, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 5, i32 10, i32 10, i32 5, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 5, i32 10, i32 10, i32 5, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 5, i32 5, i32 5, i32 5, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 3, i32 3, i32 0, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at swhite_pawn = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 10, i32 10, i32 3, i32 2, i32 1, i32 0, i32 0, i32 0, i32 0, i32 2, i32 4, i32 6, i32 12, i32 12, i32 6, i32 4, i32 2, i32 0, i32 0, i32 0, i32 0, i32 3, i32 6, i32 9, i32 14, i32 14, i32 9, i32 6, i32 3, i32 0, i32 0, i32 0, i32 0, i32 10, i32 12, i32 14, i32 16, i32 16, i32 14, i32 12, i32 10, i32 0, i32 0, i32 0, i32 0, i32 20, i32 22, i32 24, i32 26, i32 26, i32 24, i32 22, i32 20, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 , i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at sblack_pawn = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 20, i32 22, i32 24, i32 26, i32 26, i32 24, i32 22, i32 20, i32 0, i32 0, i32 0, i32 0, i32 10, i32 12, i32 14, i32 16, i32 16, i32 14, i32 12, i32 10, i32 0, i32 0, i32 0, i32 0, i32 3, i32 6, i32 9, i32 14, i32 14, i32 9, i32 6, i32 3, i32 0, i32 0, i32 0, i32 0, i32 2, i32 4, i32 6, i32 12, i32 12, i32 6, i32 4, i32 2, i32 0, i32 0, i32 0, i32 0, i32 1, i32 2, i32 3, i32 10, i32 10, i32 3, i32 2, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 , i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at swhite_king = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 2, i32 14, i32 0, i32 0, i32 0, i32 9, i32 14, i32 2, i32 0, i32 0, i32 0, i32 0, i32 -3, i32 -5, i32 -6, i32 -6, i32 -6, i32 -6, i32 -5, i32 -3, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 -5, i32 -8, i32 -8, i32 -8, i32 -8, i32 -5, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -8, i32 -8, i32 -13, i32 -13, i32 -13, i32 -13, i32 -8, i32 -8, i32 0, i32 0, i32 0, i32 0, i32 -13, i32 -13, i32 -21, i32 -21, i32 -21, i32 -21, i32 -13, i32 -13, i32 0, i32 0, i32 0, i32 0, i32 -21, i32 -21, i32 -34, i32 -34, i32 -34, i32 -34, i32 -21, i32 -21, i32 0, i32 0, i32 0, i32 0, i32 -34, i32 -34, i32 -55, i32 -55, i32 -55, i32 -55, i32 -34, i32 -34, i32 0, i32 0, i32 0, i32 0, i32 -55, i32 -55, i32 -89, i32 -89, i32 -89, i32 -89, i32 -55, i32 -55, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at sblack_king = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -55, i32 -55, i32 -89, i32 -89, i32 -89, i32 -89, i32 -55, i32 -55, i32 0, i32 0, i32 0, i32 0, i32 -34, i32 -34, i32 -55, i32 -55, i32 -55, i32 -55, i32 -34, i32 -34, i32 0, i32 0, i32 0, i32 0, i32 -21, i32 -21, i32 -34, i32 -34, i32 -34, i32 -34, i32 -21, i32 -21, i32 0, i32 0, i32 0, i32 0, i32 -13, i32 -13, i32 -21, i32 -21, i32 -21, i32 -21, i32 -13, i32 -13, i32 0, i32 0, i32 0, i32 0, i32 -8, i32 -8, i32 -13, i32 -13, i32 -13, i32 -13, i32 -8, i32 -8, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 -5, i32 -8, i32 -8, i32 -8, i32 -8, i32 -5, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -3, i32 -5, i32 -6, i32 -6, i32 -6, i32 -6, i32 -5, i32 -3, i32 0, i32 0, i32 0, i32 0, i32 2, i32 14, i32 0, i32 0, i32 0, i32 9, i32 14, i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at send_king = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 -3, i32 -1, i32 0, i32 0, i32 -1, i32 -3, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 -3, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 -3, i32 0, i32 0, i32 0, i32 0, i32 -1, i32 10, i32 25, i32 25, i32 25, i32 25, i32 10, i32 -1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 25, i32 50, i32 50, i32 25, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 10, i32 25, i32 50, i32 50, i32 25, i32 10, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -1, i32 10, i32 25, i32 25, i32 25, i32 25, i32 10, i32 -1, i32 0, i32 0, i32 0, i32 0, i32 -3, i32 10, i32 10, i32 10, i32 10, i32 10, i32 10, i32 -3, i32 0, i32 0, i32 0, i32 0, i32 -5, i32 -3, i32 -1, i32 0, i32 0, i32 -1, i32 -3, i32 -5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i 32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at srev_rank = internal global [9 x i32] [ i32 0, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1 ] ; <[9 x i32]*> [#uses=0] - at std_p_tropism = internal global [8 x i32] [ i32 9999, i32 15, i32 10, i32 7, i32 2, i32 0, i32 0, i32 0 ] ; <[8 x i32]*> [#uses=0] - at std_own_p_tropism = internal global [8 x i32] [ i32 9999, i32 30, i32 10, i32 2, i32 0, i32 0, i32 0, i32 0 ] ; <[8 x i32]*> [#uses=0] - at std_r_tropism = internal global [16 x i32] [ i32 9999, i32 0, i32 15, i32 5, i32 2, i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[16 x i32]*> [#uses=0] - at std_n_tropism = internal global [8 x i32] [ i32 9999, i32 14, i32 9, i32 6, i32 1, i32 0, i32 0, i32 0 ] ; <[8 x i32]*> [#uses=0] - at std_q_tropism = internal global [8 x i32] [ i32 9999, i32 200, i32 50, i32 15, i32 3, i32 2, i32 1, i32 0 ] ; <[8 x i32]*> [#uses=0] - at std_b_tropism = internal global [8 x i32] [ i32 9999, i32 12, i32 7, i32 5, i32 0, i32 0, i32 0, i32 0 ] ; <[8 x i32]*> [#uses=0] - at phase = internal global i32 0 ; [#uses=1] - at dir.3001 = internal global [4 x i32] [ i32 -13, i32 -11, i32 11, i32 13 ] ; <[4 x i32]*> [#uses=0] - at dir.3021 = internal global [4 x i32] [ i32 -1, i32 1, i32 12, i32 -12 ] ; <[4 x i32]*> [#uses=0] - at king_locs = internal global [2 x i32] zeroinitializer ; <[2 x i32]*> [#uses=0] - at square_d1.3081 = internal global [2 x i32] [ i32 29, i32 113 ] ; <[2 x i32]*> [#uses=0] - at wmat = internal global i32 0 ; [#uses=0] - at bmat = internal global i32 0 ; [#uses=0] - at str.upgrd.24 = internal global [35 x i8] c"Illegal piece detected sq=%i c=%i\0A\00" ; <[35 x i8]*> [#uses=0] - at str10 = internal global [81 x i8] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/neval.c\00" ; <[81 x i8]*> [#uses=0] - at std_hand_value = internal global [13 x i32] [ i32 0, i32 100, i32 -100, i32 210, i32 -210, i32 0, i32 0, i32 250, i32 -250, i32 450, i32 -450, i32 230, i32 -230 ] ; <[13 x i32]*> [#uses=0] - at xb_mode = internal global i32 0 ; [#uses=0] - at str.upgrd.25 = internal global [69 x i8] c"tellics ptell Hello! I am Sjeng and hope you enjoy playing with me.\0A\00" ; <[69 x i8]*> [#uses=0] - at str.upgrd.26 = internal global [76 x i8] c"tellics ptell For help on some commands that I understand, ptell me 'help'\0A\00" ; <[76 x i8]*> [#uses=0] - at str12 = internal global [3 x i8] c"%s\00" ; <[3 x i8]*> [#uses=0] - at my_partner = internal global [256 x i8] zeroinitializer ; <[256 x i8]*> [#uses=0] - at str13 = internal global [25 x i8] c"tellics set f5 bughouse\0A\00" ; <[25 x i8]*> [#uses=0] - at str.upgrd.27 = internal global [16 x i8] c"tellics unseek\0A\00" ; <[16 x i8]*> [#uses=0] - at str.upgrd.28 = internal global [20 x i8] c"tellics set f5 1=1\0A\00" ; <[20 x i8]*> [#uses=0] - at str.upgrd.29 = internal global [80 x i8] c"is...uh...what did you say?\0A\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" ; <[80 x i8]*> [#uses=0] - at str.upgrd.30 = internal global [5 x i8] c"help\00" ; <[5 x i8]*> [#uses=0] - at str.upgrd.31 = internal global [147 x i8] c"tellics ptell Commands that I understand are : sit, go, fast, slow, abort, flag, +/++/+++/-/--/---{p,n,b,r,q,d,h,trades}, x, dead, formula, help.\0A\00" ; <[147 x i8]*> [#uses=0] - at str.upgrd.32 = internal global [6 x i8] c"sorry\00" ; <[6 x i8]*> [#uses=0] - at str.upgrd.33 = internal global [59 x i8] c"tellics ptell Sorry, but I'm not playing a bughouse game.\0A\00" ; <[59 x i8]*> [#uses=0] - at str.upgrd.34 = internal global [4 x i8] c"sit\00" ; <[4 x i8]*> [#uses=0] - at str.upgrd.35 = internal global [56 x i8] c"tellics ptell Ok, I sit next move. Tell me when to go.\0A\00" ; <[56 x i8]*> [#uses=0] - at must_sit.b = internal global i1 false ; [#uses=0] - at str114 = internal global [3 x i8] c"go\00" ; <[3 x i8]*> [#uses=0] - at str2.upgrd.36 = internal global [5 x i8] c"move\00" ; <[5 x i8]*> [#uses=0] - at str.upgrd.37 = internal global [31 x i8] c"tellics ptell Ok, I'm moving.\0A\00" ; <[31 x i8]*> [#uses=0] - at str3.upgrd.38 = internal global [5 x i8] c"fast\00" ; <[5 x i8]*> [#uses=0] - at str4.upgrd.39 = internal global [5 x i8] c"time\00" ; <[5 x i8]*> [#uses=0] - at str15 = internal global [35 x i8] c"tellics ptell Ok, I'm going FAST!\0A\00" ; <[35 x i8]*> [#uses=0] - at go_fast.b = internal global i1 false ; [#uses=0] - at str5.upgrd.40 = internal global [5 x i8] c"slow\00" ; <[5 x i8]*> [#uses=0] - at str16 = internal global [36 x i8] c"tellics ptell Ok, moving normally.\0A\00" ; <[36 x i8]*> [#uses=0] - at str6 = internal global [6 x i8] c"abort\00" ; <[6 x i8]*> [#uses=0] - at str7.upgrd.41 = internal global [35 x i8] c"tellics ptell Requesting abort...\0A\00" ; <[35 x i8]*> [#uses=0] - at str17 = internal global [15 x i8] c"tellics abort\0A\00" ; <[15 x i8]*> [#uses=0] - at str8.upgrd.42 = internal global [5 x i8] c"flag\00" ; <[5 x i8]*> [#uses=0] - at str.upgrd.43 = internal global [27 x i8] c"tellics ptell Flagging...\0A\00" ; <[27 x i8]*> [#uses=0] - at str.upgrd.44 = internal global [14 x i8] c"tellics flag\0A\00" ; <[14 x i8]*> [#uses=0] - at str18 = internal global [2 x i8] c"+\00" ; <[2 x i8]*> [#uses=0] - at str9 = internal global [6 x i8] c"trade\00" ; <[6 x i8]*> [#uses=0] - at str10.upgrd.45 = internal global [35 x i8] c"tellics ptell Ok, trading is GOOD\0A\00" ; <[35 x i8]*> [#uses=0] - at str11 = internal global [4 x i8] c"+++\00" ; <[4 x i8]*> [#uses=0] - at str12.upgrd.46 = internal global [6 x i8] c"mates\00" ; <[6 x i8]*> [#uses=0] - at str13.upgrd.47 = internal global [3 x i8] c"++\00" ; <[3 x i8]*> [#uses=0] - at str.upgrd.48 = internal global [49 x i8] c"is VERY good (ptell me 'x' to play normal again)\00" ; <[49 x i8]*> [#uses=0] - at str.upgrd.49 = internal global [44 x i8] c"is good (ptell me 'x' to play normal again)\00" ; <[44 x i8]*> [#uses=0] - at str19 = internal global [29 x i8] c"tellics ptell Ok, Knight %s\0A\00" ; <[29 x i8]*> [#uses=0] - at str14 = internal global [29 x i8] c"tellics ptell Ok, Bishop %s\0A\00" ; <[29 x i8]*> [#uses=0] - at str15.upgrd.50 = internal global [27 x i8] c"tellics ptell Ok, Rook %s\0A\00" ; <[27 x i8]*> [#uses=0] - at str.upgrd.51 = internal global [28 x i8] c"tellics ptell Ok, Queen %s\0A\00" ; <[28 x i8]*> [#uses=0] - at str16.upgrd.52 = internal global [27 x i8] c"tellics ptell Ok, Pawn %s\0A\00" ; <[27 x i8]*> [#uses=0] - at str17.upgrd.53 = internal global [31 x i8] c"tellics ptell Ok, Diagonal %s\0A\00" ; <[31 x i8]*> [#uses=0] - at str18.upgrd.54 = internal global [28 x i8] c"tellics ptell Ok, Heavy %s\0A\00" ; <[28 x i8]*> [#uses=0] - at str20 = internal global [34 x i8] c"tellics ptell Ok, trading is BAD\0A\00" ; <[34 x i8]*> [#uses=0] - at str20.upgrd.55 = internal global [4 x i8] c"---\00" ; <[4 x i8]*> [#uses=0] - at str.upgrd.56 = internal global [53 x i8] c"mates you (ptell me 'x' when it no longer mates you)\00" ; <[53 x i8]*> [#uses=0] - at str21 = internal global [3 x i8] c"--\00" ; <[3 x i8]*> [#uses=0] - at str.upgrd.57 = internal global [52 x i8] c"is VERY bad (ptell me 'x' when it is no longer bad)\00" ; <[52 x i8]*> [#uses=0] - at str21.upgrd.58 = internal global [47 x i8] c"is bad (ptell me 'x' when it is no longer bad)\00" ; <[47 x i8]*> [#uses=0] - at str23 = internal global [16 x i8] c"mate me anymore\00" ; <[16 x i8]*> [#uses=0] - at str24 = internal global [6 x i8] c"never\00" ; <[6 x i8]*> [#uses=0] - at str25 = internal global [5 x i8] c"mind\00" ; <[5 x i8]*> [#uses=0] - at str22 = internal global [9 x i8] c"ptell me\00" ; <[9 x i8]*> [#uses=0] - at str.upgrd.59 = internal global [55 x i8] c"tellics ptell Ok, reverting to STANDARD piece values!\0A\00" ; <[55 x i8]*> [#uses=0] - at partnerdead.b = internal global i1 false ; [#uses=0] - at piecedead.b = internal global i1 false ; [#uses=0] - at str.upgrd.60 = internal global [26 x i8] c"i'll have to sit...(dead)\00" ; <[26 x i8]*> [#uses=0] - at str27 = internal global [5 x i8] c"dead\00" ; <[5 x i8]*> [#uses=0] - at str28 = internal global [27 x i8] c"i'll have to sit...(piece)\00" ; <[27 x i8]*> [#uses=0] - at str29 = internal global [3 x i8] c"ok\00" ; <[3 x i8]*> [#uses=0] - at str30 = internal global [3 x i8] c"hi\00" ; <[3 x i8]*> [#uses=0] - at str31 = internal global [6 x i8] c"hello\00" ; <[6 x i8]*> [#uses=0] - at str32 = internal global [26 x i8] c"tellics ptell Greetings.\0A\00" ; <[26 x i8]*> [#uses=0] - at str.upgrd.61 = internal global [8 x i8] c"formula\00" ; <[8 x i8]*> [#uses=0] - at str.upgrd.62 = internal global [87 x i8] c"tellics ptell Setting formula, if you are still interrupted, complain to my operator.\0A\00" ; <[87 x i8]*> [#uses=0] - at str33 = internal global [59 x i8] c"tellics ptell Sorry, but I don't understand that command.\0A\00" ; <[59 x i8]*> [#uses=0] - at pawnmated.3298 = internal global i32 0 ; [#uses=0] - at knightmated.3299 = internal global i32 0 ; [#uses=0] - at bishopmated.3300 = internal global i32 0 ; [#uses=0] - at rookmated.3301 = internal global i32 0 ; [#uses=0] - at queenmated.3302 = internal global i32 0 ; [#uses=0] - at str.upgrd.63 = internal global [41 x i8] c"tellics ptell p doesn't mate me anymore\0A\00" ; <[41 x i8]*> [#uses=0] - at str34 = internal global [41 x i8] c"tellics ptell n doesn't mate me anymore\0A\00" ; <[41 x i8]*> [#uses=0] - at str35 = internal global [41 x i8] c"tellics ptell b doesn't mate me anymore\0A\00" ; <[41 x i8]*> [#uses=0] - at str36 = internal global [41 x i8] c"tellics ptell r doesn't mate me anymore\0A\00" ; <[41 x i8]*> [#uses=0] - at str37 = internal global [41 x i8] c"tellics ptell q doesn't mate me anymore\0A\00" ; <[41 x i8]*> [#uses=0] - at str38 = internal global [20 x i8] c"tellics ptell ---p\0A\00" ; <[20 x i8]*> [#uses=0] - at str39 = internal global [20 x i8] c"tellics ptell ---n\0A\00" ; <[20 x i8]*> [#uses=0] - at str40 = internal global [20 x i8] c"tellics ptell ---b\0A\00" ; <[20 x i8]*> [#uses=0] - at str41 = internal global [20 x i8] c"tellics ptell ---r\0A\00" ; <[20 x i8]*> [#uses=0] - at str42 = internal global [20 x i8] c"tellics ptell ---q\0A\00" ; <[20 x i8]*> [#uses=0] - at str23.upgrd.64 = internal global [17 x i8] c"tellics ptell x\0A\00" ; <[17 x i8]*> [#uses=0] - at str.upgrd.65 = internal global [18 x i8] c"tellics ptell go\0A\00" ; <[18 x i8]*> [#uses=0] - at bufftop = internal global i32 0 ; [#uses=2] - at membuff = internal global i8* null ; [#uses=3] - at maxply = internal global i32 0 ; [#uses=1] - at forwards = internal global i32 0 ; [#uses=1] - at nodecount = internal global i32 0 ; [#uses=1] - at frees = internal global i32 0 ; [#uses=0] - at PBSize.b = internal global i1 false ; [#uses=1] - at alllosers.b = internal global i1 false ; [#uses=1] - at rootlosers = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=1] - at pn_move = internal global %struct.move_s zeroinitializer ; <%struct.move_s*> [#uses=7] - at iters = internal global i32 0 ; [#uses=1] - at kibitzed.b = internal global i1 false ; [#uses=0] - at str24.upgrd.66 = internal global [28 x i8] c"tellics kibitz Forced win!\0A\00" ; <[28 x i8]*> [#uses=0] - at str25.upgrd.67 = internal global [34 x i8] c"tellics kibitz Forced win! (alt)\0A\00" ; <[34 x i8]*> [#uses=0] - at pn_time = internal global i32 0 ; [#uses=1] - at post = internal global i32 0 ; [#uses=0] - at str.upgrd.68 = internal global [94 x i8] c"tellics whisper proof %d, disproof %d, %d losers, highest depth %d, primary %d, secondary %d\0A\00" ; <[94 x i8]*> [#uses=0] - at str26 = internal global [30 x i8] c"tellics whisper Forced reply\0A\00" ; <[30 x i8]*> [#uses=0] - at str27.upgrd.69 = internal global [60 x i8] c"P: %d D: %d N: %d S: %d Mem: %2.2fM Iters: %d MaxDepth: %d\0A\00" ; <[60 x i8]*> [#uses=0] - at str.upgrd.70 = internal global [90 x i8] c"tellics whisper proof %d, disproof %d, %d nodes, %d forwards, %d iters, highest depth %d\0A\00" ; <[90 x i8]*> [#uses=0] - at str.upgrd.71 = internal global [11 x i8] c"Time : %f\0A\00" ; <[11 x i8]*> [#uses=0] - at str28.upgrd.72 = internal global [23 x i8] c"This position is WON.\0A\00" ; <[23 x i8]*> [#uses=0] - at str29.upgrd.73 = internal global [5 x i8] c"PV: \00" ; <[5 x i8]*> [#uses=0] - at str30.upgrd.74 = internal global [4 x i8] c"%s \00" ; <[4 x i8]*> [#uses=0] - at str31.upgrd.75 = internal global [2 x i8] c" \00" ; <[2 x i8]*> [#uses=0] - at str32.upgrd.76 = internal global [41 x i8] c"\0Atellics kibitz Forced win in %d moves.\0A\00" ; <[41 x i8]*> [#uses=0] - at str33.upgrd.77 = internal global [20 x i8] c"\0A1-0 {White mates}\0A\00" ; <[20 x i8]*> [#uses=0] - at result = internal global i32 0 ; [#uses=4] - at str1.upgrd.78 = internal global [20 x i8] c"\0A0-1 {Black mates}\0A\00" ; <[20 x i8]*> [#uses=0] - at str35.upgrd.79 = internal global [24 x i8] c"This position is LOST.\0A\00" ; <[24 x i8]*> [#uses=0] - at str36.upgrd.80 = internal global [27 x i8] c"This position is UNKNOWN.\0A\00" ; <[27 x i8]*> [#uses=0] - at str37.upgrd.81 = internal global [47 x i8] c"P: %d D: %d N: %d S: %d Mem: %2.2fM Iters: %d\0A\00" ; <[47 x i8]*> [#uses=0] - at s_threat.b = internal global i1 false ; [#uses=0] - at TTSize.b = internal global i1 false ; [#uses=3] - at cfg_razordrop.b = internal global i1 false ; [#uses=0] - at cfg_futprune.b = internal global i1 false ; [#uses=0] - at cfg_onerep.b = internal global i1 false ; [#uses=0] - at setcode = internal global [30 x i8] zeroinitializer ; <[30 x i8]*> [#uses=0] - at str38.upgrd.82 = internal global [3 x i8] c"%u\00" ; <[3 x i8]*> [#uses=0] - at searching_pv.b = internal global i1 false ; [#uses=0] - at pv = internal global [300 x [300 x %struct.move_s]] zeroinitializer ; <[300 x [300 x %struct.move_s]]*> [#uses=0] - at i_depth = internal global i32 0 ; [#uses=0] - at history_h = internal global [144 x [144 x i32]] zeroinitializer ; <[144 x [144 x i32]]*> [#uses=0] - at killer1 = internal global [300 x %struct.move_s] zeroinitializer ; <[300 x %struct.move_s]*> [#uses=0] - at killer2 = internal global [300 x %struct.move_s] zeroinitializer ; <[300 x %struct.move_s]*> [#uses=0] - at killer3 = internal global [300 x %struct.move_s] zeroinitializer ; <[300 x %struct.move_s]*> [#uses=0] - at rootnodecount = internal global [512 x i32] zeroinitializer ; <[512 x i32]*> [#uses=0] - at raw_nodes = internal global i32 0 ; [#uses=0] - at pv_length = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=0] - at time_exit.b = internal global i1 false ; [#uses=0] - at time_for_move = internal global i32 0 ; [#uses=3] - at failed = internal global i32 0 ; [#uses=0] - at extendedtime.b = internal global i1 false ; [#uses=1] - at time_left = internal global i32 0 ; [#uses=0] - at str39.upgrd.83 = internal global [38 x i8] c"Extended from %d to %d, time left %d\0A\00" ; <[38 x i8]*> [#uses=0] - at checks = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=0] - at singular = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=0] - at recaps = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=0] - at ext_onerep = internal global i32 0 ; [#uses=1] - at FULL = internal global i32 0 ; [#uses=1] - at PVS = internal global i32 0 ; [#uses=1] - at PVSF = internal global i32 0 ; [#uses=1] - at killer_scores = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=0] - at killer_scores2 = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=0] - at killer_scores3 = internal global [300 x i32] zeroinitializer ; <[300 x i32]*> [#uses=0] - at time_failure.b = internal global i1 false ; [#uses=0] - at cur_score = internal global i32 0 ; [#uses=0] - at legals = internal global i32 0 ; [#uses=3] - at movetotal = internal global i32 0 ; [#uses=0] - at searching_move = internal global [20 x i8] zeroinitializer ; <[20 x i8]*> [#uses=0] - at is_pondering.b = internal global i1 false ; [#uses=6] - at true_i_depth = internal global i8 0 ; [#uses=1] - at is_analyzing.b = internal global i1 false ; [#uses=0] - at inc = internal global i32 0 ; [#uses=1] - at time_cushion = internal global i32 0 ; [#uses=2] - at str40.upgrd.84 = internal global [16 x i8] c"Opening phase.\0A\00" ; <[16 x i8]*> [#uses=1] - at str.upgrd.85 = internal global [19 x i8] c"Middlegame phase.\0A\00" ; <[19 x i8]*> [#uses=1] - at str1.upgrd.86 = internal global [16 x i8] c"Endgame phase.\0A\00" ; <[16 x i8]*> [#uses=1] - at str43 = internal global [20 x i8] c"Time for move : %d\0A\00" ; <[20 x i8]*> [#uses=1] - at postpv = internal global [256 x i8] zeroinitializer ; <[256 x i8]*> [#uses=0] - at str44 = internal global [49 x i8] c"tellics whisper %d restart(s), ended up with %s\0A\00" ; <[49 x i8]*> [#uses=0] - at moves_to_tc = internal global i32 0 ; [#uses=0] - at str45 = internal global [27 x i8] c"tellics kibitz Mate in %d\0A\00" ; <[27 x i8]*> [#uses=0] - at str46 = internal global [52 x i8] c"tellics ptell Mate in %d, give him no more pieces.\0A\00" ; <[52 x i8]*> [#uses=0] - at tradefreely.b = internal global i1 false ; [#uses=0] - at str.upgrd.87 = internal global [37 x i8] c"tellics ptell You can trade freely.\0A\00" ; <[37 x i8]*> [#uses=0] - at str47 = internal global [25 x i8] c"tellics ptell ---trades\0A\00" ; <[25 x i8]*> [#uses=0] - at str2.upgrd.88 = internal global [49 x i8] c"tellics kibitz Both players dead...resigning...\0A\00" ; <[49 x i8]*> [#uses=0] - at str3.upgrd.89 = internal global [16 x i8] c"tellics resign\0A\00" ; <[16 x i8]*> [#uses=0] - at str48 = internal global [81 x i8] c"tellics ptell I am forcedly mated (dead). Tell me 'go' to start moving into it.\0A\00" ; <[81 x i8]*> [#uses=0] - at str.upgrd.90 = internal global [62 x i8] c"tellics ptell I'll have to sit...(lose piece that mates you)\0A\00" ; <[62 x i8]*> [#uses=0] - at see_num_attackers = internal global [2 x i32] zeroinitializer ; <[2 x i32]*> [#uses=0] - at see_attackers = internal global [2 x [16 x %struct.see_data]] zeroinitializer ; <[2 x [16 x %struct.see_data]]*> [#uses=0] - at scentral = internal global [144 x i32] [ i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 3, i32 5, i32 5, i32 3, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 2, i32 15, i32 15, i32 15, i32 15, i32 2, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 7, i32 15, i32 25, i32 25, i32 15, i32 7, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 7, i32 15, i32 25, i32 25, i32 15, i32 7, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 2, i32 15, i32 15, i32 15, i32 15, i32 2, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -10, i32 0, i32 3, i32 5, i32 5, i32 3, i32 0, i32 -10, i32 0, i32 0, i32 0, i32 0, i32 -20, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -10, i32 -20, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0 ] ; <[144 x i32]*> [#uses=0] - at str51 = internal global [81 x i8] c"/Volumes/Stuff/src/speccpu2006-091-llvm/benchspec//CPU2006/458.sjeng/src/seval.c\00" ; <[81 x i8]*> [#uses=0] - at divider = internal global [50 x i8] c"-------------------------------------------------\00" ; <[50 x i8]*> [#uses=0] - at min_per_game = internal global i32 0 ; [#uses=0] - at opp_rating = internal global i32 0 ; [#uses=0] - at my_rating = internal global i32 0 ; [#uses=0] - at str53 = internal global [15 x i8] c"SPEC Workload\0A\00" ; <[15 x i8]*> [#uses=0] - at opening_history = internal global [256 x i8] zeroinitializer ; <[256 x i8]*> [#uses=0] - at str60 = internal global [81 x i8] c"Material score: %d Eval : %d MaxPosDiff: %d White hand: %d Black hand : %d\0A\00" ; <[81 x i8]*> [#uses=0] - at str61 = internal global [26 x i8] c"Hash : %X HoldHash : %X\0A\00" ; <[26 x i8]*> [#uses=0] - at str62 = internal global [9 x i8] c"move %s\0A\00" ; <[9 x i8]*> [#uses=0] - at str63 = internal global [5 x i8] c"\0A%s\0A\00" ; <[5 x i8]*> [#uses=0] - at str64 = internal global [19 x i8] c"0-1 {Black Mates}\0A\00" ; <[19 x i8]*> [#uses=0] - at str1.upgrd.91 = internal global [19 x i8] c"1-0 {White Mates}\0A\00" ; <[19 x i8]*> [#uses=0] - at str65 = internal global [27 x i8] c"1/2-1/2 {Fifty move rule}\0A\00" ; <[27 x i8]*> [#uses=0] - at str2.upgrd.92 = internal global [29 x i8] c"1/2-1/2 {3 fold repetition}\0A\00" ; <[29 x i8]*> [#uses=0] - at str66 = internal global [16 x i8] c"1/2-1/2 {Draw}\0A\00" ; <[16 x i8]*> [#uses=0] - at str68 = internal global [8 x i8] c"Sjeng: \00" ; <[8 x i8]*> [#uses=0] - at str69 = internal global [18 x i8] c"Illegal move: %s\0A\00" ; <[18 x i8]*> [#uses=0] - at str3.upgrd.93 = internal global [9 x i8] c"setboard\00" ; <[9 x i8]*> [#uses=0] - at str470 = internal global [5 x i8] c"quit\00" ; <[5 x i8]*> [#uses=0] - at str571 = internal global [5 x i8] c"exit\00" ; <[5 x i8]*> [#uses=0] - at str6.upgrd.94 = internal global [8 x i8] c"diagram\00" ; <[8 x i8]*> [#uses=0] - at str7.upgrd.95 = internal global [2 x i8] c"d\00" ; <[2 x i8]*> [#uses=0] - at str72 = internal global [6 x i8] c"perft\00" ; <[6 x i8]*> [#uses=0] - at str73 = internal global [3 x i8] c"%d\00" ; <[3 x i8]*> [#uses=0] - at str74 = internal global [28 x i8] c"Raw nodes for depth %d: %i\0A\00" ; <[28 x i8]*> [#uses=0] - at str.upgrd.96 = internal global [13 x i8] c"Time : %.2f\0A\00" ; <[13 x i8]*> [#uses=0] - at str75 = internal global [4 x i8] c"new\00" ; <[4 x i8]*> [#uses=0] - at str.upgrd.97 = internal global [40 x i8] c"tellics set 1 Sjeng SPEC 1.0 (SPEC/%s)\0A\00" ; <[40 x i8]*> [#uses=0] - at str.upgrd.98 = internal global [7 x i8] c"xboard\00" ; <[7 x i8]*> [#uses=0] - at str8.upgrd.99 = internal global [6 x i8] c"nodes\00" ; <[6 x i8]*> [#uses=0] - at str77 = internal global [38 x i8] c"Number of nodes: %i (%0.2f%% qnodes)\0A\00" ; <[38 x i8]*> [#uses=0] - at str9.upgrd.100 = internal global [5 x i8] c"post\00" ; <[5 x i8]*> [#uses=0] - at str10.upgrd.101 = internal global [7 x i8] c"nopost\00" ; <[7 x i8]*> [#uses=0] - at str11.upgrd.102 = internal global [7 x i8] c"random\00" ; <[7 x i8]*> [#uses=0] - at str12.upgrd.103 = internal global [5 x i8] c"hard\00" ; <[5 x i8]*> [#uses=0] - at str13.upgrd.104 = internal global [5 x i8] c"easy\00" ; <[5 x i8]*> [#uses=0] - at str14.upgrd.105 = internal global [2 x i8] c"?\00" ; <[2 x i8]*> [#uses=0] - at str15.upgrd.106 = internal global [6 x i8] c"white\00" ; <[6 x i8]*> [#uses=0] - at str16.upgrd.107 = internal global [6 x i8] c"black\00" ; <[6 x i8]*> [#uses=0] - at str17.upgrd.108 = internal global [6 x i8] c"force\00" ; <[6 x i8]*> [#uses=0] - at str18.upgrd.109 = internal global [5 x i8] c"eval\00" ; <[5 x i8]*> [#uses=0] - at str.upgrd.110 = internal global [10 x i8] c"Eval: %d\0A\00" ; <[10 x i8]*> [#uses=0] - at str2178 = internal global [3 x i8] c"%i\00" ; <[3 x i8]*> [#uses=0] - at str22.upgrd.111 = internal global [5 x i8] c"otim\00" ; <[5 x i8]*> [#uses=0] - at opp_time = internal global i32 0 ; [#uses=0] - at str23.upgrd.112 = internal global [6 x i8] c"level\00" ; <[6 x i8]*> [#uses=0] - at str.upgrd.113 = internal global [12 x i8] c"%i %i:%i %i\00" ; <[12 x i8]*> [#uses=0] - at sec_per_game = internal global i32 0 ; [#uses=0] - at str24.upgrd.114 = internal global [9 x i8] c"%i %i %i\00" ; <[9 x i8]*> [#uses=0] - at str25.upgrd.115 = internal global [7 x i8] c"rating\00" ; <[7 x i8]*> [#uses=0] - at str26.upgrd.116 = internal global [6 x i8] c"%i %i\00" ; <[6 x i8]*> [#uses=0] - at str27.upgrd.117 = internal global [8 x i8] c"holding\00" ; <[8 x i8]*> [#uses=0] - at str28.upgrd.118 = internal global [8 x i8] c"variant\00" ; <[8 x i8]*> [#uses=0] - at str29.upgrd.119 = internal global [7 x i8] c"normal\00" ; <[7 x i8]*> [#uses=0] - at str79 = internal global [11 x i8] c"crazyhouse\00" ; <[11 x i8]*> [#uses=0] - at str30.upgrd.120 = internal global [9 x i8] c"bughouse\00" ; <[9 x i8]*> [#uses=0] - at str31.upgrd.121 = internal global [8 x i8] c"suicide\00" ; <[8 x i8]*> [#uses=0] - at str32.upgrd.122 = internal global [9 x i8] c"giveaway\00" ; <[9 x i8]*> [#uses=0] - at str33.upgrd.123 = internal global [7 x i8] c"losers\00" ; <[7 x i8]*> [#uses=0] - at str34.upgrd.124 = internal global [8 x i8] c"analyze\00" ; <[8 x i8]*> [#uses=0] - at str35.upgrd.125 = internal global [5 x i8] c"undo\00" ; <[5 x i8]*> [#uses=0] - at str36.upgrd.126 = internal global [18 x i8] c"Move number : %d\0A\00" ; <[18 x i8]*> [#uses=0] - at str37.upgrd.127 = internal global [7 x i8] c"remove\00" ; <[7 x i8]*> [#uses=0] - at str38.upgrd.128 = internal global [5 x i8] c"edit\00" ; <[5 x i8]*> [#uses=0] - at str41.upgrd.129 = internal global [2 x i8] c"#\00" ; <[2 x i8]*> [#uses=0] - at str42.upgrd.130 = internal global [8 x i8] c"partner\00" ; <[8 x i8]*> [#uses=0] - at str43.upgrd.131 = internal global [9 x i8] c"$partner\00" ; <[9 x i8]*> [#uses=0] - at str44.upgrd.132 = internal global [6 x i8] c"ptell\00" ; <[6 x i8]*> [#uses=0] - at str45.upgrd.133 = internal global [5 x i8] c"test\00" ; <[5 x i8]*> [#uses=0] - at str46.upgrd.134 = internal global [3 x i8] c"st\00" ; <[3 x i8]*> [#uses=0] - at str47.upgrd.135 = internal global [7 x i8] c"result\00" ; <[7 x i8]*> [#uses=0] - at str48.upgrd.136 = internal global [6 x i8] c"prove\00" ; <[6 x i8]*> [#uses=0] - at str49 = internal global [26 x i8] c"\0AMax time to search (s): \00" ; <[26 x i8]*> [#uses=0] - at str50 = internal global [5 x i8] c"ping\00" ; <[5 x i8]*> [#uses=0] - at str51.upgrd.137 = internal global [9 x i8] c"pong %d\0A\00" ; <[9 x i8]*> [#uses=0] - at str52 = internal global [6 x i8] c"fritz\00" ; <[6 x i8]*> [#uses=0] - at str53.upgrd.138 = internal global [6 x i8] c"reset\00" ; <[6 x i8]*> [#uses=0] - at str54 = internal global [3 x i8] c"sd\00" ; <[3 x i8]*> [#uses=0] - at str55 = internal global [26 x i8] c"New max depth set to: %d\0A\00" ; <[26 x i8]*> [#uses=0] - at str56 = internal global [5 x i8] c"auto\00" ; <[5 x i8]*> [#uses=0] - at str57 = internal global [9 x i8] c"protover\00" ; <[9 x i8]*> [#uses=0] - at str.upgrd.139 = internal global [63 x i8] c"feature ping=0 setboard=1 playother=0 san=0 usermove=0 time=1\0A\00" ; <[63 x i8]*> [#uses=0] - at str80 = internal global [53 x i8] c"feature draw=0 sigint=0 sigterm=0 reuse=1 analyze=0\0A\00" ; <[53 x i8]*> [#uses=0] - at str.upgrd.140 = internal global [33 x i8] c"feature myname=\22Sjeng SPEC 1.0\22\0A\00" ; <[33 x i8]*> [#uses=0] - at str.upgrd.141 = internal global [71 x i8] c"feature variants=\22normal,bughouse,crazyhouse,suicide,giveaway,losers\22\0A\00" ; <[71 x i8]*> [#uses=0] - at str.upgrd.142 = internal global [46 x i8] c"feature colors=1 ics=0 name=0 pause=0 done=1\0A\00" ; <[46 x i8]*> [#uses=0] - at str58 = internal global [9 x i8] c"accepted\00" ; <[9 x i8]*> [#uses=0] - at str59 = internal global [9 x i8] c"rejected\00" ; <[9 x i8]*> [#uses=0] - at str.upgrd.143 = internal global [65 x i8] c"Interface does not support a required feature...expect trouble.\0A\00" ; <[65 x i8]*> [#uses=0] - at str61.upgrd.144 = internal global [6 x i8] c"\0A%s\0A\0A\00" ; <[6 x i8]*> [#uses=0] - at str81 = internal global [41 x i8] c"diagram/d: toggle diagram display\0A\00" ; <[41 x i8]*> [#uses=0] - at str82 = internal global [34 x i8] c"exit/quit: terminate Sjeng\0A\00" ; <[34 x i8]*> [#uses=0] - at str62.upgrd.145 = internal global [51 x i8] c"go: make Sjeng play the side to move\0A\00" ; <[51 x i8]*> [#uses=0] - at str83 = internal global [35 x i8] c"new: start a new game\0A\00" ; <[35 x i8]*> [#uses=0] - at str84 = internal global [55 x i8] c"level : the xboard style command to set time\0A\00" ; <[55 x i8]*> [#uses=0] - at str85 = internal global [49 x i8] c" should be in the form: where:\0A\00" ; <[49 x i8]*> [#uses=0] - at str63.upgrd.146 = internal global [49 x i8] c" a -> moves to TC (0 if using an ICS style TC)\0A\00" ; <[49 x i8]*> [#uses=0] - at str86 = internal global [25 x i8] c" b -> minutes per game\0A\00" ; <[25 x i8]*> [#uses=0] - at str64.upgrd.147 = internal global [29 x i8] c" c -> increment in seconds\0A\00" ; <[29 x i8]*> [#uses=0] - at str65.upgrd.148 = internal global [55 x i8] c"nodes: outputs the number of nodes searched\0A\00" ; <[55 x i8]*> [#uses=0] - at str87 = internal global [47 x i8] c"perft : compute raw nodes to depth x\0A\00" ; <[47 x i8]*> [#uses=0] - at str.upgrd.149 = internal global [42 x i8] c"post: toggles thinking output\0A\00" ; <[42 x i8]*> [#uses=0] - at str.upgrd.150 = internal global [45 x i8] c"xboard: put Sjeng into xboard mode\0A\00" ; <[45 x i8]*> [#uses=0] - at str.upgrd.151 = internal global [39 x i8] c"test: run an EPD testsuite\0A\00" ; <[39 x i8]*> [#uses=0] - at str88 = internal global [52 x i8] c"speed: test movegen and evaluation speed\0A\00" ; <[52 x i8]*> [#uses=0] - at str89 = internal global [59 x i8] c"proof: try to prove or disprove the current pos\0A\00" ; <[59 x i8]*> [#uses=0] - at str90 = internal global [44 x i8] c"sd : limit thinking to depth x\0A\00" ; <[44 x i8]*> [#uses=0] - at str66.upgrd.152 = internal global [51 x i8] c"st : limit thinking to x centiseconds\0A\00" ; <[51 x i8]*> [#uses=0] - at str67 = internal global [54 x i8] c"setboard : set board to a specified FEN string\0A\00" ; <[54 x i8]*> [#uses=0] - at str68.upgrd.153 = internal global [38 x i8] c"undo: back up a half move\0A\00" ; <[38 x i8]*> [#uses=0] - at str69.upgrd.154 = internal global [38 x i8] c"remove: back up a full move\0A\00" ; <[38 x i8]*> [#uses=0] - at str70 = internal global [42 x i8] c"force: disable computer moving\0A\00" ; <[42 x i8]*> [#uses=0] - at str71 = internal global [44 x i8] c"auto: computer plays both sides\0A\00" ; <[44 x i8]*> [#uses=0] - at DP_TTable = internal global %struct.TType* null ; <%struct.TType**> [#uses=1] - at AS_TTable = internal global %struct.TType* null ; <%struct.TType**> [#uses=1] - at QS_TTable = internal global %struct.QTType* null ; <%struct.QTType**> [#uses=1] - at str93 = internal global [38 x i8] c"Out of memory allocating hashtables.\0A\00" ; <[38 x i8]*> [#uses=0] - at type_to_char.3058 = internal global [14 x i32] [ i32 70, i32 80, i32 80, i32 78, i32 78, i32 75, i32 75, i32 82, i32 82, i32 81, i32 81, i32 66, i32 66, i32 69 ] ; <[14 x i32]*> [#uses=0] - at str94 = internal global [8 x i8] c"%c@%c%d\00" ; <[8 x i8]*> [#uses=0] - at str95 = internal global [5 x i8] c"%c%d\00" ; <[5 x i8]*> [#uses=0] - at str1.upgrd.155 = internal global [8 x i8] c"%c%d=%c\00" ; <[8 x i8]*> [#uses=0] - at str2.upgrd.156 = internal global [8 x i8] c"%cx%c%d\00" ; <[8 x i8]*> [#uses=0] - at str96 = internal global [11 x i8] c"%cx%c%d=%c\00" ; <[11 x i8]*> [#uses=0] - at str97 = internal global [4 x i8] c"O-O\00" ; <[4 x i8]*> [#uses=0] - at str98 = internal global [6 x i8] c"O-O-O\00" ; <[6 x i8]*> [#uses=0] - at str99 = internal global [9 x i8] c"%c%c%c%d\00" ; <[9 x i8]*> [#uses=0] - at str3100 = internal global [9 x i8] c"%c%d%c%d\00" ; <[9 x i8]*> [#uses=0] - at str101 = internal global [10 x i8] c"%c%cx%c%d\00" ; <[10 x i8]*> [#uses=0] - at str4.upgrd.157 = internal global [10 x i8] c"%c%dx%c%d\00" ; <[10 x i8]*> [#uses=0] - at str102 = internal global [7 x i8] c"%c%c%d\00" ; <[7 x i8]*> [#uses=0] - at str5103 = internal global [5 x i8] c"illg\00" ; <[5 x i8]*> [#uses=0] - at type_to_char.3190 = internal global [14 x i32] [ i32 70, i32 80, i32 112, i32 78, i32 110, i32 75, i32 107, i32 82, i32 114, i32 81, i32 113, i32 66, i32 98, i32 69 ] ; <[14 x i32]*> [#uses=0] - at str7.upgrd.158 = internal global [10 x i8] c"%c%d%c%dn\00" ; <[10 x i8]*> [#uses=0] - at str8.upgrd.159 = internal global [10 x i8] c"%c%d%c%dr\00" ; <[10 x i8]*> [#uses=0] - at str9.upgrd.160 = internal global [10 x i8] c"%c%d%c%db\00" ; <[10 x i8]*> [#uses=0] - at str10.upgrd.161 = internal global [10 x i8] c"%c%d%c%dk\00" ; <[10 x i8]*> [#uses=0] - at str11.upgrd.162 = internal global [10 x i8] c"%c%d%c%dq\00" ; <[10 x i8]*> [#uses=0] - at C.88.3251 = internal global [14 x i8*] [ i8* getelementptr ([3 x i8]* @str105, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str12106, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str13107, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str141, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str152, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str163, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str174, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str185, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str19108, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str206, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str21109, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str227, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str238, i32 0, i32 0), i8* getelementptr ([3 x i8]* @str249, i32 0, i32 0) ] ; <[14 x i8*]*> [#uses=0] - at str105 = internal global [3 x i8] c"!!\00" ; <[3 x i8]*> [#uses=1] - at str12106 = internal global [3 x i8] c" P\00" ; <[3 x i8]*> [#uses=1] - at str13107 = internal global [3 x i8] c"*P\00" ; <[3 x i8]*> [#uses=1] - at str141 = internal global [3 x i8] c" N\00" ; <[3 x i8]*> [#uses=1] - at str152 = internal global [3 x i8] c"*N\00" ; <[3 x i8]*> [#uses=1] - at str163 = internal global [3 x i8] c" K\00" ; <[3 x i8]*> [#uses=1] - at str174 = internal global [3 x i8] c"*K\00" ; <[3 x i8]*> [#uses=1] - at str185 = internal global [3 x i8] c" R\00" ; <[3 x i8]*> [#uses=1] - at str19108 = internal global [3 x i8] c"*R\00" ; <[3 x i8]*> [#uses=1] - at str206 = internal global [3 x i8] c" Q\00" ; <[3 x i8]*> [#uses=1] - at str21109 = internal global [3 x i8] c"*Q\00" ; <[3 x i8]*> [#uses=1] - at str227 = internal global [3 x i8] c" B\00" ; <[3 x i8]*> [#uses=1] - at str238 = internal global [3 x i8] c"*B\00" ; <[3 x i8]*> [#uses=1] - at str249 = internal global [3 x i8] c" \00" ; <[3 x i8]*> [#uses=1] - at str110 = internal global [42 x i8] c"+----+----+----+----+----+----+----+----+\00" ; <[42 x i8]*> [#uses=0] - at str25.upgrd.163 = internal global [6 x i8] c" %s\0A\00" ; <[6 x i8]*> [#uses=0] - at str26.upgrd.164 = internal global [5 x i8] c"%d |\00" ; <[5 x i8]*> [#uses=0] - at str27.upgrd.165 = internal global [6 x i8] c" %s |\00" ; <[6 x i8]*> [#uses=0] - at str28.upgrd.166 = internal global [7 x i8] c"\0A %s\0A\00" ; <[7 x i8]*> [#uses=0] - at str111 = internal global [45 x i8] c"\0A a b c d e f g h\0A\0A\00" ; <[45 x i8]*> [#uses=0] - at str29.upgrd.167 = internal global [45 x i8] c"\0A h g f e d c b a\0A\0A\00" ; <[45 x i8]*> [#uses=0] - at str33.upgrd.168 = internal global [2 x i8] c"<\00" ; <[2 x i8]*> [#uses=0] - at str34.upgrd.169 = internal global [3 x i8] c"> \00" ; <[3 x i8]*> [#uses=0] - at str114.upgrd.170 = internal global [18 x i8] c"%2i %7i %5i %8i \00" ; <[18 x i8]*> [#uses=0] - at str115 = internal global [20 x i8] c"%2i %c%1i.%02i %9i \00" ; <[20 x i8]*> [#uses=0] - at str39.upgrd.171 = internal global [5 x i8] c"%s !\00" ; <[5 x i8]*> [#uses=0] - at str40.upgrd.172 = internal global [6 x i8] c"%s !!\00" ; <[6 x i8]*> [#uses=0] - at str41.upgrd.173 = internal global [6 x i8] c"%s ??\00" ; <[6 x i8]*> [#uses=0] - at str124 = internal global [71 x i8] c"\0ASjeng version SPEC 1.0, Copyright (C) 2000-2005 Gian-Carlo Pascutto\0A\0A\00" ; <[71 x i8]*> [#uses=0] - at state = internal global [625 x i32] zeroinitializer ; <[625 x i32]*> [#uses=0] - -declare fastcc i32 @calc_attackers(i32, i32) - -declare fastcc i32 @is_attacked(i32, i32) - -declare fastcc void @ProcessHoldings(i8*) - -declare void @llvm.memset.i32(i8*, i8, i32, i32) - -declare i8* @strncpy(i8*, i8*, i32) - -declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) - -declare void @__eprintf(i8*, i8*, i32, i8*) - -declare fastcc void @addHolding(i32, i32) - -declare fastcc void @removeHolding(i32, i32) - -declare fastcc void @DropremoveHolding(i32, i32) - -declare i32 @printf(i8*, ...) - -declare fastcc i32 @is_draw() - -declare void @exit(i32) - -declare fastcc void @setup_epd_line(i8*) - -declare i32 @atoi(i8*) - -declare fastcc void @reset_piece_square() - -declare fastcc void @initialize_hash() - -declare i32 @__maskrune(i32, i32) - -declare fastcc void @comp_to_san(i64, i64, i64, i8*) - -declare i8* @strstr(i8*, i8*) - -declare i32 @atol(i8*) - -declare %struct.FILE* @fopen(i8*, i8*) - -declare fastcc void @display_board(i32) - -define internal void @think(%struct.move_s* sret %agg.result) { -entry: - %output.i = alloca [8 x i8], align 8 ; <[8 x i8]*> [#uses=0] - %comp_move = alloca %struct.move_s, align 16 ; <%struct.move_s*> [#uses=7] - %temp_move = alloca %struct.move_s, align 16 ; <%struct.move_s*> [#uses=6] - %moves = alloca [512 x %struct.move_s], align 16 ; <[512 x %struct.move_s]*> [#uses=7] - %output = alloca [8 x i8], align 8 ; <[8 x i8]*> [#uses=1] - store i1 false, i1* @userealholdings.b - %tmp = getelementptr [512 x %struct.move_s]* %moves, i32 0, i32 0 ; <%struct.move_s*> [#uses=3] - %tmp362 = getelementptr %struct.move_s* %comp_move, i32 0, i32 0 ; [#uses=0] - %tmp365 = getelementptr %struct.move_s* %comp_move, i32 0, i32 1 ; [#uses=0] - %tmp368 = getelementptr %struct.move_s* %comp_move, i32 0, i32 2 ; [#uses=0] - %tmp371 = getelementptr %struct.move_s* %comp_move, i32 0, i32 3 ; [#uses=0] - %tmp374 = getelementptr %struct.move_s* %comp_move, i32 0, i32 4 ; [#uses=0] - %tmp377 = getelementptr %struct.move_s* %comp_move, i32 0, i32 5 ; [#uses=0] - %tmp.upgrd.174 = bitcast %struct.move_s* %comp_move to { i64, i64, i64 }* ; <{ i64, i64, i64 }*> [#uses=3] - %tmp.upgrd.175 = getelementptr { i64, i64, i64 }* %tmp.upgrd.174, i32 0, i32 0 ; [#uses=0] - %tmp829 = getelementptr { i64, i64, i64 }* %tmp.upgrd.174, i32 0, i32 1 ; [#uses=0] - %tmp832 = getelementptr { i64, i64, i64 }* %tmp.upgrd.174, i32 0, i32 2 ; [#uses=0] - %output.upgrd.176 = getelementptr [8 x i8]* %output, i32 0, i32 0 ; [#uses=0] - %tmp573 = getelementptr %struct.move_s* %temp_move, i32 0, i32 0 ; [#uses=0] - %tmp576 = getelementptr %struct.move_s* %temp_move, i32 0, i32 1 ; [#uses=0] - %tmp579 = getelementptr %struct.move_s* %temp_move, i32 0, i32 2 ; [#uses=0] - %tmp582 = getelementptr %struct.move_s* %temp_move, i32 0, i32 3 ; [#uses=0] - %tmp585 = getelementptr %struct.move_s* %temp_move, i32 0, i32 4 ; [#uses=0] - %tmp588 = getelementptr %struct.move_s* %temp_move, i32 0, i32 5 ; [#uses=0] - %pn_restart.0.ph = bitcast i32 0 to i32 ; [#uses=2] - %tmp21362 = icmp eq i32 0, 0 ; [#uses=2] - %tmp216 = sitofp i32 %pn_restart.0.ph to float ; [#uses=1] - %tmp216.upgrd.177 = fpext float %tmp216 to double ; [#uses=1] - %tmp217 = fadd double %tmp216.upgrd.177, 1.000000e+00 ; [#uses=1] - %tmp835 = icmp sgt i32 %pn_restart.0.ph, 9 ; [#uses=0] - store i32 0, i32* @nodes - store i32 0, i32* @qnodes - store i32 1, i32* @ply - store i32 0, i32* @ECacheProbes - store i32 0, i32* @ECacheHits - store i32 0, i32* @TTProbes - store i32 0, i32* @TTHits - store i32 0, i32* @TTStores - store i32 0, i32* @NCuts - store i32 0, i32* @NTries - store i32 0, i32* @TExt - store i32 0, i32* @FH - store i32 0, i32* @FHF - store i32 0, i32* @PVS - store i32 0, i32* @FULL - store i32 0, i32* @PVSF - store i32 0, i32* @ext_check - store i32 0, i32* @ext_onerep - store i32 0, i32* @razor_drop - store i32 0, i32* @razor_material - store i1 false, i1* @extendedtime.b - store i1 false, i1* @forcedwin.b - store i32 200, i32* @maxposdiff - store i8 0, i8* @true_i_depth - store i32 0, i32* @legals - %tmp48 = load i32* @Variant ; [#uses=1] - %tmp49 = icmp eq i32 %tmp48, 4 ; [#uses=1] - %storemerge = zext i1 %tmp49 to i32 ; [#uses=1] - store i32 %storemerge, i32* @captures - call fastcc void @gen( %struct.move_s* %tmp ) - %tmp53 = load i32* @numb_moves ; [#uses=1] - %tmp.i = load i32* @Variant ; [#uses=1] - %tmp.i.upgrd.178 = icmp eq i32 %tmp.i, 3 ; [#uses=1] - br i1 %tmp.i.upgrd.178, label %in_check.exit, label %cond_next.i - -cond_next.i: ; preds = %entry - %tmp2.i5 = load i32* @white_to_move ; [#uses=1] - %tmp3.i = icmp eq i32 %tmp2.i5, 1 ; [#uses=0] - ret void - -in_check.exit: ; preds = %entry - %tmp7637 = icmp sgt i32 %tmp53, 0 ; [#uses=1] - br i1 %tmp7637, label %cond_true77, label %bb80 - -cond_true77: ; preds = %in_check.exit - %l.1.0 = bitcast i32 0 to i32 ; [#uses=2] - call fastcc void @make( %struct.move_s* %tmp, i32 %l.1.0 ) - %tmp61 = call fastcc i32 @check_legal( %struct.move_s* %tmp, i32 %l.1.0, i32 0 ) ; [#uses=1] - %tmp62 = icmp eq i32 %tmp61, 0 ; [#uses=0] - ret void - -bb80: ; preds = %in_check.exit - %tmp81 = load i32* @Variant ; [#uses=1] - %tmp82 = icmp eq i32 %tmp81, 4 ; [#uses=1] - br i1 %tmp82, label %cond_true83, label %cond_next118 - -cond_true83: ; preds = %bb80 - %tmp84 = load i32* @legals ; [#uses=1] - %tmp85 = icmp eq i32 %tmp84, 0 ; [#uses=0] - ret void - -cond_next118: ; preds = %bb80 - %tmp119 = load i32* @Variant ; [#uses=1] - %tmp120 = icmp eq i32 %tmp119, 1 ; [#uses=1] - br i1 %tmp120, label %cond_next176, label %cond_true121 - -cond_true121: ; preds = %cond_next118 - %tmp122.b = load i1* @is_pondering.b ; [#uses=1] - br i1 %tmp122.b, label %cond_next176, label %cond_true124 - -cond_true124: ; preds = %cond_true121 - %tmp125 = load i32* @legals ; [#uses=1] - %tmp126 = icmp eq i32 %tmp125, 1 ; [#uses=1] - br i1 %tmp126, label %cond_true127, label %cond_next176 - -cond_true127: ; preds = %cond_true124 - %tmp128 = load i32* @inc ; [#uses=1] - %tmp129 = mul i32 %tmp128, 100 ; [#uses=1] - %tmp130 = load i32* @time_cushion ; [#uses=1] - %tmp131 = add i32 %tmp129, %tmp130 ; [#uses=1] - store i32 %tmp131, i32* @time_cushion - %tmp134 = getelementptr %struct.move_s* %agg.result, i32 0, i32 0 ; [#uses=1] - %tmp135 = getelementptr [512 x %struct.move_s]* %moves, i32 0, i32 0, i32 0 ; [#uses=1] - %tmp136 = load i32* %tmp135 ; [#uses=1] - store i32 %tmp136, i32* %tmp134 - %tmp137 = getelementptr %struct.move_s* %agg.result, i32 0, i32 1 ; [#uses=1] - %tmp138 = getelementptr [512 x %struct.move_s]* %moves, i32 0, i32 0, i32 1 ; [#uses=1] - %tmp139 = load i32* %tmp138 ; [#uses=1] - store i32 %tmp139, i32* %tmp137 - %tmp140 = getelementptr %struct.move_s* %agg.result, i32 0, i32 2 ; [#uses=1] - %tmp141 = getelementptr [512 x %struct.move_s]* %moves, i32 0, i32 0, i32 2 ; [#uses=1] - %tmp142 = load i32* %tmp141 ; [#uses=1] - store i32 %tmp142, i32* %tmp140 - %tmp143 = getelementptr %struct.move_s* %agg.result, i32 0, i32 3 ; [#uses=1] - %tmp144 = getelementptr [512 x %struct.move_s]* %moves, i32 0, i32 0, i32 3 ; [#uses=1] - %tmp145 = load i32* %tmp144 ; [#uses=1] - store i32 %tmp145, i32* %tmp143 - %tmp146 = getelementptr %struct.move_s* %agg.result, i32 0, i32 4 ; [#uses=1] - %tmp147 = getelementptr [512 x %struct.move_s]* %moves, i32 0, i32 0, i32 4 ; [#uses=1] - %tmp148 = load i32* %tmp147 ; [#uses=1] - store i32 %tmp148, i32* %tmp146 - %tmp149 = getelementptr %struct.move_s* %agg.result, i32 0, i32 5 ; [#uses=1] - %tmp150 = getelementptr [512 x %struct.move_s]* %moves, i32 0, i32 0, i32 5 ; [#uses=1] - %tmp151 = load i32* %tmp150 ; [#uses=1] - store i32 %tmp151, i32* %tmp149 - ret void - -cond_next176: ; preds = %cond_true124, %cond_true121, %cond_next118 - call fastcc void @check_phase( ) - %tmp177 = load i32* @phase ; [#uses=1] - switch i32 %tmp177, label %bb187 [ - i32 0, label %bb178 - i32 1, label %bb180 - i32 2, label %bb183 - ] - -bb178: ; preds = %cond_next176 - %tmp179 = call i32 (i8*, ...)* @printf( i8* getelementptr ([16 x i8]* @str40.upgrd.84, i32 0, i64 0) ) ; [#uses=0] - %tmp18854.b = load i1* @is_pondering.b ; [#uses=1] - br i1 %tmp18854.b, label %cond_false210, label %cond_true190 - -bb180: ; preds = %cond_next176 - %tmp182 = call i32 (i8*, ...)* @printf( i8* getelementptr ([19 x i8]* @str.upgrd.85, i32 0, i64 0) ) ; [#uses=0] - %tmp18856.b = load i1* @is_pondering.b ; [#uses=0] - ret void - -bb183: ; preds = %cond_next176 - %tmp185 = call i32 (i8*, ...)* @printf( i8* getelementptr ([16 x i8]* @str1.upgrd.86, i32 0, i64 0) ) ; [#uses=0] - %tmp18858.b = load i1* @is_pondering.b ; [#uses=0] - ret void - -bb187: ; preds = %cond_next176 - %tmp188.b = load i1* @is_pondering.b ; [#uses=0] - ret void - -cond_true190: ; preds = %bb178 - %tmp191 = load i32* @fixed_time ; [#uses=1] - %tmp192 = icmp eq i32 %tmp191, 0 ; [#uses=0] - ret void - -cond_false210: ; preds = %bb178 - store i32 999999, i32* @time_for_move - br i1 %tmp21362, label %cond_true226.critedge, label %bb287.critedge - -cond_true226.critedge: ; preds = %cond_false210 - %tmp223.c = call i32 (i8*, ...)* @printf( i8* getelementptr ([20 x i8]* @str43, i32 0, i64 0), i32 999999 ) ; [#uses=0] - %tmp.i.upgrd.179 = load %struct.TType** @DP_TTable ; <%struct.TType*> [#uses=1] - %tmp.i7.b = load i1* @TTSize.b ; [#uses=1] - %tmp1.i = select i1 %tmp.i7.b, i32 60000000, i32 0 ; [#uses=1] - %tmp.i.sb = getelementptr %struct.TType* %tmp.i.upgrd.179, i32 0, i32 0 ; [#uses=1] - call void @llvm.memset.i32( i8* %tmp.i.sb, i8 0, i32 %tmp1.i, i32 4 ) - %tmp2.i = load %struct.TType** @AS_TTable ; <%struct.TType*> [#uses=1] - %tmp3.i8.b = load i1* @TTSize.b ; [#uses=1] - %tmp4.i = select i1 %tmp3.i8.b, i32 60000000, i32 0 ; [#uses=1] - %tmp2.i.upgrd.180 = getelementptr %struct.TType* %tmp2.i, i32 0, i32 0 ; [#uses=1] - call void @llvm.memset.i32( i8* %tmp2.i.upgrd.180, i8 0, i32 %tmp4.i, i32 4 ) - %tmp.i.QTT = load %struct.QTType** @QS_TTable ; <%struct.QTType*> [#uses=1] - %tmp5.i9.b = load i1* @TTSize.b ; [#uses=1] - %tmp6.i10 = select i1 %tmp5.i9.b, i32 48000000, i32 0 ; [#uses=1] - %tmp7.i = getelementptr %struct.QTType* %tmp.i.QTT, i32 0, i32 0 ; [#uses=1] - call void @llvm.memset.i32( i8* %tmp7.i, i8 0, i32 %tmp6.i10, i32 4 ) - %tmp.i.ECache = load %struct.ECacheType** @ECache ; <%struct.ECacheType*> [#uses=1] - %tmp.i14.b = load i1* @ECacheSize.b ; [#uses=1] - %tmp1.i16 = select i1 %tmp.i14.b, i32 12000000, i32 0 ; [#uses=1] - %tmp.i17 = bitcast %struct.ECacheType* %tmp.i.ECache to i8* ; [#uses=1] - call void @llvm.memset.i32( i8* %tmp.i17, i8 0, i32 %tmp1.i16, i32 4 ) - call void @llvm.memset.i32( i8* bitcast ([300 x i32]* @rootlosers to i8*), i8 0, i32 1200, i32 4 ) - %tmp234.b = load i1* @is_pondering.b ; [#uses=1] - br i1 %tmp234.b, label %bb263, label %cond_next238 - -cond_next238: ; preds = %cond_true226.critedge - %tmp239 = load i32* @Variant ; [#uses=2] - switch i32 %tmp239, label %bb263 [ - i32 3, label %bb249 - i32 4, label %bb249 - ] - -bb249: ; preds = %cond_next238, %cond_next238 - %tmp250 = load i32* @piece_count ; [#uses=1] - %tmp251 = icmp sgt i32 %tmp250, 3 ; [#uses=1] - %tmp240.not = icmp ne i32 %tmp239, 3 ; [#uses=1] - %brmerge = or i1 %tmp251, %tmp240.not ; [#uses=1] - br i1 %brmerge, label %bb260, label %bb263 - -bb260: ; preds = %bb249 - %tmp261 = load i32* @time_for_move ; [#uses=1] - %tmp261.upgrd.181 = sitofp i32 %tmp261 to float ; [#uses=1] - %tmp261.upgrd.182 = fpext float %tmp261.upgrd.181 to double ; [#uses=1] - %tmp262 = fdiv double %tmp261.upgrd.182, 3.000000e+00 ; [#uses=1] - %tmp262.upgrd.183 = fptosi double %tmp262 to i32 ; [#uses=1] - store i32 %tmp262.upgrd.183, i32* @pn_time - %tmp1.b.i = load i1* @PBSize.b ; [#uses=1] - %tmp1.i1 = select i1 %tmp1.b.i, i32 200000, i32 0 ; [#uses=1] - %tmp.i2 = call i8* @calloc( i32 %tmp1.i1, i32 44 ) ; [#uses=1] - %tmp.i.ub = bitcast i8* %tmp.i2 to i8* ; [#uses=1] - store i8* %tmp.i.ub, i8** @membuff - %tmp2.i3 = call i8* @calloc( i32 1, i32 44 ) ; [#uses=3] - %tmp2.i.upgrd.184 = bitcast i8* %tmp2.i3 to %struct.node_t* ; <%struct.node_t*> [#uses=6] - %tmp.i.move_s = getelementptr [512 x %struct.move_s]* null, i32 0, i32 0 ; <%struct.move_s*> [#uses=3] - call fastcc void @gen( %struct.move_s* %tmp.i.move_s ) - %tmp3.i4 = load i32* @numb_moves ; [#uses=4] - %tmp3.i5 = bitcast i32 %tmp3.i4 to i32 ; [#uses=0] - store i1 false, i1* @alllosers.b - call void @llvm.memset.i32( i8* bitcast ([300 x i32]* @rootlosers to i8*), i8 0, i32 1200, i32 4 ) - %nodesspent.i = bitcast [512 x i32]* null to i8* ; [#uses=1] - call void @llvm.memset.i32( i8* %nodesspent.i, i8 0, i32 2048, i32 16 ) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 0) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 1) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 2) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 3) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 4) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 5) - %tmp.i.i = load i32* @Variant ; [#uses=1] - %tmp.i.i.upgrd.185 = icmp eq i32 %tmp.i.i, 3 ; [#uses=1] - br i1 %tmp.i.i.upgrd.185, label %in_check.exit.i, label %cond_next.i.i - -cond_next.i.i: ; preds = %bb260 - %tmp2.i.i = load i32* @white_to_move ; [#uses=1] - %tmp3.i.i = icmp eq i32 %tmp2.i.i, 1 ; [#uses=1] - br i1 %tmp3.i.i, label %cond_true4.i.i, label %cond_false12.i.i - -cond_true4.i.i: ; preds = %cond_next.i.i - %tmp5.i.i = load i32* @wking_loc ; [#uses=1] - %tmp6.i.i = call fastcc i32 @is_attacked( i32 %tmp5.i.i, i32 0 ) ; [#uses=1] - %not.tmp7.i.i = icmp ne i32 %tmp6.i.i, 0 ; [#uses=1] - %tmp217.i = zext i1 %not.tmp7.i.i to i32 ; [#uses=1] - %tmp4219.i = icmp sgt i32 %tmp3.i4, 0 ; [#uses=1] - br i1 %tmp4219.i, label %cond_true43.i, label %bb46.i - -cond_false12.i.i: ; preds = %cond_next.i.i - %tmp13.i.i = load i32* @bking_loc ; [#uses=1] - %tmp14.i.i = call fastcc i32 @is_attacked( i32 %tmp13.i.i, i32 1 ) ; [#uses=1] - %not.tmp15.i.i = icmp ne i32 %tmp14.i.i, 0 ; [#uses=1] - %tmp2120.i = zext i1 %not.tmp15.i.i to i32 ; [#uses=1] - %tmp4222.i = icmp sgt i32 %tmp3.i4, 0 ; [#uses=1] - br i1 %tmp4222.i, label %cond_true43.i, label %bb46.i - -in_check.exit.i: ; preds = %bb260 - %tmp4224.i = icmp sgt i32 %tmp3.i4, 0 ; [#uses=0] - ret void - -cond_true43.i: ; preds = %cond_false12.i.i, %cond_true4.i.i - %tmp21.0.ph.i = phi i32 [ %tmp217.i, %cond_true4.i.i ], [ %tmp2120.i, %cond_false12.i.i ] ; [#uses=1] - %i.0.0.i = bitcast i32 0 to i32 ; [#uses=2] - call fastcc void @make( %struct.move_s* %tmp.i.move_s, i32 %i.0.0.i ) - %tmp27.i = call fastcc i32 @check_legal( %struct.move_s* %tmp.i.move_s, i32 %i.0.0.i, i32 %tmp21.0.ph.i ) ; [#uses=1] - %tmp.i6 = icmp eq i32 %tmp27.i, 0 ; [#uses=0] - ret void - -bb46.i: ; preds = %cond_false12.i.i, %cond_true4.i.i - %tmp48.i = icmp eq i32 0, 0 ; [#uses=1] - br i1 %tmp48.i, label %cond_true49.i, label %cond_next53.i - -cond_true49.i: ; preds = %bb46.i - store i32 0, i32* @bufftop - %tmp50.i = load i8** @membuff ; [#uses=1] - free i8* %tmp50.i - free i8* %tmp2.i3 - ret void - -cond_next53.i: ; preds = %bb46.i - store i32 1, i32* @nodecount - store i32 0, i32* @iters - store i32 0, i32* @maxply - store i32 0, i32* @forwards - %tmp54.i = load i32* @move_number ; [#uses=1] - %tmp55.i = load i32* @ply ; [#uses=1] - %tmp56.i = add i32 %tmp54.i, -1 ; [#uses=1] - %tmp57.i = add i32 %tmp56.i, %tmp55.i ; [#uses=1] - %tmp58.i = load i32* @hash ; [#uses=1] - %tmp.i.upgrd.186 = getelementptr [600 x i32]* @hash_history, i32 0, i32 %tmp57.i ; [#uses=1] - store i32 %tmp58.i, i32* %tmp.i.upgrd.186 - %tmp59.i = load i32* @white_to_move ; [#uses=1] - %tmp60.i = icmp eq i32 %tmp59.i, 0 ; [#uses=1] - %tmp60.i.upgrd.187 = zext i1 %tmp60.i to i32 ; [#uses=1] - store i32 %tmp60.i.upgrd.187, i32* @root_to_move - %tmp.i4.i = load i32* @Variant ; [#uses=2] - %tmp.i5.i = icmp eq i32 %tmp.i4.i, 3 ; [#uses=1] - br i1 %tmp.i5.i, label %cond_true.i.i, label %cond_false.i.i - -cond_true.i.i: ; preds = %cond_next53.i - call fastcc void @suicide_pn_eval( %struct.node_t* %tmp2.i.upgrd.184 ) - %tmp6328.i = getelementptr %struct.node_t* %tmp2.i.upgrd.184, i32 0, i32 0 ; [#uses=1] - %tmp29.i = load i8* %tmp6328.i ; [#uses=1] - %tmp6430.i = icmp eq i8 %tmp29.i, 1 ; [#uses=0] - ret void - -cond_false.i.i: ; preds = %cond_next53.i - %tmp2.i.i.upgrd.188 = icmp eq i32 %tmp.i4.i, 4 ; [#uses=1] - %tmp63.i = getelementptr %struct.node_t* %tmp2.i.upgrd.184, i32 0, i32 0 ; [#uses=2] - br i1 %tmp2.i.i.upgrd.188, label %cond_true3.i.i, label %cond_false5.i.i - -cond_true3.i.i: ; preds = %cond_false.i.i - call fastcc void @losers_pn_eval( %struct.node_t* %tmp2.i.upgrd.184 ) - %tmp31.i = load i8* %tmp63.i ; [#uses=1] - %tmp6432.i = icmp eq i8 %tmp31.i, 1 ; [#uses=1] - br i1 %tmp6432.i, label %bb75.i, label %cond_next67.i - -cond_false5.i.i: ; preds = %cond_false.i.i - call fastcc void @std_pn_eval( %struct.node_t* %tmp2.i.upgrd.184 ) - %tmp.i.upgrd.189 = load i8* %tmp63.i ; [#uses=1] - %tmp64.i = icmp eq i8 %tmp.i.upgrd.189, 1 ; [#uses=0] - ret void - -cond_next67.i: ; preds = %cond_true3.i.i - %tmp69.i = getelementptr %struct.node_t* %tmp2.i.upgrd.184, i32 0, i32 0 ; [#uses=1] - %tmp70.i = load i8* %tmp69.i ; [#uses=1] - %tmp71.i = icmp eq i8 %tmp70.i, 0 ; [#uses=0] - ret void - -bb75.i: ; preds = %cond_true3.i.i - store i32 0, i32* @bufftop - %tmp76.i = load i8** @membuff ; [#uses=1] - free i8* %tmp76.i - free i8* %tmp2.i3 - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 0) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 1) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 2) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 3) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 4) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 5) - %tmp28869 = load i32* @result ; [#uses=1] - %tmp28970 = icmp eq i32 %tmp28869, 0 ; [#uses=1] - br i1 %tmp28970, label %cond_next337, label %cond_true290 - -bb263: ; preds = %bb249, %cond_next238, %cond_true226.critedge - br i1 %tmp21362, label %cond_true266, label %bb287 - -cond_true266: ; preds = %bb263 - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 0) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 1) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 2) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 3) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 4) - store i32 0, i32* getelementptr (%struct.move_s* @pn_move, i64 0, i32 5) - %tmp28871 = load i32* @result ; [#uses=1] - %tmp28972 = icmp eq i32 %tmp28871, 0 ; [#uses=0] - ret void - -bb287.critedge: ; preds = %cond_false210 - %tmp218.c = fdiv double 1.999998e+06, %tmp217 ; [#uses=1] - %tmp218.c.upgrd.190 = fptosi double %tmp218.c to i32 ; [#uses=2] - store i32 %tmp218.c.upgrd.190, i32* @time_for_move - %tmp22367.c = call i32 (i8*, ...)* @printf( i8* getelementptr ([20 x i8]* @str43, i32 0, i64 0), i32 %tmp218.c.upgrd.190 ) ; [#uses=0] - ret void - -bb287: ; preds = %bb263 - %tmp288 = load i32* @result ; [#uses=1] - %tmp289 = icmp eq i32 %tmp288, 0 ; [#uses=0] - ret void - -cond_true290: ; preds = %bb75.i - %tmp292 = load i32* getelementptr (%struct.move_s* @pn_move, i32 0, i32 1) ; [#uses=1] - %tmp295 = icmp eq i32 %tmp292, 0 ; [#uses=0] - ret void - -cond_next337: ; preds = %bb75.i - %tmp338.b = load i1* @forcedwin.b ; [#uses=1] - br i1 %tmp338.b, label %bb348, label %cond_next342 - -cond_next342: ; preds = %cond_next337 - %tmp343 = load i32* @result ; [#uses=1] - %tmp344 = icmp eq i32 %tmp343, 0 ; [#uses=0] - ret void - -bb348: ; preds = %cond_next337 - %tmp350 = load i32* getelementptr (%struct.move_s* @pn_move, i32 0, i32 1) ; [#uses=1] - %tmp353 = icmp eq i32 %tmp350, 0 ; [#uses=0] - ret void -} - -declare fastcc i32 @eval(i32, i32) - -declare i8* @fgets(i8*, i32, %struct.FILE*) - -declare i32 @fclose(%struct.FILE*) - -declare fastcc i32 @losers_eval() - -declare fastcc i32 @l_bishop_mobility(i32) - -declare fastcc i32 @l_rook_mobility(i32) - -declare fastcc i32 @check_legal(%struct.move_s*, i32, i32) - -declare fastcc void @gen(%struct.move_s*) - -declare fastcc void @push_pawn(i32, i32) - -declare fastcc void @push_knighT(i32) - -declare fastcc void @push_slidE(i32) - -declare fastcc void @push_king(i32) - -declare fastcc i32 @f_in_check(%struct.move_s*, i32) - -declare fastcc void @make(%struct.move_s*, i32) - -declare fastcc void @add_capture(i32, i32, i32) - -declare fastcc void @unmake(%struct.move_s*, i32) - -declare i32 @ErrorIt(i32, i32) - -declare i32 @Pawn(i32, i32) - -declare i32 @Knight(i32, i32) - -declare i32 @King(i32, i32) - -declare i32 @Rook(i32, i32) - -declare i32 @Queen(i32, i32) - -declare i32 @Bishop(i32, i32) - -declare fastcc void @check_phase() - -declare fastcc i32 @bishop_mobility(i32) - -declare fastcc i32 @rook_mobility(i32) - -declare i32 @sscanf(i8*, i8*, ...) - -declare i32 @strncmp(i8*, i8*, i32) - -declare i8* @strchr(i8*, i32) - -declare fastcc void @CheckBadFlow(i32) - -declare fastcc void @suicide_pn_eval(%struct.node_t*) - -declare fastcc void @losers_pn_eval(%struct.node_t*) - -declare fastcc void @std_pn_eval(%struct.node_t*) - -declare fastcc %struct.node_t* @select_most_proving(%struct.node_t*) - -declare fastcc void @set_proof_and_disproof_numbers(%struct.node_t*) - -declare fastcc void @StoreTT(i32, i32, i32, i32, i32, i32) - -declare fastcc void @develop_node(%struct.node_t*) - -declare fastcc void @update_ancestors(%struct.node_t*) - -declare i8* @calloc(i32, i32) - -declare fastcc void @comp_to_coord(i64, i64, i64, i8*) - -declare i8* @strcat(i8*, i8*) - -declare i32 @sprintf(i8*, i8*, ...) - -declare fastcc void @order_moves(%struct.move_s*, i32*, i32*, i32, i32) - -declare fastcc i32 @see(i32, i32, i32) - -declare fastcc void @perft(i32) - -declare fastcc i32 @qsearch(i32, i32, i32) - -declare fastcc i32 @allocate_time() - -declare fastcc void @QStoreTT(i32, i32, i32, i32) - -declare fastcc i32 @search(i32, i32, i32, i32) - -declare fastcc i32 @ProbeTT(i32*, i32, i32*, i32*, i32*, i32) - -declare void @search_root(%struct.move_s* sret , i32, i32, i32) - -declare fastcc void @post_fh_thinking(i32, %struct.move_s*) - -declare fastcc void @post_thinking(i32) - -declare i32 @fprintf(%struct.FILE*, i8*, ...) - -declare fastcc i32 @s_bishop_mobility(i32) - -declare fastcc i32 @s_rook_mobility(i32) - -declare fastcc i32 @suicide_mid_eval() - -declare i32 @main(i32, i8**) - -declare fastcc void @init_game() - -declare void @setbuf(%struct.FILE*, i8*) - -declare i8* @strcpy(i8*, i8*) - -declare i32 @__tolower(i32) - -declare i32 @strcmp(i8*, i8*) - -declare void (i32)* @signal(i32, void (i32)*) - -declare fastcc void @hash_extract_pv(i32, i8*) - -declare double @difftime(i32, i32) - -declare i32 @getc(%struct.FILE*) - -declare i32 @strlen(i8*) - -declare i32 @fwrite(i8*, i32, i32, %struct.FILE*) Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2008-07-28-load-store.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2008-07-28-load-store.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2008-07-28-load-store.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2008-07-28-load-store.ll (removed) @@ -1,15 +0,0 @@ -; RUN: opt < %s -basicaa -dse -S | not grep tmp5 -; PR2599 -target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" - -define void @foo({ i32, i32 }* %x) nounwind { -entry: - %tmp4 = getelementptr { i32, i32 }* %x, i32 0, i32 0 ; [#uses=2] - %tmp5 = load i32* %tmp4, align 4 ; [#uses=1] - %tmp7 = getelementptr { i32, i32 }* %x, i32 0, i32 1 ; [#uses=2] - %tmp8 = load i32* %tmp7, align 4 ; [#uses=1] - %tmp17 = sub i32 0, %tmp8 ; [#uses=1] - store i32 %tmp5, i32* %tmp4, align 4 - store i32 %tmp17, i32* %tmp7, align 4 - ret void -} Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-28-MemDepUpdate.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-28-MemDepUpdate.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-28-MemDepUpdate.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-28-MemDepUpdate.ll (removed) @@ -1,16 +0,0 @@ -; RUN: opt < %s -dse | llvm-dis -; PR3141 - %struct.ada__tags__dispatch_table = type { [1 x i32] } - %struct.f393a00_1__object = type { %struct.ada__tags__dispatch_table*, i8 } - %struct.f393a00_2__windmill = type { %struct.f393a00_1__object, i16 } - -define void @f393a00_2__swap(%struct.f393a00_2__windmill* %a, %struct.f393a00_2__windmill* %b) { -entry: - %t = alloca %struct.f393a00_2__windmill ; <%struct.f393a00_2__windmill*> [#uses=1] - %0 = getelementptr %struct.f393a00_2__windmill* %t, i32 0, i32 0, i32 0 ; <%struct.ada__tags__dispatch_table**> [#uses=1] - %1 = load %struct.ada__tags__dispatch_table** null, align 4 ; <%struct.ada__tags__dispatch_table*> [#uses=1] - %2 = load %struct.ada__tags__dispatch_table** %0, align 8 ; <%struct.ada__tags__dispatch_table*> [#uses=1] - store %struct.ada__tags__dispatch_table* %2, %struct.ada__tags__dispatch_table** null, align 4 - store %struct.ada__tags__dispatch_table* %1, %struct.ada__tags__dispatch_table** null, align 4 - ret void -} Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-29-OffEndOfBlock.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-29-OffEndOfBlock.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-29-OffEndOfBlock.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2008-11-29-OffEndOfBlock.ll (removed) @@ -1,27 +0,0 @@ -; RUN: opt < %s -dse | llvm-dis - -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" -target triple = "i386-apple-darwin7" - %struct.cab_archive = type { i32, i16, i16, i16, i16, i8, %struct.cab_folder*, %struct.cab_file* } - %struct.cab_file = type { i32, i16, i64, i8*, i32, i32, i32, %struct.cab_folder*, %struct.cab_file*, %struct.cab_archive*, %struct.cab_state* } - %struct.cab_folder = type { i16, i16, %struct.cab_archive*, i64, %struct.cab_folder* } - %struct.cab_state = type { i8*, i8*, [38912 x i8], i16, i16, i8*, i16 } - %struct.lzx_stream = type { i32, i32, i8, i64, i64, i8*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8, i8, i8, i8, i8, i32, i8*, i8*, i8*, i8*, i8*, i32, i32, i32, [84 x i8], [720 x i8], [314 x i8], [72 x i8], [104 x i16], [5408 x i16], [4596 x i16], [144 x i16], [51 x i32], [51 x i8], [32768 x i8], %struct.cab_file*, i32 (%struct.cab_file*, i8*, i32)* } - -declare fastcc i32 @lzx_read_lens(%struct.lzx_stream*, i8*, i32, i32) nounwind - -define i32 @lzx_decompress(%struct.lzx_stream* %lzx, i64 %out_bytes) nounwind { -bb13: ; preds = %entry - %0 = getelementptr %struct.lzx_stream* %lzx, i32 0, i32 25 ; [#uses=2] - %1 = getelementptr %struct.lzx_stream* %lzx, i32 0, i32 26 ; [#uses=2] - %2 = getelementptr %struct.lzx_stream* %lzx, i32 0, i32 29 ; [#uses=0] - br label %bb14 - -bb14: ; preds = %bb13 - %3 = load i8** %0, align 4 ; [#uses=1] - %4 = load i8** %1, align 4 ; [#uses=1] - store i8* %3, i8** %0, align 4 - store i8* %4, i8** %1, align 4 - %5 = call fastcc i32 @lzx_read_lens(%struct.lzx_stream* %lzx, i8* null, i32 256, i32 0) nounwind ; [#uses=0] - unreachable -} Removed: llvm/trunk/test/Transforms/DeadStoreElimination/2009-11-10-Trampoline.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/2009-11-10-Trampoline.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/2009-11-10-Trampoline.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/2009-11-10-Trampoline.ll (removed) @@ -1,16 +0,0 @@ -; RUN: opt -S -dse < %s | FileCheck %s - -declare i8* @llvm.init.trampoline(i8*, i8*, i8*) - -declare void @f() - -define void @unused_trampoline() { -; CHECK: @unused_trampoline - %storage = alloca [10 x i8], align 16 ; <[10 x i8]*> [#uses=1] -; CHECK-NOT: alloca - %cast = getelementptr [10 x i8]* %storage, i32 0, i32 0 ; [#uses=1] - %tramp = call i8* @llvm.init.trampoline( i8* %cast, i8* bitcast (void ()* @f to i8*), i8* null ) ; [#uses=1] -; CHECK-NOT: trampoline - ret void -; CHECK: ret void -} Modified: llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll?rev=120373&r1=120372&r2=120373&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll Mon Nov 29 19:00:34 2010 @@ -1,14 +1,38 @@ -; RUN: opt < %s -basicaa -dse -S | \ -; RUN: not grep {store i8} +; RUN: opt < %s -basicaa -dse -S | FileCheck %s +target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" + ; Ensure that the dead store is deleted in this case. It is wholely ; overwritten by the second store. -target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" -define i32 @test() { - %V = alloca i32 ; [#uses=3] +define void @test1(i32 *%V) { %V2 = bitcast i32* %V to i8* ; [#uses=1] store i8 0, i8* %V2 store i32 1234567, i32* %V - %X = load i32* %V ; [#uses=1] - ret i32 %X + ret void +; CHECK: @test1 +; CHECK-NEXT: store i32 1234567 } +; Note that we could do better by merging the two stores into one. +define void @test2(i32* %P) { +; CHECK: @test2 + store i32 0, i32* %P +; CHECK: store i32 + %Q = bitcast i32* %P to i16* + store i16 1, i16* %Q +; CHECK: store i16 + ret void +} + + +define i32 @test3(double %__x) { +; CHECK: @test3 +; CHECK: store double + %__u = alloca { [3 x i32] } + %tmp.1 = bitcast { [3 x i32] }* %__u to double* + store double %__x, double* %tmp.1 + %tmp.4 = getelementptr { [3 x i32] }* %__u, i32 0, i32 0, i32 1 + %tmp.5 = load i32* %tmp.4 + %tmp.6 = icmp slt i32 %tmp.5, 0 + %tmp.7 = zext i1 %tmp.6 to i32 + ret i32 %tmp.7 +} Removed: llvm/trunk/test/Transforms/DeadStoreElimination/byval.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/byval.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/byval.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/byval.ll (removed) @@ -1,10 +0,0 @@ -; RUN: opt < %s -dse -S | not grep store - -%struct.x = type { i32, i32, i32, i32 } - -define i32 @foo(%struct.x* byval %a) nounwind { -entry: - %tmp2 = getelementptr %struct.x* %a, i32 0, i32 0 - store i32 1, i32* %tmp2, align 4 - ret i32 1 -} Modified: llvm/trunk/test/Transforms/DeadStoreElimination/crash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/crash.ll?rev=120373&r1=120372&r2=120373&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/crash.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/crash.ll Mon Nov 29 19:00:34 2010 @@ -1,4 +1,4 @@ -; RUN: opt < %s -dse -S +; RUN: opt < %s -basicaa -dse -S target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" target triple = "i386-apple-darwin10.0" @@ -55,3 +55,20 @@ store i32 4, i32* %Q2 br label %dead } + + +; PR3141 +%struct.ada__tags__dispatch_table = type { [1 x i32] } +%struct.f393a00_1__object = type { %struct.ada__tags__dispatch_table*, i8 } +%struct.f393a00_2__windmill = type { %struct.f393a00_1__object, i16 } + +define void @test4(%struct.f393a00_2__windmill* %a, %struct.f393a00_2__windmill* %b) { +entry: + %t = alloca %struct.f393a00_2__windmill ; <%struct.f393a00_2__windmill*> [#uses=1] + %0 = getelementptr %struct.f393a00_2__windmill* %t, i32 0, i32 0, i32 0 ; <%struct.ada__tags__dispatch_table**> [#uses=1] + %1 = load %struct.ada__tags__dispatch_table** null, align 4 ; <%struct.ada__tags__dispatch_table*> [#uses=1] + %2 = load %struct.ada__tags__dispatch_table** %0, align 8 ; <%struct.ada__tags__dispatch_table*> [#uses=1] + store %struct.ada__tags__dispatch_table* %2, %struct.ada__tags__dispatch_table** null, align 4 + store %struct.ada__tags__dispatch_table* %1, %struct.ada__tags__dispatch_table** null, align 4 + ret void +} Removed: llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/memcpy.ll (removed) @@ -1,52 +0,0 @@ -; RUN: opt < %s -dse -S | not grep alloca -; ModuleID = 'placeholder.adb' -target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" -target triple = "i686-pc-linux-gnu" - %struct.placeholder__T5b = type { i32, [1 x i32] } - %struct.placeholder__an_interval___PAD = type { %struct.placeholder__interval, [4 x i32] } - %struct.placeholder__interval = type { i32, i32 } - %struct.placeholder__s__s__the_interval___PAD = type { %struct.placeholder__interval } - -define void @_ada_placeholder() nounwind { -entry: - %an_interval = alloca %struct.placeholder__an_interval___PAD ; <%struct.placeholder__an_interval___PAD*> [#uses=3] - %tmp34 = bitcast %struct.placeholder__an_interval___PAD* %an_interval to %struct.placeholder__T5b* ; <%struct.placeholder__T5b*> [#uses=1] - %tmp5 = getelementptr %struct.placeholder__an_interval___PAD* %an_interval, i32 0, i32 0, i32 0 ; [#uses=2] - store i32 1, i32* %tmp5, align 8 - %tmp10 = getelementptr %struct.placeholder__T5b* %tmp34, i32 0, i32 1, i32 0 ; [#uses=1] - store i32 1, i32* %tmp10, align 4 - %tmp82 = load i32* %tmp5, align 8 ; [#uses=5] - %tmp83 = icmp slt i32 %tmp82, 6 ; [#uses=1] - %min84 = select i1 %tmp83, i32 %tmp82, i32 5 ; [#uses=3] - %tmp85 = icmp sgt i32 %min84, -1 ; [#uses=2] - %min84.cast193 = zext i32 %min84 to i64 ; [#uses=1] - %min84.cast193.op = shl i64 %min84.cast193, 33 ; [#uses=1] - %tmp104 = icmp sgt i32 %tmp82, -1 ; [#uses=2] - %tmp103.cast192 = zext i32 %tmp82 to i64 ; [#uses=1] - %tmp103.cast192.op = shl i64 %tmp103.cast192, 33 ; [#uses=1] - %min84.cast193.op.op = ashr i64 %min84.cast193.op, 28 ; [#uses=1] - %sextr121 = select i1 %tmp85, i64 %min84.cast193.op.op, i64 0 ; [#uses=2] - %tmp103.cast192.op.op = ashr i64 %tmp103.cast192.op, 28 ; [#uses=1] - %sextr123 = select i1 %tmp104, i64 %tmp103.cast192.op.op, i64 0 ; [#uses=2] - %tmp124 = icmp sle i64 %sextr121, %sextr123 ; [#uses=1] - %min125 = select i1 %tmp124, i64 %sextr121, i64 %sextr123 ; [#uses=1] - %sextr131194 = and i64 %min125, 34359738336 ; [#uses=1] - %tmp134 = add i64 %sextr131194, 63 ; [#uses=1] - lshr i64 %tmp134, 3 ; :0 [#uses=1] - %tmp150188.shrunk = trunc i64 %0 to i32 ; [#uses=1] - %tmp159 = and i32 %tmp150188.shrunk, -4 ; [#uses=1] - %tmp161 = alloca i8, i32 %tmp159 ; [#uses=1] - %min167.op = shl i32 %min84, 2 ; [#uses=1] - %tmp170 = select i1 %tmp85, i32 %min167.op, i32 0 ; [#uses=2] - %tmp173.op = shl i32 %tmp82, 2 ; [#uses=1] - %tmp176 = select i1 %tmp104, i32 %tmp173.op, i32 0 ; [#uses=2] - %tmp177 = icmp sle i32 %tmp170, %tmp176 ; [#uses=1] - %min178 = select i1 %tmp177, i32 %tmp170, i32 %tmp176 ; [#uses=1] - %tmp179 = add i32 %min178, 7 ; [#uses=1] - %tmp180 = and i32 %tmp179, -4 ; [#uses=1] - %tmp183185 = bitcast %struct.placeholder__an_interval___PAD* %an_interval to i8* ; [#uses=1] - call void @llvm.memcpy.i32( i8* %tmp161, i8* %tmp183185, i32 %tmp180, i32 4 ) - ret void -} - -declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) nounwind Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120373&r1=120372&r2=120373&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 19:00:34 2010 @@ -79,3 +79,69 @@ ; CHECK: @test7 ; CHECK-NEXT: call void @llvm.memcpy } + +; Do not delete stores that are only partially killed. +define i32 @test8() { + %V = alloca i32 + store i32 1234567, i32* %V + %V2 = bitcast i32* %V to i8* + store i8 0, i8* %V2 + %X = load i32* %V + ret i32 %X + +; CHECK: @test8 +; CHECK: store i32 1234567 +} + + +; Test for byval handling. +%struct.x = type { i32, i32, i32, i32 } +define void @test9(%struct.x* byval %a) nounwind { + %tmp2 = getelementptr %struct.x* %a, i32 0, i32 0 + store i32 1, i32* %tmp2, align 4 + ret void +; CHECK: @test9 +; CHECK-NEXT: ret void +} + +; va_arg has fuzzy dependence, the store shouldn't be zapped. +define double @test10(i8* %X) { + %X_addr = alloca i8* + store i8* %X, i8** %X_addr + %tmp.0 = va_arg i8** %X_addr, double + ret double %tmp.0 +; CHECK: @test10 +; CHECK: store +} + + +; DSE should delete the dead trampoline. +declare i8* @llvm.init.trampoline(i8*, i8*, i8*) +declare void @test11f() +define void @test11() { +; CHECK: @test11 + %storage = alloca [10 x i8], align 16 ; <[10 x i8]*> [#uses=1] +; CHECK-NOT: alloca + %cast = getelementptr [10 x i8]* %storage, i32 0, i32 0 ; [#uses=1] + %tramp = call i8* @llvm.init.trampoline( i8* %cast, i8* bitcast (void ()* @test11f to i8*), i8* null ) ; [#uses=1] +; CHECK-NOT: trampoline + ret void +; CHECK: ret void +} + + +; PR2599 - load -> store to same address. +define void @test12({ i32, i32 }* %x) nounwind { + %tmp4 = getelementptr { i32, i32 }* %x, i32 0, i32 0 + %tmp5 = load i32* %tmp4, align 4 + %tmp7 = getelementptr { i32, i32 }* %x, i32 0, i32 1 + %tmp8 = load i32* %tmp7, align 4 + %tmp17 = sub i32 0, %tmp8 + store i32 %tmp5, i32* %tmp4, align 4 + store i32 %tmp17, i32* %tmp7, align 4 + ret void +; CHECK: @test12 +; CHECK-NOT: tmp5 +; CHECK: ret void +} + Removed: llvm/trunk/test/Transforms/DeadStoreElimination/volatile-load.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/volatile-load.ll?rev=120372&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/volatile-load.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/volatile-load.ll (removed) @@ -1,8 +0,0 @@ -; RUN: opt < %s -dse -S | grep {volatile load} - - at g_1 = global i32 0 - -define void @foo() nounwind { - %t = volatile load i32* @g_1 - ret void -} From sabre at nondot.org Mon Nov 29 19:05:07 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 01:05:07 -0000 Subject: [llvm-commits] [llvm] r120374 - in /llvm/trunk/test/Transforms/DeadStoreElimination: context-sensitive.ll partial-overwrite.ll simple.ll Message-ID: <20101130010507.397272A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 19:05:07 2010 New Revision: 120374 URL: http://llvm.org/viewvc/llvm-project?rev=120374&view=rev Log: I already merged partial-overwrite.ll -> PartialStore.ll Merge context-sensitive.ll -> simple.ll and upgrade it. Removed: llvm/trunk/test/Transforms/DeadStoreElimination/context-sensitive.ll llvm/trunk/test/Transforms/DeadStoreElimination/partial-overwrite.ll Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Removed: llvm/trunk/test/Transforms/DeadStoreElimination/context-sensitive.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/context-sensitive.ll?rev=120373&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/context-sensitive.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/context-sensitive.ll (removed) @@ -1,15 +0,0 @@ -; RUN: opt < %s -basicaa -dse -S | not grep DEAD -target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" - -declare void @ext() - -define i32* @caller() { - %P = malloc i32 ; [#uses=4] - %DEAD = load i32* %P ; [#uses=1] - %DEAD2 = add i32 %DEAD, 1 ; [#uses=1] - store i32 %DEAD2, i32* %P - call void @ext( ) - store i32 0, i32* %P - ret i32* %P -} - Removed: llvm/trunk/test/Transforms/DeadStoreElimination/partial-overwrite.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/partial-overwrite.ll?rev=120373&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/partial-overwrite.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/partial-overwrite.ll (removed) @@ -1,14 +0,0 @@ -; RUN: opt -dse -S %s | FileCheck %s -; Note that we could do better by merging the two stores into one. - -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" -target triple = "x86_64-unknown-linux-gnu" - -define void @test(i32* %P) { - store i32 0, i32* %P -; CHECK: store i32 - %Q = bitcast i32* %P to i16* - store i16 1, i16* %Q -; CHECK: store i16 - ret void -} Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120374&r1=120373&r2=120374&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 19:05:07 2010 @@ -145,3 +145,23 @@ ; CHECK: ret void } + +; %P doesn't escape, the DEAD instructions should be removed. +declare void @test13f() +define i32* @test13() { + %p = tail call i8* @malloc(i32 4) + %P = bitcast i8* %p to i32* + %DEAD = load i32* %P + %DEAD2 = add i32 %DEAD, 1 + store i32 %DEAD2, i32* %P + call void @test13f( ) + store i32 0, i32* %P + ret i32* %P +; CHECK: @test13() +; CHECK-NEXT: malloc +; CHECK-NEXT: bitcast +; CHECK-NEXT: call void +} + +declare noalias i8* @malloc(i32) + From sabre at nondot.org Mon Nov 29 19:06:43 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 01:06:43 -0000 Subject: [llvm-commits] [llvm] r120375 - in /llvm/trunk/test/Transforms/DeadStoreElimination: alloca.ll simple.ll Message-ID: <20101130010643.C564A2A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 19:06:43 2010 New Revision: 120375 URL: http://llvm.org/viewvc/llvm-project?rev=120375&view=rev Log: merge one more away Removed: llvm/trunk/test/Transforms/DeadStoreElimination/alloca.ll Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Removed: llvm/trunk/test/Transforms/DeadStoreElimination/alloca.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/alloca.ll?rev=120374&view=auto ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/alloca.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/alloca.ll (removed) @@ -1,9 +0,0 @@ -; RUN: opt < %s -dse -S | not grep DEAD - -define void @test(i32* %Q) { - %P = alloca i32 ; [#uses=1] - %DEAD = load i32* %Q ; [#uses=1] - store i32 %DEAD, i32* %P - ret void -} - Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120375&r1=120374&r2=120375&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 19:06:43 2010 @@ -165,3 +165,15 @@ declare noalias i8* @malloc(i32) + + +define void @test14(i32* %Q) { + %P = alloca i32 + %DEAD = load i32* %Q + store i32 %DEAD, i32* %P + ret void + +; CHECK: @test14 +; CHECK-NEXT: ret void +} + From sabre at nondot.org Mon Nov 29 19:28:33 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 01:28:33 -0000 Subject: [llvm-commits] [llvm] r120377 - in /llvm/trunk: include/llvm/Analysis/MemoryBuiltins.h lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130012833.7B75E2A6C12F@llvm.org> Author: lattner Date: Mon Nov 29 19:28:33 2010 New Revision: 120377 URL: http://llvm.org/viewvc/llvm-project?rev=120377&view=rev Log: clean up handling of 'free', detangling it from everything else. It can be seriously improved, but at least now it isn't intertwined with the other logic. Modified: llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h?rev=120377&r1=120376&r2=120377&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h (original) +++ llvm/trunk/include/llvm/Analysis/MemoryBuiltins.h Mon Nov 29 19:28:33 2010 @@ -74,6 +74,10 @@ /// isFreeCall - Returns non-null if the value is a call to the builtin free() const CallInst *isFreeCall(const Value *I); + +static inline CallInst *isFreeCall(Value *I) { + return const_cast(isFreeCall((const Value*)I)); +} } // End llvm namespace Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120377&r1=120376&r2=120377&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 19:28:33 2010 @@ -58,9 +58,7 @@ } bool runOnBasicBlock(BasicBlock &BB); - bool handleFreeWithNonTrivialDependency(const CallInst *F, - Instruction *Inst, - MemDepResult Dep); + bool HandleFree(CallInst *F); bool handleEndBlock(BasicBlock &BB); bool RemoveUndeadPointers(Value *Ptr, uint64_t killPointerSize, BasicBlock::iterator &BBI, @@ -124,7 +122,7 @@ return true; } -/// getPointerOperand - Return the pointer that is being clobbered. +/// getPointerOperand - Return the pointer that is being written to. static Value *getPointerOperand(Instruction *I) { assert(doesClobberMemory(I)); if (StoreInst *SI = dyn_cast(I)) @@ -202,8 +200,14 @@ for (BasicBlock::iterator BBI = BB.begin(), BBE = BB.end(); BBI != BBE; ) { Instruction *Inst = BBI++; - // If we find a store or a free, get its memory dependence. - if (!doesClobberMemory(Inst) && !isFreeCall(Inst)) + // Handle 'free' calls specially. + if (CallInst *F = isFreeCall(Inst)) { + MadeChange |= HandleFree(F); + continue; + } + + // If we find a store, get its memory dependence. + if (!doesClobberMemory(Inst)) continue; MemDepResult InstDep = MD.getDependency(Inst); @@ -211,13 +215,7 @@ // Ignore non-local store liveness. // FIXME: cross-block DSE would be fun. :) if (InstDep.isNonLocal()) continue; - - // Handle frees whose dependencies are non-trivial. - if (const CallInst *F = isFreeCall(Inst)) { - MadeChange |= handleFreeWithNonTrivialDependency(F, Inst, InstDep); - continue; - } - + // If we're storing the same value back to a pointer that we just // loaded from, then the store can be removed. if (StoreInst *SI = dyn_cast(Inst)) { @@ -292,24 +290,25 @@ return MadeChange; } -/// handleFreeWithNonTrivialDependency - Handle frees of entire structures whose -/// dependency is a store to a field of that structure. -bool DSE::handleFreeWithNonTrivialDependency(const CallInst *F, - Instruction *Inst, - MemDepResult Dep) { +/// HandleFree - Handle frees of entire structures whose dependency is a store +/// to a field of that structure. +bool DSE::HandleFree(CallInst *F) { AliasAnalysis &AA = getAnalysis(); MemoryDependenceAnalysis &MD = getAnalysis(); - + + MemDepResult Dep = MD.getDependency(F); do { + if (Dep.isNonLocal()) return false; + Instruction *Dependency = Dep.getInst(); - if (!Dependency || !doesClobberMemory(Dependency) || !isElidable(Dependency)) + if (!doesClobberMemory(Dependency) || !isElidable(Dependency)) return false; Value *DepPointer = getPointerOperand(Dependency)->getUnderlyingObject(); // Check for aliasing. if (AA.alias(F->getArgOperand(0), 1, DepPointer, 1) != - AliasAnalysis::MustAlias) + AliasAnalysis::MustAlias) return false; // DCE instructions only used to calculate that store @@ -321,8 +320,9 @@ // s[0] = 0; // s[1] = 0; // This has just been deleted. // free(s); - Dep = MD.getDependency(Inst); + Dep = MD.getDependency(F); } while (!Dep.isNonLocal()); + return true; } From rjmccall at apple.com Mon Nov 29 19:39:32 2010 From: rjmccall at apple.com (John McCall) Date: Mon, 29 Nov 2010 17:39:32 -0800 Subject: [llvm-commits] [Review request] Instcombine: extractvalue from load --> load from gep In-Reply-To: References: <7CBC704A-3752-4146-9B04-867EE9F3EDED@apple.com> Message-ID: On Nov 29, 2010, at 2:21 PM, Frits van Bommel wrote: > On Mon, Nov 29, 2010 at 10:30 PM, Chris Lattner wrote: >> I think that Dan is pointing out that it is unwise for an frontend to generate a ton of aggregate values, because that will cause fastisel to be defeated and lead to slower compile times. However, despite Dan's objections, I think this is a perfectly reasonable xform for instcombine to do. > > I agree that it's probably not a very good thing to do, but apparently > they do occur "in the wild" even with clang. Yes, we use them for pointer-to-function-members, and I'm planning to change our complex generation to use them as well. Sometimes subverting fastisel can lead to faster compiler times by substantially simplifying code. :) John. From sabre at nondot.org Mon Nov 29 19:37:52 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 01:37:52 -0000 Subject: [llvm-commits] [llvm] r120378 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130013752.915322A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 19:37:52 2010 New Revision: 120378 URL: http://llvm.org/viewvc/llvm-project?rev=120378&view=rev Log: rename doesClobberMemory -> hasMemoryWrite to be more specific, and remove an actively-wrong comment. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120378&r1=120377&r2=120378&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 19:37:52 2010 @@ -91,9 +91,9 @@ FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); } -/// doesClobberMemory - Does this instruction clobber (write without reading) -/// some memory? -static bool doesClobberMemory(Instruction *I) { +/// hasMemoryWrite - Does this instruction write some memory? This only returns +/// true for things that we can analyze with other helpers below. +static bool hasMemoryWrite(Instruction *I) { if (isa(I)) return true; if (IntrinsicInst *II = dyn_cast(I)) { @@ -114,7 +114,7 @@ /// isElidable - If the value of this instruction and the memory it writes to is /// unused, may we delete this instrtction? static bool isElidable(Instruction *I) { - assert(doesClobberMemory(I)); + assert(hasMemoryWrite(I)); if (IntrinsicInst *II = dyn_cast(I)) return II->getIntrinsicID() != Intrinsic::lifetime_end; if (StoreInst *SI = dyn_cast(I)) @@ -124,7 +124,7 @@ /// getPointerOperand - Return the pointer that is being written to. static Value *getPointerOperand(Instruction *I) { - assert(doesClobberMemory(I)); + assert(hasMemoryWrite(I)); if (StoreInst *SI = dyn_cast(I)) return SI->getPointerOperand(); if (MemIntrinsic *MI = dyn_cast(I)) @@ -143,7 +143,7 @@ /// getStoreSize - Return the length in bytes of the write by the clobbering /// instruction. If variable or unknown, returns AliasAnalysis::UnknownSize. static uint64_t getStoreSize(Instruction *I, const TargetData *TD) { - assert(doesClobberMemory(I)); + assert(hasMemoryWrite(I)); if (StoreInst *SI = dyn_cast(I)) { if (!TD) return AliasAnalysis::UnknownSize; return TD->getTypeStoreSize(SI->getOperand(0)->getType()); @@ -206,8 +206,8 @@ continue; } - // If we find a store, get its memory dependence. - if (!doesClobberMemory(Inst)) + // If we find something that writes memory, get its memory dependence. + if (!hasMemoryWrite(Inst)) continue; MemDepResult InstDep = MD.getDependency(Inst); @@ -264,7 +264,7 @@ // If this is a store-store dependence, then the previous store is dead so // long as this store is at least as big as it. - if (InstDep.isDef() && doesClobberMemory(InstDep.getInst())) { + if (InstDep.isDef() && hasMemoryWrite(InstDep.getInst())) { Instruction *DepStore = InstDep.getInst(); if (isStoreAtLeastAsWideAs(Inst, DepStore, TD) && isElidable(DepStore)) { // Delete the store and now-dead instructions that feed it. @@ -301,7 +301,7 @@ if (Dep.isNonLocal()) return false; Instruction *Dependency = Dep.getInst(); - if (!doesClobberMemory(Dependency) || !isElidable(Dependency)) + if (!hasMemoryWrite(Dependency) || !isElidable(Dependency)) return false; Value *DepPointer = getPointerOperand(Dependency)->getUnderlyingObject(); @@ -358,7 +358,7 @@ --BBI; // If we find a store whose pointer is dead. - if (doesClobberMemory(BBI)) { + if (hasMemoryWrite(BBI)) { if (isElidable(BBI)) { // See through pointer-to-pointer bitcasts Value *pointerOperand = getPointerOperand(BBI)->getUnderlyingObject(); From sabre at nondot.org Mon Nov 29 19:48:21 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 01:48:21 -0000 Subject: [llvm-commits] [llvm] r120380 - in /llvm/trunk: include/llvm/Analysis/AliasAnalysis.h lib/Analysis/AliasAnalysis.cpp Message-ID: <20101130014821.1D8182A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 19:48:20 2010 New Revision: 120380 URL: http://llvm.org/viewvc/llvm-project?rev=120380&view=rev Log: getLocationForDest should work for memset as well. Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h llvm/trunk/lib/Analysis/AliasAnalysis.cpp Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=120380&r1=120379&r2=120380&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original) +++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Mon Nov 29 19:48:20 2010 @@ -49,6 +49,7 @@ class Pass; class AnalysisUsage; class MemTransferInst; +class MemIntrinsic; class AliasAnalysis { protected: @@ -137,7 +138,7 @@ Location getLocation(const StoreInst *SI); Location getLocation(const VAArgInst *VI); static Location getLocationForSource(const MemTransferInst *MTI); - static Location getLocationForDest(const MemTransferInst *MTI); + static Location getLocationForDest(const MemIntrinsic *MI); /// Alias analysis result - Either we know for sure that it does not alias, we /// know for sure it must alias, or we don't know anything: The two pointers Modified: llvm/trunk/lib/Analysis/AliasAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/AliasAnalysis.cpp?rev=120380&r1=120379&r2=120380&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/AliasAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/AliasAnalysis.cpp Mon Nov 29 19:48:20 2010 @@ -224,7 +224,7 @@ } AliasAnalysis::Location -AliasAnalysis::getLocationForDest(const MemTransferInst *MTI) { +AliasAnalysis::getLocationForDest(const MemIntrinsic *MTI) { uint64_t Size = UnknownSize; if (ConstantInt *C = dyn_cast(MTI->getLength())) Size = C->getValue().getZExtValue(); From sabre at nondot.org Mon Nov 29 19:56:13 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 01:56:13 -0000 Subject: [llvm-commits] [llvm] r120381 - /llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Message-ID: <20101130015613.B6A332A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 19:56:13 2010 New Revision: 120381 URL: http://llvm.org/viewvc/llvm-project?rev=120381&view=rev Log: strength reduce this. Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=120381&r1=120380&r2=120381&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original) +++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Mon Nov 29 19:56:13 2010 @@ -411,7 +411,7 @@ if (MemLoc.Ptr) { // If we can do a pointer scan, make it happen. bool isLoad = !(MR & AliasAnalysis::Mod); - if (IntrinsicInst *II = dyn_cast(QueryInst)) + if (IntrinsicInst *II = dyn_cast(QueryInst)) isLoad |= II->getIntrinsicID() == Intrinsic::lifetime_end; LocalCache = getPointerDependencyFrom(MemLoc, isLoad, ScanPos, From sabre at nondot.org Mon Nov 29 20:03:47 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 02:03:47 -0000 Subject: [llvm-commits] [llvm] r120382 - in /llvm/trunk: include/llvm/IntrinsicInst.h lib/Transforms/Utils/Local.cpp Message-ID: <20101130020348.049C32A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 20:03:47 2010 New Revision: 120382 URL: http://llvm.org/viewvc/llvm-project?rev=120382&view=rev Log: remove the pointless check of MemoryUseIntrinsic from is trivially dead, since these have side effects. This makes the (misnamed) MemoryUseIntrinsic class dead, so remove it. Modified: llvm/trunk/include/llvm/IntrinsicInst.h llvm/trunk/lib/Transforms/Utils/Local.cpp Modified: llvm/trunk/include/llvm/IntrinsicInst.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IntrinsicInst.h?rev=120382&r1=120381&r2=120382&view=diff ============================================================================== --- llvm/trunk/include/llvm/IntrinsicInst.h (original) +++ llvm/trunk/include/llvm/IntrinsicInst.h Mon Nov 29 20:03:47 2010 @@ -55,7 +55,7 @@ return isa(V) && classof(cast(V)); } }; - + /// DbgInfoIntrinsic - This is the common base class for debug info intrinsics /// class DbgInfoIntrinsic : public IntrinsicInst { @@ -297,29 +297,6 @@ } }; - /// MemoryUseIntrinsic - This is the common base class for the memory use - /// marker intrinsics. - /// - class MemoryUseIntrinsic : public IntrinsicInst { - public: - - // Methods for support type inquiry through isa, cast, and dyn_cast: - static inline bool classof(const MemoryUseIntrinsic *) { return true; } - static inline bool classof(const IntrinsicInst *I) { - switch (I->getIntrinsicID()) { - case Intrinsic::lifetime_start: - case Intrinsic::lifetime_end: - case Intrinsic::invariant_start: - case Intrinsic::invariant_end: - return true; - default: return false; - } - } - static inline bool classof(const Value *V) { - return isa(V) && classof(cast(V)); - } - }; - } #endif Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=120382&r1=120381&r2=120382&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Utils/Local.cpp (original) +++ llvm/trunk/lib/Transforms/Utils/Local.cpp Mon Nov 29 20:03:47 2010 @@ -209,9 +209,6 @@ // We don't want debug info removed by anything this general. if (isa(I)) return false; - // Likewise for memory use markers. - if (isa(I)) return false; - if (!I->mayHaveSideEffects()) return true; // Special case intrinsics that "may have side effects" but can be deleted From sabre at nondot.org Mon Nov 29 20:04:15 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 02:04:15 -0000 Subject: [llvm-commits] [llvm] r120383 - /llvm/trunk/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll Message-ID: <20101130020415.9F65F2A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 20:04:15 2010 New Revision: 120383 URL: http://llvm.org/viewvc/llvm-project?rev=120383&view=rev Log: remove a use of llvm-dis Modified: llvm/trunk/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll Modified: llvm/trunk/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll?rev=120383&r1=120382&r2=120383&view=diff ============================================================================== --- llvm/trunk/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll (original) +++ llvm/trunk/test/Transforms/InstCombine/2003-08-12-AllocaNonNull.ll Mon Nov 29 20:04:15 2010 @@ -1,7 +1,6 @@ ; This testcase can be simplified by "realizing" that alloca can never return ; null. -; RUN: opt < %s -instcombine -simplifycfg | \ -; RUN: llvm-dis | not grep br +; RUN: opt < %s -instcombine -simplifycfg -S | not grep br declare i32 @bitmap_clear(...) From stoklund at 2pi.dk Mon Nov 29 20:17:10 2010 From: stoklund at 2pi.dk (Jakob Stoklund Olesen) Date: Tue, 30 Nov 2010 02:17:10 -0000 Subject: [llvm-commits] [llvm] r120385 - in /llvm/trunk: include/llvm/InitializePasses.h lib/CodeGen/CMakeLists.txt lib/CodeGen/CodeGen.cpp lib/CodeGen/LiveDebugVariables.cpp lib/CodeGen/LiveDebugVariables.h Message-ID: <20101130021710.4AD312A6C12D@llvm.org> Author: stoklund Date: Mon Nov 29 20:17:10 2010 New Revision: 120385 URL: http://llvm.org/viewvc/llvm-project?rev=120385&view=rev Log: Stub out a new LiveDebugVariables pass. This analysis is going to run immediately after LiveIntervals. It will stay alive during register allocation and keep track of user variables mentioned in DBG_VALUE instructions. When the register allocator is moving values between registers and the stack, it is very hard to keep track of DBG_VALUE instructions. We usually get it wrong. This analysis maintains a data structure that makes it easy to update DBG_VALUE instructions. Added: llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp llvm/trunk/lib/CodeGen/LiveDebugVariables.h Modified: llvm/trunk/include/llvm/InitializePasses.h llvm/trunk/lib/CodeGen/CMakeLists.txt llvm/trunk/lib/CodeGen/CodeGen.cpp Modified: llvm/trunk/include/llvm/InitializePasses.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=120385&r1=120384&r2=120385&view=diff ============================================================================== --- llvm/trunk/include/llvm/InitializePasses.h (original) +++ llvm/trunk/include/llvm/InitializePasses.h Mon Nov 29 20:17:10 2010 @@ -117,6 +117,7 @@ void initializeLazyValueInfoPass(PassRegistry&); void initializeLibCallAliasAnalysisPass(PassRegistry&); void initializeLintPass(PassRegistry&); +void initializeLiveDebugVariablesPass(PassRegistry&); void initializeLiveIntervalsPass(PassRegistry&); void initializeLiveStacksPass(PassRegistry&); void initializeLiveValuesPass(PassRegistry&); Modified: llvm/trunk/lib/CodeGen/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CMakeLists.txt?rev=120385&r1=120384&r2=120385&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/CMakeLists.txt (original) +++ llvm/trunk/lib/CodeGen/CMakeLists.txt Mon Nov 29 20:17:10 2010 @@ -20,6 +20,7 @@ IntrinsicLowering.cpp LLVMTargetMachine.cpp LatencyPriorityQueue.cpp + LiveDebugVariables.cpp LiveInterval.cpp LiveIntervalAnalysis.cpp LiveIntervalUnion.cpp Modified: llvm/trunk/lib/CodeGen/CodeGen.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGen.cpp?rev=120385&r1=120384&r2=120385&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/CodeGen.cpp (original) +++ llvm/trunk/lib/CodeGen/CodeGen.cpp Mon Nov 29 20:17:10 2010 @@ -23,6 +23,7 @@ initializeDeadMachineInstructionElimPass(Registry); initializeGCModuleInfoPass(Registry); initializeIfConverterPass(Registry); + initializeLiveDebugVariablesPass(Registry); initializeLiveIntervalsPass(Registry); initializeLiveStacksPass(Registry); initializeLiveVariablesPass(Registry); Added: llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp?rev=120385&view=auto ============================================================================== --- llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp (added) +++ llvm/trunk/lib/CodeGen/LiveDebugVariables.cpp Mon Nov 29 20:17:10 2010 @@ -0,0 +1,50 @@ +//===- LiveDebugVariables.cpp - Tracking debug info variables -------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the LiveDebugVariables analysis. +// +// Remove all DBG_VALUE instructions referencing virtual registers and replace +// them with a data structure tracking where live user variables are kept - in a +// virtual register or in a stack slot. +// +// Allow the data structure to be updated during register allocation when values +// are moved between registers and stack slots. Finally emit new DBG_VALUE +// instructions after register allocation is complete. +// +//===----------------------------------------------------------------------===// + +#include "LiveDebugVariables.h" +#include "llvm/CodeGen/LiveIntervalAnalysis.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/Target/TargetMachine.h" + +using namespace llvm; + +char LiveDebugVariables::ID = 0; + +INITIALIZE_PASS_BEGIN(LiveDebugVariables, "livedebugvars", + "Debug Variable Analysis", false, false) +INITIALIZE_PASS_DEPENDENCY(LiveIntervals) +INITIALIZE_PASS_END(LiveDebugVariables, "livedebugvars", + "Debug Variable Analysis", false, false) + +void LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequiredTransitive(); + AU.setPreservesAll(); + MachineFunctionPass::getAnalysisUsage(AU); +} + +LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID) { + initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry()); +} + +bool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) { + return false; +} Added: llvm/trunk/lib/CodeGen/LiveDebugVariables.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveDebugVariables.h?rev=120385&view=auto ============================================================================== --- llvm/trunk/lib/CodeGen/LiveDebugVariables.h (added) +++ llvm/trunk/lib/CodeGen/LiveDebugVariables.h Mon Nov 29 20:17:10 2010 @@ -0,0 +1,57 @@ +//===- LiveDebugVariables.h - Tracking debug info variables ----*- c++ -*--===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file provides the interface to the LiveDebugVariables analysis. +// +// The analysis removes DBG_VALUE instructions for virtual registers and tracks +// live user variables in a data structure that can be updated during register +// allocation. +// +// After register allocation new DBG_VALUE instructions are emitted to reflect +// the new locations of user variables. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_LIVEDEBUGVARIABLES_H +#define LLVM_CODEGEN_LIVEDEBUGVARIABLES_H + +#include "llvm/CodeGen/MachineFunctionPass.h" + +namespace llvm { + +class LiveDebugVariables : public MachineFunctionPass { + void *pImpl; +public: + static char ID; // Pass identification, replacement for typeid + + LiveDebugVariables(); + + /// renameRegister - Move any user variables in OldReg to NewReg:SubIdx. + /// @param OldReg Old virtual register that is going away. + /// @param NewReg New register holding the user variables. + /// @param SubIdx If NewReg is a virtual register, SubIdx may indicate a sub- + /// register. + void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx); + + /// emitDebugValues - Emit new DBG_VALUE instructions reflecting the changes + /// that happened during register allocation. + void emitDebugValues(); + +private: + + /// runOnMachineFunction - Analyze and remove DBG_VALUE instructions. + virtual bool runOnMachineFunction(MachineFunction &); + + virtual void getAnalysisUsage(AnalysisUsage &) const; + +}; + +} // namespace llvm + +#endif // LLVM_CODEGEN_LIVEDEBUGVARIABLES_H From aggarwa4 at illinois.edu Mon Nov 29 21:50:15 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Tue, 30 Nov 2010 03:50:15 -0000 Subject: [llvm-commits] [poolalloc] r120387 - /poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Message-ID: <20101130035015.3E7DA2A6C12D@llvm.org> Author: aggarwa4 Date: Mon Nov 29 21:50:15 2010 New Revision: 120387 URL: http://llvm.org/viewvc/llvm-project?rev=120387&view=rev Log: Removing dead code from this file to remove clutter. Please refer to svn history for details on these functions. Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/BottomUpClosure.cpp?rev=120387&r1=120386&r2=120387&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/BottomUpClosure.cpp (original) +++ poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Mon Nov 29 21:50:15 2010 @@ -59,10 +59,6 @@ // entry-points correctly. As a bonus, we can be more aggressive at propagating // information upwards, as long as we don't remove unresolved call sites. bool BUDataStructures::runOnModuleInternal(Module& M) { -#if 0 - llvm::errs() << "BU is currently being worked in in very invasive ways.\n" - << "It is probably broken right now\n"; -#endif // // Put the callgraph into canonical form by finding SCCs. @@ -70,13 +66,6 @@ callgraph.buildSCCs(); callgraph.buildRoots(); -#if 0 - // - // Merge the DSGraphs of functions belonging to an SCC. - // - mergeSCCs(); -#endif - // // Make sure we have a DSGraph for all declared functions in the Module. // While we may not need them in this DSA pass, a later DSA pass may ask us @@ -91,30 +80,7 @@ // // Do a post-order traversal of the SCC callgraph and do bottom-up inlining. // -#if 0 - { - //errs() << *DSG.knownRoots.begin() << " -> " << *DSG.knownRoots.rbegin() << "\n"; - svset marked; - for (DSCallGraph::root_iterator ii = callgraph.root_begin(), - ee = callgraph.root_end(); ii != ee; ++ii) { - //errs() << (*ii)->getName() << "\n"; - - // - // Do bottom-up inlining of the function. - // - DSGraph* G = postOrder(*ii, marked); - - // - // Update the list of unresolved indirect function call sites in the - // globals graph with the new information learned about the current - // function. - // - CloneAuxIntoGlobal(G); - } - } -#else postOrderInline (M); -#endif std::vector EntryPoints; @@ -128,8 +94,6 @@ // incomplete in the globals graph. // - //finalizeGlobals(); - GlobalsGraph->removeTriviallyDeadNodes(); GlobalsGraph->maskIncompleteMarkers(); @@ -554,108 +518,6 @@ return MyID; // == Min } -#if 0 -// -// Method: postOrder() -// -// Description: -// Process the SCCs of the callgraph in post order. When we process a -// function, we inline the DSGraphs of its callees into the function's own -// DSGraph, thereby doing the "bottom-up" pass that makes BU so famous. -// -// Inputs: -// F - The function in the SCC to process. Note that its children in the -// callgraph will be processed first through a recursive call. -// marked - A reference to a set containing all values processed by -// previous invocations (this method is recursive). -// -// Outputs: -// marked - A set containing pointers to functions that have already been -// processed. -// -// Return value: -// The DSGraph of the function after it has been processed is returned. -// -DSGraph* -BUDataStructures::postOrder(const Function* F, svset& marked) { - // - // If we have already processed this function before, do not process it - // again. - // - callgraph.assertSCCRoot(F); - DSGraph* G = getDSGraph(*F); - if (marked.count(F)) return G; - - // - // Find the set of callees to process. - // - // For this operation, we do not want to use the call graph. Instead, we - // want to consult the DSGraph and see which call sites have not yet been - // resolved. This is because we may learn about more call sites after doing - // one pass of bottom-up inlining, and so we don't want to reprocess the - // callees that were previously processed in an earlier BU phase. - // - for (DSCallGraph::flat_iterator ii = callgraph.flat_callee_begin(F), - ee = callgraph.flat_callee_end(F); ii != ee; ++ii) { - callgraph.assertSCCRoot(*ii); - assert (*ii != F && "Simple loop in callgraph"); - if (!(*ii)->isDeclaration()) - postOrder(*ii, marked); - } - - // - // Record that we are about to process the given function. - // - marked.insert(F); - - // - // Inline the graphs of callees into this function's callgraph. - // - calculateGraph(G); - - // - // Now that we have new information merged into the function's DSGraph, - // update the call graph using this new information. - // - G->buildCallGraph(callgraph,filterCallees); - - // - // Return the DSGraph associated with this function. - // - return G; -} - -void BUDataStructures::finalizeGlobals(void) { - // Any unresolved call can be removed (resolved) if it does not contain - // external functions and it is not reachable from any call that does - // contain external functions - std::set GoodCalls, BadCalls; - for (DSGraph::afc_iterator ii = GlobalsGraph->afc_begin(), - ee = GlobalsGraph->afc_end(); ii != ee; ++ii) - if (ii->isDirectCall() || ii->getCalleeNode()->isExternFuncNode()) - BadCalls.insert(*ii); - else - GoodCalls.insert(*ii); - DenseSet reachable; - for (std::set::iterator ii = BadCalls.begin(), - ee = BadCalls.end(); ii != ee; ++ii) { - ii->getRetVal().getNode()->markReachableNodes(reachable); - ii->getVAVal().getNode()->markReachableNodes(reachable); - for (unsigned x = 0; x < ii->getNumPtrArgs(); ++x) - ii->getPtrArg(x).getNode()->markReachableNodes(reachable); - } - for (std::set::iterator ii = GoodCalls.begin(), - ee = GoodCalls.end(); ii != ee; ++ii) - if (reachable.count(ii->getCalleeNode())) - GlobalsGraph->getAuxFunctionCalls() - .erase(std::find(GlobalsGraph->getAuxFunctionCalls().begin(), - GlobalsGraph->getAuxFunctionCalls().end(), - *ii)); - GlobalsGraph->getScalarMap().clear_scalars(); -} - -#endif - // // Method: CloneAuxIntoGlobal() // @@ -680,9 +542,6 @@ for (DSGraph::afc_iterator ii = G->afc_begin(), ee = G->afc_end(); ii != ee; ++ii) { -#if 0 - cerr << "Pushing " << ii->getCallSite().getInstruction()->getOperand(0) << "\n"; -#endif // // If we can, merge with an existing call site for this instruction. From nicholas at mxc.ca Mon Nov 29 22:13:41 2010 From: nicholas at mxc.ca (Nick Lewycky) Date: Tue, 30 Nov 2010 04:13:41 -0000 Subject: [llvm-commits] [llvm] r120388 - in /llvm/trunk: docs/LangRef.html include/llvm/Intrinsics.td Message-ID: <20101130041341.B89BB2A6C12D@llvm.org> Author: nicholas Date: Mon Nov 29 22:13:41 2010 New Revision: 120388 URL: http://llvm.org/viewvc/llvm-project?rev=120388&view=rev Log: Make @llvm.invariant.start not be readonly, so that it has side-effects. This unbreaks test/Transforms/InstCombine/invariant.ll which was broken by r120382. This is a fix-forward to do what I think Chris intended. Modified: llvm/trunk/docs/LangRef.html llvm/trunk/include/llvm/Intrinsics.td Modified: llvm/trunk/docs/LangRef.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.html?rev=120388&r1=120387&r2=120388&view=diff ============================================================================== --- llvm/trunk/docs/LangRef.html (original) +++ llvm/trunk/docs/LangRef.html Mon Nov 29 22:13:41 2010 @@ -7506,7 +7506,7 @@
Syntax:
-  declare {}* @llvm.invariant.start(i64 <size>, i8* nocapture <ptr>) readonly
+  declare {}* @llvm.invariant.start(i64 <size>, i8* nocapture <ptr>)
 
Overview:
Modified: llvm/trunk/include/llvm/Intrinsics.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.td?rev=120388&r1=120387&r2=120388&view=diff ============================================================================== --- llvm/trunk/include/llvm/Intrinsics.td (original) +++ llvm/trunk/include/llvm/Intrinsics.td Mon Nov 29 22:13:41 2010 @@ -436,7 +436,7 @@ [IntrReadWriteArgMem, NoCapture<1>]>; def int_invariant_start : Intrinsic<[llvm_descriptor_ty], [llvm_i64_ty, llvm_ptr_ty], - [IntrReadArgMem, NoCapture<1>]>; + [IntrReadWriteArgMem, NoCapture<1>]>; def int_invariant_end : Intrinsic<[], [llvm_descriptor_ty, llvm_i64_ty, llvm_ptr_ty], From sabre at nondot.org Mon Nov 29 23:30:45 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 05:30:45 -0000 Subject: [llvm-commits] [llvm] r120391 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130053045.9A4AA2A6C12D@llvm.org> Author: lattner Date: Mon Nov 29 23:30:45 2010 New Revision: 120391 URL: http://llvm.org/viewvc/llvm-project?rev=120391&view=rev Log: rename a function and reduce some indentation, no functionality change. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120391&r1=120390&r2=120391&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 23:30:45 2010 @@ -111,9 +111,9 @@ return false; } -/// isElidable - If the value of this instruction and the memory it writes to is -/// unused, may we delete this instrtction? -static bool isElidable(Instruction *I) { +/// isRemovable - If the value of this instruction and the memory it writes to +/// is unused, may we delete this instruction? +static bool isRemovable(Instruction *I) { assert(hasMemoryWrite(I)); if (IntrinsicInst *II = dyn_cast(I)) return II->getIntrinsicID() != Intrinsic::lifetime_end; @@ -192,6 +192,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { MemoryDependenceAnalysis &MD = getAnalysis(); + AliasAnalysis &AA = getAnalysis(); TD = getAnalysisIfAvailable(); bool MadeChange = false; @@ -238,7 +239,7 @@ } } } - + if (!InstDep.isDef()) { // If this is a may-aliased store that is clobbering the store value, we // can keep searching past it for another must-aliased pointer that stores @@ -249,7 +250,6 @@ // we can remove the first store to P even though we don't know if P and Q // alias. if (StoreInst *SI = dyn_cast(Inst)) { - AliasAnalysis &AA = getAnalysis(); AliasAnalysis::Location Loc = AA.getLocation(SI); while (InstDep.isClobber() && InstDep.getInst() != &BB.front()) { // Can't look past this instruction if it might read 'Loc'. @@ -266,19 +266,21 @@ // long as this store is at least as big as it. if (InstDep.isDef() && hasMemoryWrite(InstDep.getInst())) { Instruction *DepStore = InstDep.getInst(); - if (isStoreAtLeastAsWideAs(Inst, DepStore, TD) && isElidable(DepStore)) { - // Delete the store and now-dead instructions that feed it. - DeleteDeadInstruction(DepStore); - ++NumFastStores; - MadeChange = true; - - // DeleteDeadInstruction can delete the current instruction in loop - // cases, reset BBI. - BBI = Inst; - if (BBI != BB.begin()) - --BBI; + if (!isRemovable(DepStore) || + !isStoreAtLeastAsWideAs(Inst, DepStore, TD)) continue; - } + + // Delete the store and now-dead instructions that feed it. + DeleteDeadInstruction(DepStore); + ++NumFastStores; + MadeChange = true; + + // DeleteDeadInstruction can delete the current instruction in loop + // cases, reset BBI. + BBI = Inst; + if (BBI != BB.begin()) + --BBI; + continue; } } @@ -301,7 +303,7 @@ if (Dep.isNonLocal()) return false; Instruction *Dependency = Dep.getInst(); - if (!hasMemoryWrite(Dependency) || !isElidable(Dependency)) + if (!hasMemoryWrite(Dependency) || !isRemovable(Dependency)) return false; Value *DepPointer = getPointerOperand(Dependency)->getUnderlyingObject(); @@ -359,7 +361,7 @@ // If we find a store whose pointer is dead. if (hasMemoryWrite(BBI)) { - if (isElidable(BBI)) { + if (isRemovable(BBI)) { // See through pointer-to-pointer bitcasts Value *pointerOperand = getPointerOperand(BBI)->getUnderlyingObject(); From andersca at mac.com Mon Nov 29 23:59:26 2010 From: andersca at mac.com (Anders Carlsson) Date: Tue, 30 Nov 2010 05:59:26 -0000 Subject: [llvm-commits] [llvm] r120393 - in /llvm/trunk/test/Transforms/SimplifyLibCalls: FPuts.ll Puts.ll Message-ID: <20101130055926.AD8C02A6C12D@llvm.org> Author: andersca Date: Mon Nov 29 23:59:26 2010 New Revision: 120393 URL: http://llvm.org/viewvc/llvm-project?rev=120393&view=rev Log: Rename this test to FPuts.ll since it actually tests fputs. Added: llvm/trunk/test/Transforms/SimplifyLibCalls/FPuts.ll - copied unchanged from r120387, llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll Removed: llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll Removed: llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll?rev=120392&view=auto ============================================================================== --- llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll (original) +++ llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll (removed) @@ -1,29 +0,0 @@ -; Test that the PutsCatOptimizer works correctly -; RUN: opt < %s -simplify-libcalls -S | \ -; RUN: not grep {call.*fputs} - -; This transformation requires the pointer size, as it assumes that size_t is -; the size of a pointer. -target datalayout = "-p:64:64:64" - - %struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i32, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i32, [52 x i8] } - %struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } - at stdout = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=1] - at empty = constant [1 x i8] zeroinitializer ; <[1 x i8]*> [#uses=1] - at len1 = constant [2 x i8] c"A\00" ; <[2 x i8]*> [#uses=1] - at long = constant [7 x i8] c"hello\0A\00" ; <[7 x i8]*> [#uses=1] - -declare i32 @fputs(i8*, %struct._IO_FILE*) - -define i32 @main() { -entry: - %out = load %struct._IO_FILE** @stdout ; <%struct._IO_FILE*> [#uses=3] - %s1 = getelementptr [1 x i8]* @empty, i32 0, i32 0 ; [#uses=1] - %s2 = getelementptr [2 x i8]* @len1, i32 0, i32 0 ; [#uses=1] - %s3 = getelementptr [7 x i8]* @long, i32 0, i32 0 ; [#uses=1] - %a = call i32 @fputs( i8* %s1, %struct._IO_FILE* %out ) ; [#uses=0] - %b = call i32 @fputs( i8* %s2, %struct._IO_FILE* %out ) ; [#uses=0] - %c = call i32 @fputs( i8* %s3, %struct._IO_FILE* %out ) ; [#uses=0] - ret i32 0 -} - From andersca at mac.com Tue Nov 30 00:03:55 2010 From: andersca at mac.com (Anders Carlsson) Date: Tue, 30 Nov 2010 06:03:55 -0000 Subject: [llvm-commits] [llvm] r120394 - /llvm/trunk/test/Transforms/SimplifyLibCalls/FPuts.ll Message-ID: <20101130060355.42F6C2A6C12D@llvm.org> Author: andersca Date: Tue Nov 30 00:03:55 2010 New Revision: 120394 URL: http://llvm.org/viewvc/llvm-project?rev=120394&view=rev Log: Fix a typo. Modified: llvm/trunk/test/Transforms/SimplifyLibCalls/FPuts.ll Modified: llvm/trunk/test/Transforms/SimplifyLibCalls/FPuts.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyLibCalls/FPuts.ll?rev=120394&r1=120393&r2=120394&view=diff ============================================================================== --- llvm/trunk/test/Transforms/SimplifyLibCalls/FPuts.ll (original) +++ llvm/trunk/test/Transforms/SimplifyLibCalls/FPuts.ll Tue Nov 30 00:03:55 2010 @@ -1,4 +1,4 @@ -; Test that the PutsCatOptimizer works correctly +; Test that the FPutsOptimizer works correctly ; RUN: opt < %s -simplify-libcalls -S | \ ; RUN: not grep {call.*fputs} From andersca at mac.com Tue Nov 30 00:19:18 2010 From: andersca at mac.com (Anders Carlsson) Date: Tue, 30 Nov 2010 06:19:18 -0000 Subject: [llvm-commits] [llvm] r120398 - in /llvm/trunk: lib/Transforms/Scalar/SimplifyLibCalls.cpp test/Transforms/SimplifyLibCalls/Puts.ll Message-ID: <20101130061918.3280A2A6C12D@llvm.org> Author: andersca Date: Tue Nov 30 00:19:18 2010 New Revision: 120398 URL: http://llvm.org/viewvc/llvm-project?rev=120398&view=rev Log: Add a puts optimization that converts puts() to putchar('\n'). Added: llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll Modified: llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp Modified: llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp?rev=120398&r1=120397&r2=120398&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/SimplifyLibCalls.cpp Tue Nov 30 00:19:18 2010 @@ -1345,6 +1345,34 @@ } }; +//===---------------------------------------===// +// 'puts' Optimizations + +struct PutsOpt : public LibCallOptimization { + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { + // Require one fixed pointer argument and an integer/void result. + const FunctionType *FT = Callee->getFunctionType(); + if (FT->getNumParams() < 1 || !FT->getParamType(0)->isPointerTy() || + !(FT->getReturnType()->isIntegerTy() || + FT->getReturnType()->isVoidTy())) + return 0; + + // Check for a constant string. + std::string Str; + if (!GetConstantStringInfo(CI->getArgOperand(0), Str)) + return 0; + + if (Str.empty()) { + // puts("") -> putchar('\n') + Value *Res = EmitPutChar(B.getInt32('\n'), B, TD); + if (CI->use_empty()) return CI; + return B.CreateIntCast(Res, CI->getType(), true); + } + + return 0; + } +}; + } // end anonymous namespace. //===----------------------------------------------------------------------===// @@ -1370,6 +1398,7 @@ // Formatting and IO Optimizations SPrintFOpt SPrintF; PrintFOpt PrintF; FWriteOpt FWrite; FPutsOpt FPuts; FPrintFOpt FPrintF; + PutsOpt Puts; bool Modified; // This is only used by doInitialization. public: @@ -1484,6 +1513,7 @@ Optimizations["fwrite"] = &FWrite; Optimizations["fputs"] = &FPuts; Optimizations["fprintf"] = &FPrintF; + Optimizations["puts"] = &Puts; } @@ -2298,9 +2328,6 @@ // * pow(sqrt(x),y) -> pow(x,y*0.5) // * pow(pow(x,y),z)-> pow(x,y*z) // -// puts: -// * puts("") -> putchar('\n') -// // round, roundf, roundl: // * round(cnst) -> cnst' // Added: llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll?rev=120398&view=auto ============================================================================== --- llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll (added) +++ llvm/trunk/test/Transforms/SimplifyLibCalls/Puts.ll Tue Nov 30 00:19:18 2010 @@ -0,0 +1,15 @@ +; Test that the PutsOptimizer works correctly +; RUN: opt < %s -simplify-libcalls -S | FileCheck %s + +target datalayout = "-p:64:64:64" + + at .str = private constant [1 x i8] zeroinitializer + +declare i32 @puts(i8*) + +define void @foo() { +entry: +; CHECK: call i32 @putchar(i32 10) + %call = call i32 @puts(i8* getelementptr inbounds ([1 x i8]* @.str, i32 0, i32 0)) + ret void +} From aggarwa4 at illinois.edu Tue Nov 30 00:33:55 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Tue, 30 Nov 2010 06:33:55 -0000 Subject: [llvm-commits] [poolalloc] r120399 - /poolalloc/trunk/test/dsa/callgraph/merge.ll Message-ID: <20101130063355.A84812A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 00:33:55 2010 New Revision: 120399 URL: http://llvm.org/viewvc/llvm-project?rev=120399&view=rev Log: MOdified test case, to make sure that all functions in the SCC are found in the call graph. Modified: poolalloc/trunk/test/dsa/callgraph/merge.ll Modified: poolalloc/trunk/test/dsa/callgraph/merge.ll URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/test/dsa/callgraph/merge.ll?rev=120399&r1=120398&r2=120399&view=diff ============================================================================== --- poolalloc/trunk/test/dsa/callgraph/merge.ll (original) +++ poolalloc/trunk/test/dsa/callgraph/merge.ll Tue Nov 30 00:33:55 2010 @@ -1,4 +1,4 @@ -;RUN: dsaopt %s -dsa-cbu -analyze -check-callees=E,B,D +;RUN: dsaopt %s -dsa-cbu -analyze -check-callees=E,B,D,A ; ModuleID = 'merge.o' target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" target triple = "x86_64-unknown-linux-gnu" From aggarwa4 at illinois.edu Tue Nov 30 00:36:48 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Tue, 30 Nov 2010 06:36:48 -0000 Subject: [llvm-commits] [poolalloc] r120400 - in /poolalloc/trunk: include/dsa/DataStructure.h lib/DSA/BottomUpClosure.cpp lib/DSA/DataStructure.cpp lib/DSA/TopDownClosure.cpp Message-ID: <20101130063648.6543A2A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 00:36:48 2010 New Revision: 120400 URL: http://llvm.org/viewvc/llvm-project?rev=120400&view=rev Log: Move cloneIntoGlobals and cloneGlobalsInto to DataStructures instead of BUDataStructures, so as to reduce code duplication in TD. Also, this allows us to use these functions for updating the graphs in all pases. Modified: poolalloc/trunk/include/dsa/DataStructure.h poolalloc/trunk/lib/DSA/BottomUpClosure.cpp poolalloc/trunk/lib/DSA/DataStructure.cpp poolalloc/trunk/lib/DSA/TopDownClosure.cpp Modified: poolalloc/trunk/include/dsa/DataStructure.h URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/dsa/DataStructure.h?rev=120400&r1=120399&r2=120400&view=diff ============================================================================== --- poolalloc/trunk/include/dsa/DataStructure.h (original) +++ poolalloc/trunk/include/dsa/DataStructure.h Tue Nov 30 00:36:48 2010 @@ -88,6 +88,9 @@ void init(TargetData* T); void formGlobalECs(); + + void cloneIntoGlobals(DSGraph* G); + void cloneGlobalsInto(DSGraph* G); void restoreCorrectCallGraph(); @@ -219,9 +222,6 @@ EntryPointAnalysis* EP; - void cloneIntoGlobals(DSGraph* G); - void cloneGlobalsInto(DSGraph* G); - // filterCallees -- Whether or not we filter out illegal callees // from the CallGraph. This is useful while doing original BU, // but might be undesirable in other passes such as CBU/EQBU. Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/BottomUpClosure.cpp?rev=120400&r1=120399&r2=120400&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/BottomUpClosure.cpp (original) +++ poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Tue Nov 30 00:36:48 2010 @@ -45,7 +45,7 @@ // bool BUDataStructures::runOnModule(Module &M) { init(&getAnalysis(), false, true, false, false ); - EP = &getAnalysis(); + //EP = &getAnalysis(); return runOnModuleInternal(M); } @@ -82,10 +82,12 @@ // postOrderInline (M); - +#if 0 + //DSA does not use entryPoint analysis std::vector EntryPoints; EP = &getAnalysis(); EP->findEntryPoints(M, EntryPoints); +#endif // At the end of the bottom-up pass, the globals graph becomes complete. // FIXME: This is not the right way to do this, but it is sorta better than @@ -674,37 +676,3 @@ } -//For Entry Points -void BUDataStructures::cloneGlobalsInto(DSGraph* Graph) { - // If this graph contains main, copy the contents of the globals graph over. - // Note that this is *required* for correctness. If a callee contains a use - // of a global, we have to make sure to link up nodes due to global-argument - // bindings. - const DSGraph* GG = Graph->getGlobalsGraph(); - ReachabilityCloner RC(Graph, GG, - DSGraph::DontCloneCallNodes | - DSGraph::DontCloneAuxCallNodes); - - // Clone the global nodes into this graph. - for (DSScalarMap::global_iterator I = Graph->getScalarMap().global_begin(), - E = Graph->getScalarMap().global_end(); I != E; ++I) - RC.getClonedNH(GG->getNodeForValue(*I)); -} - -//For all graphs -void BUDataStructures::cloneIntoGlobals(DSGraph* Graph) { - // When this graph is finalized, clone the globals in the graph into the - // globals graph to make sure it has everything, from all graphs. - DSScalarMap &MainSM = Graph->getScalarMap(); - ReachabilityCloner RC(GlobalsGraph, Graph, - DSGraph::DontCloneCallNodes | - DSGraph::DontCloneAuxCallNodes | - DSGraph::StripAllocaBit); - - // Clone everything reachable from globals in the function graph into the - // globals graph. - for (DSScalarMap::global_iterator I = MainSM.global_begin(), - E = MainSM.global_end(); I != E; ++I) - RC.getClonedNH(MainSM[*I]); -} - Modified: poolalloc/trunk/lib/DSA/DataStructure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/DataStructure.cpp?rev=120400&r1=120399&r2=120400&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/DataStructure.cpp (original) +++ poolalloc/trunk/lib/DSA/DataStructure.cpp Tue Nov 30 00:36:48 2010 @@ -1484,6 +1484,41 @@ DEBUG(if(MadeChange) G.AssertGraphOK()); } +//For Entry Points +void DataStructures::cloneGlobalsInto(DSGraph* Graph) { + // If this graph contains main, copy the contents of the globals graph over. + // Note that this is *required* for correctness. If a callee contains a use + // of a global, we have to make sure to link up nodes due to global-argument + // bindings. + const DSGraph* GG = Graph->getGlobalsGraph(); + ReachabilityCloner RC(Graph, GG, + DSGraph::DontCloneCallNodes | + DSGraph::DontCloneAuxCallNodes); + + // Clone the global nodes into this graph. + for (DSScalarMap::global_iterator I = Graph->getScalarMap().global_begin(), + E = Graph->getScalarMap().global_end(); I != E; ++I) + RC.getClonedNH(GG->getNodeForValue(*I)); +} + +//For all graphs +void DataStructures::cloneIntoGlobals(DSGraph* Graph) { + // When this graph is finalized, clone the globals in the graph into the + // globals graph to make sure it has everything, from all graphs. + DSScalarMap &MainSM = Graph->getScalarMap(); + ReachabilityCloner RC(GlobalsGraph, Graph, + DSGraph::DontCloneCallNodes | + DSGraph::DontCloneAuxCallNodes | + DSGraph::StripAllocaBit); + + // Clone everything reachable from globals in the function graph into the + // globals graph. + for (DSScalarMap::global_iterator I = MainSM.global_begin(), + E = MainSM.global_end(); I != E; ++I) + RC.getClonedNH(MainSM[*I]); +} + + void DataStructures::init(DataStructures* D, bool clone, bool useAuxCalls, bool copyGlobalAuxCalls, bool resetAux) { assert (!GraphSource && "Already init"); Modified: poolalloc/trunk/lib/DSA/TopDownClosure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/TopDownClosure.cpp?rev=120400&r1=120399&r2=120400&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/TopDownClosure.cpp (original) +++ poolalloc/trunk/lib/DSA/TopDownClosure.cpp Tue Nov 30 00:36:48 2010 @@ -173,14 +173,7 @@ if (!(F->isDeclaration())){ DSGraph *Graph = getOrCreateGraph(F); - ReachabilityCloner RC(Graph, GlobalsGraph, - DSGraph::DontCloneCallNodes | - DSGraph::DontCloneAuxCallNodes); - for (DSScalarMap::global_iterator - GI = Graph->getScalarMap().global_begin(), - E = Graph->getScalarMap().global_end(); GI != E; ++GI) - RC.getClonedNH(GlobalsGraph->getNodeForValue(*GI)); - + cloneGlobalsInto(Graph); // Clean up uninteresting nodes Graph->removeDeadNodes(0); @@ -236,16 +229,7 @@ // then having RemoveDeadNodes clone it back, we should do all of this as a // post-pass over all of the graphs. We need to take cloning out of // removeDeadNodes and gut removeDeadNodes at the same time first though. :( - { - DSGraph* GG = DSG->getGlobalsGraph(); - ReachabilityCloner RC(DSG, GG, - DSGraph::DontCloneCallNodes | - DSGraph::DontCloneAuxCallNodes); - for (DSScalarMap::global_iterator - GI = DSG->getScalarMap().global_begin(), - E = DSG->getScalarMap().global_end(); GI != E; ++GI) - RC.getClonedNH(GG->getNodeForValue(*GI)); - } + cloneGlobalsInto(DSG); DEBUG(errs() << "[TD] Inlining callers into '" << DSG->getFunctionNames() << "'\n"); From aggarwa4 at illinois.edu Tue Nov 30 01:01:33 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Tue, 30 Nov 2010 07:01:33 -0000 Subject: [llvm-commits] [poolalloc] r120403 - /poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp Message-ID: <20101130070133.A3F562A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 01:01:33 2010 New Revision: 120403 URL: http://llvm.org/viewvc/llvm-project?rev=120403&view=rev Log: Only merge information back from Globals. This is part of changes, to make the globalsGraph interactions clean and consistent. Modified: poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp Modified: poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp?rev=120403&r1=120402&r2=120403&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp (original) +++ poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp Tue Nov 30 01:01:33 2010 @@ -57,16 +57,8 @@ buildIndirectFunctionSets(); formGlobalECs(); - // - // Propagate information from the local graphs to the globals graphs. - // - for (Module::iterator F = M.begin(); F != M.end(); ++F) { - if (!(F->isDeclaration())) { - if (DSGraph * Graph = getOrCreateGraph(F)) { - cloneIntoGlobals (Graph); - } - } - } + + for (Module::iterator F = M.begin(); F != M.end(); ++F) { if (!(F->isDeclaration())) { From echristo at apple.com Tue Nov 30 01:20:12 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 07:20:12 -0000 Subject: [llvm-commits] [llvm] r120404 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h lib/Target/X86/X86InstrSSE.td test/CodeGen/X86/apm.ll Message-ID: <20101130072013.1E4622A6C12D@llvm.org> Author: echristo Date: Tue Nov 30 01:20:12 2010 New Revision: 120404 URL: http://llvm.org/viewvc/llvm-project?rev=120404&view=rev Log: Rewrite mwait and monitor support and custom lower arguments. Fixes PR8573. Added: llvm/trunk/test/CodeGen/X86/apm.ll Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp llvm/trunk/lib/Target/X86/X86ISelLowering.h llvm/trunk/lib/Target/X86/X86InstrSSE.td Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=120404&r1=120403&r2=120404&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Nov 30 01:20:12 2010 @@ -9444,6 +9444,53 @@ } MachineBasicBlock * +X86TargetLowering::EmitMonitor(MachineInstr *MI, MachineBasicBlock *BB) const { + assert((Subtarget->hasSSE3()) && "Target must have SSE3 features enabled"); + + DebugLoc dl = MI->getDebugLoc(); + const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); + + // Address into RAX/EAX, other two args into ECX, EDX. + unsigned MemOpc = Subtarget->is64Bit() ? X86::LEA64r : X86::LEA32r; + unsigned MemReg = Subtarget->is64Bit() ? X86::RAX : X86::EAX; + MachineInstrBuilder MIB = BuildMI(*BB, MI, dl, TII->get(MemOpc), MemReg); + for (int i = 0; i < X86::AddrNumOperands; ++i) + (*MIB).addOperand(MI->getOperand(i)); + + unsigned ValOps = X86::AddrNumOperands; + BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::ECX) + .addReg(MI->getOperand(ValOps).getReg()); + BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::EDX) + .addReg(MI->getOperand(ValOps+1).getReg()); + + // The instruction doesn't actually take any operands though. + BuildMI(*BB, MI, dl, TII->get(X86::MONITORrrr)); + + MI->eraseFromParent(); // The pseudo is gone now. + return BB; +} + +MachineBasicBlock * +X86TargetLowering::EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const { + assert((Subtarget->hasSSE3()) && "Target must have SSE3 features enabled"); + + DebugLoc dl = MI->getDebugLoc(); + const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); + + // First arg in ECX, the second in EAX. + BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::ECX) + .addReg(MI->getOperand(0).getReg()); + BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::EAX) + .addReg(MI->getOperand(1).getReg()); + + // The instruction doesn't actually take any operands though. + BuildMI(*BB, MI, dl, TII->get(X86::MWAITrr)); + + MI->eraseFromParent(); // The pseudo is gone now. + return BB; +} + +MachineBasicBlock * X86TargetLowering::EmitVAARG64WithCustomInserter( MachineInstr *MI, MachineBasicBlock *MBB) const { @@ -10042,6 +10089,12 @@ case X86::VPCMPESTRM128MEM: return EmitPCMP(MI, BB, 5, true /* in mem */); + // Thread synchronization. + case X86::MONITOR: + return EmitMonitor(MI, BB); + case X86::MWAIT: + return EmitMwait(MI, BB); + // Atomic Lowering. case X86::ATOMAND32: return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr, Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=120404&r1=120403&r2=120404&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.h (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Tue Nov 30 01:20:12 2010 @@ -821,6 +821,13 @@ MachineBasicBlock *EmitPCMP(MachineInstr *BInstr, MachineBasicBlock *BB, unsigned argNum, bool inMem) const; + /// Utility functions to emit monitor and mwait instructions. These + /// need to make sure that the arguments to the intrinsic are in the + /// correct registers. + MachineBasicBlock *EmitMonitor(MachineInstr *MI, MachineBasicBlock *BB) + const; + MachineBasicBlock *EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const; + /// Utility function to emit atomic bitwise operations (and, or, xor). /// It takes the bitwise instruction to expand, the associated machine basic /// block, and the associated X86 opcodes for reg/reg and reg/imm. Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=120404&r1=120403&r2=120404&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Tue Nov 30 01:20:12 2010 @@ -3640,10 +3640,21 @@ //===---------------------------------------------------------------------===// // Thread synchronization -def MONITOR : I<0x01, MRM_C8, (outs), (ins), "monitor", - [(int_x86_sse3_monitor EAX, ECX, EDX)]>,TB, Requires<[HasSSE3]>; -def MWAIT : I<0x01, MRM_C9, (outs), (ins), "mwait", - [(int_x86_sse3_mwait ECX, EAX)]>, TB, Requires<[HasSSE3]>; +let usesCustomInserter = 1 in { +def MONITOR : I<0, Pseudo, (outs), (ins i32mem:$src1, GR32:$src2, GR32:$src3), + "# MONITORrrr PSUEDO", + [(int_x86_sse3_monitor addr:$src1, GR32:$src2, GR32:$src3)]>; +def MWAIT : I<0, Pseudo, (outs), (ins GR32:$src1, GR32:$src2), + "# MWAITrr PSEUDO", + [(int_x86_sse3_mwait GR32:$src1, GR32:$src2)]>; +} + +let Uses = [EAX, ECX, EDX] in +def MONITORrrr : I<0x01, MRM_C8, (outs), (ins), "monitor", []>, TB, + Requires<[HasSSE3]>; +let Uses = [ECX, EAX] in +def MWAITrr : I<0x01, MRM_C9, (outs), (ins), "mwait", []>, TB, + Requires<[HasSSE3]>; //===---------------------------------------------------------------------===// // Non-Instruction Patterns Added: llvm/trunk/test/CodeGen/X86/apm.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/apm.ll?rev=120404&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/apm.ll (added) +++ llvm/trunk/test/CodeGen/X86/apm.ll Tue Nov 30 01:20:12 2010 @@ -0,0 +1,26 @@ +; RUN: llc < %s -o - -march=x86-64 | FileCheck %s +; PR8573 + +; CHECK: _foo: +; CHECK: leaq (%rdi), %rax +; CHECK-NEXT: movl %esi, %ecx +; CHECK-NEXT: monitor +define void @foo(i8* %P, i32 %E, i32 %H) nounwind { +entry: + tail call void @llvm.x86.sse3.monitor(i8* %P, i32 %E, i32 %H) + ret void +} + +declare void @llvm.x86.sse3.monitor(i8*, i32, i32) nounwind + +; CHECK: _bar: +; CHECK: movl %edi, %ecx +; CHECK-NEXT: movl %esi, %eax +; CHECK-NEXT: mwait +define void @bar(i32 %E, i32 %H) nounwind { +entry: + tail call void @llvm.x86.sse3.mwait(i32 %E, i32 %H) + ret void +} + +declare void @llvm.x86.sse3.mwait(i32, i32) nounwind From sabre at nondot.org Tue Nov 30 01:20:51 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 07:20:51 -0000 Subject: [llvm-commits] [llvm] r120405 - /llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Message-ID: <20101130072051.2AFEB2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 01:20:51 2010 New Revision: 120405 URL: http://llvm.org/viewvc/llvm-project?rev=120405&view=rev Log: death to extraneous \n's. Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Modified: llvm/trunk/include/llvm/Analysis/AliasAnalysis.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AliasAnalysis.h?rev=120405&r1=120404&r2=120405&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/AliasAnalysis.h (original) +++ llvm/trunk/include/llvm/Analysis/AliasAnalysis.h Tue Nov 30 01:20:51 2010 @@ -108,8 +108,7 @@ /// the location, or null if there is no known unique tag. const MDNode *TBAATag; - explicit Location(const Value *P = 0, - uint64_t S = UnknownSize, + explicit Location(const Value *P = 0, uint64_t S = UnknownSize, const MDNode *N = 0) : Ptr(P), Size(S), TBAATag(N) {} From sabre at nondot.org Tue Nov 30 01:23:21 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 07:23:21 -0000 Subject: [llvm-commits] [llvm] r120406 - in /llvm/trunk: include/llvm/Analysis/MemoryDependenceAnalysis.h lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/simple.ll Message-ID: <20101130072321.A58392A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 01:23:21 2010 New Revision: 120406 URL: http://llvm.org/viewvc/llvm-project?rev=120406&view=rev Log: Rewrite the main DSE loop to be written in terms of reasoning about pairs of AA::Location's instead of looking for MemDep's "Def" predicate. This is more powerful and general, handling memset/memcpy/store all uniformly, and implementing PR8701 and probably obsoleting parts of memcpyoptimizer. This also fixes an obscure bug with init.trampoline and i8 stores, but I'm not surprised it hasn't been hit yet. Enhancing init.trampoline to carry the size that it stores would allow DSE to be much more aggressive about optimizing them. Modified: llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Modified: llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h?rev=120406&r1=120405&r2=120406&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h (original) +++ llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h Tue Nov 30 01:23:21 2010 @@ -47,6 +47,9 @@ /// pair holds the instruction that clobbers the memory. For example, /// this occurs when we see a may-aliased store to the memory location we /// care about. + /// + /// A dependence query on the first instruction of the entry block will + /// return a clobber(self) result. Clobber, /// Def - This is a dependence on the specified instruction which Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120406&r1=120405&r2=120406&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 01:23:21 2010 @@ -111,6 +111,44 @@ return false; } +/// getLocForWrite - Return a Location stored to by the specified instruction. +static AliasAnalysis::Location +getLocForWrite(Instruction *Inst, AliasAnalysis &AA) { + if (StoreInst *SI = dyn_cast(Inst)) + return AA.getLocation(SI); + + if (MemIntrinsic *MI = dyn_cast(Inst)) { + // memcpy/memmove/memset. + AliasAnalysis::Location Loc = AA.getLocationForDest(MI); + // If we don't have target data around, an unknown size in Location means + // that we should use the size of the pointee type. This isn't valid for + // memset/memcpy, which writes more than an i8. + if (Loc.Size == AliasAnalysis::UnknownSize && AA.getTargetData() == 0) + return AliasAnalysis::Location(); + return Loc; + } + + IntrinsicInst *II = dyn_cast(Inst); + if (II == 0) return AliasAnalysis::Location(); + + switch (II->getIntrinsicID()) { + default: return AliasAnalysis::Location(); // Unhandled intrinsic. + case Intrinsic::init_trampoline: + // If we don't have target data around, an unknown size in Location means + // that we should use the size of the pointee type. This isn't valid for + // init.trampoline, which writes more than an i8. + if (AA.getTargetData() == 0) return AliasAnalysis::Location(); + + // FIXME: We don't know the size of the trampoline, so we can't really + // handle it here. + return AliasAnalysis::Location(II->getArgOperand(0)); + case Intrinsic::lifetime_end: { + uint64_t Len = cast(II->getArgOperand(0))->getZExtValue(); + return AliasAnalysis::Location(II->getArgOperand(1), Len); + } + } +} + /// isRemovable - If the value of this instruction and the memory it writes to /// is unused, may we delete this instruction? static bool isRemovable(Instruction *I) { @@ -140,56 +178,32 @@ } } -/// getStoreSize - Return the length in bytes of the write by the clobbering -/// instruction. If variable or unknown, returns AliasAnalysis::UnknownSize. -static uint64_t getStoreSize(Instruction *I, const TargetData *TD) { - assert(hasMemoryWrite(I)); - if (StoreInst *SI = dyn_cast(I)) { - if (!TD) return AliasAnalysis::UnknownSize; - return TD->getTypeStoreSize(SI->getOperand(0)->getType()); - } - - Value *Len; - if (MemIntrinsic *MI = dyn_cast(I)) { - Len = MI->getLength(); - } else { - IntrinsicInst *II = cast(I); - switch (II->getIntrinsicID()) { - default: assert(false && "Unexpected intrinsic!"); - case Intrinsic::init_trampoline: - return AliasAnalysis::UnknownSize; - case Intrinsic::lifetime_end: - Len = II->getArgOperand(0); - break; - } - } - if (ConstantInt *LenCI = dyn_cast(Len)) - if (!LenCI->isAllOnesValue()) - return LenCI->getZExtValue(); - return AliasAnalysis::UnknownSize; -} +/// isCompleteOverwrite - Return true if a store to the 'Later' location +/// completely overwrites a store to the 'Earlier' location. +static bool isCompleteOverwrite(const AliasAnalysis::Location &Later, + const AliasAnalysis::Location &Earlier, + AliasAnalysis &AA, const TargetData *TD) { + const Value *P1 = Later.Ptr->stripPointerCasts(); + const Value *P2 = Earlier.Ptr->stripPointerCasts(); + + // Make sure that the start pointers are the same. + if (P1 != P2) + return false; -/// isStoreAtLeastAsWideAs - Return true if the size of the store in I1 is -/// greater than or equal to the store in I2. This returns false if we don't -/// know. -/// -static bool isStoreAtLeastAsWideAs(Instruction *I1, Instruction *I2, - const TargetData *TD) { - const Type *I1Ty = getPointerOperand(I1)->getType(); - const Type *I2Ty = getPointerOperand(I2)->getType(); - - // Exactly the same type, must have exactly the same size. - if (I1Ty == I2Ty) return true; - - uint64_t I1Size = getStoreSize(I1, TD); - uint64_t I2Size = getStoreSize(I2, TD); - - return I1Size != AliasAnalysis::UnknownSize && - I2Size != AliasAnalysis::UnknownSize && - I1Size >= I2Size; + // If we have no TargetData information around, then the size of the store is + // inferrable from the pointee type. If they are the same type, then we know + // that the store is safe. + if (TD == 0) + return Later.Ptr->getType() == Earlier.Ptr->getType(); + + + // Make sure that the Later size is >= the Earlier size. + if (Later.Size < Earlier.Size) + return false; + + return true; } - bool DSE::runOnBasicBlock(BasicBlock &BB) { MemoryDependenceAnalysis &MD = getAnalysis(); AliasAnalysis &AA = getAnalysis(); @@ -215,7 +229,11 @@ // Ignore non-local store liveness. // FIXME: cross-block DSE would be fun. :) - if (InstDep.isNonLocal()) continue; + if (InstDep.isNonLocal() || + // Ignore self dependence, which happens in the entry block of the + // function. + InstDep.getInst() == Inst) + continue; // If we're storing the same value back to a pointer that we just // loaded from, then the store can be removed. @@ -240,7 +258,43 @@ } } - if (!InstDep.isDef()) { + // Figure out what location is being stored to. + AliasAnalysis::Location Loc = getLocForWrite(Inst, AA); + + // If we didn't get a useful location, fail. + if (Loc.Ptr == 0) + continue; + + while (!InstDep.isNonLocal()) { + // Get the memory clobbered by the instruction we depend on. MemDep will + // skip any instructions that 'Loc' clearly doesn't interact with. If we + // end up depending on a may- or must-aliased load, then we can't optimize + // away the store and we bail out. However, if we depend on on something + // that overwrites the memory location we *can* potentially optimize it. + // + // Find out what memory location the dependant instruction stores. + Instruction *DepWrite = InstDep.getInst(); + AliasAnalysis::Location DepLoc = getLocForWrite(DepWrite, AA); + // If we didn't get a useful location, or if it isn't a size, bail out. + if (DepLoc.Ptr == 0) + break; + + // If we find a removable write that is completely obliterated by the + // store to 'Loc' then we can remove it. + if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, AA, TD)) { + // Delete the store and now-dead instructions that feed it. + DeleteDeadInstruction(DepWrite); + ++NumFastStores; + MadeChange = true; + + // DeleteDeadInstruction can delete the current instruction in loop + // cases, reset BBI. + BBI = Inst; + if (BBI != BB.begin()) + --BBI; + break; + } + // If this is a may-aliased store that is clobbering the store value, we // can keep searching past it for another must-aliased pointer that stores // to the same location. For example, in: @@ -249,38 +303,13 @@ // store -> P // we can remove the first store to P even though we don't know if P and Q // alias. - if (StoreInst *SI = dyn_cast(Inst)) { - AliasAnalysis::Location Loc = AA.getLocation(SI); - while (InstDep.isClobber() && InstDep.getInst() != &BB.front()) { - // Can't look past this instruction if it might read 'Loc'. - if (AA.getModRefInfo(InstDep.getInst(), Loc) & AliasAnalysis::Ref) - break; - - InstDep = MD.getPointerDependencyFrom(Loc, false, - InstDep.getInst(), &BB); - } - } - } - - // If this is a store-store dependence, then the previous store is dead so - // long as this store is at least as big as it. - if (InstDep.isDef() && hasMemoryWrite(InstDep.getInst())) { - Instruction *DepStore = InstDep.getInst(); - if (!isRemovable(DepStore) || - !isStoreAtLeastAsWideAs(Inst, DepStore, TD)) - continue; + if (DepWrite == &BB.front()) break; + + // Can't look past this instruction if it might read 'Loc'. + if (AA.getModRefInfo(DepWrite, Loc) & AliasAnalysis::Ref) + break; - // Delete the store and now-dead instructions that feed it. - DeleteDeadInstruction(DepStore); - ++NumFastStores; - MadeChange = true; - - // DeleteDeadInstruction can delete the current instruction in loop - // cases, reset BBI. - BBI = Inst; - if (BBI != BB.begin()) - --BBI; - continue; + InstDep = MD.getPointerDependencyFrom(Loc, false, DepWrite, &BB); } } Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120406&r1=120405&r2=120406&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Tue Nov 30 01:23:21 2010 @@ -177,3 +177,36 @@ ; CHECK-NEXT: ret void } + +; PR8701 + +;; Fully dead overwrite of memcpy. +define void @test15(i8* %P, i8* %Q) nounwind ssp { + tail call void @llvm.memcpy.i64(i8* %P, i8* %Q, i64 12, i32 1) + tail call void @llvm.memcpy.i64(i8* %P, i8* %Q, i64 12, i32 1) + ret void +; CHECK: @test15 +; CHECK-NEXT: call void @llvm.memcpy +; CHECK-NEXT: ret +} + +;; Full overwrite of smaller memcpy. +define void @test16(i8* %P, i8* %Q) nounwind ssp { + tail call void @llvm.memcpy.i64(i8* %P, i8* %Q, i64 8, i32 1) + tail call void @llvm.memcpy.i64(i8* %P, i8* %Q, i64 12, i32 1) + ret void +; CHECK: @test16 +; CHECK-NEXT: call void @llvm.memcpy +; CHECK-NEXT: ret +} + +;; Overwrite of memset by memcpy. +define void @test17(i8* %P, i8* %Q) nounwind ssp { + tail call void @llvm.memset.i64(i8* %P, i8 42, i64 8, i32 1) + tail call void @llvm.memcpy.i64(i8* %P, i8* %Q, i64 12, i32 1) + ret void +; CHECK: @test17 +; CHECK-NEXT: call void @llvm.memcpy +; CHECK-NEXT: ret +} + From clattner at apple.com Tue Nov 30 01:29:57 2010 From: clattner at apple.com (Chris Lattner) Date: Mon, 29 Nov 2010 23:29:57 -0800 Subject: [llvm-commits] [llvm] r120404 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h lib/Target/X86/X86InstrSSE.td test/CodeGen/X86/apm.ll In-Reply-To: <20101130072013.1E4622A6C12D@llvm.org> References: <20101130072013.1E4622A6C12D@llvm.org> Message-ID: <95E528E1-FBD3-42B5-A705-C7DF0C2C0FB9@apple.com> On Nov 29, 2010, at 11:20 PM, Eric Christopher wrote: > URL: http://llvm.org/viewvc/llvm-project?rev=120404&view=rev > Log: > Rewrite mwait and monitor support and custom lower arguments. Cool! > + > + // Address into RAX/EAX, other two args into ECX, EDX. > + unsigned MemOpc = Subtarget->is64Bit() ? X86::LEA64r : X86::LEA32r; > + unsigned MemReg = Subtarget->is64Bit() ? X86::RAX : X86::EAX; > + MachineInstrBuilder MIB = BuildMI(*BB, MI, dl, TII->get(MemOpc), MemReg); > + for (int i = 0; i < X86::AddrNumOperands; ++i) > + (*MIB).addOperand(MI->getOperand(i)); Please use -> instead of (*x). > +MachineBasicBlock * > +X86TargetLowering::EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const { > + assert((Subtarget->hasSSE3()) && "Target must have SSE3 features enabled"); No need for the redundant parens here. > +++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Tue Nov 30 01:20:12 2010 > @@ -821,6 +821,13 @@ > MachineBasicBlock *EmitPCMP(MachineInstr *BInstr, MachineBasicBlock *BB, > unsigned argNum, bool inMem) const; > > + /// Utility functions to emit monitor and mwait instructions. These > + /// need to make sure that the arguments to the intrinsic are in the > + /// correct registers. > + MachineBasicBlock *EmitMonitor(MachineInstr *MI, MachineBasicBlock *BB) > + const; Minor and picky, but please wrap before 'MachineBasicBlock' so it isn't just a qualifier floating. > +let usesCustomInserter = 1 in { > +def MONITOR : I<0, Pseudo, (outs), (ins i32mem:$src1, GR32:$src2, GR32:$src3), > + "# MONITORrrr PSUEDO", > + [(int_x86_sse3_monitor addr:$src1, GR32:$src2, GR32:$src3)]>; > +def MWAIT : I<0, Pseudo, (outs), (ins GR32:$src1, GR32:$src2), > + "# MWAITrr PSEUDO", > + [(int_x86_sse3_mwait GR32:$src1, GR32:$src2)]>; Please use an empty asmstring to avoid bloating the asmprinter tables. Better yet, X86 should use a PseudoI<> class that does the right thing. Thanks for fixing this Eric! -Chris From clchiou at gmail.com Tue Nov 30 01:34:44 2010 From: clchiou at gmail.com (Che-Liang Chiou) Date: Tue, 30 Nov 2010 07:34:44 -0000 Subject: [llvm-commits] [llvm] r120407 - in /llvm/trunk/lib/Target/PTX: PTXAsmPrinter.cpp PTXISelDAGToDAG.cpp PTXInstrInfo.td Message-ID: <20101130073444.385922A6C12D@llvm.org> Author: clchiou Date: Tue Nov 30 01:34:44 2010 New Revision: 120407 URL: http://llvm.org/viewvc/llvm-project?rev=120407&view=rev Log: ptx: add ld instruction support register and register-immediate addressing mode todo: immediate and register-register addressing mode Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp llvm/trunk/lib/Target/PTX/PTXInstrInfo.td Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp?rev=120407&r1=120406&r2=120407&view=diff ============================================================================== --- llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Tue Nov 30 01:34:44 2010 @@ -49,6 +49,8 @@ virtual void EmitInstruction(const MachineInstr *MI); void printOperand(const MachineInstr *MI, int opNum, raw_ostream &OS); + void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &OS, + const char *Modifier = 0); // autogen'd. void printInstruction(const MachineInstr *MI, raw_ostream &OS); @@ -61,7 +63,7 @@ static const char PARAM_PREFIX[] = "__param_"; -static const char *getRegisterTypeName(unsigned RegNo){ +static const char *getRegisterTypeName(unsigned RegNo) { #define TEST_REGCLS(cls, clsstr) \ if (PTX::cls ## RegisterClass->contains(RegNo)) return # clsstr; TEST_REGCLS(RRegs32, s32); @@ -72,8 +74,7 @@ return NULL; } -static const char *getInstructionTypeName(const MachineInstr *MI) -{ +static const char *getInstructionTypeName(const MachineInstr *MI) { for (int i = 0, e = MI->getNumOperands(); i != e; ++i) { const MachineOperand &MO = MI->getOperand(i); if (MO.getType() == MachineOperand::MO_Register) @@ -119,13 +120,13 @@ // Replace "%type" if found StringRef strref = OS.str(); size_t pos; - if ((pos = strref.find("%type")) == StringRef::npos) { - OutStreamer.EmitRawText(strref); - return; + if ((pos = strref.find("%type")) != StringRef::npos) { + std::string str = strref; + str.replace(pos, /*strlen("%type")==*/5, getInstructionTypeName(MI)); + strref = StringRef(str); } - std::string str = strref; - str.replace(pos, /*strlen("%type")==*/5, getInstructionTypeName(MI)); - OutStreamer.EmitRawText(StringRef(str)); + + OutStreamer.EmitRawText(strref); } void PTXAsmPrinter::printOperand(const MachineInstr *MI, int opNum, @@ -145,6 +146,17 @@ } } +void PTXAsmPrinter::printMemOperand(const MachineInstr *MI, int opNum, + raw_ostream &OS, const char *Modifier) { + printOperand(MI, opNum, OS); + + if (MI->getOperand(opNum+1).isImm() && MI->getOperand(opNum+1).getImm() == 0) + return; // don't print "+0" + + OS << "+"; + printOperand(MI, opNum+1, OS); +} + void PTXAsmPrinter::EmitFunctionDeclaration() { // The function label could have already been emitted if two symbols end up // conflicting due to asm renaming. Detect this and emit an error. Modified: llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp?rev=120407&r1=120406&r2=120407&view=diff ============================================================================== --- llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp (original) +++ llvm/trunk/lib/Target/PTX/PTXISelDAGToDAG.cpp Tue Nov 30 01:34:44 2010 @@ -14,6 +14,7 @@ #include "PTX.h" #include "PTXTargetMachine.h" #include "llvm/CodeGen/SelectionDAGISel.h" +#include "llvm/DerivedTypes.h" using namespace llvm; @@ -30,9 +31,16 @@ SDNode *Select(SDNode *Node); + // Complex Pattern Selectors. + bool SelectADDRri(SDValue &Addr, SDValue &Base, SDValue &Offset); + bool SelectADDRii(SDValue &Addr, SDValue &Base, SDValue &Offset); + // Include the pieces auto'gened from the target description #include "PTXGenDAGISel.inc" + private: + bool isImm (const SDValue &operand); + bool SelectImm (const SDValue &operand, SDValue &imm); }; // class PTXDAGToDAGISel } // namespace @@ -51,3 +59,54 @@ // SelectCode() is auto'gened return SelectCode(Node); } + +// Match memory operand of the form [reg+reg] and [reg+imm] +bool PTXDAGToDAGISel::SelectADDRri(SDValue &Addr, SDValue &Base, + SDValue &Offset) { + if (Addr.getNumOperands() >= 2 && + isImm(Addr.getOperand(0)) && isImm(Addr.getOperand(1))) + return false; // let SelectADDRii handle the [imm+imm] case + + // try [reg+imm] and [imm+reg] + if (Addr.getOpcode() == ISD::ADD) + for (int i = 0; i < 2; i ++) + if (SelectImm(Addr.getOperand(1-i), Offset)) { + Base = Addr.getOperand(i); + return true; + } + + // okay, it's [reg+reg] + Base = Addr; + Offset = CurDAG->getTargetConstant(0, MVT::i32); + return true; +} + +// Match memory operand of the form [imm+imm] and [imm] +bool PTXDAGToDAGISel::SelectADDRii(SDValue &Addr, SDValue &Base, + SDValue &Offset) { + if (Addr.getOpcode() == ISD::ADD) { + return SelectImm(Addr.getOperand(0), Base) && + SelectImm(Addr.getOperand(1), Offset); + } + + if (SelectImm(Addr, Base)) { + Offset = CurDAG->getTargetConstant(0, MVT::i32); + return true; + } + + return false; +} + +bool PTXDAGToDAGISel::isImm(const SDValue &operand) { + return ConstantSDNode::classof(operand.getNode()); +} + +bool PTXDAGToDAGISel::SelectImm(const SDValue &operand, SDValue &imm) { + SDNode *node = operand.getNode(); + if (!ConstantSDNode::classof(node)) + return false; + + ConstantSDNode *CN = cast(node); + imm = CurDAG->getTargetConstant(*CN->getConstantIntValue(), MVT::i32); + return true; +} Modified: llvm/trunk/lib/Target/PTX/PTXInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXInstrInfo.td?rev=120407&r1=120406&r2=120407&view=diff ============================================================================== --- llvm/trunk/lib/Target/PTX/PTXInstrInfo.td (original) +++ llvm/trunk/lib/Target/PTX/PTXInstrInfo.td Tue Nov 30 01:34:44 2010 @@ -18,6 +18,31 @@ include "PTXInstrFormats.td" //===----------------------------------------------------------------------===// +// Instruction Pattern Stuff +//===----------------------------------------------------------------------===// + +def load_global : PatFrag<(ops node:$ptr), (load node:$ptr), [{ + if (const Value *Src = cast(N)->getSrcValue()) + if (const PointerType *PT = dyn_cast(Src->getType())) + return PT->getAddressSpace() <= 255; + return false; +}]>; + +// Addressing modes. +def ADDRri : ComplexPattern; +def ADDRii : ComplexPattern; + +// Address operands +def MEMri : Operand { + let PrintMethod = "printMemOperand"; + let MIOperandInfo = (ops RRegs32, i32imm); +} +def MEMii : Operand { + let PrintMethod = "printMemOperand"; + let MIOperandInfo = (ops i32imm, i32imm); +} + +//===----------------------------------------------------------------------===// // PTX Specific Node Definitions //===----------------------------------------------------------------------===// @@ -41,6 +66,17 @@ [(set RRegs32:$d, (opnode RRegs32:$a, imm:$b))]>; } +multiclass PTX_LD { + def ri : InstPTX<(outs RC:$d), + (ins MEMri:$a), + !strconcat(opstr, ".%type\t$d, [$a]"), + [(set RC:$d, (pat_load ADDRri:$a))]>; + def ii : InstPTX<(outs RC:$d), + (ins MEMii:$a), + !strconcat(opstr, ".%type\t$d, [$a]"), + [(set RC:$d, (pat_load ADDRii:$a))]>; +} + //===----------------------------------------------------------------------===// // Instructions //===----------------------------------------------------------------------===// @@ -69,6 +105,8 @@ [(set RRegs32:$d, imm:$a)]>; } +defm LDg : PTX_LD<"ld.global", RRegs32, load_global>; + ///===- Control Flow Instructions -----------------------------------------===// let isReturn = 1, isTerminator = 1, isBarrier = 1 in { From isanbard at gmail.com Tue Nov 30 01:44:32 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 07:44:32 -0000 Subject: [llvm-commits] [llvm] r120408 - in /llvm/trunk: lib/Target/ARM/ARMCodeEmitter.cpp lib/Target/ARM/ARMInstrThumb.td lib/Target/ARM/ARMMCCodeEmitter.cpp lib/Target/ARM/AsmParser/ARMAsmParser.cpp test/MC/ARM/thumb.s Message-ID: <20101130074432.61AF42A6C12D@llvm.org> Author: void Date: Tue Nov 30 01:44:32 2010 New Revision: 120408 URL: http://llvm.org/viewvc/llvm-project?rev=120408&view=rev Log: Add parsing for the Thumb t_addrmode_s4 addressing mode. This can almost certainly be made more generic. But it does allow us to parse something like: ldr r3, [r2, r4] correctly in Thumb mode. Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp llvm/trunk/lib/Target/ARM/ARMInstrThumb.td llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp llvm/trunk/test/MC/ARM/thumb.s Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=120408&r1=120407&r2=120408&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Tue Nov 30 01:44:32 2010 @@ -235,8 +235,10 @@ const { return 0;} uint32_t getAddrMode3OffsetOpValue(const MachineInstr &MI, unsigned OpIdx) const { return 0;} - uint32_t getAddrMode3OpValue(const MachineInstr &MI, unsigned Op) const - { return 0; } + uint32_t getAddrMode3OpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } + uint32_t getAddrModeS4OpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } uint32_t getAddrMode5OpValue(const MachineInstr &MI, unsigned Op) const { // {17-13} = reg // {12} = (U)nsigned (add == '1', sub == '0') Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120408&r1=120407&r2=120408&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 01:44:32 2010 @@ -74,6 +74,11 @@ // Define Thumb specific addressing modes. +def MemModeThumbAsmOperand : AsmOperandClass { + let Name = "MemModeThumb"; + let SuperClasses = []; +} + // t_addrmode_rr := reg + reg // def t_addrmode_rr : Operand, @@ -87,8 +92,10 @@ // def t_addrmode_s4 : Operand, ComplexPattern { + string EncoderMethod = "getAddrModeS4OpValue"; let PrintMethod = "printThumbAddrModeS4Operand"; let MIOperandInfo = (ops tGPR:$base, i32imm:$offsimm, tGPR:$offsreg); + let ParserMatchClass = MemModeThumbAsmOperand; } // t_addrmode_s2 := reg + reg @@ -489,8 +496,7 @@ let Inst{7-0} = imm; } -// A8.6.16 B: Encoding T1 -// If Inst{11-8} == 0b1110 then UNDEFINED +// The assembler uses 0xDEFE for a trap instruction. let isBarrier = 1, isTerminator = 1 in def tTRAP : TI<(outs), (ins), IIC_Br, "trap", [(trap)]>, Encoding16 { @@ -505,12 +511,26 @@ def tLDR : T1pI4<(outs tGPR:$Rt), (ins t_addrmode_s4:$addr), IIC_iLoad_r, "ldr", "\t$Rt, $addr", [(set tGPR:$Rt, (load t_addrmode_s4:$addr))]>, - T1LdSt<0b100>; + T1LdSt<0b100> { + // A8.6.60 + bits<3> Rt; + bits<8> addr; + let Inst{8-6} = addr{5-3}; // Rm + let Inst{5-3} = addr{2-0}; // Rn + let Inst{2-0} = Rt; +} -def tLDRi: T1pI4<(outs tGPR:$dst), (ins t_addrmode_s4:$addr), IIC_iLoad_r, - "ldr", "\t$dst, $addr", +def tLDRi: T1pI4<(outs tGPR:$Rt), (ins t_addrmode_s4:$addr), IIC_iLoad_r, + "ldr", "\t$Rt, $addr", []>, - T1LdSt4Imm<{1,?,?}>; + T1LdSt4Imm<{1,?,?}> { + // A8.6.57 + bits<3> Rt; + bits<8> addr; + let Inst{10-6} = addr{7-3}; // imm5 + let Inst{5-3} = addr{2-0}; // Rn + let Inst{2-0} = Rt; +} def tLDRB : T1pI1<(outs tGPR:$dst), (ins t_addrmode_s1:$addr), IIC_iLoad_bh_r, "ldrb", "\t$dst, $addr", Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120408&r1=120407&r2=120408&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Nov 30 01:44:32 2010 @@ -136,6 +136,10 @@ uint32_t getAddrMode3OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const; + /// getAddrModeS4OpValue - Return encoding for t_addrmode_s4 operands. + uint32_t getAddrModeS4OpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &Fixups) const; + /// getAddrMode5OpValue - Return encoding info for 'reg +/- imm8' operand. uint32_t getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const; @@ -540,6 +544,26 @@ return (Rn << 9) | Imm8 | (isAdd << 8) | (isImm << 13); } +/// getAddrModeS4OpValue - Return encoding for t_addrmode_s4 operands. +uint32_t ARMMCCodeEmitter:: +getAddrModeS4OpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &Fixups) const { + // [Rn, Rm] + // {5-3} = Rm + // {2-0} = Rn + // + // [Rn, #imm] + // {7-3} = imm5 + // {2-0} = Rn + const MCOperand &MO = MI.getOperand(OpIdx); + const MCOperand &MO1 = MI.getOperand(OpIdx + 1); + const MCOperand &MO2 = MI.getOperand(OpIdx + 2); + unsigned Rn = getARMRegisterNumbering(MO.getReg()); + unsigned Imm5 = MO1.getImm(); + unsigned Rm = getARMRegisterNumbering(MO2.getReg()); + return (Rm << 3) | (Imm5 << 3) | Rn; +} + /// getAddrMode5OpValue - Return encoding info for 'reg +/- imm12' operand. uint32_t ARMMCCodeEmitter:: getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx, Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=120408&r1=120407&r2=120408&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original) +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Tue Nov 30 01:44:32 2010 @@ -222,16 +222,30 @@ if (!isMemory() || Mem.OffsetIsReg || Mem.OffsetRegShifted || Mem.Writeback || Mem.Negative) return false; + // If there is an offset expression, make sure it's valid. - if (!Mem.Offset) - return true; + if (!Mem.Offset) return true; + const MCConstantExpr *CE = dyn_cast(Mem.Offset); - if (!CE) - return false; + if (!CE) return false; + // The offset must be a multiple of 4 in the range 0-1020. int64_t Value = CE->getValue(); return ((Value & 0x3) == 0 && Value <= 1020 && Value >= -1020); } + bool isMemModeThumb() const { + if (!isMemory() || (!Mem.OffsetIsReg && !Mem.Offset) || Mem.Writeback) + return false; + + if (!Mem.Offset) return true; + + const MCConstantExpr *CE = dyn_cast(Mem.Offset); + if (!CE) return false; + + // The offset must be a multiple of 4 in the range 0-124. + uint64_t Value = CE->getValue(); + return ((Value & 0x3) == 0 && Value <= 124); + } void addExpr(MCInst &Inst, const MCExpr *Expr) const { // Add as immediates when possible. Null MCExpr = 0. @@ -302,6 +316,21 @@ } } + void addMemModeThumbOperands(MCInst &Inst, unsigned N) const { + assert(N == 3 && isMemModeThumb() && "Invalid number of operands!"); + Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum)); + + if (Mem.Offset) { + const MCConstantExpr *CE = dyn_cast(Mem.Offset); + assert(CE && "Non-constant mode offset operand!"); + Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4)); + Inst.addOperand(MCOperand::CreateReg(0)); + } else { + Inst.addOperand(MCOperand::CreateImm(0)); + Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum)); + } + } + virtual void dump(raw_ostream &OS) const; static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) { @@ -592,8 +621,8 @@ int OffsetRegNum; bool OffsetRegShifted; enum ShiftType ShiftType; - const MCExpr *ShiftAmount; - const MCExpr *Offset; + const MCExpr *ShiftAmount = 0; + const MCExpr *Offset = 0; if (ParseMemoryOffsetReg(Negative, OffsetRegShifted, ShiftType, ShiftAmount, Offset, OffsetIsReg, OffsetRegNum, E)) return true; Modified: llvm/trunk/test/MC/ARM/thumb.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb.s?rev=120408&r1=120407&r2=120408&view=diff ============================================================================== --- llvm/trunk/test/MC/ARM/thumb.s (original) +++ llvm/trunk/test/MC/ARM/thumb.s Tue Nov 30 01:44:32 2010 @@ -32,3 +32,6 @@ @ CHECK: uxth r3, r6 @ encoding: [0xb3,0xb2] uxtb r3, r6 uxth r3, r6 + +@ CHECK: ldr r3, [r1, r2] @ encoding: [0x8b,0x58] + ldr r3, [r1, r2] From zwarich at apple.com Tue Nov 30 02:00:26 2010 From: zwarich at apple.com (Cameron Zwarich) Date: Tue, 30 Nov 2010 03:00:26 -0500 Subject: [llvm-commits] [Review request] Natural loop computation speedup Message-ID: This was a 16% speedup running loops on test-suite + SPEC2000. -------------- next part -------------- A non-text attachment was scrubbed... Name: loop.patch Type: application/octet-stream Size: 1969 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/ef4322b2/attachment.obj -------------- next part -------------- Cameron From echristo at apple.com Tue Nov 30 02:10:29 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 08:10:29 -0000 Subject: [llvm-commits] [llvm] r120410 - in /llvm/trunk/lib/Target/X86: X86ISelLowering.cpp X86ISelLowering.h Message-ID: <20101130081029.20DBF2A6C12D@llvm.org> Author: echristo Date: Tue Nov 30 02:10:28 2010 New Revision: 120410 URL: http://llvm.org/viewvc/llvm-project?rev=120410&view=rev Log: Fix some cleanups from my last patch. Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp llvm/trunk/lib/Target/X86/X86ISelLowering.h Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=120410&r1=120409&r2=120410&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Nov 30 02:10:28 2010 @@ -9445,7 +9445,7 @@ MachineBasicBlock * X86TargetLowering::EmitMonitor(MachineInstr *MI, MachineBasicBlock *BB) const { - assert((Subtarget->hasSSE3()) && "Target must have SSE3 features enabled"); + assert(Subtarget->hasSSE3() && "Target must have SSE3 features enabled"); DebugLoc dl = MI->getDebugLoc(); const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); @@ -9455,7 +9455,7 @@ unsigned MemReg = Subtarget->is64Bit() ? X86::RAX : X86::EAX; MachineInstrBuilder MIB = BuildMI(*BB, MI, dl, TII->get(MemOpc), MemReg); for (int i = 0; i < X86::AddrNumOperands; ++i) - (*MIB).addOperand(MI->getOperand(i)); + MIB.addOperand(MI->getOperand(i)); unsigned ValOps = X86::AddrNumOperands; BuildMI(*BB, MI, dl, TII->get(TargetOpcode::COPY), X86::ECX) @@ -9472,7 +9472,7 @@ MachineBasicBlock * X86TargetLowering::EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const { - assert((Subtarget->hasSSE3()) && "Target must have SSE3 features enabled"); + assert(Subtarget->hasSSE3() && "Target must have SSE3 features enabled"); DebugLoc dl = MI->getDebugLoc(); const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=120410&r1=120409&r2=120410&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.h (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Tue Nov 30 02:10:28 2010 @@ -824,8 +824,8 @@ /// Utility functions to emit monitor and mwait instructions. These /// need to make sure that the arguments to the intrinsic are in the /// correct registers. - MachineBasicBlock *EmitMonitor(MachineInstr *MI, MachineBasicBlock *BB) - const; + MachineBasicBlock *EmitMonitor(MachineInstr *MI, + MachineBasicBlock *BB) const; MachineBasicBlock *EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const; /// Utility function to emit atomic bitwise operations (and, or, xor). From echristo at apple.com Tue Nov 30 02:20:21 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 08:20:21 -0000 Subject: [llvm-commits] [llvm] r120411 - /llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Message-ID: <20101130082021.CB64E2A6C12D@llvm.org> Author: echristo Date: Tue Nov 30 02:20:21 2010 New Revision: 120411 URL: http://llvm.org/viewvc/llvm-project?rev=120411&view=rev Log: Fix insertion point in pcmp expander. While I'm there, clean up too many \n even for me. Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=120411&r1=120410&r2=120411&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Nov 30 02:20:21 2010 @@ -9405,15 +9405,12 @@ MachineBasicBlock * X86TargetLowering::EmitPCMP(MachineInstr *MI, MachineBasicBlock *BB, unsigned numArgs, bool memArg) const { - assert((Subtarget->hasSSE42() || Subtarget->hasAVX()) && "Target must have SSE4.2 or AVX features enabled"); DebugLoc dl = MI->getDebugLoc(); const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); - unsigned Opc; - if (!Subtarget->hasAVX()) { if (memArg) Opc = numArgs == 3 ? X86::PCMPISTRM128rm : X86::PCMPESTRM128rm; @@ -9426,20 +9423,16 @@ Opc = numArgs == 3 ? X86::VPCMPISTRM128rr : X86::VPCMPESTRM128rr; } - MachineInstrBuilder MIB = BuildMI(BB, dl, TII->get(Opc)); - + MachineInstrBuilder MIB = BuildMI(*BB, MI, dl, TII->get(Opc)); for (unsigned i = 0; i < numArgs; ++i) { MachineOperand &Op = MI->getOperand(i+1); - if (!(Op.isReg() && Op.isImplicit())) MIB.addOperand(Op); } - - BuildMI(BB, dl, TII->get(X86::MOVAPSrr), MI->getOperand(0).getReg()) + BuildMI(*BB, MI, dl, TII->get(X86::MOVAPSrr), MI->getOperand(0).getReg()) .addReg(X86::XMM0); MI->eraseFromParent(); - return BB; } From echristo at apple.com Tue Nov 30 02:29:54 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 00:29:54 -0800 Subject: [llvm-commits] [llvm] r120404 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h lib/Target/X86/X86InstrSSE.td test/CodeGen/X86/apm.ll In-Reply-To: <95E528E1-FBD3-42B5-A705-C7DF0C2C0FB9@apple.com> References: <20101130072013.1E4622A6C12D@llvm.org> <95E528E1-FBD3-42B5-A705-C7DF0C2C0FB9@apple.com> Message-ID: <4ABAD351-1412-4DAB-93F8-E98D45D1AE3A@apple.com> > Minor and picky, but please wrap before 'MachineBasicBlock' so it isn't just a qualifier floating. > I was wondering how I should indent that. :) >> +let usesCustomInserter = 1 in { >> +def MONITOR : I<0, Pseudo, (outs), (ins i32mem:$src1, GR32:$src2, GR32:$src3), >> + "# MONITORrrr PSUEDO", >> + [(int_x86_sse3_monitor addr:$src1, GR32:$src2, GR32:$src3)]>; >> +def MWAIT : I<0, Pseudo, (outs), (ins GR32:$src1, GR32:$src2), >> + "# MWAITrr PSEUDO", >> + [(int_x86_sse3_mwait GR32:$src1, GR32:$src2)]>; > > Please use an empty asmstring to avoid bloating the asmprinter tables. Better yet, X86 should use a PseudoI<> class that does the right thing. Got most of these handled, I'll get this next. -eric From echristo at apple.com Tue Nov 30 02:50:07 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 00:50:07 -0800 Subject: [llvm-commits] [Review request] Natural loop computation speedup In-Reply-To: References: Message-ID: On Nov 30, 2010, at 12:00 AM, Cameron Zwarich wrote: > Seems entirely reasonable, though I doubt the change in the #if 0 code made much difference ;) (It is, of course, great for consistency :) -eric From echristo at apple.com Tue Nov 30 02:57:23 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 08:57:23 -0000 Subject: [llvm-commits] [llvm] r120412 - in /llvm/trunk/lib/Target/X86: X86InstrFormats.td X86InstrSSE.td Message-ID: <20101130085723.4D5D22A6C12F@llvm.org> Author: echristo Date: Tue Nov 30 02:57:23 2010 New Revision: 120412 URL: http://llvm.org/viewvc/llvm-project?rev=120412&view=rev Log: Implement a PseudoI class and transfer the sse instructions over to use it. Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td llvm/trunk/lib/Target/X86/X86InstrSSE.td Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFormats.td?rev=120412&r1=120411&r2=120412&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFormats.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrFormats.td Tue Nov 30 02:57:23 2010 @@ -168,6 +168,11 @@ let TSFlags{37} = has3DNow0F0FOpcode; } +class PseudoI pattern> + : X86Inst<0, Pseudo, NoImm, oops, iops, "", GenericDomain> { + let Pattern = pattern; +} + class I o, Format f, dag outs, dag ins, string asm, list pattern, Domain d = GenericDomain> : X86Inst { Modified: llvm/trunk/lib/Target/X86/X86InstrSSE.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSSE.td?rev=120412&r1=120411&r2=120412&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrSSE.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrSSE.td Tue Nov 30 02:57:23 2010 @@ -3641,11 +3641,9 @@ // Thread synchronization let usesCustomInserter = 1 in { -def MONITOR : I<0, Pseudo, (outs), (ins i32mem:$src1, GR32:$src2, GR32:$src3), - "# MONITORrrr PSUEDO", +def MONITOR : PseudoI<(outs), (ins i32mem:$src1, GR32:$src2, GR32:$src3), [(int_x86_sse3_monitor addr:$src1, GR32:$src2, GR32:$src3)]>; -def MWAIT : I<0, Pseudo, (outs), (ins GR32:$src1, GR32:$src2), - "# MWAITrr PSEUDO", +def MWAIT : PseudoI<(outs), (ins GR32:$src1, GR32:$src2), [(int_x86_sse3_mwait GR32:$src1, GR32:$src2)]>; } @@ -4907,12 +4905,12 @@ // Packed Compare Implicit Length Strings, Return Mask multiclass pseudo_pcmpistrm { - def REG : Ii8<0, Pseudo, (outs VR128:$dst), - (ins VR128:$src1, VR128:$src2, i8imm:$src3), !strconcat(asm, "rr PSEUDO"), + def REG : PseudoI<(outs VR128:$dst), + (ins VR128:$src1, VR128:$src2, i8imm:$src3), [(set VR128:$dst, (int_x86_sse42_pcmpistrm128 VR128:$src1, VR128:$src2, imm:$src3))]>; - def MEM : Ii8<0, Pseudo, (outs VR128:$dst), - (ins VR128:$src1, i128mem:$src2, i8imm:$src3), !strconcat(asm, "rm PSEUDO"), + def MEM : PseudoI<(outs VR128:$dst), + (ins VR128:$src1, i128mem:$src2, i8imm:$src3), [(set VR128:$dst, (int_x86_sse42_pcmpistrm128 VR128:$src1, (load addr:$src2), imm:$src3))]>; } @@ -4943,12 +4941,12 @@ // Packed Compare Explicit Length Strings, Return Mask multiclass pseudo_pcmpestrm { - def REG : Ii8<0, Pseudo, (outs VR128:$dst), - (ins VR128:$src1, VR128:$src3, i8imm:$src5), !strconcat(asm, "rr PSEUDO"), + def REG : PseudoI<(outs VR128:$dst), + (ins VR128:$src1, VR128:$src3, i8imm:$src5), [(set VR128:$dst, (int_x86_sse42_pcmpestrm128 VR128:$src1, EAX, VR128:$src3, EDX, imm:$src5))]>; - def MEM : Ii8<0, Pseudo, (outs VR128:$dst), - (ins VR128:$src1, i128mem:$src3, i8imm:$src5), !strconcat(asm, "rm PSEUDO"), + def MEM : PseudoI<(outs VR128:$dst), + (ins VR128:$src1, i128mem:$src3, i8imm:$src5), [(set VR128:$dst, (int_x86_sse42_pcmpestrm128 VR128:$src1, EAX, (load addr:$src3), EDX, imm:$src5))]>; } From echristo at apple.com Tue Nov 30 03:00:35 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 01:00:35 -0800 Subject: [llvm-commits] [llvm] r120404 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h lib/Target/X86/X86InstrSSE.td test/CodeGen/X86/apm.ll In-Reply-To: <4ABAD351-1412-4DAB-93F8-E98D45D1AE3A@apple.com> References: <20101130072013.1E4622A6C12D@llvm.org> <95E528E1-FBD3-42B5-A705-C7DF0C2C0FB9@apple.com> <4ABAD351-1412-4DAB-93F8-E98D45D1AE3A@apple.com> Message-ID: <063CEB85-732A-4EF1-BB53-84FE6A3AB93D@apple.com> On Nov 30, 2010, at 12:29 AM, Eric Christopher wrote: > >> Minor and picky, but please wrap before 'MachineBasicBlock' so it isn't just a qualifier floating. >> > > I was wondering how I should indent that. :) > >>> +let usesCustomInserter = 1 in { >>> +def MONITOR : I<0, Pseudo, (outs), (ins i32mem:$src1, GR32:$src2, GR32:$src3), >>> + "# MONITORrrr PSUEDO", >>> + [(int_x86_sse3_monitor addr:$src1, GR32:$src2, GR32:$src3)]>; >>> +def MWAIT : I<0, Pseudo, (outs), (ins GR32:$src1, GR32:$src2), >>> + "# MWAITrr PSEUDO", >>> + [(int_x86_sse3_mwait GR32:$src1, GR32:$src2)]>; >> >> Please use an empty asmstring to avoid bloating the asmprinter tables. Better yet, X86 should use a PseudoI<> class that does the right thing. > > Got most of these handled, I'll get this next. And this is done too - at least the SSE file has been migrated mostly. I haven't looked at the ones for the assembler only - they seem to use the asm string so I left it alone so I could look at it. -eric From jay.foad at gmail.com Tue Nov 30 03:02:01 2010 From: jay.foad at gmail.com (Jay Foad) Date: Tue, 30 Nov 2010 09:02:01 -0000 Subject: [llvm-commits] [llvm] r120413 - in /llvm/trunk: include/llvm/ADT/APInt.h lib/Analysis/ValueTracking.cpp lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp lib/Support/APInt.cpp Message-ID: <20101130090201.464EF2A6C12F@llvm.org> Author: foad Date: Tue Nov 30 03:02:01 2010 New Revision: 120413 URL: http://llvm.org/viewvc/llvm-project?rev=120413&view=rev Log: PR5207: Make APInt::set(), APInt::clear() and APInt::flip() return void. Modified: llvm/trunk/include/llvm/ADT/APInt.h llvm/trunk/lib/Analysis/ValueTracking.cpp llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp llvm/trunk/lib/Support/APInt.cpp Modified: llvm/trunk/include/llvm/ADT/APInt.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/APInt.h?rev=120413&r1=120412&r2=120413&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/APInt.h (original) +++ llvm/trunk/include/llvm/ADT/APInt.h Tue Nov 30 03:02:01 2010 @@ -379,12 +379,17 @@ /// @{ /// @brief Gets maximum unsigned value of APInt for specific bit width. static APInt getMaxValue(unsigned numBits) { - return APInt(numBits, 0).set(); + APInt API(numBits, 0); + API.set(); + return API; } /// @brief Gets maximum signed value of APInt for a specific bit width. static APInt getSignedMaxValue(unsigned numBits) { - return APInt(numBits, 0).set().clear(numBits - 1); + APInt API(numBits, 0); + API.set(); + API.clear(numBits - 1); + return API; } /// @brief Gets minimum unsigned value of APInt for a specific bit width. @@ -394,7 +399,9 @@ /// @brief Gets minimum signed value of APInt for a specific bit width. static APInt getSignedMinValue(unsigned numBits) { - return APInt(numBits, 0).set(numBits - 1); + APInt API(numBits, 0); + API.set(numBits - 1); + return API; } /// getSignBit - This is just a wrapper function of getSignedMinValue(), and @@ -407,7 +414,9 @@ /// @returns the all-ones value for an APInt of the specified bit-width. /// @brief Get the all-ones value. static APInt getAllOnesValue(unsigned numBits) { - return APInt(numBits, 0).set(); + APInt API(numBits, 0); + API.set(); + return API; } /// @returns the '0' value for an APInt of the specified bit-width. @@ -1035,51 +1044,49 @@ /// @name Bit Manipulation Operators /// @{ /// @brief Set every bit to 1. - APInt &set() { - if (isSingleWord()) { + void set() { + if (isSingleWord()) VAL = -1ULL; - return clearUnusedBits(); + else { + // Set all the bits in all the words. + for (unsigned i = 0; i < getNumWords(); ++i) + pVal[i] = -1ULL; } - - // Set all the bits in all the words. - for (unsigned i = 0; i < getNumWords(); ++i) - pVal[i] = -1ULL; // Clear the unused ones - return clearUnusedBits(); + clearUnusedBits(); } /// Set the given bit to 1 whose position is given as "bitPosition". /// @brief Set a given bit to 1. - APInt &set(unsigned bitPosition); + void set(unsigned bitPosition); /// @brief Set every bit to 0. - APInt &clear() { + void clear() { if (isSingleWord()) VAL = 0; else memset(pVal, 0, getNumWords() * APINT_WORD_SIZE); - return *this; } /// Set the given bit to 0 whose position is given as "bitPosition". /// @brief Set a given bit to 0. - APInt &clear(unsigned bitPosition); + void clear(unsigned bitPosition); /// @brief Toggle every bit to its opposite value. - APInt &flip() { - if (isSingleWord()) { + void flip() { + if (isSingleWord()) VAL ^= -1ULL; - return clearUnusedBits(); + else { + for (unsigned i = 0; i < getNumWords(); ++i) + pVal[i] ^= -1ULL; } - for (unsigned i = 0; i < getNumWords(); ++i) - pVal[i] ^= -1ULL; - return clearUnusedBits(); + clearUnusedBits(); } /// Toggle a given bit to its opposite value whose position is given /// as "bitPosition". /// @brief Toggles a given bit to its opposite value. - APInt& flip(unsigned bitPosition); + void flip(unsigned bitPosition); /// @} /// @name Value Characterization Functions Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=120413&r1=120412&r2=120413&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original) +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Tue Nov 30 03:02:01 2010 @@ -875,8 +875,9 @@ // Turn Op0 << Op1 into Op0 * 2^Op1 APInt Op1Int = Op1CI->getValue(); uint64_t BitToSet = Op1Int.getLimitedValue(Op1Int.getBitWidth() - 1); - Op1 = ConstantInt::get(V->getContext(), - APInt(Op1Int.getBitWidth(), 0).set(BitToSet)); + APInt API(Op1Int.getBitWidth(), 0); + API.set(BitToSet); + Op1 = ConstantInt::get(V->getContext(), API); } Value *Mul0 = NULL; Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp?rev=120413&r1=120412&r2=120413&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp Tue Nov 30 03:02:01 2010 @@ -133,8 +133,9 @@ unsigned Size = NVT.getSizeInBits(); // Mask = ~(1 << (Size-1)) - SDValue Mask = DAG.getConstant(APInt::getAllOnesValue(Size).clear(Size-1), - NVT); + APInt API = APInt::getAllOnesValue(Size); + API.clear(Size-1); + SDValue Mask = DAG.getConstant(API, NVT); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return DAG.getNode(ISD::AND, N->getDebugLoc(), NVT, Op, Mask); } Modified: llvm/trunk/lib/Support/APInt.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APInt.cpp?rev=120413&r1=120412&r2=120413&view=diff ============================================================================== --- llvm/trunk/lib/Support/APInt.cpp (original) +++ llvm/trunk/lib/Support/APInt.cpp Tue Nov 30 03:02:01 2010 @@ -584,22 +584,20 @@ return lhs.ult(rhs); } -APInt& APInt::set(unsigned bitPosition) { +void APInt::set(unsigned bitPosition) { if (isSingleWord()) VAL |= maskBit(bitPosition); else pVal[whichWord(bitPosition)] |= maskBit(bitPosition); - return *this; } /// Set the given bit to 0 whose position is given as "bitPosition". /// @brief Set a given bit to 0. -APInt& APInt::clear(unsigned bitPosition) { +void APInt::clear(unsigned bitPosition) { if (isSingleWord()) VAL &= ~maskBit(bitPosition); else pVal[whichWord(bitPosition)] &= ~maskBit(bitPosition); - return *this; } /// @brief Toggle every bit to its opposite value. @@ -607,11 +605,10 @@ /// Toggle a given bit to its opposite value whose position is given /// as "bitPosition". /// @brief Toggles a given bit to its opposite value. -APInt& APInt::flip(unsigned bitPosition) { +void APInt::flip(unsigned bitPosition) { assert(bitPosition < BitWidth && "Out of the bit-width range!"); if ((*this)[bitPosition]) clear(bitPosition); else set(bitPosition); - return *this; } unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) { From jay.foad at gmail.com Tue Nov 30 03:04:44 2010 From: jay.foad at gmail.com (Jay Foad) Date: Tue, 30 Nov 2010 09:04:44 +0000 Subject: [llvm-commits] [PATCH] Bug 5207: make APInt set(), clear() and flip() return void In-Reply-To: <83AE4010-3184-4075-8F82-2B006FDC0D12@apple.com> References: <83AE4010-3184-4075-8F82-2B006FDC0D12@apple.com> Message-ID: > Looks great to me, please commit. ?I'd also suggest renaming the methods to "setAllBits()" "clearAllBits" "flipAllBits" etc. ?Thanks for working on this Jay! Committed. The methods are overloaded. We have: void set(); // set all bits void set(unsigned); // set a single bit ... and likewise for clear() and flip(). So maybe rename them to setAllBits() and setBit(unsigned) respectively? Thanks, Jay. From echristo at apple.com Tue Nov 30 03:05:21 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 01:05:21 -0800 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: <20101129142046.GA2741@localhost.localdomain> References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> Message-ID: <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> On Nov 29, 2010, at 6:20 AM, Mikhail Glushenkov wrote: > > How difficult of an undertaking would that be for someone who never worked on a > LLVM backend? I'm not very fond of the current solution, but backend hacking is > an uncharted territory for me. > This is probably an involved task - it'll probably involve doing things like separating out instruction itineraries from the processor description for ARM, making sure that things that call into the backend use the tuning information if it's requested as opposed to the architecture information, etc. I don't know how hard it'll be, but it may be a bit of typing. >> In particular the implementation that you have here won't work for any >> other processor that I know of at the moment. > > Yes, it is incomplete. I don't think it's the right direction for the support either. I think what I outlined above may be a better route. I can try to get a better roadmap or list of things that need to be done for you if you're interested in going the way I'm thinking? -eric From echristo at apple.com Tue Nov 30 03:11:07 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 09:11:07 -0000 Subject: [llvm-commits] [llvm] r120415 - /llvm/trunk/lib/Target/X86/X86InstrFormats.td Message-ID: <20101130091107.F1D8E2A6C12F@llvm.org> Author: echristo Date: Tue Nov 30 03:11:07 2010 New Revision: 120415 URL: http://llvm.org/viewvc/llvm-project?rev=120415&view=rev Log: This defaults to GenericDomain. Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFormats.td?rev=120415&r1=120414&r2=120415&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFormats.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrFormats.td Tue Nov 30 03:11:07 2010 @@ -169,7 +169,7 @@ } class PseudoI pattern> - : X86Inst<0, Pseudo, NoImm, oops, iops, "", GenericDomain> { + : X86Inst<0, Pseudo, NoImm, oops, iops, ""> { let Pattern = pattern; } From echristo at apple.com Tue Nov 30 03:11:54 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 09:11:54 -0000 Subject: [llvm-commits] [llvm] r120416 - /llvm/trunk/lib/Target/X86/X86InstrFormats.td Message-ID: <20101130091154.36F102A6C12F@llvm.org> Author: echristo Date: Tue Nov 30 03:11:54 2010 New Revision: 120416 URL: http://llvm.org/viewvc/llvm-project?rev=120416&view=rev Log: Fix some grammar in comments I noticed. Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFormats.td?rev=120416&r1=120415&r2=120416&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFormats.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrFormats.td Tue Nov 30 03:11:54 2010 @@ -135,17 +135,17 @@ bit hasAdSizePrefix = 0; // Does this inst have a 0x67 prefix? bits<4> Prefix = 0; // Which prefix byte does this inst have? - bit hasREX_WPrefix = 0; // Does this inst requires the REX.W prefix? + bit hasREX_WPrefix = 0; // Does this inst require the REX.W prefix? FPFormat FPForm = NotFP; // What flavor of FP instruction is this? bit hasLockPrefix = 0; // Does this inst have a 0xF0 prefix? bits<2> SegOvrBits = 0; // Segment override prefix. Domain ExeDomain = d; - bit hasVEXPrefix = 0; // Does this inst requires a VEX prefix? + bit hasVEXPrefix = 0; // Does this inst require a VEX prefix? bit hasVEX_WPrefix = 0; // Does this inst set the VEX_W field? - bit hasVEX_4VPrefix = 0; // Does this inst requires the VEX.VVVV field? - bit hasVEX_i8ImmReg = 0; // Does this inst requires the last source register + bit hasVEX_4VPrefix = 0; // Does this inst require the VEX.VVVV field? + bit hasVEX_i8ImmReg = 0; // Does this inst require the last source register // to be encoded in a immediate field? - bit hasVEX_L = 0; // Does this inst uses large (256-bit) registers? + bit hasVEX_L = 0; // Does this inst use large (256-bit) registers? bit has3DNow0F0FOpcode =0;// Wacky 3dNow! encoding? // TSFlags layout should be kept in sync with X86InstrInfo.h. From baldrick at free.fr Tue Nov 30 03:16:04 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 30 Nov 2010 09:16:04 -0000 Subject: [llvm-commits] [dragonegg] r120417 - in /dragonegg/trunk: llvm-backend.cpp llvm-convert.cpp Message-ID: <20101130091604.4F76E2A6C12F@llvm.org> Author: baldrick Date: Tue Nov 30 03:16:04 2010 New Revision: 120417 URL: http://llvm.org/viewvc/llvm-project?rev=120417&view=rev Log: System was renamed to Support. Fix the build. Modified: dragonegg/trunk/llvm-backend.cpp dragonegg/trunk/llvm-convert.cpp Modified: dragonegg/trunk/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-backend.cpp?rev=120417&r1=120416&r2=120417&view=diff ============================================================================== --- dragonegg/trunk/llvm-backend.cpp (original) +++ dragonegg/trunk/llvm-backend.cpp Tue Nov 30 03:16:04 2010 @@ -49,7 +49,6 @@ #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/StandardPasses.h" -#include "llvm/System/Program.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" Modified: dragonegg/trunk/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=120417&r1=120416&r2=120417&view=diff ============================================================================== --- dragonegg/trunk/llvm-convert.cpp (original) +++ dragonegg/trunk/llvm-convert.cpp Tue Nov 30 03:16:04 2010 @@ -42,10 +42,10 @@ #include "llvm/Support/CFG.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/Host.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/ValueHandle.h" -#include "llvm/System/Host.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetMachine.h" From echristo at apple.com Tue Nov 30 03:23:54 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 09:23:54 -0000 Subject: [llvm-commits] [llvm] r120418 - /llvm/trunk/test/CodeGen/X86/apm.ll Message-ID: <20101130092354.800A62A6C12D@llvm.org> Author: echristo Date: Tue Nov 30 03:23:54 2010 New Revision: 120418 URL: http://llvm.org/viewvc/llvm-project?rev=120418&view=rev Log: Not all platforms use _. Duh. Modified: llvm/trunk/test/CodeGen/X86/apm.ll Modified: llvm/trunk/test/CodeGen/X86/apm.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/apm.ll?rev=120418&r1=120417&r2=120418&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/apm.ll (original) +++ llvm/trunk/test/CodeGen/X86/apm.ll Tue Nov 30 03:23:54 2010 @@ -1,7 +1,7 @@ ; RUN: llc < %s -o - -march=x86-64 | FileCheck %s ; PR8573 -; CHECK: _foo: +; CHECK: foo: ; CHECK: leaq (%rdi), %rax ; CHECK-NEXT: movl %esi, %ecx ; CHECK-NEXT: monitor @@ -13,7 +13,7 @@ declare void @llvm.x86.sse3.monitor(i8*, i32, i32) nounwind -; CHECK: _bar: +; CHECK: bar: ; CHECK: movl %edi, %ecx ; CHECK-NEXT: movl %esi, %eax ; CHECK-NEXT: mwait From nicholas at mxc.ca Tue Nov 30 03:37:45 2010 From: nicholas at mxc.ca (Nick Lewycky) Date: Tue, 30 Nov 2010 01:37:45 -0800 Subject: [llvm-commits] [llvm] r120325 - in /llvm/trunk: lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/simple.ll In-Reply-To: <20101129215931.88D672A6C12D@llvm.org> References: <20101129215931.88D672A6C12D@llvm.org> Message-ID: <4CF4C5E9.2020109@mxc.ca> Chris Lattner wrote: > Author: lattner > Date: Mon Nov 29 15:59:31 2010 > New Revision: 120325 > > URL: http://llvm.org/viewvc/llvm-project?rev=120325&view=rev > Log: > fix PR8677, patch by Jakub Staszak! > > Modified: > llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp > llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll > > Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120325&r1=120324&r2=120325&view=diff > ============================================================================== > --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) > +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Mon Nov 29 15:59:31 2010 > @@ -235,8 +235,10 @@ > &BB); > } > > - // If not a definite must-alias dependency, ignore it. > - if (!InstDep.isDef()) > + // If not a definite must-alias store dependency, ignore it. If this is a > + // load from the same pointer, we don't want to transform load+store into > + // a noop. > + if (!InstDep.isDef() || !isa(InstDep.getInst())) > continue; > } > > > Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120325&r1=120324&r2=120325&view=diff > ============================================================================== > --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) > +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Mon Nov 29 15:59:31 2010 > @@ -20,3 +20,17 @@ > ; CHECK: @test2 > ; CHECK-NEXT: store i32 20 > } > + > + > +; PR8677 > + at g = global i32 1 > + > +define i32 @test3(i32* %g_addr) nounwind { > +; CHECK: @test3 > +; CHEcK: load i32* %g_addr Typo: cheCk :) Nick > + %g_value = load i32* %g_addr, align 4 > + store i32 -1, i32* @g, align 4 > + store i32 %g_value, i32* %g_addr, align 4 > + %tmp3 = load i32* @g, align 4 > + ret i32 %tmp3 > +} > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > From baldrick at free.fr Tue Nov 30 04:08:00 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 30 Nov 2010 10:08:00 -0000 Subject: [llvm-commits] [dragonegg] r120419 - in /dragonegg/trunk: llvm-abi.h llvm-backend.cpp llvm-convert.cpp llvm-debug.cpp llvm-debug.h llvm-internal.h llvm-types.cpp utils/target.cpp x86/llvm-target.cpp Message-ID: <20101130100800.B0E042A6C12D@llvm.org> Author: baldrick Date: Tue Nov 30 04:08:00 2010 New Revision: 120419 URL: http://llvm.org/viewvc/llvm-project?rev=120419&view=rev Log: Trim header includes. Modified: dragonegg/trunk/llvm-abi.h dragonegg/trunk/llvm-backend.cpp dragonegg/trunk/llvm-convert.cpp dragonegg/trunk/llvm-debug.cpp dragonegg/trunk/llvm-debug.h dragonegg/trunk/llvm-internal.h dragonegg/trunk/llvm-types.cpp dragonegg/trunk/utils/target.cpp dragonegg/trunk/x86/llvm-target.cpp Modified: dragonegg/trunk/llvm-abi.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-abi.h?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/llvm-abi.h (original) +++ dragonegg/trunk/llvm-abi.h Tue Nov 30 04:08:00 2010 @@ -33,10 +33,6 @@ #include "llvm-target.h" // LLVM headers -#include "llvm/Attributes.h" -#include "llvm/CallingConv.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" #include "llvm/LLVMContext.h" #include "llvm/Target/TargetData.h" Modified: dragonegg/trunk/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-backend.cpp?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/llvm-backend.cpp (original) +++ dragonegg/trunk/llvm-backend.cpp Tue Nov 30 04:08:00 2010 @@ -24,42 +24,26 @@ #include "llvm-cache.h" } #include "llvm-debug.h" -#include "llvm-internal.h" #include "llvm-os.h" #include "llvm-target.h" // LLVM headers #define DEBUG_TYPE "plugin" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" #include "llvm/LLVMContext.h" #include "llvm/Module.h" -#include "llvm/PassManager.h" -#include "llvm/ValueSymbolTable.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/ADT/StringMap.h" -#include "llvm/Analysis/LoopPass.h" -#include "llvm/Analysis/Verifier.h" #include "llvm/Assembly/PrintModulePass.h" -#include "llvm/Assembly/Writer.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/ManagedStatic.h" -#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/StandardPasses.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetLowering.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetRegistry.h" -#include "llvm/Transforms/IPO.h" -#include "llvm/Transforms/Scalar.h" // System headers -#include #include // GCC headers Modified: dragonegg/trunk/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/llvm-convert.cpp (original) +++ dragonegg/trunk/llvm-convert.cpp Tue Nov 30 04:08:00 2010 @@ -26,30 +26,15 @@ // Plugin headers #include "llvm-abi.h" #include "llvm-debug.h" -#include "llvm-internal.h" #include "llvm-tree.h" // LLVM headers -#include "llvm/CallingConv.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/InlineAsm.h" -#include "llvm/Instructions.h" -#include "llvm/LLVMContext.h" #include "llvm/Module.h" -#include "llvm/ValueSymbolTable.h" -#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Support/CFG.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Host.h" -#include "llvm/Support/MathExtras.h" -#include "llvm/Support/raw_ostream.h" -#include "llvm/Support/ValueHandle.h" -#include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" Modified: dragonegg/trunk/llvm-debug.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-debug.cpp?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/llvm-debug.cpp (original) +++ dragonegg/trunk/llvm-debug.cpp Tue Nov 30 04:08:00 2010 @@ -24,21 +24,10 @@ //===----------------------------------------------------------------------===// // Plugin headers -#include "llvm-abi.h" #include "llvm-debug.h" -#include "llvm-internal.h" // LLVM headers -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Instructions.h" -#include "llvm/Intrinsics.h" #include "llvm/Module.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringExtras.h" -#include "llvm/Analysis/DebugInfo.h" -#include "llvm/Support/Dwarf.h" -#include "llvm/Target/TargetMachine.h" // System headers #include Modified: dragonegg/trunk/llvm-debug.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-debug.h?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/llvm-debug.h (original) +++ dragonegg/trunk/llvm-debug.h Tue Nov 30 04:08:00 2010 @@ -33,13 +33,10 @@ // LLVM headers #include "llvm/Analysis/DebugInfo.h" #include "llvm/Support/Allocator.h" -#include "llvm/Support/Dwarf.h" #include "llvm/Support/ValueHandle.h" // System headers #include -#include -#include namespace llvm { Modified: dragonegg/trunk/llvm-internal.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/llvm-internal.h (original) +++ dragonegg/trunk/llvm-internal.h Tue Nov 30 04:08:00 2010 @@ -28,21 +28,12 @@ #define LLVM_INTERNAL_H // LLVM headers -#include "llvm/CallingConv.h" #include "llvm/Intrinsics.h" #include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SetVector.h" #include "llvm/Support/IRBuilder.h" -#include "llvm/Support/MathExtras.h" -#include "llvm/Support/raw_os_ostream.h" #include "llvm/Support/TargetFolder.h" -// System headers -#include -#include -#include - struct basic_block_def; union gimple_statement_d; union tree_node; Modified: dragonegg/trunk/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-types.cpp?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/llvm-types.cpp (original) +++ dragonegg/trunk/llvm-types.cpp Tue Nov 30 04:08:00 2010 @@ -31,17 +31,10 @@ } // LLVM headers -#include "llvm/CallingConv.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/TypeSymbolTable.h" #include "llvm/Assembly/Writer.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/StringExtras.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" // System headers Modified: dragonegg/trunk/utils/target.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/utils/target.cpp?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/utils/target.cpp (original) +++ dragonegg/trunk/utils/target.cpp Tue Nov 30 04:08:00 2010 @@ -1,4 +1,3 @@ -#include #include #include Modified: dragonegg/trunk/x86/llvm-target.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/x86/llvm-target.cpp?rev=120419&r1=120418&r2=120419&view=diff ============================================================================== --- dragonegg/trunk/x86/llvm-target.cpp (original) +++ dragonegg/trunk/x86/llvm-target.cpp Tue Nov 30 04:08:00 2010 @@ -25,14 +25,9 @@ // Plugin headers #include "llvm-abi.h" -#include "llvm-internal.h" #include "llvm-target.h" // LLVM headers -#include "llvm/DerivedTypes.h" -#include "llvm/Instructions.h" -#include "llvm/Intrinsics.h" -#include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/Support/ErrorHandling.h" From clchiou at gmail.com Tue Nov 30 04:14:14 2010 From: clchiou at gmail.com (Che-Liang Chiou) Date: Tue, 30 Nov 2010 10:14:14 -0000 Subject: [llvm-commits] [llvm] r120423 - in /llvm/trunk: lib/Target/PTX/PTXAsmPrinter.cpp test/CodeGen/PTX/options.ll Message-ID: <20101130101414.4AE752A6C12D@llvm.org> Author: clchiou Date: Tue Nov 30 04:14:14 2010 New Revision: 120423 URL: http://llvm.org/viewvc/llvm-project?rev=120423&view=rev Log: ptx: add command-line options for gpu target and ptx version Added: llvm/trunk/test/CodeGen/PTX/options.ll Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp?rev=120423&r1=120422&r2=120423&view=diff ============================================================================== --- llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Tue Nov 30 04:14:14 2010 @@ -27,12 +27,21 @@ #include "llvm/MC/MCSymbol.h" #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetRegistry.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; +static cl::opt +OptPTXVersion("ptx-version", cl::desc("Set PTX version"), + cl::init("1.4")); + +static cl::opt +OptPTXTarget("ptx-target", cl::desc("Set GPU target (comma-separated list)"), + cl::init("sm_10")); + namespace { class PTXAsmPrinter : public AsmPrinter { public: @@ -41,6 +50,8 @@ const char *getPassName() const { return "PTX Assembly Printer"; } + virtual void EmitStartOfAsmFile(Module &M); + virtual bool runOnMachineFunction(MachineFunction &MF); virtual void EmitFunctionBodyStart(); @@ -85,6 +96,13 @@ return NULL; } +void PTXAsmPrinter::EmitStartOfAsmFile(Module &M) +{ + OutStreamer.EmitRawText(Twine("\t.version " + OptPTXVersion)); + OutStreamer.EmitRawText(Twine("\t.target " + OptPTXTarget)); + OutStreamer.AddBlankLine(); +} + bool PTXAsmPrinter::runOnMachineFunction(MachineFunction &MF) { SetupMachineFunction(MF); EmitFunctionDeclaration(); Added: llvm/trunk/test/CodeGen/PTX/options.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PTX/options.ll?rev=120423&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/PTX/options.ll (added) +++ llvm/trunk/test/CodeGen/PTX/options.ll Tue Nov 30 04:14:14 2010 @@ -0,0 +1,6 @@ +; RUN: llc < %s -march=ptx -ptx-version=2.0 | grep ".version 2.0" +; RUN: llc < %s -march=ptx -ptx-target=sm_20 | grep ".target sm_20" + +define ptx_device void @t1() { + ret void +} From baldrick at free.fr Tue Nov 30 04:24:45 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 30 Nov 2010 11:24:45 +0100 Subject: [llvm-commits] [Review request] Natural loop computation speedup In-Reply-To: References: Message-ID: <4CF4D0ED.8060407@free.fr> Hi Cameron, > This was a 16% speedup running loops on test-suite + SPEC2000. dense map iterators are invalidated when new values are inserted. Did you audit the code to check that this is not a problem? If in doubt, you could build LLVM with expensive checks enabled and check that nothing blows up in the testsuite. Ciao, Duncan. From foldr at codedgers.com Tue Nov 30 04:28:08 2010 From: foldr at codedgers.com (Mikhail Glushenkov) Date: Tue, 30 Nov 2010 11:28:08 +0100 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> Message-ID: <20101130102808.GA11987@localhost.localdomain> Hi, On Tue, Nov 30, 2010 at 01:05:21AM -0800, Eric Christopher wrote: > > I don't think it's the right direction for the support either. I think what I > outlined above may be a better route. I can try to get a better roadmap or > list of things that need to be done for you if you're interested in going the > way I'm thinking? Yes, I'm interested. Maintaining so much target-specific information in the driver does not sound fun, and implementing this feature properly will save me time in the long run. -- () ascii ribbon campaign - against html e-mail /\ www.asciiribbon.org - against proprietary attachments From baldrick at free.fr Tue Nov 30 04:41:34 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 30 Nov 2010 11:41:34 +0100 Subject: [llvm-commits] [llvm] r120398 - in /llvm/trunk: lib/Transforms/Scalar/SimplifyLibCalls.cpp test/Transforms/SimplifyLibCalls/Puts.ll In-Reply-To: <20101130061918.3280A2A6C12D@llvm.org> References: <20101130061918.3280A2A6C12D@llvm.org> Message-ID: <4CF4D4DE.8070200@free.fr> Hi Anders, > +struct PutsOpt : public LibCallOptimization { > + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { > + // Require one fixed pointer argument and an integer/void result. is it correct to allow puts with a void result? Mightn't this be a sign that it is not the puts library function, but something else? > +define void @foo() { > +entry: > +; CHECK: call i32 @putchar(i32 10) > + %call = call i32 @puts(i8* getelementptr inbounds ([1 x i8]* @.str, i32 0, i32 0)) > + ret void > +} Since %call is not used, this doesn't check the code that converts the result of the call. Ciao, Duncan. From baldrick at free.fr Tue Nov 30 04:44:10 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 30 Nov 2010 11:44:10 +0100 Subject: [llvm-commits] [llvm] r120388 - in /llvm/trunk: docs/LangRef.html include/llvm/Intrinsics.td In-Reply-To: <20101130041341.B89BB2A6C12D@llvm.org> References: <20101130041341.B89BB2A6C12D@llvm.org> Message-ID: <4CF4D57A.6080601@free.fr> Hi Nick, > Make @llvm.invariant.start not be readonly, so that it has side-effects. This > unbreaks test/Transforms/InstCombine/invariant.ll which was broken by r120382. > This is a fix-forward to do what I think Chris intended. mightn't this pessimize code? Ciao, Duncan. From dmalyshev at accesssoftek.com Tue Nov 30 07:13:42 2010 From: dmalyshev at accesssoftek.com (Danil Malyshev) Date: Tue, 30 Nov 2010 05:13:42 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> Message-ID: <6AE1604EE3EC5F4296C096518C6B77EE1705A19BB4@mail.accesssoftek.com> Hello Chris, > I don't understand or have an opinion on the archive tests though, can you explain it more? Can someone on windows review them? I apologize that I have not written in detail about the changes in the tests. llvm-ar console output have Unix EOL style after my fix. Archive tests use *.toc files for compare llvm-ar console output. This files have Windows EOL style in the Windows OS because have property svn:eol-style=native. So after my fix Archive tests will fails in the Windows. I think, the best solution to this problem is delete property svn:eol-style=native in *.toc files, because the Subversion store files with this property in the Unix style. Thank you, Danil ________________________________ From: Chris Lattner [mailto:clattner at apple.com] Sent: Tuesday, November 30, 2010 2:06 AM To: Danil Malyshev Cc: llvm-commits LLVM Subject: Re: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW On Nov 29, 2010, at 11:38 AM, Danil Malyshev wrote: Hello Jakob, > Can you find a way of doing this without increasing the size of the raw_ostream object, and without imposing any overhead on users that don't need it? Ok, I did it. Attached file fix-cout-02.diff is the new patch. It change only llvm-ar, llvm-ranlib, and attributes of *.toc files in Archive tests. The llvm-ar and llvm-ranlib changes look great, committed in r120341. I also removed the #include of , saving us a static ctor. I don't understand or have an opinion on the archive tests though, can you explain it more? Can someone on windows review them? -Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/0e63737b/attachment.html From baldrick at free.fr Tue Nov 30 08:14:56 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 30 Nov 2010 14:14:56 -0000 Subject: [llvm-commits] [dragonegg] r120427 - in /dragonegg/trunk: darwin/llvm-os.h linux/llvm-os.h llvm-abi-default.cpp llvm-abi.h llvm-backend.cpp llvm-cache.h llvm-convert.cpp llvm-debug.cpp llvm-debug.h llvm-internal.h llvm-types.cpp utils/target.cpp x86/llvm-target.cpp x86/llvm-target.h Message-ID: <20101130141456.938472A6C12D@llvm.org> Author: baldrick Date: Tue Nov 30 08:14:56 2010 New Revision: 120427 URL: http://llvm.org/viewvc/llvm-project?rev=120427&view=rev Log: Correct copyright notices: (1) These files are no longer part of GCC, so refer to DragonEgg rather than GCC; (2) Copyright was never assigned to the Free Software Foundation according to Chris (and he should know), so change the copyright lines to refer to the people who contributed to the file (to make life simpler for myself I mentioned the person noted as having added the file, myself and "et al" if others were involved; if you feel someone else should have been mentioned please let me know) rather than to the Free Software Foundation; (3) Update the list of years in the copyright statement; (4) Correct the address of the Free Software Foundation. While there, uniformize the style along the lines of what is done in LLVM itself. Needless to say the licence is not changed in any way: still GPL, v2 or later. Modified: dragonegg/trunk/darwin/llvm-os.h dragonegg/trunk/linux/llvm-os.h dragonegg/trunk/llvm-abi-default.cpp dragonegg/trunk/llvm-abi.h dragonegg/trunk/llvm-backend.cpp dragonegg/trunk/llvm-cache.h dragonegg/trunk/llvm-convert.cpp dragonegg/trunk/llvm-debug.cpp dragonegg/trunk/llvm-debug.h dragonegg/trunk/llvm-internal.h dragonegg/trunk/llvm-types.cpp dragonegg/trunk/utils/target.cpp dragonegg/trunk/x86/llvm-target.cpp dragonegg/trunk/x86/llvm-target.h Modified: dragonegg/trunk/darwin/llvm-os.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/darwin/llvm-os.h?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/darwin/llvm-os.h (original) +++ dragonegg/trunk/darwin/llvm-os.h Tue Nov 30 08:14:56 2010 @@ -1,22 +1,24 @@ -/* Darwin specific definitions -Copyright (C) 2009 Free Software Foundation, Inc. - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +//===--------- llvm-os.h - Darwin specific definitions ----------*- C++ -*-===// +// +// Copyright (C) 2009, 2010 Duncan Sands et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// This file provides Darwin specific declarations. +//===----------------------------------------------------------------------===// #ifndef LLVM_OS_H #define LLVM_OS_H Modified: dragonegg/trunk/linux/llvm-os.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/linux/llvm-os.h?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/linux/llvm-os.h (original) +++ dragonegg/trunk/linux/llvm-os.h Tue Nov 30 08:14:56 2010 @@ -1,22 +1,24 @@ -/* Linux specific definitions -Copyright (C) 2009 Free Software Foundation, Inc. - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +//===---------- llvm-os.h - Linux specific definitions ----------*- C++ -*-===// +// +// Copyright (C) 2009, 2010 Duncan Sands et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// This file provides Linux specific declarations. +//===----------------------------------------------------------------------===// #ifndef LLVM_OS_H #define LLVM_OS_H Modified: dragonegg/trunk/llvm-abi-default.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-abi-default.cpp?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-abi-default.cpp (original) +++ dragonegg/trunk/llvm-abi-default.cpp Tue Nov 30 08:14:56 2010 @@ -1,3 +1,25 @@ +//===--------- llvm-abi-default.cpp - Default ABI implementation ----------===// +// +// Copyright (C) 2010 Rafael Espindola, Duncan Sands et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// This file implements the default ABI. +//===----------------------------------------------------------------------===// + // Plugin headers #include "llvm-abi.h" Modified: dragonegg/trunk/llvm-abi.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-abi.h?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-abi.h (original) +++ dragonegg/trunk/llvm-abi.h Tue Nov 30 08:14:56 2010 @@ -1,28 +1,26 @@ -/* Processor ABI customization hooks -Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. -Contributed by Chris Lattner (sabre at nondot.org) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - +//===------ llvm-abi.h - Processor ABI customization hooks ------*- C++ -*-===// +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Chris Lattner, Duncan Sands +// et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// //===----------------------------------------------------------------------===// -// This is a C++ header file that specifies how argument values are passed and -// returned from function calls. This allows the target to specialize handling -// of things like how structures are passed by-value. +// This file specifies how argument values are passed and returned from function +// calls. This allows the target to specialize handling of things like how +// structures are passed by-value. //===----------------------------------------------------------------------===// #ifndef LLVM_ABI_H Modified: dragonegg/trunk/llvm-backend.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-backend.cpp?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-backend.cpp (original) +++ dragonegg/trunk/llvm-backend.cpp Tue Nov 30 08:14:56 2010 @@ -1,23 +1,25 @@ -/* High-level LLVM backend interface -Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. -Contributed by Chris Lattner (sabre at nondot.org) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +//===-------- llvm-backend.cpp - High-level LLVM backend interface --------===// +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Chris Lattner, Duncan Sands +// et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// This file defines the high-level LLVM backend interface. +//===----------------------------------------------------------------------===// // Plugin headers extern "C" { Modified: dragonegg/trunk/llvm-cache.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-cache.h?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-cache.h (original) +++ dragonegg/trunk/llvm-cache.h Tue Nov 30 08:14:56 2010 @@ -1,29 +1,27 @@ -/* Caching values "in" trees -Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. -Contributed by Chris Lattner (sabre at nondot.org) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -/*===----------------------------------------------------------------------=== - This code lets you to associate a void* with a tree, as if it were cached - inside the tree: if the tree is garbage collected and reallocated, then the - cached value will have been cleared. - ===----------------------------------------------------------------------===*/ +/*===-------- llvm-cache.h - Caching values "in" GCC trees --------*- C -*-===*\ +|* *| +|* Copyright (C) 2009, 2010 Duncan Sands. *| +|* *| +|* This file is part of DragonEgg. *| +|* *| +|* DragonEgg is free software; you can redistribute it and/or modify it under *| +|* the terms of the GNU General Public License as published by the Free *| +|* Software Foundation; either version 2, or (at your option) any later *| +|* version. *| +|* *| +|* DragonEgg is distributed in the hope that it will be useful, but WITHOUT *| +|* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *| +|* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *| +|* more details. *| +|* You should have received a copy of the GNU General Public License along *| +|* with DragonEgg; see the file COPYING. If not, write to the Free Software *| +|* Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. *| +|* *| +|*===----------------------------------------------------------------------===*| +|* This code lets you to associate a void* with a tree, as if it were cached *| +|* inside the tree: if the tree is garbage collected and reallocated, then *| +|* the cached value will have been cleared. *| +\*===----------------------------------------------------------------------===*/ #ifndef LLVM_CACHE_H #define LLVM_CACHE_H Modified: dragonegg/trunk/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-convert.cpp (original) +++ dragonegg/trunk/llvm-convert.cpp Tue Nov 30 08:14:56 2010 @@ -1,24 +1,22 @@ -/* High-level LLVM backend interface -Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. -Contributed by Chris Lattner (sabre at nondot.org) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - +//===---------- llvm-convert.cpp - Converting gimple to LLVM IR -----------===// +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Chris Lattner, Duncan Sands +// et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// //===----------------------------------------------------------------------===// // This is the code that converts GCC AST nodes into LLVM code. //===----------------------------------------------------------------------===// Modified: dragonegg/trunk/llvm-debug.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-debug.cpp?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-debug.cpp (original) +++ dragonegg/trunk/llvm-debug.cpp Tue Nov 30 08:14:56 2010 @@ -1,26 +1,24 @@ -/* High-level LLVM backend interface -Copyright (C) 2005 Free Software Foundation, Inc. -Contributed by Jim Laskey (jlaskey at apple.com) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - +//===------------ llvm-debug.cpp - Debug information gathering ------------===// +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Jim Laskey, Duncan Sands +// et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// //===----------------------------------------------------------------------===// -// This is a C++ source file that implements the debug information gathering. +// This file implements debug information gathering. //===----------------------------------------------------------------------===// // Plugin headers Modified: dragonegg/trunk/llvm-debug.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-debug.h?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-debug.h (original) +++ dragonegg/trunk/llvm-debug.h Tue Nov 30 08:14:56 2010 @@ -1,27 +1,23 @@ -/* Internal interfaces between the LLVM backend components -Copyright (C) 2006 Free Software Foundation, Inc. -Contributed by Jim Laskey (jlaskey at apple.com) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - +//===---- llvm-debug.h - Interface for generating debug info ----*- C++ -*-===// +// +// Copyright (C) 2006, 2007, 2008, 2009, 2010 Jim Laskey, Duncan Sands et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// //===----------------------------------------------------------------------===// -// This is a C++ header file that defines the debug interfaces shared among -// the llvm-*.cpp files. +// This file declares the debug interfaces shared among the dragonegg files. //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUG_H Modified: dragonegg/trunk/llvm-internal.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-internal.h (original) +++ dragonegg/trunk/llvm-internal.h Tue Nov 30 08:14:56 2010 @@ -1,27 +1,24 @@ -/* Internal interfaces between the LLVM backend components -Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. -Contributed by Chris Lattner (sabre at nondot.org) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - +//=-- llvm-internal.h - Interface between the backend components --*- C++ -*-=// +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Chris Lattner, Duncan Sands +// et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// //===----------------------------------------------------------------------===// -// This is a C++ header file that defines the internal interfaces shared among -// the llvm-*.cpp files. +// This file declares the internal interfaces shared among the dragonegg files. //===----------------------------------------------------------------------===// #ifndef LLVM_INTERNAL_H Modified: dragonegg/trunk/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-types.cpp?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/llvm-types.cpp (original) +++ dragonegg/trunk/llvm-types.cpp Tue Nov 30 08:14:56 2010 @@ -1,24 +1,22 @@ -/* Tree type to LLVM type converter -Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. -Contributed by Chris Lattner (sabre at nondot.org) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - +//===--------- llvm-type.cpp - Converting GCC types to LLVM types ---------===// +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Chris Lattner, Duncan Sands +// et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// //===----------------------------------------------------------------------===// // This is the code that converts GCC tree types into LLVM types. //===----------------------------------------------------------------------===// Modified: dragonegg/trunk/utils/target.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/utils/target.cpp?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/utils/target.cpp (original) +++ dragonegg/trunk/utils/target.cpp Tue Nov 30 08:14:56 2010 @@ -1,6 +1,27 @@ -#include +//===---- llvm-target.cpp - Utility for getting info about the target -----===// +// +// Copyright (C) 2009, 2010 Duncan Sands. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// Utility program for getting information about the system that GCC targets. +//===----------------------------------------------------------------------===// #include +#include using namespace llvm; Modified: dragonegg/trunk/x86/llvm-target.cpp URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/x86/llvm-target.cpp?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/x86/llvm-target.cpp (original) +++ dragonegg/trunk/x86/llvm-target.cpp Tue Nov 30 08:14:56 2010 @@ -1,26 +1,24 @@ -/* High-level LLVM backend interface -Copyright (C) 2005 Free Software Foundation, Inc. -Contributed by Evan Cheng (evan.cheng at apple.com) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - +//===------------ llvm-target.cpp - Implements the IA-32 ABI. -------------===// +// +// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Evan Cheng, Duncan Sands +// et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// //===----------------------------------------------------------------------===// -// This is a C++ source file that implements specific llvm IA-32 ABI. +// This file implements specific LLVM IA-32 ABI. //===----------------------------------------------------------------------===// // Plugin headers Modified: dragonegg/trunk/x86/llvm-target.h URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/x86/llvm-target.h?rev=120427&r1=120426&r2=120427&view=diff ============================================================================== --- dragonegg/trunk/x86/llvm-target.h (original) +++ dragonegg/trunk/x86/llvm-target.h Tue Nov 30 08:14:56 2010 @@ -1,23 +1,24 @@ -/* Some target-specific hooks for gcc->llvm conversion -Copyright (C) 2007 Free Software Foundation, Inc. -Contributed by Anton Korobeynikov (asl at math.spbu.ru) - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +//==-- llvm-target.h - Target hooks for GCC to LLVM conversion ---*- C++ -*-==// +// +// Copyright (C) 2007, 2008, 2009, 2010 Anton Korobeynikov, Duncan Sands et al. +// +// This file is part of DragonEgg. +// +// DragonEgg is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2, or (at your option) any later version. +// +// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// DragonEgg; see the file COPYING. If not, write to the Free Software +// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA. +// +//===----------------------------------------------------------------------===// +// This file declares some target-specific hooks for GCC to LLVM conversion. +//===----------------------------------------------------------------------===// #ifndef LLVM_TARGET_H #define LLVM_TARGET_H From geek4civic at gmail.com Tue Nov 30 08:39:37 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Tue, 30 Nov 2010 23:39:37 +0900 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: <6AE1604EE3EC5F4296C096518C6B77EE1705A19BB4@mail.accesssoftek.com> References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> <6AE1604EE3EC5F4296C096518C6B77EE1705A19BB4@mail.accesssoftek.com> Message-ID: Good evening Danil. We should not rely on svn:eol-style nor eol-intolerant diff.exe. Some person does not use CRLF(eol-style=native) on windows (me, too). I propose a patch. It is FileCheck-ized. ...Takumi -------------- next part -------------- From 9497f70ba36a038a3b2536de7031e5ed6821ca3d Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 30 Sep 2010 00:33:10 +0900 Subject: [PATCH] test/Archive: FileCheck-ize, and remove *.toc --- test/Archive/GNU.toc | 4 ---- test/Archive/MacOSX.toc | 5 ----- test/Archive/SVR4.toc | 4 ---- test/Archive/toc_GNU.ll | 7 +++++-- test/Archive/toc_MacOSX.ll | 8 ++++++-- test/Archive/toc_SVR4.ll | 7 +++++-- test/Archive/toc_xpg4.ll | 7 +++++-- test/Archive/xpg4.toc | 4 ---- 8 files changed, 21 insertions(+), 25 deletions(-) delete mode 100644 test/Archive/GNU.toc delete mode 100644 test/Archive/MacOSX.toc delete mode 100644 test/Archive/SVR4.toc delete mode 100644 test/Archive/xpg4.toc diff --git a/test/Archive/GNU.toc b/test/Archive/GNU.toc deleted file mode 100644 index d993413..0000000 --- a/test/Archive/GNU.toc +++ /dev/null @@ -1,4 +0,0 @@ -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o diff --git a/test/Archive/MacOSX.toc b/test/Archive/MacOSX.toc deleted file mode 100644 index f971df7..0000000 --- a/test/Archive/MacOSX.toc +++ /dev/null @@ -1,5 +0,0 @@ -__.SYMDEF SORTED -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o diff --git a/test/Archive/SVR4.toc b/test/Archive/SVR4.toc deleted file mode 100644 index d993413..0000000 --- a/test/Archive/SVR4.toc +++ /dev/null @@ -1,4 +0,0 @@ -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o diff --git a/test/Archive/toc_GNU.ll b/test/Archive/toc_GNU.ll index 136f603..9ed7d8e 100644 --- a/test/Archive/toc_GNU.ll +++ b/test/Archive/toc_GNU.ll @@ -1,5 +1,8 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;GNU style archives -;RUN: llvm-ar t %p/GNU.a > %t1 -;RUN: diff %t1 %p/GNU.toc +;RUN: llvm-ar t %p/GNU.a | FileCheck %s +;CHECK: evenlen +;CHECK-NEXT: oddlen +;CHECK-NEXT: very_long_bytecode_file_name.bc +;CHECK-NEXT: IsNAN.o diff --git a/test/Archive/toc_MacOSX.ll b/test/Archive/toc_MacOSX.ll index fb03223..6dbc9d2 100644 --- a/test/Archive/toc_MacOSX.ll +++ b/test/Archive/toc_MacOSX.ll @@ -1,5 +1,9 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;MacOSX style archives -;RUN: llvm-ar t %p/MacOSX.a > %t1 -;RUN: diff %t1 %p/MacOSX.toc +;RUN: llvm-ar t %p/MacOSX.a | FileCheck %s +;CHECK: __.SYMDEF SORTED +;CHECK-NEXT: evenlen +;CHECK-NEXT: oddlen +;CHECK-NEXT: very_long_bytecode_file_name.bc +;CHECK-NEXT: IsNAN.o diff --git a/test/Archive/toc_SVR4.ll b/test/Archive/toc_SVR4.ll index 930a26f..d447b92 100644 --- a/test/Archive/toc_SVR4.ll +++ b/test/Archive/toc_SVR4.ll @@ -1,5 +1,8 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;SVR4 style archives -;RUN: llvm-ar t %p/SVR4.a > %t1 -;RUN: diff %t1 %p/SVR4.toc +;RUN: llvm-ar t %p/SVR4.a | FileCheck %s +;CHECK: evenlen +;CHECK-NEXT: oddlen +;CHECK-NEXT: very_long_bytecode_file_name.bc +;CHECK-NEXT: IsNAN.o diff --git a/test/Archive/toc_xpg4.ll b/test/Archive/toc_xpg4.ll index 441af03..fd875ee 100644 --- a/test/Archive/toc_xpg4.ll +++ b/test/Archive/toc_xpg4.ll @@ -1,5 +1,8 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;xpg4 style archives -;RUN: llvm-ar t %p/xpg4.a > %t1 -;RUN: diff %t1 %p/xpg4.toc +;RUN: llvm-ar t %p/xpg4.a | FileCheck %s +CHECK: evenlen +CHECK-NEXT: oddlen +CHECK-NEXT: very_long_bytecode_file_name.bc +CHECK-NEXT: IsNAN.o diff --git a/test/Archive/xpg4.toc b/test/Archive/xpg4.toc deleted file mode 100644 index d993413..0000000 --- a/test/Archive/xpg4.toc +++ /dev/null @@ -1,4 +0,0 @@ -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o -- 1.7.1.GIT From jay.foad at gmail.com Tue Nov 30 09:14:44 2010 From: jay.foad at gmail.com (Jay Foad) Date: Tue, 30 Nov 2010 15:14:44 +0000 Subject: [llvm-commits] [PATCH] Bug 5207: make APInt set(), clear() and flip() return void In-Reply-To: References: <83AE4010-3184-4075-8F82-2B006FDC0D12@apple.com> Message-ID: On 30 November 2010 09:04, Jay Foad wrote: >> Looks great to me, please commit. ?I'd also suggest renaming the methods to "setAllBits()" "clearAllBits" "flipAllBits" etc. ?Thanks for working on this Jay! > The methods are overloaded. We have: > > void set(); // set all bits > void set(unsigned); // set a single bit > > ... and likewise for clear() and flip(). So maybe rename them to > setAllBits() and setBit(unsigned) respectively? Patch attached. It passes "make check". Do you like? Jay. -------------- next part -------------- A non-text attachment was scrubbed... Name: setallbits.diff Type: text/x-patch Size: 19020 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/9f2f1b4d/attachment-0001.bin From clattner at apple.com Tue Nov 30 11:07:48 2010 From: clattner at apple.com (Chris Lattner) Date: Tue, 30 Nov 2010 09:07:48 -0800 Subject: [llvm-commits] [llvm] r120398 - in /llvm/trunk: lib/Transforms/Scalar/SimplifyLibCalls.cpp test/Transforms/SimplifyLibCalls/Puts.ll In-Reply-To: <4CF4D4DE.8070200@free.fr> References: <20101130061918.3280A2A6C12D@llvm.org> <4CF4D4DE.8070200@free.fr> Message-ID: <2FB6EFAA-998F-4D2E-A655-CE5DA6F9C236@apple.com> On Nov 30, 2010, at 2:41 AM, Duncan Sands wrote: > Hi Anders, > >> +struct PutsOpt : public LibCallOptimization { >> + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { >> + // Require one fixed pointer argument and an integer/void result. > > is it correct to allow puts with a void result? Mightn't this be a sign that > it is not the puts library function, but something else? That or that code used an (incorrect) explicit declaration, which happens all the time. If it is something else, then the code is undefined and we've already lost. This is one the of assumptions that simplifylibcalls makes. -Chris From clattner at apple.com Tue Nov 30 11:08:55 2010 From: clattner at apple.com (Chris Lattner) Date: Tue, 30 Nov 2010 09:08:55 -0800 Subject: [llvm-commits] [PATCH] Bug 5207: make APInt set(), clear() and flip() return void In-Reply-To: References: <83AE4010-3184-4075-8F82-2B006FDC0D12@apple.com> Message-ID: <9F8E6DB2-9439-462E-B42F-FC34F9CAED26@apple.com> On Nov 30, 2010, at 7:14 AM, Jay Foad wrote: > On 30 November 2010 09:04, Jay Foad wrote: >>> Looks great to me, please commit. I'd also suggest renaming the methods to "setAllBits()" "clearAllBits" "flipAllBits" etc. Thanks for working on this Jay! > >> The methods are overloaded. We have: >> >> void set(); // set all bits >> void set(unsigned); // set a single bit >> >> ... and likewise for clear() and flip(). So maybe rename them to >> setAllBits() and setBit(unsigned) respectively? > > Patch attached. It passes "make check". Do you like? Looks great! From anton at korobeynikov.info Tue Nov 30 11:29:57 2010 From: anton at korobeynikov.info (Anton Korobeynikov) Date: Tue, 30 Nov 2010 20:29:57 +0300 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> Message-ID: Hi Eric, > This is probably an involved task - it'll probably involve doing things like separating out instruction itineraries from the processor description for ARM, making sure that things that call into the backend use the tuning information if it's requested as opposed to the architecture information, etc. Isn't this just a matter of attributes aliases? E.g. armv6 would be translated into arm + v6 attr and so on? I dunno whether this is the similar in MIPS world, you definitely know better :) -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University From clattner at apple.com Tue Nov 30 12:13:00 2010 From: clattner at apple.com (Chris Lattner) Date: Tue, 30 Nov 2010 10:13:00 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> <6AE1604EE3EC5F4296C096518C6B77EE1705A19BB4@mail.accesssoftek.com> Message-ID: On Nov 30, 2010, at 6:39 AM, NAKAMURA Takumi wrote: > Good evening Danil. > > We should not rely on svn:eol-style nor eol-intolerant diff.exe. > Some person does not use CRLF(eol-style=native) on windows (me, too). > > I propose a patch. It is FileCheck-ized. Looks great to me! Please apply, -Chris From sabre at nondot.org Tue Nov 30 12:12:52 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 18:12:52 -0000 Subject: [llvm-commits] [llvm] r120435 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp lib/CodeGen/SelectionDAG/TargetLowering.cpp Message-ID: <20101130181253.175F02A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 12:12:52 2010 New Revision: 120435 URL: http://llvm.org/viewvc/llvm-project?rev=120435&view=rev Log: add TLI support indicating that jumps are more expensive than logical operations and use this to disable a specific optimization. Patch by Micah Villmow! Modified: llvm/trunk/include/llvm/Target/TargetLowering.h llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Modified: llvm/trunk/include/llvm/Target/TargetLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=120435&r1=120434&r2=120435&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetLowering.h (original) +++ llvm/trunk/include/llvm/Target/TargetLowering.h Tue Nov 30 12:12:52 2010 @@ -125,6 +125,10 @@ /// srl/add/sra. bool isPow2DivCheap() const { return Pow2DivIsCheap; } + /// isJumpExpensive() - Return true if Flow Control is an expensive operation + /// that should be avoided. + bool isJumpExpensive() const { return JumpIsExpensive; } + /// getSetCCResultType - Return the ValueType of the result of SETCC /// operations. Also used to obtain the target's preferred type for /// the condition operand of SELECT and BRCOND nodes. In the case of @@ -1013,7 +1017,16 @@ /// SelectIsExpensive - Tells the code generator not to expand operations /// into sequences that use the select operations if possible. - void setSelectIsExpensive() { SelectIsExpensive = true; } + void setSelectIsExpensive(bool isExpensive = true) { + SelectIsExpensive = isExpensive; + } + + /// JumpIsExpensive - Tells the code generator not to expand sequence of + /// operations into a seperate sequences that increases the amount of + /// flow control. + void setJumpIsExpensive(bool isExpensive = true) { + JumpIsExpensive = isExpensive; + } /// setIntDivIsCheap - Tells the code generator that integer divide is /// expensive, and if possible, should be replaced by an alternate sequence @@ -1597,6 +1610,11 @@ /// it. bool Pow2DivIsCheap; + /// JumpIsExpensive - Tells the code generator that it shouldn't generate + /// extra flow control instructions and should attempt to combine flow + /// control instructions via predication. + bool JumpIsExpensive; + /// UseUnderscoreSetJmp - This target prefers to use _setjmp to implement /// llvm.setjmp. Defaults to false. bool UseUnderscoreSetJmp; Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=120435&r1=120434&r2=120435&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Tue Nov 30 12:12:52 2010 @@ -1403,6 +1403,7 @@ // If this is a series of conditions that are or'd or and'd together, emit // this as a sequence of branches instead of setcc's with and/or operations. + // As long as jumps are not expensive, this should improve performance. // For example, instead of something like: // cmp A, B // C = seteq @@ -1417,7 +1418,8 @@ // jle foo // if (const BinaryOperator *BOp = dyn_cast(CondVal)) { - if (BOp->hasOneUse() && + if (!TLI.isJumpExpensive() && + BOp->hasOneUse() && (BOp->getOpcode() == Instruction::And || BOp->getOpcode() == Instruction::Or)) { FindMergedConditions(BOp, Succ0MBB, Succ1MBB, BrMBB, BrMBB, Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=120435&r1=120434&r2=120435&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Tue Nov 30 12:12:52 2010 @@ -572,6 +572,7 @@ SelectIsExpensive = false; IntDivIsCheap = false; Pow2DivIsCheap = false; + JumpIsExpensive = false; StackPointerRegisterToSaveRestore = 0; ExceptionPointerRegister = 0; ExceptionSelectorRegister = 0; From clattner at apple.com Tue Nov 30 12:15:25 2010 From: clattner at apple.com (Chris Lattner) Date: Tue, 30 Nov 2010 10:15:25 -0800 Subject: [llvm-commits] Patch for Bug7696 In-Reply-To: References: <3196F70D-8F3A-4836-940C-AB151333D0BD@apple.com> <9FD2A1AA-071C-48C2-9EDE-B521F62ECC10@apple.com> Message-ID: On Nov 29, 2010, at 4:24 PM, Villmow, Micah wrote: > Here is a new patch. This is against Rev120359(TOT around 4pm). > > This includes the comments from Chris about spaces and periods. Applied in r120435, thanks Micah! -Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/6041a097/attachment.html From resistor at mac.com Tue Nov 30 12:15:21 2010 From: resistor at mac.com (Owen Anderson) Date: Tue, 30 Nov 2010 18:15:21 -0000 Subject: [llvm-commits] [llvm] r120436 - /llvm/trunk/test/MC/ARM/thumb2.s Message-ID: <20101130181521.C4A7A2A6C12D@llvm.org> Author: resistor Date: Tue Nov 30 12:15:21 2010 New Revision: 120436 URL: http://llvm.org/viewvc/llvm-project?rev=120436&view=rev Log: Add tests for more forms of Thumb2 loads and stores. Modified: llvm/trunk/test/MC/ARM/thumb2.s Modified: llvm/trunk/test/MC/ARM/thumb2.s URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb2.s?rev=120436&r1=120435&r2=120436&view=diff ============================================================================== --- llvm/trunk/test/MC/ARM/thumb2.s (original) +++ llvm/trunk/test/MC/ARM/thumb2.s Tue Nov 30 12:15:21 2010 @@ -130,3 +130,35 @@ ldr r2, [r0, #-64]! @ CHECK: ldrsb r2, [r0, #4]! @ encoding: [0x04,0x2f,0x10,0xf9] ldrsb r2, [r0, #4]! + +@ CHECK: strb.w r0, [r1, #4092] @ encoding: [0xfc,0x0f,0x81,0xf8] + strb.w r0, [r1, #4092] +@ CHECK: strb r0, [r1, #-128] @ encoding: [0x80,0x0c,0x01,0xf8] + strb r0, [r1, #-128] +@ CHECK: strb.w r0, [r1, r2, lsl #2] @ encoding: [0x22,0x00,0x01,0xf8] + strb.w r0, [r1, r2, lsl #2] +@ CHECK: strh.w r0, [r1, #4092] @ encoding: [0xfc,0x0f,0xa1,0xf8] + strh.w r0, [r1, #4092] +@ CHECK: strh r0, [r1, #-128] @ encoding: [0x80,0x0c,0x21,0xf8] + strh r0, [r1, #-128] +@ CHECK: strh r0, [r1, #-128] @ encoding: [0x80,0x0c,0x21,0xf8] + strh r0, [r1, #-128] +@ CHECK: strh.w r0, [r1, r2, lsl #2] @ encoding: [0x22,0x00,0x21,0xf8] + strh.w r0, [r1, r2, lsl #2] + +@ CHECK: ldrb r0, [r0, #-1] @ encoding: [0x01,0x0c,0x10,0xf8] + ldrb r0, [r0, #-1] +@ CHECK: ldrb r0, [r0, #-128] @ encoding: [0x80,0x0c,0x10,0xf8] + ldrb r0, [r0, #-128] +@ CHECK: ldrb.w r0, [r0, r1, lsl #2] @ encoding: [0x21,0x00,0x10,0xf8] + ldrb.w r0, [r0, r1, lsl #2] +@ CHECK: ldrh.w r0, [r0, #2046] @ encoding: [0xfe,0x07,0xb0,0xf8] + ldrh.w r0, [r0, #2046] +@ CHECK: ldrh r0, [r0, #-128] @ encoding: [0x80,0x0c,0x30,0xf8] + ldrh r0, [r0, #-128] +@ CHECK: ldrh.w r0, [r0, r1, lsl #2] @ encoding: [0x21,0x00,0x30,0xf8] + ldrh.w r0, [r0, r1, lsl #2] +@ CHECK: ldrsb.w r0, [r0] @ encoding: [0x00,0x00,0x90,0xf9] + ldrsb.w r0, [r0] +@ CHECK: ldrsh.w r0, [r0] @ encoding: [0x00,0x00,0xb0,0xf9] + ldrsh.w r0, [r0] From zwarich at apple.com Tue Nov 30 12:25:31 2010 From: zwarich at apple.com (Cameron Zwarich) Date: Tue, 30 Nov 2010 13:25:31 -0500 Subject: [llvm-commits] [Review request] Natural loop computation speedup In-Reply-To: <4CF4D0ED.8060407@free.fr> References: <4CF4D0ED.8060407@free.fr> Message-ID: <2285445A-9E5F-4BE0-A238-06ABFAF2D775@apple.com> On Nov 30, 2010, at 5:24 AM, Duncan Sands wrote: > Hi Cameron, > >> This was a 16% speedup running loops on test-suite + SPEC2000. > > dense map iterators are invalidated when new values are inserted. Did you > audit the code to check that this is not a problem? If in doubt, you could > build LLVM with expensive checks enabled and check that nothing blows up in > the testsuite. There are no iterators actually used for iteration (except in #if 0 code, and that one is fine), only for find() and only internal to LoopInfo, so it should be fine. Are there any expensive checks that invalidated iterators are not being used? I don't see them in DenseMap.h. Cameron From clattner at apple.com Tue Nov 30 12:28:26 2010 From: clattner at apple.com (Chris Lattner) Date: Tue, 30 Nov 2010 10:28:26 -0800 Subject: [llvm-commits] [Review request] Natural loop computation speedup In-Reply-To: References: Message-ID: <414D7328-1C8C-4CCF-9454-B802AE9B080B@apple.com> On Nov 30, 2010, at 12:00 AM, Cameron Zwarich wrote: > This was a 16% speedup running loops on test-suite + SPEC2000. Looks great to me! -Chris From grosbach at apple.com Tue Nov 30 12:30:20 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 18:30:20 -0000 Subject: [llvm-commits] [llvm] r120438 - in /llvm/trunk/lib/Target/ARM: ARMAsmPrinter.cpp ARMInstrFormats.td ARMInstrInfo.td Message-ID: <20101130183020.28D242A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 12:30:19 2010 New Revision: 120438 URL: http://llvm.org/viewvc/llvm-project?rev=120438&view=rev Log: Pseudo-ize BX_CALL and friends. Remove dead instruction format classes. rdar://8685712 Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120438&r1=120437&r2=120438&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Tue Nov 30 12:30:19 2010 @@ -806,6 +806,56 @@ } return; } + case ARM::BXr9_CALL: + case ARM::BX_CALL: { + { + MCInst TmpInst; + TmpInst.setOpcode(ARM::MOVr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::LR)); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + // Add 's' bit operand (always reg0 for this) + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + } + { + MCInst TmpInst; + TmpInst.setOpcode(ARM::BX); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + OutStreamer.EmitInstruction(TmpInst); + } + return; + } + case ARM::BMOVPCRXr9_CALL: + case ARM::BMOVPCRX_CALL: { + { + MCInst TmpInst; + TmpInst.setOpcode(ARM::MOVr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::LR)); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + // Add 's' bit operand (always reg0 for this) + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + } + { + MCInst TmpInst; + TmpInst.setOpcode(ARM::MOVr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + // Add 's' bit operand (always reg0 for this) + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + } + return; + } case ARM::tPICADD: { // This is a pseudo op for a label + instruction sequence, which looks like: // LPC0: @@ -978,6 +1028,9 @@ // Add predicate operands. TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); TmpInst.addOperand(MCOperand::CreateReg(0)); + // Add 's' bit operand (always reg0 for this) + if (Opc == ARM::MOVr) + TmpInst.addOperand(MCOperand::CreateReg(0)); OutStreamer.EmitInstruction(TmpInst); // Make sure the Thumb jump table is 4-byte aligned. Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120438&r1=120437&r2=120438&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Tue Nov 30 12:30:19 2010 @@ -352,10 +352,6 @@ asm, "", pattern> { let Inst{27-24} = opcod; } -class ABXIx2 pattern> - : XI; // BR_JT instructions class JTI pattern> - : I; - // loads @@ -1020,10 +1011,6 @@ string asm, list pattern> : Thumb2XI; -class T2Ix2 pattern> - : Thumb2I; - // Two-address instructions class T2XIt pattern> Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120438&r1=120437&r2=120438&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Tue Nov 30 12:30:19 2010 @@ -1230,6 +1230,7 @@ } // ARMV4 only + // FIXME: This should be a pseudo. def MOVPCRX : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "mov\tpc, $dst", [(brind GPR:$dst)]>, Requires<[IsARM, NoV4T]> { @@ -1278,25 +1279,14 @@ // ARMv4T // Note: Restrict $func to the tGPR regclass to prevent it being in LR. - // FIXME: x2 insn patterns like this need to be pseudo instructions. - def BX_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), - IIC_Br, "mov\tlr, pc\n\tbx\t$func", - [(ARMcall_nolink tGPR:$func)]>, - Requires<[IsARM, HasV4T, IsNotDarwin]> { - bits<4> func; - let Inst{27-4} = 0b000100101111111111110001; - let Inst{3-0} = func; - } + def BX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops), + Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>, + Requires<[IsARM, HasV4T, IsNotDarwin]>; // ARMv4 - def BMOVPCRX_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), - IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", - [(ARMcall_nolink tGPR:$func)]>, - Requires<[IsARM, NoV4T, IsNotDarwin]> { - bits<4> func; - let Inst{27-4} = 0b000110100000111100000000; - let Inst{3-0} = func; - } + def BMOVPCRX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops), + Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>, + Requires<[IsARM, NoV4T, IsNotDarwin]>; } let isCall = 1, @@ -1335,24 +1325,14 @@ // ARMv4T // Note: Restrict $func to the tGPR regclass to prevent it being in LR. - def BXr9_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), - IIC_Br, "mov\tlr, pc\n\tbx\t$func", - [(ARMcall_nolink tGPR:$func)]>, - Requires<[IsARM, HasV4T, IsDarwin]> { - bits<4> func; - let Inst{27-4} = 0b000100101111111111110001; - let Inst{3-0} = func; - } + def BXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops), + Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>, + Requires<[IsARM, HasV4T, IsDarwin]>; // ARMv4 - def BMOVPCRXr9_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops), - IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func", - [(ARMcall_nolink tGPR:$func)]>, - Requires<[IsARM, NoV4T, IsDarwin]> { - bits<4> func; - let Inst{27-4} = 0b000110100000111100000000; - let Inst{3-0} = func; - } + def BMOVPCRXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops), + Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>, + Requires<[IsARM, NoV4T, IsDarwin]>; } // Tail calls. From resistor at mac.com Tue Nov 30 12:38:28 2010 From: resistor at mac.com (Owen Anderson) Date: Tue, 30 Nov 2010 18:38:28 -0000 Subject: [llvm-commits] [llvm] r120439 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101130183828.4E6E52A6C12D@llvm.org> Author: resistor Date: Tue Nov 30 12:38:28 2010 New Revision: 120439 URL: http://llvm.org/viewvc/llvm-project?rev=120439&view=rev Log: Provide encodings for a few more load/store variants. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120439&r1=120438&r2=120439&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Tue Nov 30 12:38:28 2010 @@ -1396,8 +1396,8 @@ // for disassembly only. // Ref: A8.6.57 LDR (immediate, Thumb) Encoding T4 class T2IldT type, string opc, InstrItinClass ii> - : T2Ii8<(outs GPR:$dst), (ins t2addrmode_imm8:$addr), ii, opc, - "\t$dst, $addr", []> { + : T2Ii8<(outs GPR:$Rt), (ins t2addrmode_imm8:$addr), ii, opc, + "\t$Rt, $addr", []> { let Inst{31-27} = 0b11111; let Inst{26-25} = 0b00; let Inst{24} = signed; @@ -1406,6 +1406,12 @@ let Inst{20} = 1; // load let Inst{11} = 1; let Inst{10-8} = 0b110; // PUW. + + bits<4> Rt; + bits<13> addr; + let Inst{15-12} = Rt{3-0}; + let Inst{19-16} = addr{12-9}; + let Inst{7-0} = addr{7-0}; } def t2LDRT : T2IldT<0, 0b10, "ldrt", IIC_iLoad_i>; @@ -1476,8 +1482,8 @@ // only. // Ref: A8.6.193 STR (immediate, Thumb) Encoding T4 class T2IstT type, string opc, InstrItinClass ii> - : T2Ii8<(outs GPR:$src), (ins t2addrmode_imm8:$addr), ii, opc, - "\t$src, $addr", []> { + : T2Ii8<(outs GPR:$Rt), (ins t2addrmode_imm8:$addr), ii, opc, + "\t$Rt, $addr", []> { let Inst{31-27} = 0b11111; let Inst{26-25} = 0b00; let Inst{24} = 0; // not signed @@ -1486,6 +1492,12 @@ let Inst{20} = 0; // store let Inst{11} = 1; let Inst{10-8} = 0b110; // PUW + + bits<4> Rt; + bits<13> addr; + let Inst{15-12} = Rt{3-0}; + let Inst{19-16} = addr{12-9}; + let Inst{7-0} = addr{7-0}; } def t2STRT : T2IstT<0b10, "strt", IIC_iStore_i>; From zwarich at apple.com Tue Nov 30 12:51:19 2010 From: zwarich at apple.com (Cameron Zwarich) Date: Tue, 30 Nov 2010 18:51:19 -0000 Subject: [llvm-commits] [llvm] r120440 - /llvm/trunk/include/llvm/Analysis/LoopInfo.h Message-ID: <20101130185119.46E5C2A6C12D@llvm.org> Author: zwarich Date: Tue Nov 30 12:51:19 2010 New Revision: 120440 URL: http://llvm.org/viewvc/llvm-project?rev=120440&view=rev Log: Change the basic block map in LoopInfo from a std::map to a DenseMap. This is a 16% speedup running loops on test-suite + SPEC2000. Reviewed by Eric Christopher. Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h Modified: llvm/trunk/include/llvm/Analysis/LoopInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=120440&r1=120439&r2=120440&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/LoopInfo.h (original) +++ llvm/trunk/include/llvm/Analysis/LoopInfo.h Tue Nov 30 12:51:19 2010 @@ -32,6 +32,7 @@ #define LLVM_ANALYSIS_LOOP_INFO_H #include "llvm/Pass.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/GraphTraits.h" #include "llvm/ADT/SmallVector.h" @@ -629,7 +630,7 @@ template class LoopInfoBase { // BBMap - Mapping of basic blocks to the inner most loop they occur in - std::map BBMap; + DenseMap BBMap; std::vector TopLevelLoops; friend class LoopBase; @@ -660,7 +661,7 @@ /// block is in no loop (for example the entry node), null is returned. /// LoopT *getLoopFor(const BlockT *BB) const { - typename std::map::const_iterator I= + typename DenseMap::const_iterator I= BBMap.find(const_cast(BB)); return I != BBMap.end() ? I->second : 0; } @@ -728,7 +729,7 @@ /// including all of the Loop objects it is nested in and our mapping from /// BasicBlocks to loops. void removeBlock(BlockT *BB) { - typename std::map::iterator I = BBMap.find(BB); + typename DenseMap::iterator I = BBMap.find(BB); if (I != BBMap.end()) { for (LoopT *L = I->second; L; L = L->getParentLoop()) L->removeBlockFromLoop(BB); @@ -922,7 +923,7 @@ for (unsigned i = 0; i < TopLevelLoops.size(); ++i) TopLevelLoops[i]->print(OS); #if 0 - for (std::map::const_iterator I = BBMap.begin(), + for (DenseMap::const_iterator I = BBMap.begin(), E = BBMap.end(); I != E; ++I) OS << "BB '" << I->first->getName() << "' level = " << I->second->getLoopDepth() << "\n"; From grosbach at apple.com Tue Nov 30 12:56:13 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 18:56:13 -0000 Subject: [llvm-commits] [llvm] r120441 - /llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Message-ID: <20101130185613.52A512A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 12:56:13 2010 New Revision: 120441 URL: http://llvm.org/viewvc/llvm-project?rev=120441&view=rev Log: Delete a few no longer needed references to pseudos. Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=120441&r1=120440&r2=120441&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Tue Nov 30 12:56:13 2010 @@ -1570,10 +1570,6 @@ Name.find("CMNz") != std::string::npos */) return false; - // Ignore pseudo instructions. - if (Name == "BXr9" || Name == "BMOVPCRX" || Name == "BMOVPCRXr9") - return false; - // Tail calls are other patterns that generate existing instructions. if (Name == "TCRETURNdi" || Name == "TCRETURNdiND" || Name == "TCRETURNri" || Name == "TCRETURNriND" || From grosbach at apple.com Tue Nov 30 12:56:36 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 18:56:36 -0000 Subject: [llvm-commits] [llvm] r120442 - in /llvm/trunk/lib/Target/ARM: ARMAsmPrinter.cpp ARMInstrInfo.td Message-ID: <20101130185636.6DC9D2A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 12:56:36 2010 New Revision: 120442 URL: http://llvm.org/viewvc/llvm-project?rev=120442&view=rev Log: Pseudo-ize ARM MOVPCRX Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120442&r1=120441&r2=120442&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Tue Nov 30 12:56:36 2010 @@ -806,6 +806,19 @@ } return; } + case ARM::MOVPCRX: { + MCInst TmpInst; + TmpInst.setOpcode(ARM::MOVr); + TmpInst.addOperand(MCOperand::CreateReg(ARM::PC)); + TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg())); + // Add predicate operands. + TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL)); + TmpInst.addOperand(MCOperand::CreateReg(0)); + // Add 's' bit operand (always reg0 for this) + TmpInst.addOperand(MCOperand::CreateReg(0)); + OutStreamer.EmitInstruction(TmpInst); + return; + } case ARM::BXr9_CALL: case ARM::BX_CALL: { { Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120442&r1=120441&r2=120442&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Tue Nov 30 12:56:36 2010 @@ -1230,14 +1230,12 @@ } // ARMV4 only - // FIXME: This should be a pseudo. - def MOVPCRX : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "mov\tpc, $dst", - [(brind GPR:$dst)]>, - Requires<[IsARM, NoV4T]> { - bits<4> dst; - let Inst{31-4} = 0b1110000110100000111100000000; - let Inst{3-0} = dst; - } + // FIXME: We would really like to define this as a vanilla ARMPat like: + // ARMPat<(brind GPR:$dst), (MOVr PC, GPR:$dst)> + // With that, however, we can't set isBranch, isTerminator, etc.. + def MOVPCRX : ARMPseudoInst<(outs), (ins GPR:$dst), + Size4Bytes, IIC_Br, [(brind GPR:$dst)]>, + Requires<[IsARM, NoV4T]>; } // All calls clobber the non-callee saved registers. SP is marked as From grosbach at apple.com Tue Nov 30 13:00:13 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 19:00:13 -0000 Subject: [llvm-commits] [llvm] r120443 - /llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Message-ID: <20101130190013.A91662A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 13:00:13 2010 New Revision: 120443 URL: http://llvm.org/viewvc/llvm-project?rev=120443&view=rev Log: Tidy up. Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=120443&r1=120442&r2=120443&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Tue Nov 30 13:00:13 2010 @@ -1543,8 +1543,9 @@ TARGET_NAME_t TargetName; }; -bool ARMDecoderEmitter::ARMDEBackend::populateInstruction( - const CodeGenInstruction &CGI, TARGET_NAME_t TN) { +bool ARMDecoderEmitter:: +ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI, + TARGET_NAME_t TN) { const Record &Def = *CGI.TheDef; const StringRef Name = Def.getName(); uint8_t Form = getByteField(Def, "Form"); From grosbach at apple.com Tue Nov 30 13:08:32 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 19:08:32 -0000 Subject: [llvm-commits] [llvm] r120444 - /llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Message-ID: <20101130190832.756382A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 13:08:32 2010 New Revision: 120444 URL: http://llvm.org/viewvc/llvm-project?rev=120444&view=rev Log: The VLDMQ/VSTMQ instructions are reprented as true Pseudo-insts now (i.e., no extra encoding information), so we no longer need to special case them here. Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=120444&r1=120443&r2=120444&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Tue Nov 30 13:08:32 2010 @@ -1580,11 +1580,6 @@ Name == "MOVr_TC") return false; - // VLDMQ/VSTMQ can be handled with the more generic VLDMD/VSTMD. - if (Name == "VLDMQ" || Name == "VLDMQ_UPD" || - Name == "VSTMQ" || Name == "VSTMQ_UPD") - return false; - // // The following special cases are for conflict resolutions. // From sabre at nondot.org Tue Nov 30 13:12:10 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 19:12:10 -0000 Subject: [llvm-commits] [llvm] r120445 - in /llvm/trunk: lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/simple.ll Message-ID: <20101130191210.9AFFD2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 13:12:10 2010 New Revision: 120445 URL: http://llvm.org/viewvc/llvm-project?rev=120445&view=rev Log: enhance isRemovable to refuse to delete volatile mem transfers now that DSE hacks on them. This fixes a regression I introduced, by generalizing DSE to hack on transfers. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120445&r1=120444&r2=120445&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 13:12:10 2010 @@ -152,12 +152,27 @@ /// isRemovable - If the value of this instruction and the memory it writes to /// is unused, may we delete this instruction? static bool isRemovable(Instruction *I) { - assert(hasMemoryWrite(I)); - if (IntrinsicInst *II = dyn_cast(I)) - return II->getIntrinsicID() != Intrinsic::lifetime_end; + // Don't remove volatile stores. if (StoreInst *SI = dyn_cast(I)) return !SI->isVolatile(); - return true; + + IntrinsicInst *II = cast(I); + switch (II->getIntrinsicID()) { + default: assert(0 && "doesn't pass 'hasMemoryWrite' predicate"); + case Intrinsic::lifetime_end: + // Never remove dead lifetime_end's, e.g. because it is followed by a + // free. + return false; + case Intrinsic::init_trampoline: + // Always safe to remove init_trampoline. + return true; + + case Intrinsic::memset: + case Intrinsic::memmove: + case Intrinsic::memcpy: + // Don't remove volatile memory intrinsics. + return !cast(II)->isVolatile(); + } } /// getPointerOperand - Return the pointer that is being written to. Modified: llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll?rev=120445&r1=120444&r2=120445&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/simple.ll Tue Nov 30 13:12:10 2010 @@ -1,6 +1,12 @@ ; RUN: opt < %s -basicaa -dse -S | FileCheck %s target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" +declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind +declare void @llvm.memset.i64(i8*, i8, i64, i32) +declare void @llvm.memcpy.i64(i8*, i8*, i64, i32) +declare i8* @llvm.init.trampoline(i8*, i8*, i8*) + define void @test1(i32* %Q, i32* %P) { %DEAD = load i32* %Q store i32 %DEAD, i32* %P @@ -55,9 +61,6 @@ ; CHECK-NEXT: ret void } -declare void @llvm.memset.i64(i8*, i8, i64, i32) -declare void @llvm.memcpy.i64(i8*, i8*, i64, i32) - ; Should delete store of 10 even though memset is a may-store to P (P and Q may ; alias). define void @test6(i32 *%p, i8 *%q) { @@ -116,7 +119,6 @@ ; DSE should delete the dead trampoline. -declare i8* @llvm.init.trampoline(i8*, i8*, i8*) declare void @test11f() define void @test11() { ; CHECK: @test11 @@ -210,3 +212,13 @@ ; CHECK-NEXT: ret } +; Should not delete the volatile memset. +define void @test17v(i8* %P, i8* %Q) nounwind ssp { + tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 true) + tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) + ret void +; CHECK: @test17v +; CHECK-NEXT: call void @llvm.memset +; CHECK-NEXT: call void @llvm.memcpy +; CHECK-NEXT: ret +} From echristo at apple.com Tue Nov 30 13:14:07 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 19:14:07 -0000 Subject: [llvm-commits] [llvm] r120447 - /llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Message-ID: <20101130191407.7B3F22A6C12F@llvm.org> Author: echristo Date: Tue Nov 30 13:14:07 2010 New Revision: 120447 URL: http://llvm.org/viewvc/llvm-project?rev=120447&view=rev Log: Noticed this on inspection, fix and update some comments. Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFastISel.cpp?rev=120447&r1=120446&r2=120447&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMFastISel.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Tue Nov 30 13:14:07 2010 @@ -933,12 +933,13 @@ MachineMemOperand::MOLoad, MFI.getObjectSize(FI), MFI.getObjectAlignment(FI)); - // LDRH needs an additional operand. + // ARM::STRH needs an additional operand. if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(StrOpc)) .addReg(SrcReg, getKillRegState(true)) - .addFrameIndex(FI).addImm(Offset).addMemOperand(MMO)); + .addFrameIndex(FI).addReg(0).addImm(Offset) + .addMemOperand(MMO)); else AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(StrOpc)) @@ -948,7 +949,7 @@ return true; } - // ARM::LDRH needs an additional operand. + // ARM::STRH needs an additional operand. if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(StrOpc)) From resistor at mac.com Tue Nov 30 13:19:31 2010 From: resistor at mac.com (Owen Anderson) Date: Tue, 30 Nov 2010 19:19:31 -0000 Subject: [llvm-commits] [llvm] r120449 - in /llvm/trunk: lib/Target/ARM/ARMCodeEmitter.cpp lib/Target/ARM/ARMInstrThumb2.td lib/Target/ARM/ARMMCCodeEmitter.cpp utils/TableGen/EDEmitter.cpp Message-ID: <20101130191932.00F982A6C12D@llvm.org> Author: resistor Date: Tue Nov 30 13:19:31 2010 New Revision: 120449 URL: http://llvm.org/viewvc/llvm-project?rev=120449&view=rev Log: Add encoding support for Thumb2 PLD and PLI instructions. Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp llvm/trunk/utils/TableGen/EDEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=120449&r1=120448&r2=120449&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Tue Nov 30 13:19:31 2010 @@ -183,6 +183,8 @@ const { return 0; } unsigned getT2AddrModeImm8OffsetOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } + unsigned getT2AddrModeImm12OffsetOpValue(const MachineInstr &MI,unsigned Op) + const { return 0; } unsigned getT2AddrModeSORegOpValue(const MachineInstr &MI, unsigned Op) const { return 0; } unsigned getT2SORegOpValue(const MachineInstr &MI, unsigned Op) Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120449&r1=120448&r2=120449&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Tue Nov 30 13:19:31 2010 @@ -146,6 +146,11 @@ string EncoderMethod = "getT2AddrModeImm8OffsetOpValue"; } +def t2am_imm12_offset : Operand { + string EncoderMethod = "getT2AddrModeImm12OffsetOpValue"; +} + + // t2addrmode_imm8s4 := reg +/- (imm8 << 2) def t2addrmode_imm8s4 : Operand { let PrintMethod = "printT2AddrModeImm8s4Operand"; @@ -1539,6 +1544,10 @@ let Inst{21} = write; let Inst{20} = 1; let Inst{15-12} = 0b1111; + + bits<16> addr; + let Inst{19-16} = addr{15-12}; // Rn + let Inst{11-0} = addr{11-0}; // imm12 } def i8 : T2Ii8<(outs), (ins t2addrmode_imm8:$addr), IIC_Preload, opc, @@ -1552,6 +1561,10 @@ let Inst{20} = 1; let Inst{15-12} = 0b1111; let Inst{11-8} = 0b1100; + + bits<13> addr; + let Inst{19-16} = addr{12-9}; // Rn + let Inst{7-0} = addr{7-0}; // imm8 } def s : T2Iso<(outs), (ins t2addrmode_so_reg:$addr), IIC_Preload, opc, @@ -1565,10 +1578,15 @@ let Inst{20} = 1; let Inst{15-12} = 0b1111; let Inst{11-6} = 0000000; + + bits<10> addr; + let Inst{19-16} = addr{9-6}; // Rn + let Inst{3-0} = addr{5-2}; // Rm + let Inst{5-4} = addr{1-0}; // imm2 } let isCodeGenOnly = 1 in - def pci : T2Ipc<(outs), (ins i32imm:$addr), IIC_Preload, opc, + def pci : T2Ipc<(outs), (ins t2am_imm12_offset:$addr), IIC_Preload, opc, "\t$addr", []> { let Inst{31-25} = 0b1111100; @@ -1579,6 +1597,10 @@ let Inst{20} = 1; let Inst{19-16} = 0b1111; // Rn = 0b1111 let Inst{15-12} = 0b1111; + + bits<13> addr; + let Inst{23} = addr{12}; + let Inst{11-0} = addr{11-0}; } } Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120449&r1=120448&r2=120449&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Nov 30 13:19:31 2010 @@ -183,6 +183,8 @@ SmallVectorImpl &Fixups) const; unsigned getT2AddrModeImm8OffsetOpValue(const MCInst &MI, unsigned OpNum, SmallVectorImpl &Fixups) const; + unsigned getT2AddrModeImm12OffsetOpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const; unsigned getT2AddrModeImm12OpValue(const MCInst &MI, unsigned OpNum, SmallVectorImpl &Fixups) const; @@ -723,6 +725,22 @@ } unsigned ARMMCCodeEmitter:: +getT2AddrModeImm12OffsetOpValue(const MCInst &MI, unsigned OpNum, + SmallVectorImpl &Fixups) const { + const MCOperand &MO1 = MI.getOperand(OpNum); + + // FIXME: Needs fixup support. + unsigned Value = 0; + int32_t tmp = (int32_t)MO1.getImm(); + if (tmp < 0) + tmp = abs(tmp); + else + Value |= 4096; // Set the ADD bit + Value |= tmp & 4095; + return Value; +} + +unsigned ARMMCCodeEmitter:: getT2AddrModeImm12OpValue(const MCInst &MI, unsigned OpNum, SmallVectorImpl &Fixups) const { const MCOperand &MO1 = MI.getOperand(OpNum); Modified: llvm/trunk/utils/TableGen/EDEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/EDEmitter.cpp?rev=120449&r1=120448&r2=120449&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/EDEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/EDEmitter.cpp Tue Nov 30 13:19:31 2010 @@ -614,6 +614,7 @@ MISC("it_mask", "kOperandTypeThumbITMask"); // I MISC("t2addrmode_imm8", "kOperandTypeThumb2AddrModeImm8"); // R, I MISC("t2am_imm8_offset", "kOperandTypeThumb2AddrModeImm8Offset");//I + MISC("t2am_imm12_offset", "kOperandTypeThumb2AddrModeImm12Offset");//I MISC("t2addrmode_imm12", "kOperandTypeThumb2AddrModeImm12"); // R, I MISC("t2addrmode_so_reg", "kOperandTypeThumb2AddrModeSoReg"); // R, R, I MISC("t2addrmode_imm8s4", "kOperandTypeThumb2AddrModeImm8s4"); // R, I @@ -840,6 +841,7 @@ operandTypes.addEntry("kOperandTypeThumb2SoImm"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8Offset"); + operandTypes.addEntry("kOperandTypeThumb2AddrModeImm12Offset"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm12"); operandTypes.addEntry("kOperandTypeThumb2AddrModeSoReg"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8s4"); From echristo at apple.com Tue Nov 30 13:22:09 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 11:22:09 -0800 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> Message-ID: <460C2A86-441B-4894-AEE2-B1DD0A88A015@apple.com> On Nov 30, 2010, at 9:29 AM, Anton Korobeynikov wrote: > Hi Eric, > >> This is probably an involved task - it'll probably involve doing things like separating out instruction itineraries from the processor description for ARM, making sure that things that call into the backend use the tuning information if it's requested as opposed to the architecture information, etc. > Isn't this just a matter of attributes aliases? E.g. armv6 would be > translated into arm + v6 attr and so on? I dunno whether this is the > similar in MIPS world, you definitely know better :) Sure, but that's no different than specifying a processor at the moment - the processor details in the backend do exactly that. I assumed this was a step in some direction towards supporting all of the options which would make it a choice of how we want to go about doing it. I don't think you should be translating that in the front end, you just need options supported by each backend. -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/bc923fdd/attachment.html From sabre at nondot.org Tue Nov 30 13:20:40 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 19:20:40 -0000 Subject: [llvm-commits] [llvm] r120450 - /llvm/trunk/docs/CodingStandards.html Message-ID: <20101130192040.8534D2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 13:20:40 2010 New Revision: 120450 URL: http://llvm.org/viewvc/llvm-project?rev=120450&view=rev Log: forbid rtti and exceptions Modified: llvm/trunk/docs/CodingStandards.html Modified: llvm/trunk/docs/CodingStandards.html URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CodingStandards.html?rev=120450&r1=120449&r2=120450&view=diff ============================================================================== --- llvm/trunk/docs/CodingStandards.html (original) +++ llvm/trunk/docs/CodingStandards.html Tue Nov 30 13:20:40 2010 @@ -29,6 +29,7 @@
  • Write Portable Code
  • +
  • Do not use RTTI or Exceptions
  • Use of class/struct Keywords
  • @@ -406,6 +407,28 @@ +
    + +

    LLVM does not use RTTI (e.g. dynamic_cast<>) or exceptions, in an +effort to reduce code and executable size. These two language features violate +the general C++ principle of "you only pay for what you use", causing executable +bloat even if exceptions are never used in a code base, or if RTTI is never used +for a class. Because of this, we turn them off globally in the code. +

    + +

    +That said, LLVM does make extensive use of a hand-rolled form of RTTI that use +templates like isa<>, cast<>, +and dyn_cast<>. This form of RTTI is opt-in and can be added to any +class. It is also substantially more efficient than dynamic_cast<>. +

    + +
    + + +
    From anton at korobeynikov.info Tue Nov 30 13:25:14 2010 From: anton at korobeynikov.info (Anton Korobeynikov) Date: Tue, 30 Nov 2010 22:25:14 +0300 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: <460C2A86-441B-4894-AEE2-B1DD0A88A015@apple.com> References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> <460C2A86-441B-4894-AEE2-B1DD0A88A015@apple.com> Message-ID: > Sure, but that's no different than specifying a processor at the moment - > the processor details in the backend do exactly that. I assumed this was a > step in some direction towards supporting all of the options which would > make it a choice of how we want to go about doing it. I don't think you > should be translating that in the front end, you just need options supported > by each backend. Right, I mean "attributes aliases" to be supported by a backend, or rather something which can be used to "group" some set of attributes. This is pretty similar to current CPU support, so, going this way should be pretty straightforward. -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University From echristo at apple.com Tue Nov 30 13:27:44 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 11:27:44 -0800 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> <460C2A86-441B-4894-AEE2-B1DD0A88A015@apple.com> Message-ID: <825A165A-4751-4FF9-BDA1-6EC19DFD1A12@apple.com> On Nov 30, 2010, at 11:25 AM, Anton Korobeynikov wrote: >> Sure, but that's no different than specifying a processor at the moment - >> the processor details in the backend do exactly that. I assumed this was a >> step in some direction towards supporting all of the options which would >> make it a choice of how we want to go about doing it. I don't think you >> should be translating that in the front end, you just need options supported >> by each backend. > Right, I mean "attributes aliases" to be supported by a backend, or > rather something > which can be used to "group" some set of attributes. This is pretty > similar to current > CPU support, so, going this way should be pretty straightforward. Right, but grouping a set of attributes and calling it a processor is, in my mind, no different than saying -march= and the backend understanding that is a set of things to compile for - and no different than what -mcpu= does today (in llc, not from the front end, I blame ARM for this confusion) :) -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/dbbefbc1/attachment.html From grosbach at apple.com Tue Nov 30 13:25:56 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 19:25:56 -0000 Subject: [llvm-commits] [llvm] r120451 - /llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Message-ID: <20101130192556.C93EC2A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 13:25:56 2010 New Revision: 120451 URL: http://llvm.org/viewvc/llvm-project?rev=120451&view=rev Log: Add FIXME Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120451&r1=120450&r2=120451&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Tue Nov 30 13:25:56 2010 @@ -1844,6 +1844,7 @@ // FIXME: Should pc be an implicit operand like PICADD, etc? let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1, hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in +// FIXME: Should be a pseudo-instruction. def LDMIA_RET : AXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops), IndexModeUpd, LdStMulFrm, IIC_iLoad_mBr, From sabre at nondot.org Tue Nov 30 13:28:23 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 19:28:23 -0000 Subject: [llvm-commits] [llvm] r120452 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130192823.ADBAA2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 13:28:23 2010 New Revision: 120452 URL: http://llvm.org/viewvc/llvm-project?rev=120452&view=rev Log: reduce indentation, clean up TD use a bit. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120452&r1=120451&r2=120452&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 13:28:23 2010 @@ -37,8 +37,6 @@ namespace { struct DSE : public FunctionPass { - TargetData *TD; - static char ID; // Pass identification, replacement for typeid DSE() : FunctionPass(ID) { initializeDSEPass(*PassRegistry::getPassRegistry()); @@ -78,7 +76,7 @@ AU.addPreserved(); } - uint64_t getPointerSize(Value *V) const; + uint64_t getPointerSize(Value *V, AliasAnalysis &AA) const; }; } @@ -197,7 +195,7 @@ /// completely overwrites a store to the 'Earlier' location. static bool isCompleteOverwrite(const AliasAnalysis::Location &Later, const AliasAnalysis::Location &Earlier, - AliasAnalysis &AA, const TargetData *TD) { + AliasAnalysis &AA) { const Value *P1 = Later.Ptr->stripPointerCasts(); const Value *P2 = Earlier.Ptr->stripPointerCasts(); @@ -205,12 +203,16 @@ if (P1 != P2) return false; - // If we have no TargetData information around, then the size of the store is - // inferrable from the pointee type. If they are the same type, then we know - // that the store is safe. - if (TD == 0) - return Later.Ptr->getType() == Earlier.Ptr->getType(); - + // If we don't know the sizes of either access, then we can't do a comparison. + if (Later.Size == AliasAnalysis::UnknownSize || + Earlier.Size == AliasAnalysis::UnknownSize) { + // If we have no TargetData information around, then the size of the store + // is inferrable from the pointee type. If they are the same type, then we + // know that the store is safe. + if (AA.getTargetData() == 0) + return Later.Ptr->getType() == Earlier.Ptr->getType(); + return false; + } // Make sure that the Later size is >= the Earlier size. if (Later.Size < Earlier.Size) @@ -222,7 +224,6 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { MemoryDependenceAnalysis &MD = getAnalysis(); AliasAnalysis &AA = getAnalysis(); - TD = getAnalysisIfAvailable(); bool MadeChange = false; @@ -296,7 +297,7 @@ // If we find a removable write that is completely obliterated by the // store to 'Loc' then we can remove it. - if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, AA, TD)) { + if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, AA)) { // Delete the store and now-dead instructions that feed it. DeleteDeadInstruction(DepWrite); ++NumFastStores; @@ -486,8 +487,8 @@ } // See if the call site touches it - AliasAnalysis::ModRefResult A = AA.getModRefInfo(CS, *I, - getPointerSize(*I)); + AliasAnalysis::ModRefResult A = + AA.getModRefInfo(CS, *I, getPointerSize(*I, AA)); if (A == AliasAnalysis::ModRef) ++modRef; @@ -551,7 +552,7 @@ for (SmallPtrSet::iterator I = deadPointers.begin(), E = deadPointers.end(); I != E; ++I) { // See if this pointer could alias it - AliasAnalysis::AliasResult A = AA.alias(*I, getPointerSize(*I), + AliasAnalysis::AliasResult A = AA.alias(*I, getPointerSize(*I, AA), killPointer, killPointerSize); // If it must-alias and a store, we can delete it @@ -573,7 +574,7 @@ for (SmallVector::iterator I = undead.begin(), E = undead.end(); I != E; ++I) - deadPointers.erase(*I); + deadPointers.erase(*I); return MadeChange; } @@ -621,17 +622,19 @@ } while (!NowDeadInsts.empty()); } -uint64_t DSE::getPointerSize(Value *V) const { - if (TD) { - if (AllocaInst *A = dyn_cast(V)) { - // Get size information for the alloca - if (ConstantInt *C = dyn_cast(A->getArraySize())) - return C->getZExtValue() * TD->getTypeAllocSize(A->getAllocatedType()); - } else { - assert(isa(V) && "Expected AllocaInst or Argument!"); - const PointerType *PT = cast(V->getType()); - return TD->getTypeAllocSize(PT->getElementType()); - } +uint64_t DSE::getPointerSize(Value *V, AliasAnalysis &AA) const { + const TargetData *TD = AA.getTargetData(); + if (TD == 0) + return AliasAnalysis::UnknownSize; + + if (AllocaInst *A = dyn_cast(V)) { + // Get size information for the alloca + if (ConstantInt *C = dyn_cast(A->getArraySize())) + return C->getZExtValue() * TD->getTypeAllocSize(A->getAllocatedType()); + return AliasAnalysis::UnknownSize; } - return AliasAnalysis::UnknownSize; + + assert(isa(V) && "Expected AllocaInst or Argument!"); + const PointerType *PT = cast(V->getType()); + return TD->getTypeAllocSize(PT->getElementType()); } From anton at korobeynikov.info Tue Nov 30 13:30:41 2010 From: anton at korobeynikov.info (Anton Korobeynikov) Date: Tue, 30 Nov 2010 22:30:41 +0300 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: <825A165A-4751-4FF9-BDA1-6EC19DFD1A12@apple.com> References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> <460C2A86-441B-4894-AEE2-B1DD0A88A015@apple.com> <825A165A-4751-4FF9-BDA1-6EC19DFD1A12@apple.com> Message-ID: > Right, but grouping a set of attributes and calling it a processor is, in my > mind, no different than saying -march= and the backend understanding > that is a set of things to compile for - and no different than what > -mcpu= does today (in llc, not from the front end, I blame ARM for this > confusion) Same for me :) Sorry, if this was not clear ;) -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University From echristo at apple.com Tue Nov 30 13:31:08 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 11:31:08 -0800 Subject: [llvm-commits] [llvm] r120230 - in /llvm/trunk/tools/llvmc/src: Base.td.in Hooks.cpp In-Reply-To: References: <20101128003113.591B62A6C12C@llvm.org> <7F6191DA-FE25-49B8-AEBD-13A01BF24C1C@apple.com> <20101129142046.GA2741@localhost.localdomain> <1331D695-1C58-41ED-A04B-B3E843BEA850@apple.com> <460C2A86-441B-4894-AEE2-B1DD0A88A015@apple.com> <825A165A-4751-4FF9-BDA1-6EC19DFD1A12@apple.com> Message-ID: On Nov 30, 2010, at 11:30 AM, Anton Korobeynikov wrote: >> Right, but grouping a set of attributes and calling it a processor is, in my >> mind, no different than saying -march= and the backend understanding >> that is a set of things to compile for - and no different than what >> -mcpu= does today (in llc, not from the front end, I blame ARM for this >> confusion) > Same for me :) Sorry, if this was not clear ;) Violent agreement! :) -eric -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/986b38df/attachment.html From sabre at nondot.org Tue Nov 30 13:34:42 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 19:34:42 -0000 Subject: [llvm-commits] [llvm] r120453 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130193442.511102A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 13:34:42 2010 New Revision: 120453 URL: http://llvm.org/viewvc/llvm-project?rev=120453&view=rev Log: make getPointerSize a static function. Add ivars to DSE for AA and MD pass info instead of using getAnalysis<> all over. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120453&r1=120452&r2=120453&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 13:34:42 2010 @@ -37,21 +37,27 @@ namespace { struct DSE : public FunctionPass { + AliasAnalysis *AA; + MemoryDependenceAnalysis *MD; + static char ID; // Pass identification, replacement for typeid - DSE() : FunctionPass(ID) { + DSE() : FunctionPass(ID), AA(0), MD(0) { initializeDSEPass(*PassRegistry::getPassRegistry()); } virtual bool runOnFunction(Function &F) { - bool Changed = false; - + AA = &getAnalysis(); + MD = &getAnalysis(); DominatorTree &DT = getAnalysis(); + bool Changed = false; for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) // Only check non-dead blocks. Dead blocks may have strange pointer // cycles that will confuse alias analysis. if (DT.isReachableFromEntry(I)) Changed |= runOnBasicBlock(*I); + + AA = 0; MD = 0; return Changed; } @@ -72,11 +78,10 @@ AU.addRequired(); AU.addRequired(); AU.addRequired(); + AU.addPreserved(); AU.addPreserved(); AU.addPreserved(); } - - uint64_t getPointerSize(Value *V, AliasAnalysis &AA) const; }; } @@ -191,6 +196,24 @@ } } +static uint64_t getPointerSize(Value *V, AliasAnalysis &AA) { + const TargetData *TD = AA.getTargetData(); + if (TD == 0) + return AliasAnalysis::UnknownSize; + + if (AllocaInst *A = dyn_cast(V)) { + // Get size information for the alloca + if (ConstantInt *C = dyn_cast(A->getArraySize())) + return C->getZExtValue() * TD->getTypeAllocSize(A->getAllocatedType()); + return AliasAnalysis::UnknownSize; + } + + assert(isa(V) && "Expected AllocaInst or Argument!"); + const PointerType *PT = cast(V->getType()); + return TD->getTypeAllocSize(PT->getElementType()); +} + + /// isCompleteOverwrite - Return true if a store to the 'Later' location /// completely overwrites a store to the 'Earlier' location. static bool isCompleteOverwrite(const AliasAnalysis::Location &Later, @@ -222,9 +245,6 @@ } bool DSE::runOnBasicBlock(BasicBlock &BB) { - MemoryDependenceAnalysis &MD = getAnalysis(); - AliasAnalysis &AA = getAnalysis(); - bool MadeChange = false; // Do a top-down walk on the BB. @@ -241,7 +261,7 @@ if (!hasMemoryWrite(Inst)) continue; - MemDepResult InstDep = MD.getDependency(Inst); + MemDepResult InstDep = MD->getDependency(Inst); // Ignore non-local store liveness. // FIXME: cross-block DSE would be fun. :) @@ -275,7 +295,7 @@ } // Figure out what location is being stored to. - AliasAnalysis::Location Loc = getLocForWrite(Inst, AA); + AliasAnalysis::Location Loc = getLocForWrite(Inst, *AA); // If we didn't get a useful location, fail. if (Loc.Ptr == 0) @@ -290,14 +310,14 @@ // // Find out what memory location the dependant instruction stores. Instruction *DepWrite = InstDep.getInst(); - AliasAnalysis::Location DepLoc = getLocForWrite(DepWrite, AA); + AliasAnalysis::Location DepLoc = getLocForWrite(DepWrite, *AA); // If we didn't get a useful location, or if it isn't a size, bail out. if (DepLoc.Ptr == 0) break; // If we find a removable write that is completely obliterated by the // store to 'Loc' then we can remove it. - if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, AA)) { + if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, *AA)) { // Delete the store and now-dead instructions that feed it. DeleteDeadInstruction(DepWrite); ++NumFastStores; @@ -322,10 +342,10 @@ if (DepWrite == &BB.front()) break; // Can't look past this instruction if it might read 'Loc'. - if (AA.getModRefInfo(DepWrite, Loc) & AliasAnalysis::Ref) + if (AA->getModRefInfo(DepWrite, Loc) & AliasAnalysis::Ref) break; - InstDep = MD.getPointerDependencyFrom(Loc, false, DepWrite, &BB); + InstDep = MD->getPointerDependencyFrom(Loc, false, DepWrite, &BB); } } @@ -340,10 +360,7 @@ /// HandleFree - Handle frees of entire structures whose dependency is a store /// to a field of that structure. bool DSE::HandleFree(CallInst *F) { - AliasAnalysis &AA = getAnalysis(); - MemoryDependenceAnalysis &MD = getAnalysis(); - - MemDepResult Dep = MD.getDependency(F); + MemDepResult Dep = MD->getDependency(F); do { if (Dep.isNonLocal()) return false; @@ -354,7 +371,7 @@ Value *DepPointer = getPointerOperand(Dependency)->getUnderlyingObject(); // Check for aliasing. - if (AA.alias(F->getArgOperand(0), 1, DepPointer, 1) != + if (AA->alias(F->getArgOperand(0), 1, DepPointer, 1) != AliasAnalysis::MustAlias) return false; @@ -367,7 +384,7 @@ // s[0] = 0; // s[1] = 0; // This has just been deleted. // free(s); - Dep = MD.getDependency(F); + Dep = MD->getDependency(F); } while (!Dep.isNonLocal()); return true; @@ -380,8 +397,6 @@ /// store i32 1, i32* %A /// ret void bool DSE::handleEndBlock(BasicBlock &BB) { - AliasAnalysis &AA = getAnalysis(); - bool MadeChange = false; // Pointers alloca'd in this function are dead in the end block @@ -467,7 +482,7 @@ } else if (CallSite CS = cast(BBI)) { // If this call does not access memory, it can't // be undeadifying any of our pointers. - if (AA.doesNotAccessMemory(CS)) + if (AA->doesNotAccessMemory(CS)) continue; unsigned modRef = 0; @@ -488,7 +503,7 @@ // See if the call site touches it AliasAnalysis::ModRefResult A = - AA.getModRefInfo(CS, *I, getPointerSize(*I, AA)); + AA->getModRefInfo(CS, *I, getPointerSize(*I, *AA)); if (A == AliasAnalysis::ModRef) ++modRef; @@ -532,8 +547,6 @@ bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, BasicBlock::iterator &BBI, SmallPtrSet &deadPointers) { - AliasAnalysis &AA = getAnalysis(); - // If the kill pointer can be easily reduced to an alloca, // don't bother doing extraneous AA queries. if (deadPointers.count(killPointer)) { @@ -552,8 +565,8 @@ for (SmallPtrSet::iterator I = deadPointers.begin(), E = deadPointers.end(); I != E; ++I) { // See if this pointer could alias it - AliasAnalysis::AliasResult A = AA.alias(*I, getPointerSize(*I, AA), - killPointer, killPointerSize); + AliasAnalysis::AliasResult A = AA->alias(*I, getPointerSize(*I, *AA), + killPointer, killPointerSize); // If it must-alias and a store, we can delete it if (isa(BBI) && A == AliasAnalysis::MustAlias) { @@ -593,7 +606,6 @@ --NumFastOther; // Before we touch this instruction, remove it from memdep! - MemoryDependenceAnalysis &MDA = getAnalysis(); do { Instruction *DeadInst = NowDeadInsts.pop_back_val(); @@ -602,7 +614,7 @@ // This instruction is dead, zap it, in stages. Start by removing it from // MemDep, which needs to know the operands and needs it to be in the // function. - MDA.removeInstruction(DeadInst); + MD->removeInstruction(DeadInst); for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) { Value *Op = DeadInst->getOperand(op); @@ -622,19 +634,3 @@ } while (!NowDeadInsts.empty()); } -uint64_t DSE::getPointerSize(Value *V, AliasAnalysis &AA) const { - const TargetData *TD = AA.getTargetData(); - if (TD == 0) - return AliasAnalysis::UnknownSize; - - if (AllocaInst *A = dyn_cast(V)) { - // Get size information for the alloca - if (ConstantInt *C = dyn_cast(A->getArraySize())) - return C->getZExtValue() * TD->getTypeAllocSize(A->getAllocatedType()); - return AliasAnalysis::UnknownSize; - } - - assert(isa(V) && "Expected AllocaInst or Argument!"); - const PointerType *PT = cast(V->getType()); - return TD->getTypeAllocSize(PT->getElementType()); -} From sabre at nondot.org Tue Nov 30 13:48:15 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 19:48:15 -0000 Subject: [llvm-commits] [llvm] r120454 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130194815.ABA672A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 13:48:15 2010 New Revision: 120454 URL: http://llvm.org/viewvc/llvm-project?rev=120454&view=rev Log: various cleanups and code simplification Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120454&r1=120453&r2=120454&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 13:48:15 2010 @@ -400,104 +400,88 @@ bool MadeChange = false; // Pointers alloca'd in this function are dead in the end block - SmallPtrSet deadPointers; + SmallPtrSet DeadPointers; // Find all of the alloca'd pointers in the entry block. BasicBlock *Entry = BB.getParent()->begin(); for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I) if (AllocaInst *AI = dyn_cast(I)) - deadPointers.insert(AI); + DeadPointers.insert(AI); // Treat byval arguments the same, stores to them are dead at the end of the // function. for (Function::arg_iterator AI = BB.getParent()->arg_begin(), AE = BB.getParent()->arg_end(); AI != AE; ++AI) if (AI->hasByValAttr()) - deadPointers.insert(AI); + DeadPointers.insert(AI); // Scan the basic block backwards for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){ --BBI; - // If we find a store whose pointer is dead. - if (hasMemoryWrite(BBI)) { - if (isRemovable(BBI)) { - // See through pointer-to-pointer bitcasts - Value *pointerOperand = getPointerOperand(BBI)->getUnderlyingObject(); - - // Alloca'd pointers or byval arguments (which are functionally like - // alloca's) are valid candidates for removal. - if (deadPointers.count(pointerOperand)) { - // DCE instructions only used to calculate that store. - Instruction *Dead = BBI; - ++BBI; - DeleteDeadInstruction(Dead, &deadPointers); - ++NumFastStores; - MadeChange = true; - continue; - } - } - - // Because a memcpy or memmove is also a load, we can't skip it if we - // didn't remove it. - if (!isa(BBI)) + // If we find a store, check to see if it points into a dead stack value. + if (hasMemoryWrite(BBI) && isRemovable(BBI)) { + // See through pointer-to-pointer bitcasts + Value *Pointer = getPointerOperand(BBI)->getUnderlyingObject(); + + // Alloca'd pointers or byval arguments (which are functionally like + // alloca's) are valid candidates for removal. + if (DeadPointers.count(Pointer)) { + // DCE instructions only used to calculate that store. + Instruction *Dead = BBI++; + DeleteDeadInstruction(Dead, &DeadPointers); + ++NumFastStores; + MadeChange = true; continue; + } + } + + // Remove any dead non-memory-mutating instructions. + if (isInstructionTriviallyDead(BBI)) { + Instruction *Inst = BBI++; + DeleteDeadInstruction(Inst, &DeadPointers); + ++NumFastOther; + MadeChange = true; + continue; } - Value *killPointer = 0; - uint64_t killPointerSize = AliasAnalysis::UnknownSize; + if (AllocaInst *A = dyn_cast(BBI)) { + DeadPointers.erase(A); + continue; + } + + + Value *KillPointer = 0; + uint64_t KillPointerSize = AliasAnalysis::UnknownSize; // If we encounter a use of the pointer, it is no longer considered dead if (LoadInst *L = dyn_cast(BBI)) { - // However, if this load is unused and not volatile, we can go ahead and - // remove it, and not have to worry about it making our pointer undead! - if (L->use_empty() && !L->isVolatile()) { - ++BBI; - DeleteDeadInstruction(L, &deadPointers); - ++NumFastOther; - MadeChange = true; - continue; - } - - killPointer = L->getPointerOperand(); + KillPointer = L->getPointerOperand(); } else if (VAArgInst *V = dyn_cast(BBI)) { - killPointer = V->getOperand(0); - } else if (isa(BBI) && - isa(cast(BBI)->getLength())) { - killPointer = cast(BBI)->getSource(); - killPointerSize = cast( - cast(BBI)->getLength())->getZExtValue(); - } else if (AllocaInst *A = dyn_cast(BBI)) { - deadPointers.erase(A); - - // Dead alloca's can be DCE'd when we reach them - if (A->use_empty()) { - ++BBI; - DeleteDeadInstruction(A, &deadPointers); - ++NumFastOther; - MadeChange = true; - } - - continue; + KillPointer = V->getOperand(0); + } else if (MemTransferInst *MTI = dyn_cast(BBI)) { + KillPointer = cast(BBI)->getSource(); + if (ConstantInt *Len = dyn_cast(MTI->getLength())) + KillPointerSize = Len->getZExtValue(); } else if (CallSite CS = cast(BBI)) { - // If this call does not access memory, it can't - // be undeadifying any of our pointers. + // If this call does not access memory, it can't be loading any of our + // pointers. if (AA->doesNotAccessMemory(CS)) continue; - unsigned modRef = 0; - unsigned other = 0; + unsigned NumModRef = 0; + unsigned NumOther = 0; // Remove any pointers made undead by the call from the dead set std::vector dead; - for (SmallPtrSet::iterator I = deadPointers.begin(), - E = deadPointers.end(); I != E; ++I) { + for (SmallPtrSet::iterator I = DeadPointers.begin(), + E = DeadPointers.end(); I != E; ++I) { // HACK: if we detect that our AA is imprecise, it's not // worth it to scan the rest of the deadPointers set. Just // assume that the AA will return ModRef for everything, and // go ahead and bail. - if (modRef >= 16 && other == 0) { - deadPointers.clear(); + if (NumModRef >= 16 && NumOther == 0) { + DeadPointers.clear(); return MadeChange; } @@ -506,9 +490,9 @@ AA->getModRefInfo(CS, *I, getPointerSize(*I, *AA)); if (A == AliasAnalysis::ModRef) - ++modRef; + ++NumModRef; else - ++other; + ++NumOther; if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref) dead.push_back(*I); @@ -516,27 +500,19 @@ for (std::vector::iterator I = dead.begin(), E = dead.end(); I != E; ++I) - deadPointers.erase(*I); + DeadPointers.erase(*I); continue; - } else if (isInstructionTriviallyDead(BBI)) { - // For any non-memory-affecting non-terminators, DCE them as we reach them - Instruction *Inst = BBI; - ++BBI; - DeleteDeadInstruction(Inst, &deadPointers); - ++NumFastOther; - MadeChange = true; + } else { + // Not a loading instruction. continue; } - - if (!killPointer) - continue; - killPointer = killPointer->getUnderlyingObject(); + KillPointer = KillPointer->getUnderlyingObject(); // Deal with undead pointers - MadeChange |= RemoveUndeadPointers(killPointer, killPointerSize, BBI, - deadPointers); + MadeChange |= RemoveUndeadPointers(KillPointer, KillPointerSize, BBI, + DeadPointers); } return MadeChange; @@ -546,11 +522,11 @@ /// undead when scanning for dead stores to alloca's. bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, BasicBlock::iterator &BBI, - SmallPtrSet &deadPointers) { + SmallPtrSet &DeadPointers) { // If the kill pointer can be easily reduced to an alloca, // don't bother doing extraneous AA queries. - if (deadPointers.count(killPointer)) { - deadPointers.erase(killPointer); + if (DeadPointers.count(killPointer)) { + DeadPointers.erase(killPointer); return false; } @@ -562,8 +538,8 @@ SmallVector undead; - for (SmallPtrSet::iterator I = deadPointers.begin(), - E = deadPointers.end(); I != E; ++I) { + for (SmallPtrSet::iterator I = DeadPointers.begin(), + E = DeadPointers.end(); I != E; ++I) { // See if this pointer could alias it AliasAnalysis::AliasResult A = AA->alias(*I, getPointerSize(*I, *AA), killPointer, killPointerSize); @@ -574,7 +550,7 @@ // Remove it! ++BBI; - DeleteDeadInstruction(S, &deadPointers); + DeleteDeadInstruction(S, &DeadPointers); ++NumFastStores; MadeChange = true; @@ -587,7 +563,7 @@ for (SmallVector::iterator I = undead.begin(), E = undead.end(); I != E; ++I) - deadPointers.erase(*I); + DeadPointers.erase(*I); return MadeChange; } From resistor at mac.com Tue Nov 30 14:00:02 2010 From: resistor at mac.com (Owen Anderson) Date: Tue, 30 Nov 2010 20:00:02 -0000 Subject: [llvm-commits] [llvm] r120455 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Message-ID: <20101130200002.1A8A22A6C12D@llvm.org> Author: resistor Date: Tue Nov 30 14:00:01 2010 New Revision: 120455 URL: http://llvm.org/viewvc/llvm-project?rev=120455&view=rev Log: Provide Thumb2 encodings for a few miscellaneous instructions. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120455&r1=120454&r2=120455&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Tue Nov 30 14:00:01 2010 @@ -1870,8 +1870,8 @@ // Select Bytes -- for disassembly only -def t2SEL : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), NoItinerary, "sel", - "\t$dst, $a, $b", []> { +def t2SEL : T2ThreeReg<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), + NoItinerary, "sel", "\t$Rd, $Rn, $Rm", []> { let Inst{31-27} = 0b11111; let Inst{26-24} = 0b010; let Inst{23} = 0b1; @@ -2005,7 +2005,8 @@ let Inst{7-6} = sh{1-0}; } -def t2SSAT: T2I<(outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn, shift_imm:$sh), +def t2SSAT: T2SatI< + (outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn, shift_imm:$sh), NoItinerary, "ssat", "\t$Rd, $sat_imm, $Rn$sh", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; @@ -2014,7 +2015,8 @@ let Inst{15} = 0; } -def t2SSAT16: T2I<(outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn), NoItinerary, +def t2SSAT16: T2SatI< + (outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn), NoItinerary, "ssat16", "\t$Rd, $sat_imm, $Rn", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; @@ -2026,8 +2028,9 @@ let Inst{7-6} = 0b00; // imm2 = '00' } -def t2USAT: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a, shift_imm:$sh), - NoItinerary, "usat", "\t$dst, $bit_pos, $a$sh", +def t2USAT: T2SatI< + (outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn, shift_imm:$sh), + NoItinerary, "usat", "\t$Rd, $sat_imm, $Rn$sh", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; let Inst{25-22} = 0b1110; @@ -2035,8 +2038,9 @@ let Inst{15} = 0; } -def t2USAT16: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a), NoItinerary, - "usat16", "\t$dst, $bit_pos, $a", +def t2USAT16: T2SatI< + (outs rGPR:$dst), (ins i32imm:$sat_imm, rGPR:$Rn), NoItinerary, + "usat16", "\t$dst, $sat_imm, $Rn", [/* For disassembly only; pattern left blank */]> { let Inst{31-27} = 0b11110; let Inst{25-22} = 0b1110; @@ -3077,6 +3081,13 @@ let Inst{31-27} = 0b11110; let Inst{15-14} = 0b10; let Inst{12} = 0; + + bits<20> target; + let Inst{26} = target{19}; + let Inst{11} = target{18}; + let Inst{13} = target{17}; + let Inst{21-16} = target{16-11}; + let Inst{10-0} = target{10-0}; } @@ -3170,6 +3181,9 @@ let Inst{12} = 0; let Inst{10-8} = 0b000; let Inst{7-4} = 0b1111; + + bits<4> opt; + let Inst{3-0} = opt{3-0}; } // Secure Monitor Call is a system instruction -- for disassembly only From dalej at apple.com Tue Nov 30 14:23:21 2010 From: dalej at apple.com (Dale Johannesen) Date: Tue, 30 Nov 2010 20:23:21 -0000 Subject: [llvm-commits] [llvm] r120457 - /llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Message-ID: <20101130202322.04AD42A6C12D@llvm.org> Author: johannes Date: Tue Nov 30 14:23:21 2010 New Revision: 120457 URL: http://llvm.org/viewvc/llvm-project?rev=120457&view=rev Log: Avoid exponential growth of a table. It feels like there should be a better way to do this. PR 8679. Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=120457&r1=120456&r2=120457&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Tue Nov 30 14:23:21 2010 @@ -481,6 +481,23 @@ } } + /// InsertInOverdefinedPHIs - Insert an entry in the UsersOfOverdefinedPHIS + /// map for I and PN, but if one is there already, do not create another. + /// (Duplicate entries do not break anything directly, but can lead to + /// exponential growth of the table in rare cases.) + void InsertInOverdefinedPHIs(Instruction *I, PHINode *PN) { + std::multimap::iterator J, E; + bool found = false; + tie(J, E) = UsersOfOverdefinedPHIs.equal_range(PN); + for (; J != E; ++J) + if (J->second == I) { + found = true; + break; + } + if (!found) + UsersOfOverdefinedPHIs.insert(std::make_pair(PN, I)); + } + private: friend class InstVisitor; @@ -973,9 +990,9 @@ if (Result.isConstant()) { markConstant(IV, &I, Result.getConstant()); // Remember that this instruction is virtually using the PHI node - // operands. - UsersOfOverdefinedPHIs.insert(std::make_pair(PN1, &I)); - UsersOfOverdefinedPHIs.insert(std::make_pair(PN2, &I)); + // operands. + InsertInOverdefinedPHIs(&I, PN1); + InsertInOverdefinedPHIs(&I, PN2); return; } @@ -1056,8 +1073,8 @@ markConstant(&I, Result.getConstant()); // Remember that this instruction is virtually using the PHI node // operands. - UsersOfOverdefinedPHIs.insert(std::make_pair(PN1, &I)); - UsersOfOverdefinedPHIs.insert(std::make_pair(PN2, &I)); + InsertInOverdefinedPHIs(&I, PN1); + InsertInOverdefinedPHIs(&I, PN2); return; } From kremenek at apple.com Tue Nov 30 14:26:45 2010 From: kremenek at apple.com (Ted Kremenek) Date: Tue, 30 Nov 2010 20:26:45 -0000 Subject: [llvm-commits] [llvm] r120459 - in /llvm/trunk/include/llvm/ADT: ImmutableMap.h ImmutableSet.h Message-ID: <20101130202645.5901C2A6C12D@llvm.org> Author: kremenek Date: Tue Nov 30 14:26:45 2010 New Revision: 120459 URL: http://llvm.org/viewvc/llvm-project?rev=120459&view=rev Log: Performance optimization on ImmutableMap/ImmutableSet: - Use a DenseSet instead of a FoldingSet to cache canonicalized nodes. This reduces the overhead of double-hashing. - Use reference counts in ImutAVLTree to much more aggressively recover tree nodes that are no longer usable. We can generate many transient nodes while using add() and remove() on ImmutableSet/ImmutableMaps to generate a final set/map. For the clang static analyzer (the main client of these data structures), this results in a slight speedup (0.5%) when analyzing sqlite3, but much more importantly results in a 30-60% reduction in peak memory usage when the analyzer is analyzing a given function in a file. On average that's about a ** 44% reduction ** in the memory footprint of the static analyzer. Modified: llvm/trunk/include/llvm/ADT/ImmutableMap.h llvm/trunk/include/llvm/ADT/ImmutableSet.h Modified: llvm/trunk/include/llvm/ADT/ImmutableMap.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableMap.h?rev=120459&r1=120458&r2=120459&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/ImmutableMap.h (original) +++ llvm/trunk/include/llvm/ADT/ImmutableMap.h Tue Nov 30 14:26:45 2010 @@ -76,7 +76,23 @@ /// should use a Factory object to create maps instead of directly /// invoking the constructor, but there are cases where make this /// constructor public is useful. - explicit ImmutableMap(const TreeTy* R) : Root(const_cast(R)) {} + explicit ImmutableMap(const TreeTy* R) : Root(const_cast(R)) { + if (Root) { Root->retain(); } + } + ImmutableMap(const ImmutableMap &X) : Root(X.Root) { + if (Root) { Root->retain(); } + } + ImmutableMap &operator=(const ImmutableMap &X) { + if (Root != X.Root) { + if (X.Root) { X.Root->retain(); } + if (Root) { Root->release(); } + Root = X.Root; + } + return *this; + } + ~ImmutableMap() { + if (Root) { Root->release(); } + } class Factory { typename TreeTy::Factory F; @@ -110,15 +126,18 @@ return Root ? Root->contains(K) : false; } - bool operator==(ImmutableMap RHS) const { + bool operator==(const ImmutableMap &RHS) const { return Root && RHS.Root ? Root->isEqual(*RHS.Root) : Root == RHS.Root; } - bool operator!=(ImmutableMap RHS) const { + bool operator!=(const ImmutableMap &RHS) const { return Root && RHS.Root ? Root->isNotEqual(*RHS.Root) : Root != RHS.Root; } - TreeTy* getRoot() const { return Root; } + TreeTy* getRoot() const { + if (Root) { Root->retain(); } + return Root; + } bool isEmpty() const { return !Root; } Modified: llvm/trunk/include/llvm/ADT/ImmutableSet.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableSet.h?rev=120459&r1=120458&r2=120459&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/ImmutableSet.h (original) +++ llvm/trunk/include/llvm/ADT/ImmutableSet.h Tue Nov 30 14:26:45 2010 @@ -15,10 +15,13 @@ #define LLVM_ADT_IMSET_H #include "llvm/Support/Allocator.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/Support/DataTypes.h" #include #include +#include +#include namespace llvm { @@ -32,7 +35,7 @@ template class ImutAVLTreeGenericIterator; template -class ImutAVLTree : public FoldingSetNode { +class ImutAVLTree { public: typedef typename ImutInfo::key_type_ref key_type_ref; typedef typename ImutInfo::value_type value_type; @@ -43,7 +46,6 @@ friend class ImutIntervalAVLFactory; friend class ImutAVLTreeGenericIterator; - friend class FoldingSet; typedef ImutAVLTreeInOrderIterator iterator; @@ -51,11 +53,11 @@ // Public Interface. //===----------------------------------------------------===// - /// getLeft - Returns a pointer to the left subtree. This value + /// Return a pointer to the left subtree. This value /// is NULL if there is no left subtree. ImutAVLTree *getLeft() const { return left; } - /// getRight - Returns a pointer to the right subtree. This value is + /// Return a pointer to the right subtree. This value is /// NULL if there is no right subtree. ImutAVLTree *getRight() const { return right; } @@ -211,23 +213,25 @@ return getHeight(); } - /// Profile - Profiling for ImutAVLTree. - void Profile(llvm::FoldingSetNodeID& ID) { - ID.AddInteger(computeDigest()); - } - //===----------------------------------------------------===// // Internal values. //===----------------------------------------------------===// private: - ImutAVLTree* left; - ImutAVLTree* right; - unsigned height : 28; - unsigned IsMutable : 1; - unsigned IsDigestCached : 1; - value_type value; - uint32_t digest; + Factory *factory; + ImutAVLTree *left; + ImutAVLTree *right; + ImutAVLTree *prev; + ImutAVLTree *next; + + unsigned height : 28; + unsigned IsMutable : 1; + unsigned IsDigestCached : 1; + unsigned IsCanonicalized : 1; + + value_type value; + uint32_t digest; + uint32_t refCount; //===----------------------------------------------------===// // Internal methods (node manipulation; used by Factory). @@ -236,10 +240,15 @@ private: /// ImutAVLTree - Internal constructor that is only called by /// ImutAVLFactory. - ImutAVLTree(ImutAVLTree* l, ImutAVLTree* r, value_type_ref v, + ImutAVLTree(Factory *f, ImutAVLTree* l, ImutAVLTree* r, value_type_ref v, unsigned height) - : left(l), right(r), height(height), IsMutable(true), - IsDigestCached(false), value(v), digest(0) {} + : factory(f), left(l), right(r), prev(0), next(0), height(height), + IsMutable(true), IsDigestCached(false), IsCanonicalized(0), + value(v), digest(0), refCount(0) + { + if (left) left->retain(); + if (right) right->retain(); + } /// isMutable - Returns true if the left and right subtree references /// (as well as height) can be changed. If this method returns false, @@ -277,25 +286,6 @@ IsDigestCached = true; } - /// setLeft - Changes the reference of the left subtree. Used internally - /// by ImutAVLFactory. - void setLeft(ImutAVLTree* NewLeft) { - assert(isMutable() && - "Only a mutable tree can have its left subtree changed."); - left = NewLeft; - IsDigestCached = false; - } - - /// setRight - Changes the reference of the right subtree. Used internally - /// by ImutAVLFactory. - void setRight(ImutAVLTree* newRight) { - assert(isMutable() && - "Only a mutable tree can have its right subtree changed."); - - right = newRight; - IsDigestCached = false; - } - /// setHeight - Changes the height of the tree. Used internally by /// ImutAVLFactory. void setHeight(unsigned h) { @@ -332,6 +322,38 @@ markedCachedDigest(); return X; } + + //===----------------------------------------------------===// + // Reference count operations. + //===----------------------------------------------------===// + +public: + void retain() { ++refCount; } + void release() { + assert(refCount > 0); + if (--refCount == 0) + destroy(); + } + void destroy() { + if (left) + left->release(); + if (right) + right->release(); + if (IsCanonicalized) { + if (next) + next->prev = prev; + + if (prev) + prev->next = next; + else + factory->Cache[computeDigest()] = next; + } + + // We need to clear the mutability bit in case we are + // destroying the node as part of a sweep in ImutAVLFactory::recoverNodes(). + IsMutable = false; + factory->freeNodes.push_back(this); + } }; //===----------------------------------------------------------------------===// @@ -340,14 +362,17 @@ template class ImutAVLFactory { + friend class ImutAVLTree; typedef ImutAVLTree TreeTy; typedef typename TreeTy::value_type_ref value_type_ref; typedef typename TreeTy::key_type_ref key_type_ref; - typedef FoldingSet CacheTy; + typedef DenseMap CacheTy; CacheTy Cache; uintptr_t Allocator; + std::vector createdNodes; + std::vector freeNodes; bool ownsAllocator() const { return Allocator & 0x1 ? false : true; @@ -375,12 +400,14 @@ TreeTy* add(TreeTy* T, value_type_ref V) { T = add_internal(V,T); markImmutable(T); + recoverNodes(); return T; } TreeTy* remove(TreeTy* T, key_type_ref V) { T = remove_internal(V,T); markImmutable(T); + recoverNodes(); return T; } @@ -430,21 +457,32 @@ TreeTy* createNode(TreeTy* L, value_type_ref V, TreeTy* R) { BumpPtrAllocator& A = getAllocator(); - TreeTy* T = (TreeTy*) A.Allocate(); - new (T) TreeTy(L, R, V, incrementHeight(L,R)); + TreeTy* T; + if (!freeNodes.empty()) { + T = freeNodes.back(); + freeNodes.pop_back(); + assert(T != L); + assert(T != R); + } + else { + T = (TreeTy*) A.Allocate(); + } + new (T) TreeTy(this, L, R, V, incrementHeight(L,R)); + createdNodes.push_back(T); return T; } TreeTy* createNode(TreeTy* newLeft, TreeTy* oldTree, TreeTy* newRight) { - assert(!isEmpty(oldTree)); - if (oldTree->isMutable()) { - oldTree->setLeft(newLeft); - oldTree->setRight(newRight); - oldTree->setHeight(incrementHeight(newLeft, newRight)); - return oldTree; + return createNode(newLeft, getValue(oldTree), newRight); + } + + void recoverNodes() { + for (unsigned i = 0, n = createdNodes.size(); i < n; ++i) { + TreeTy *N = createdNodes[i]; + if (N->isMutable() && N->refCount == 0) + N->destroy(); } - else - return createNode(newLeft, getValue(oldTree), newRight); + createdNodes.clear(); } /// balanceTree - Used by add_internal and remove_internal to @@ -564,44 +602,41 @@ public: TreeTy *getCanonicalTree(TreeTy *TNew) { if (!TNew) - return NULL; - - // Search the FoldingSet bucket for a Tree with the same digest. - FoldingSetNodeID ID; + return 0; + + if (TNew->IsCanonicalized) + return TNew; + + // Search the hashtable for another tree with the same digest, and + // if find a collision compare those trees by their contents. unsigned digest = TNew->computeDigest(); - ID.AddInteger(digest); - unsigned hash = ID.ComputeHash(); - - typename CacheTy::bucket_iterator I = Cache.bucket_begin(hash); - typename CacheTy::bucket_iterator E = Cache.bucket_end(hash); - - for (; I != E; ++I) { - TreeTy *T = &*I; - - if (T->computeDigest() != digest) - continue; - - // We found a collision. Perform a comparison of Contents('T') - // with Contents('TNew') - typename TreeTy::iterator TI = T->begin(), TE = T->end(); - - if (!compareTreeWithSection(TNew, TI, TE)) - continue; - - if (TI != TE) - continue; // T has more contents than TNew. - - // Trees did match! Return 'T'. - return T; + TreeTy *&entry = Cache[digest]; + do { + if (!entry) + break; + for (TreeTy *T = entry ; T != 0; T = T->next) { + // Compare the Contents('T') with Contents('TNew') + typename TreeTy::iterator TI = T->begin(), TE = T->end(); + if (!compareTreeWithSection(TNew, TI, TE)) + continue; + if (TI != TE) + continue; // T has more contents than TNew. + // Trees did match! Return 'T'. + if (TNew->refCount == 0) + TNew->destroy(); + return T; + } + entry->prev = TNew; + TNew->next = entry; } + while (false); - // 'TNew' is the only tree of its kind. Return it. - Cache.InsertNode(TNew, (void*) &*Cache.bucket_end(hash)); + entry = TNew; + TNew->IsCanonicalized = true; return TNew; } }; - //===----------------------------------------------------------------------===// // Immutable AVL-Tree Iterators. //===----------------------------------------------------------------------===// @@ -902,7 +937,23 @@ /// should use a Factory object to create sets instead of directly /// invoking the constructor, but there are cases where make this /// constructor public is useful. - explicit ImmutableSet(TreeTy* R) : Root(R) {} + explicit ImmutableSet(TreeTy* R) : Root(R) { + if (Root) { Root->retain(); } + } + ImmutableSet(const ImmutableSet &X) : Root(X.Root) { + if (Root) { Root->retain(); } + } + ImmutableSet &operator=(const ImmutableSet &X) { + if (Root != X.Root) { + if (X.Root) { X.Root->retain(); } + if (Root) { Root->release(); } + Root = X.Root; + } + return *this; + } + ~ImmutableSet() { + if (Root) { Root->release(); } + } class Factory { typename TreeTy::Factory F; @@ -953,20 +1004,21 @@ friend class Factory; - /// contains - Returns true if the set contains the specified value. + /// Returns true if the set contains the specified value. bool contains(value_type_ref V) const { return Root ? Root->contains(V) : false; } - bool operator==(ImmutableSet RHS) const { + bool operator==(const ImmutableSet &RHS) const { return Root && RHS.Root ? Root->isEqual(*RHS.Root) : Root == RHS.Root; } - bool operator!=(ImmutableSet RHS) const { + bool operator!=(const ImmutableSet &RHS) const { return Root && RHS.Root ? Root->isNotEqual(*RHS.Root) : Root != RHS.Root; } TreeTy *getRoot() { + if (Root) { Root->retain(); } return Root; } From baldrick at free.fr Tue Nov 30 14:36:17 2010 From: baldrick at free.fr (Duncan Sands) Date: Tue, 30 Nov 2010 21:36:17 +0100 Subject: [llvm-commits] [Review request] Natural loop computation speedup In-Reply-To: <2285445A-9E5F-4BE0-A238-06ABFAF2D775@apple.com> References: <4CF4D0ED.8060407@free.fr> <2285445A-9E5F-4BE0-A238-06ABFAF2D775@apple.com> Message-ID: <4CF56041.8010607@free.fr> Hi Cameron, >>> This was a 16% speedup running loops on test-suite + SPEC2000. >> >> dense map iterators are invalidated when new values are inserted. Did you >> audit the code to check that this is not a problem? If in doubt, you could >> build LLVM with expensive checks enabled and check that nothing blows up in >> the testsuite. > > There are no iterators actually used for iteration (except in #if 0 code, and that one is fine), only for find() and only internal to LoopInfo, so it should be fine. Are there any expensive checks that invalidated iterators are not being used? I don't see them in DenseMap.h. my mistake, you are right that expensive checks don't do anything for DenseMap (though probably they should given the number of times people have been bitten by the iterator invalidation behaviour). Thanks for checking the code! Ciao, Duncan. From sabre at nondot.org Tue Nov 30 15:18:46 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 21:18:46 -0000 Subject: [llvm-commits] [llvm] r120463 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130211846.E930A2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 15:18:46 2010 New Revision: 120463 URL: http://llvm.org/viewvc/llvm-project?rev=120463&view=rev Log: move call handling in handleEndBlock up a bit, and simplify it. If the call might read all the allocas, stop scanning early. Convert a vector to smallvector, shrink SmallPtrSet to 16 instead of 64 to avoid crazy linear scans. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120463&r1=120462&r2=120463&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 15:18:46 2010 @@ -66,9 +66,9 @@ bool handleEndBlock(BasicBlock &BB); bool RemoveUndeadPointers(Value *Ptr, uint64_t killPointerSize, BasicBlock::iterator &BBI, - SmallPtrSet &deadPointers); + SmallPtrSet &deadPointers); void DeleteDeadInstruction(Instruction *I, - SmallPtrSet *deadPointers = 0); + SmallPtrSet *deadPointers = 0); // getAnalysisUsage - We require post dominance frontiers (aka Control @@ -400,7 +400,7 @@ bool MadeChange = false; // Pointers alloca'd in this function are dead in the end block - SmallPtrSet DeadPointers; + SmallPtrSet DeadPointers; // Find all of the alloca'd pointers in the entry block. BasicBlock *Entry = BB.getParent()->begin(); @@ -450,42 +450,26 @@ continue; } - - Value *KillPointer = 0; - uint64_t KillPointerSize = AliasAnalysis::UnknownSize; - - // If we encounter a use of the pointer, it is no longer considered dead - if (LoadInst *L = dyn_cast(BBI)) { - KillPointer = L->getPointerOperand(); - } else if (VAArgInst *V = dyn_cast(BBI)) { - KillPointer = V->getOperand(0); - } else if (MemTransferInst *MTI = dyn_cast(BBI)) { - KillPointer = cast(BBI)->getSource(); - if (ConstantInt *Len = dyn_cast(MTI->getLength())) - KillPointerSize = Len->getZExtValue(); - } else if (CallSite CS = cast(BBI)) { + if (CallSite CS = cast(BBI)) { // If this call does not access memory, it can't be loading any of our // pointers. if (AA->doesNotAccessMemory(CS)) continue; - unsigned NumModRef = 0; - unsigned NumOther = 0; + unsigned NumModRef = 0, NumOther = 0; - // Remove any pointers made undead by the call from the dead set - std::vector dead; - for (SmallPtrSet::iterator I = DeadPointers.begin(), + // If the call might load from any of our allocas, then any store above + // the call is live. + SmallVector LiveAllocas; + for (SmallPtrSet::iterator I = DeadPointers.begin(), E = DeadPointers.end(); I != E; ++I) { - // HACK: if we detect that our AA is imprecise, it's not - // worth it to scan the rest of the deadPointers set. Just - // assume that the AA will return ModRef for everything, and - // go ahead and bail. - if (NumModRef >= 16 && NumOther == 0) { - DeadPointers.clear(); + // If we detect that our AA is imprecise, it's not worth it to scan the + // rest of the DeadPointers set. Just assume that the AA will return + // ModRef for everything, and go ahead and bail out. + if (NumModRef >= 16 && NumOther == 0) return MadeChange; - } - - // See if the call site touches it + + // See if the call site touches it. AliasAnalysis::ModRefResult A = AA->getModRefInfo(CS, *I, getPointerSize(*I, *AA)); @@ -495,14 +479,33 @@ ++NumOther; if (A == AliasAnalysis::ModRef || A == AliasAnalysis::Ref) - dead.push_back(*I); + LiveAllocas.push_back(*I); } - - for (std::vector::iterator I = dead.begin(), E = dead.end(); - I != E; ++I) + + for (SmallVector::iterator I = LiveAllocas.begin(), + E = LiveAllocas.end(); I != E; ++I) DeadPointers.erase(*I); + // If all of the allocas were clobbered by the call then we're not going + // to find anything else to process. + if (DeadPointers.empty()) + return MadeChange; + continue; + } + + Value *KillPointer = 0; + uint64_t KillPointerSize = AliasAnalysis::UnknownSize; + + // If we encounter a use of the pointer, it is no longer considered dead + if (LoadInst *L = dyn_cast(BBI)) { + KillPointer = L->getPointerOperand(); + } else if (VAArgInst *V = dyn_cast(BBI)) { + KillPointer = V->getOperand(0); + } else if (MemTransferInst *MTI = dyn_cast(BBI)) { + KillPointer = cast(BBI)->getSource(); + if (ConstantInt *Len = dyn_cast(MTI->getLength())) + KillPointerSize = Len->getZExtValue(); } else { // Not a loading instruction. continue; @@ -522,7 +525,7 @@ /// undead when scanning for dead stores to alloca's. bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, BasicBlock::iterator &BBI, - SmallPtrSet &DeadPointers) { + SmallPtrSet &DeadPointers) { // If the kill pointer can be easily reduced to an alloca, // don't bother doing extraneous AA queries. if (DeadPointers.count(killPointer)) { @@ -575,7 +578,7 @@ /// If ValueSet is non-null, remove any deleted instructions from it as well. /// void DSE::DeleteDeadInstruction(Instruction *I, - SmallPtrSet *ValueSet) { + SmallPtrSet *ValueSet) { SmallVector NowDeadInsts; NowDeadInsts.push_back(I); From sabre at nondot.org Tue Nov 30 15:32:12 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 21:32:12 -0000 Subject: [llvm-commits] [llvm] r120465 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130213212.C115D2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 15:32:12 2010 New Revision: 120465 URL: http://llvm.org/viewvc/llvm-project?rev=120465&view=rev Log: remove the "undead" terminology, which is nonstandard and never made sense to me. We now have a set of dead stack objects, and they become live when loaded. Fix a theoretical problem where we'd pass in the wrong pointer to the alias query. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120465&r1=120464&r2=120465&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 15:32:12 2010 @@ -64,9 +64,9 @@ bool runOnBasicBlock(BasicBlock &BB); bool HandleFree(CallInst *F); bool handleEndBlock(BasicBlock &BB); - bool RemoveUndeadPointers(Value *Ptr, uint64_t killPointerSize, - BasicBlock::iterator &BBI, - SmallPtrSet &deadPointers); + bool RemoveAccessedObjects(Value *Ptr, uint64_t killPointerSize, + BasicBlock::iterator &BBI, + SmallPtrSet &deadPointers); void DeleteDeadInstruction(Instruction *I, SmallPtrSet *deadPointers = 0); @@ -399,21 +399,22 @@ bool DSE::handleEndBlock(BasicBlock &BB) { bool MadeChange = false; - // Pointers alloca'd in this function are dead in the end block - SmallPtrSet DeadPointers; + // Keep track of all of the stack objects that are dead at the end of the + // function. + SmallPtrSet DeadStackObjects; // Find all of the alloca'd pointers in the entry block. BasicBlock *Entry = BB.getParent()->begin(); for (BasicBlock::iterator I = Entry->begin(), E = Entry->end(); I != E; ++I) if (AllocaInst *AI = dyn_cast(I)) - DeadPointers.insert(AI); + DeadStackObjects.insert(AI); // Treat byval arguments the same, stores to them are dead at the end of the // function. for (Function::arg_iterator AI = BB.getParent()->arg_begin(), AE = BB.getParent()->arg_end(); AI != AE; ++AI) if (AI->hasByValAttr()) - DeadPointers.insert(AI); + DeadStackObjects.insert(AI); // Scan the basic block backwards for (BasicBlock::iterator BBI = BB.end(); BBI != BB.begin(); ){ @@ -426,10 +427,10 @@ // Alloca'd pointers or byval arguments (which are functionally like // alloca's) are valid candidates for removal. - if (DeadPointers.count(Pointer)) { + if (DeadStackObjects.count(Pointer)) { // DCE instructions only used to calculate that store. Instruction *Dead = BBI++; - DeleteDeadInstruction(Dead, &DeadPointers); + DeleteDeadInstruction(Dead, &DeadStackObjects); ++NumFastStores; MadeChange = true; continue; @@ -439,14 +440,14 @@ // Remove any dead non-memory-mutating instructions. if (isInstructionTriviallyDead(BBI)) { Instruction *Inst = BBI++; - DeleteDeadInstruction(Inst, &DeadPointers); + DeleteDeadInstruction(Inst, &DeadStackObjects); ++NumFastOther; MadeChange = true; continue; } if (AllocaInst *A = dyn_cast(BBI)) { - DeadPointers.erase(A); + DeadStackObjects.erase(A); continue; } @@ -461,8 +462,8 @@ // If the call might load from any of our allocas, then any store above // the call is live. SmallVector LiveAllocas; - for (SmallPtrSet::iterator I = DeadPointers.begin(), - E = DeadPointers.end(); I != E; ++I) { + for (SmallPtrSet::iterator I = DeadStackObjects.begin(), + E = DeadStackObjects.end(); I != E; ++I) { // If we detect that our AA is imprecise, it's not worth it to scan the // rest of the DeadPointers set. Just assume that the AA will return // ModRef for everything, and go ahead and bail out. @@ -484,11 +485,11 @@ for (SmallVector::iterator I = LiveAllocas.begin(), E = LiveAllocas.end(); I != E; ++I) - DeadPointers.erase(*I); + DeadStackObjects.erase(*I); // If all of the allocas were clobbered by the call then we're not going // to find anything else to process. - if (DeadPointers.empty()) + if (DeadStackObjects.empty()) return MadeChange; continue; @@ -511,41 +512,47 @@ continue; } - KillPointer = KillPointer->getUnderlyingObject(); - - // Deal with undead pointers - MadeChange |= RemoveUndeadPointers(KillPointer, KillPointerSize, BBI, - DeadPointers); + // Remove any allocas from the DeadPointer set that are loaded, as this + // makes any stores above the access live. + MadeChange |= RemoveAccessedObjects(KillPointer, KillPointerSize, BBI, + DeadStackObjects); + + // If all of the allocas were clobbered by the access then we're not going + // to find anything else to process. + if (DeadStackObjects.empty()) + break; } return MadeChange; } -/// RemoveUndeadPointers - check for uses of a pointer that make it -/// undead when scanning for dead stores to alloca's. -bool DSE::RemoveUndeadPointers(Value *killPointer, uint64_t killPointerSize, - BasicBlock::iterator &BBI, - SmallPtrSet &DeadPointers) { - // If the kill pointer can be easily reduced to an alloca, - // don't bother doing extraneous AA queries. - if (DeadPointers.count(killPointer)) { - DeadPointers.erase(killPointer); +/// RemoveAccessedObjects - Check to see if the specified location may alias any +/// of the stack objects in the DeadStackObjects set. If so, they become live +/// because the location is being loaded. +bool DSE::RemoveAccessedObjects(Value *KillPointer, uint64_t KillPointerSize, + BasicBlock::iterator &BBI, + SmallPtrSet &DeadStackObjects) { + Value *UnderlyingPointer = KillPointer->getUnderlyingObject(); + + // A constant can't be in the dead pointer set. + if (isa(UnderlyingPointer)) return false; - } - // A global can't be in the dead pointer set. - if (isa(killPointer)) + // If the kill pointer can be easily reduced to an alloca, don't bother doing + // extraneous AA queries. + if (DeadStackObjects.count(UnderlyingPointer)) { + DeadStackObjects.erase(UnderlyingPointer); return false; + } bool MadeChange = false; + SmallVector NowLive; - SmallVector undead; - - for (SmallPtrSet::iterator I = DeadPointers.begin(), - E = DeadPointers.end(); I != E; ++I) { + for (SmallPtrSet::iterator I = DeadStackObjects.begin(), + E = DeadStackObjects.end(); I != E; ++I) { // See if this pointer could alias it AliasAnalysis::AliasResult A = AA->alias(*I, getPointerSize(*I, *AA), - killPointer, killPointerSize); + KillPointer, KillPointerSize); // If it must-alias and a store, we can delete it if (isa(BBI) && A == AliasAnalysis::MustAlias) { @@ -553,7 +560,7 @@ // Remove it! ++BBI; - DeleteDeadInstruction(S, &DeadPointers); + DeleteDeadInstruction(S, &DeadStackObjects); ++NumFastStores; MadeChange = true; @@ -561,12 +568,12 @@ // Otherwise, it is undead } else if (A != AliasAnalysis::NoAlias) - undead.push_back(*I); + NowLive.push_back(*I); } - for (SmallVector::iterator I = undead.begin(), E = undead.end(); + for (SmallVector::iterator I = NowLive.begin(), E = NowLive.end(); I != E; ++I) - DeadPointers.erase(*I); + DeadStackObjects.erase(*I); return MadeChange; } From echristo at apple.com Tue Nov 30 15:37:36 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 21:37:36 -0000 Subject: [llvm-commits] [llvm] r120466 - /llvm/trunk/lib/Target/X86/X86InstrControl.td Message-ID: <20101130213736.DA4C62A6C12D@llvm.org> Author: echristo Date: Tue Nov 30 15:37:36 2010 New Revision: 120466 URL: http://llvm.org/viewvc/llvm-project?rev=120466&view=rev Log: Migrate X86InstrControl.td to use PseudoI and fix a couple of 80-col violations while I'm in there. Modified: llvm/trunk/lib/Target/X86/X86InstrControl.td Modified: llvm/trunk/lib/Target/X86/X86InstrControl.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrControl.td?rev=120466&r1=120465&r2=120466&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrControl.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrControl.td Tue Nov 30 15:37:36 2010 @@ -182,16 +182,13 @@ XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS], Uses = [ESP] in { - def TCRETURNdi : I<0, Pseudo, (outs), - (ins i32imm_pcrel:$dst, i32imm:$offset, variable_ops), - "#TC_RETURN $dst $offset", []>; - def TCRETURNri : I<0, Pseudo, (outs), - (ins GR32_TC:$dst, i32imm:$offset, variable_ops), - "#TC_RETURN $dst $offset", []>; + def TCRETURNdi : PseudoI<(outs), + (ins i32imm_pcrel:$dst, i32imm:$offset, variable_ops), []>; + def TCRETURNri : PseudoI<(outs), + (ins GR32_TC:$dst, i32imm:$offset, variable_ops), []>; let mayLoad = 1 in - def TCRETURNmi : I<0, Pseudo, (outs), - (ins i32mem_TC:$dst, i32imm:$offset, variable_ops), - "#TC_RETURN $dst $offset", []>; + def TCRETURNmi : PseudoI<(outs), + (ins i32mem_TC:$dst, i32imm:$offset, variable_ops), []>; // FIXME: The should be pseudo instructions that are lowered when going to // mcinst. @@ -259,7 +256,8 @@ def WINCALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst, variable_ops), "call{q}\t{*}$dst", [(X86call GR64:$dst)]>, Requires<[IsWin64]>; - def WINCALL64m : I<0xFF, MRM2m, (outs), (ins i64mem:$dst,variable_ops), + def WINCALL64m : I<0xFF, MRM2m, (outs), + (ins i64mem:$dst,variable_ops), "call{q}\t{*}$dst", [(X86call (loadi64 addr:$dst))]>, Requires<[IsWin64]>; @@ -274,16 +272,14 @@ XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS], Uses = [RSP] in { - def TCRETURNdi64 : I<0, Pseudo, (outs), - (ins i64i32imm_pcrel:$dst, i32imm:$offset, variable_ops), - "#TC_RETURN $dst $offset", []>; - def TCRETURNri64 : I<0, Pseudo, (outs), (ins GR64_TC:$dst, i32imm:$offset, - variable_ops), - "#TC_RETURN $dst $offset", []>; + def TCRETURNdi64 : PseudoI<(outs), + (ins i64i32imm_pcrel:$dst, i32imm:$offset, variable_ops), + []>; + def TCRETURNri64 : PseudoI<(outs), + (ins GR64_TC:$dst, i32imm:$offset, variable_ops), []>; let mayLoad = 1 in - def TCRETURNmi64 : I<0, Pseudo, (outs), - (ins i64mem_TC:$dst, i32imm:$offset, variable_ops), - "#TC_RETURN $dst $offset", []>; + def TCRETURNmi64 : PseudoI<(outs), + (ins i64mem_TC:$dst, i32imm:$offset, variable_ops), []>; def TAILJMPd64 : Ii32PCRel<0xE9, RawFrm, (outs), (ins i64i32imm_pcrel:$dst, variable_ops), From sabre at nondot.org Tue Nov 30 15:38:30 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 21:38:30 -0000 Subject: [llvm-commits] [llvm] r120467 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130213830.8D8BA2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 15:38:30 2010 New Revision: 120467 URL: http://llvm.org/viewvc/llvm-project?rev=120467&view=rev Log: two improvements to RemoveAccessedObjects: 1. if the underlying pointer passed in can be resolved to any argument or alloca, then we don't need to scan. Previously we would only avoid the scan if the alloca or byval was actually considered dead. 2. The dead store processing code is itself completely dead and didn't handle volatile stores right anyway, so delete it. This allows simplifying the interface to RemoveAccessedObjects. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120467&r1=120466&r2=120467&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 15:38:30 2010 @@ -64,8 +64,7 @@ bool runOnBasicBlock(BasicBlock &BB); bool HandleFree(CallInst *F); bool handleEndBlock(BasicBlock &BB); - bool RemoveAccessedObjects(Value *Ptr, uint64_t killPointerSize, - BasicBlock::iterator &BBI, + void RemoveAccessedObjects(Value *Ptr, uint64_t killPointerSize, SmallPtrSet &deadPointers); void DeleteDeadInstruction(Instruction *I, SmallPtrSet *deadPointers = 0); @@ -514,8 +513,7 @@ // Remove any allocas from the DeadPointer set that are loaded, as this // makes any stores above the access live. - MadeChange |= RemoveAccessedObjects(KillPointer, KillPointerSize, BBI, - DeadStackObjects); + RemoveAccessedObjects(KillPointer, KillPointerSize, DeadStackObjects); // If all of the allocas were clobbered by the access then we're not going // to find anything else to process. @@ -529,53 +527,34 @@ /// RemoveAccessedObjects - Check to see if the specified location may alias any /// of the stack objects in the DeadStackObjects set. If so, they become live /// because the location is being loaded. -bool DSE::RemoveAccessedObjects(Value *KillPointer, uint64_t KillPointerSize, - BasicBlock::iterator &BBI, +void DSE::RemoveAccessedObjects(Value *KillPointer, uint64_t KillPointerSize, SmallPtrSet &DeadStackObjects) { Value *UnderlyingPointer = KillPointer->getUnderlyingObject(); // A constant can't be in the dead pointer set. if (isa(UnderlyingPointer)) - return false; + return; // If the kill pointer can be easily reduced to an alloca, don't bother doing // extraneous AA queries. - if (DeadStackObjects.count(UnderlyingPointer)) { + if (isa(UnderlyingPointer) || isa(UnderlyingPointer)) { DeadStackObjects.erase(UnderlyingPointer); - return false; + return; } - bool MadeChange = false; SmallVector NowLive; - for (SmallPtrSet::iterator I = DeadStackObjects.begin(), E = DeadStackObjects.end(); I != E; ++I) { // See if this pointer could alias it AliasAnalysis::AliasResult A = AA->alias(*I, getPointerSize(*I, *AA), KillPointer, KillPointerSize); - - // If it must-alias and a store, we can delete it - if (isa(BBI) && A == AliasAnalysis::MustAlias) { - StoreInst *S = cast(BBI); - - // Remove it! - ++BBI; - DeleteDeadInstruction(S, &DeadStackObjects); - ++NumFastStores; - MadeChange = true; - - continue; - - // Otherwise, it is undead - } else if (A != AliasAnalysis::NoAlias) + if (A != AliasAnalysis::NoAlias) NowLive.push_back(*I); } for (SmallVector::iterator I = NowLive.begin(), E = NowLive.end(); I != E; ++I) DeadStackObjects.erase(*I); - - return MadeChange; } /// DeleteDeadInstruction - Delete this instruction. Before we do, go through From sabre at nondot.org Tue Nov 30 15:47:58 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 21:47:58 -0000 Subject: [llvm-commits] [llvm] r120469 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130214759.012152A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 15:47:58 2010 New Revision: 120469 URL: http://llvm.org/viewvc/llvm-project?rev=120469&view=rev Log: switch RemoveAccessedObjects to use AliasAnalysis::Location to simplify the code. We now get accurate sizes on Loads, though it surely doesn't matter in practice. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120469&r1=120468&r2=120469&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 15:47:58 2010 @@ -64,8 +64,8 @@ bool runOnBasicBlock(BasicBlock &BB); bool HandleFree(CallInst *F); bool handleEndBlock(BasicBlock &BB); - void RemoveAccessedObjects(Value *Ptr, uint64_t killPointerSize, - SmallPtrSet &deadPointers); + void RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc, + SmallPtrSet &DeadStackObjects); void DeleteDeadInstruction(Instruction *I, SmallPtrSet *deadPointers = 0); @@ -494,18 +494,15 @@ continue; } - Value *KillPointer = 0; - uint64_t KillPointerSize = AliasAnalysis::UnknownSize; + AliasAnalysis::Location LoadedLoc; // If we encounter a use of the pointer, it is no longer considered dead if (LoadInst *L = dyn_cast(BBI)) { - KillPointer = L->getPointerOperand(); + LoadedLoc = AA->getLocation(L); } else if (VAArgInst *V = dyn_cast(BBI)) { - KillPointer = V->getOperand(0); + LoadedLoc = AA->getLocation(V); } else if (MemTransferInst *MTI = dyn_cast(BBI)) { - KillPointer = cast(BBI)->getSource(); - if (ConstantInt *Len = dyn_cast(MTI->getLength())) - KillPointerSize = Len->getZExtValue(); + LoadedLoc = AA->getLocationForSource(MTI); } else { // Not a loading instruction. continue; @@ -513,7 +510,7 @@ // Remove any allocas from the DeadPointer set that are loaded, as this // makes any stores above the access live. - RemoveAccessedObjects(KillPointer, KillPointerSize, DeadStackObjects); + RemoveAccessedObjects(LoadedLoc, DeadStackObjects); // If all of the allocas were clobbered by the access then we're not going // to find anything else to process. @@ -527,9 +524,9 @@ /// RemoveAccessedObjects - Check to see if the specified location may alias any /// of the stack objects in the DeadStackObjects set. If so, they become live /// because the location is being loaded. -void DSE::RemoveAccessedObjects(Value *KillPointer, uint64_t KillPointerSize, +void DSE::RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc, SmallPtrSet &DeadStackObjects) { - Value *UnderlyingPointer = KillPointer->getUnderlyingObject(); + const Value *UnderlyingPointer = LoadedLoc.Ptr->getUnderlyingObject(); // A constant can't be in the dead pointer set. if (isa(UnderlyingPointer)) @@ -538,17 +535,16 @@ // If the kill pointer can be easily reduced to an alloca, don't bother doing // extraneous AA queries. if (isa(UnderlyingPointer) || isa(UnderlyingPointer)) { - DeadStackObjects.erase(UnderlyingPointer); + DeadStackObjects.erase(const_cast(UnderlyingPointer)); return; } SmallVector NowLive; for (SmallPtrSet::iterator I = DeadStackObjects.begin(), E = DeadStackObjects.end(); I != E; ++I) { - // See if this pointer could alias it - AliasAnalysis::AliasResult A = AA->alias(*I, getPointerSize(*I, *AA), - KillPointer, KillPointerSize); - if (A != AliasAnalysis::NoAlias) + // See if the loaded location could alias the stack location. + AliasAnalysis::Location StackLoc(*I, getPointerSize(*I, *AA)); + if (!AA->isNoAlias(StackLoc, LoadedLoc)) NowLive.push_back(*I); } From echristo at apple.com Tue Nov 30 15:57:32 2010 From: echristo at apple.com (Eric Christopher) Date: Tue, 30 Nov 2010 21:57:32 -0000 Subject: [llvm-commits] [llvm] r120470 - /llvm/trunk/lib/Target/X86/X86InstrFPStack.td Message-ID: <20101130215732.CB9D52A6C12D@llvm.org> Author: echristo Date: Tue Nov 30 15:57:32 2010 New Revision: 120470 URL: http://llvm.org/viewvc/llvm-project?rev=120470&view=rev Log: Move X86InstrFPStack.td over to PseudoI as well. Modified: llvm/trunk/lib/Target/X86/X86InstrFPStack.td Modified: llvm/trunk/lib/Target/X86/X86InstrFPStack.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFPStack.td?rev=120470&r1=120469&r2=120470&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFPStack.td (original) +++ llvm/trunk/lib/Target/X86/X86InstrFPStack.td Tue Nov 30 15:57:32 2010 @@ -73,41 +73,23 @@ // Some 'special' instructions let usesCustomInserter = 1 in { // Expanded after instruction selection. - def FP32_TO_INT16_IN_MEM : I<0, Pseudo, - (outs), (ins i16mem:$dst, RFP32:$src), - "##FP32_TO_INT16_IN_MEM PSEUDO!", + def FP32_TO_INT16_IN_MEM : PseudoI<(outs), (ins i16mem:$dst, RFP32:$src), [(X86fp_to_i16mem RFP32:$src, addr:$dst)]>; - def FP32_TO_INT32_IN_MEM : I<0, Pseudo, - (outs), (ins i32mem:$dst, RFP32:$src), - "##FP32_TO_INT32_IN_MEM PSEUDO!", + def FP32_TO_INT32_IN_MEM : PseudoI<(outs), (ins i32mem:$dst, RFP32:$src), [(X86fp_to_i32mem RFP32:$src, addr:$dst)]>; - def FP32_TO_INT64_IN_MEM : I<0, Pseudo, - (outs), (ins i64mem:$dst, RFP32:$src), - "##FP32_TO_INT64_IN_MEM PSEUDO!", + def FP32_TO_INT64_IN_MEM : PseudoI<(outs), (ins i64mem:$dst, RFP32:$src), [(X86fp_to_i64mem RFP32:$src, addr:$dst)]>; - def FP64_TO_INT16_IN_MEM : I<0, Pseudo, - (outs), (ins i16mem:$dst, RFP64:$src), - "##FP64_TO_INT16_IN_MEM PSEUDO!", + def FP64_TO_INT16_IN_MEM : PseudoI<(outs), (ins i16mem:$dst, RFP64:$src), [(X86fp_to_i16mem RFP64:$src, addr:$dst)]>; - def FP64_TO_INT32_IN_MEM : I<0, Pseudo, - (outs), (ins i32mem:$dst, RFP64:$src), - "##FP64_TO_INT32_IN_MEM PSEUDO!", + def FP64_TO_INT32_IN_MEM : PseudoI<(outs), (ins i32mem:$dst, RFP64:$src), [(X86fp_to_i32mem RFP64:$src, addr:$dst)]>; - def FP64_TO_INT64_IN_MEM : I<0, Pseudo, - (outs), (ins i64mem:$dst, RFP64:$src), - "##FP64_TO_INT64_IN_MEM PSEUDO!", + def FP64_TO_INT64_IN_MEM : PseudoI<(outs), (ins i64mem:$dst, RFP64:$src), [(X86fp_to_i64mem RFP64:$src, addr:$dst)]>; - def FP80_TO_INT16_IN_MEM : I<0, Pseudo, - (outs), (ins i16mem:$dst, RFP80:$src), - "##FP80_TO_INT16_IN_MEM PSEUDO!", + def FP80_TO_INT16_IN_MEM : PseudoI<(outs), (ins i16mem:$dst, RFP80:$src), [(X86fp_to_i16mem RFP80:$src, addr:$dst)]>; - def FP80_TO_INT32_IN_MEM : I<0, Pseudo, - (outs), (ins i32mem:$dst, RFP80:$src), - "##FP80_TO_INT32_IN_MEM PSEUDO!", + def FP80_TO_INT32_IN_MEM : PseudoI<(outs), (ins i32mem:$dst, RFP80:$src), [(X86fp_to_i32mem RFP80:$src, addr:$dst)]>; - def FP80_TO_INT64_IN_MEM : I<0, Pseudo, - (outs), (ins i64mem:$dst, RFP80:$src), - "##FP80_TO_INT64_IN_MEM PSEUDO!", + def FP80_TO_INT64_IN_MEM : PseudoI<(outs), (ins i64mem:$dst, RFP80:$src), [(X86fp_to_i64mem RFP80:$src, addr:$dst)]>; } From sabre at nondot.org Tue Nov 30 15:58:15 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 21:58:15 -0000 Subject: [llvm-commits] [llvm] r120471 - /llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Message-ID: <20101130215815.101B52A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 15:58:14 2010 New Revision: 120471 URL: http://llvm.org/viewvc/llvm-project?rev=120471&view=rev Log: Make DeleteDeadInstruction be a static function, move some code around. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120471&r1=120470&r2=120471&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 15:58:14 2010 @@ -66,8 +66,6 @@ bool handleEndBlock(BasicBlock &BB); void RemoveAccessedObjects(const AliasAnalysis::Location &LoadedLoc, SmallPtrSet &DeadStackObjects); - void DeleteDeadInstruction(Instruction *I, - SmallPtrSet *deadPointers = 0); // getAnalysisUsage - We require post dominance frontiers (aka Control @@ -93,6 +91,53 @@ FunctionPass *llvm::createDeadStoreEliminationPass() { return new DSE(); } +//===----------------------------------------------------------------------===// +// Helper functions +//===----------------------------------------------------------------------===// + +/// DeleteDeadInstruction - Delete this instruction. Before we do, go through +/// and zero out all the operands of this instruction. If any of them become +/// dead, delete them and the computation tree that feeds them. +/// +/// If ValueSet is non-null, remove any deleted instructions from it as well. +/// +static void DeleteDeadInstruction(Instruction *I, + MemoryDependenceAnalysis &MD, + SmallPtrSet *ValueSet = 0) { + SmallVector NowDeadInsts; + + NowDeadInsts.push_back(I); + --NumFastOther; + + // Before we touch this instruction, remove it from memdep! + do { + Instruction *DeadInst = NowDeadInsts.pop_back_val(); + ++NumFastOther; + + // This instruction is dead, zap it, in stages. Start by removing it from + // MemDep, which needs to know the operands and needs it to be in the + // function. + MD.removeInstruction(DeadInst); + + for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) { + Value *Op = DeadInst->getOperand(op); + DeadInst->setOperand(op, 0); + + // If this operand just became dead, add it to the NowDeadInsts list. + if (!Op->use_empty()) continue; + + if (Instruction *OpI = dyn_cast(Op)) + if (isInstructionTriviallyDead(OpI)) + NowDeadInsts.push_back(OpI); + } + + DeadInst->eraseFromParent(); + + if (ValueSet) ValueSet->erase(DeadInst); + } while (!NowDeadInsts.empty()); +} + + /// hasMemoryWrite - Does this instruction write some memory? This only returns /// true for things that we can analyze with other helpers below. static bool hasMemoryWrite(Instruction *I) { @@ -177,21 +222,18 @@ } } -/// getPointerOperand - Return the pointer that is being written to. -static Value *getPointerOperand(Instruction *I) { - assert(hasMemoryWrite(I)); +/// getStoredPointerOperand - Return the pointer that is being written to. +static Value *getStoredPointerOperand(Instruction *I) { if (StoreInst *SI = dyn_cast(I)) return SI->getPointerOperand(); if (MemIntrinsic *MI = dyn_cast(I)) - return MI->getArgOperand(0); + return MI->getDest(); IntrinsicInst *II = cast(I); switch (II->getIntrinsicID()) { default: assert(false && "Unexpected intrinsic!"); case Intrinsic::init_trampoline: return II->getArgOperand(0); - case Intrinsic::lifetime_end: - return II->getArgOperand(1); } } @@ -243,6 +285,11 @@ return true; } + +//===----------------------------------------------------------------------===// +// DSE Pass +//===----------------------------------------------------------------------===// + bool DSE::runOnBasicBlock(BasicBlock &BB) { bool MadeChange = false; @@ -280,7 +327,7 @@ // in case we need it. WeakVH NextInst(BBI); - DeleteDeadInstruction(SI); + DeleteDeadInstruction(SI, *MD); if (NextInst == 0) // Next instruction deleted. BBI = BB.begin(); @@ -318,7 +365,7 @@ // store to 'Loc' then we can remove it. if (isRemovable(DepWrite) && isCompleteOverwrite(Loc, DepLoc, *AA)) { // Delete the store and now-dead instructions that feed it. - DeleteDeadInstruction(DepWrite); + DeleteDeadInstruction(DepWrite, *MD); ++NumFastStores; MadeChange = true; @@ -367,7 +414,8 @@ if (!hasMemoryWrite(Dependency) || !isRemovable(Dependency)) return false; - Value *DepPointer = getPointerOperand(Dependency)->getUnderlyingObject(); + Value *DepPointer = + getStoredPointerOperand(Dependency)->getUnderlyingObject(); // Check for aliasing. if (AA->alias(F->getArgOperand(0), 1, DepPointer, 1) != @@ -375,7 +423,7 @@ return false; // DCE instructions only used to calculate that store - DeleteDeadInstruction(Dependency); + DeleteDeadInstruction(Dependency, *MD); ++NumFastStores; // Inst's old Dependency is now deleted. Compute the next dependency, @@ -422,14 +470,13 @@ // If we find a store, check to see if it points into a dead stack value. if (hasMemoryWrite(BBI) && isRemovable(BBI)) { // See through pointer-to-pointer bitcasts - Value *Pointer = getPointerOperand(BBI)->getUnderlyingObject(); + Value *Pointer = getStoredPointerOperand(BBI)->getUnderlyingObject(); - // Alloca'd pointers or byval arguments (which are functionally like - // alloca's) are valid candidates for removal. + // Stores to stack values are valid candidates for removal. if (DeadStackObjects.count(Pointer)) { // DCE instructions only used to calculate that store. Instruction *Dead = BBI++; - DeleteDeadInstruction(Dead, &DeadStackObjects); + DeleteDeadInstruction(Dead, *MD, &DeadStackObjects); ++NumFastStores; MadeChange = true; continue; @@ -439,7 +486,7 @@ // Remove any dead non-memory-mutating instructions. if (isInstructionTriviallyDead(BBI)) { Instruction *Inst = BBI++; - DeleteDeadInstruction(Inst, &DeadStackObjects); + DeleteDeadInstruction(Inst, *MD, &DeadStackObjects); ++NumFastOther; MadeChange = true; continue; @@ -553,45 +600,3 @@ DeadStackObjects.erase(*I); } -/// DeleteDeadInstruction - Delete this instruction. Before we do, go through -/// and zero out all the operands of this instruction. If any of them become -/// dead, delete them and the computation tree that feeds them. -/// -/// If ValueSet is non-null, remove any deleted instructions from it as well. -/// -void DSE::DeleteDeadInstruction(Instruction *I, - SmallPtrSet *ValueSet) { - SmallVector NowDeadInsts; - - NowDeadInsts.push_back(I); - --NumFastOther; - - // Before we touch this instruction, remove it from memdep! - do { - Instruction *DeadInst = NowDeadInsts.pop_back_val(); - - ++NumFastOther; - - // This instruction is dead, zap it, in stages. Start by removing it from - // MemDep, which needs to know the operands and needs it to be in the - // function. - MD->removeInstruction(DeadInst); - - for (unsigned op = 0, e = DeadInst->getNumOperands(); op != e; ++op) { - Value *Op = DeadInst->getOperand(op); - DeadInst->setOperand(op, 0); - - // If this operand just became dead, add it to the NowDeadInsts list. - if (!Op->use_empty()) continue; - - if (Instruction *OpI = dyn_cast(Op)) - if (isInstructionTriviallyDead(OpI)) - NowDeadInsts.push_back(OpI); - } - - DeadInst->eraseFromParent(); - - if (ValueSet) ValueSet->erase(DeadInst); - } while (!NowDeadInsts.empty()); -} - From sabre at nondot.org Tue Nov 30 16:18:11 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 22:18:11 -0000 Subject: [llvm-commits] [llvm] r120474 - /llvm/trunk/lib/Transforms/Scalar/GVN.cpp Message-ID: <20101130221811.A41872A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 16:18:11 2010 New Revision: 120474 URL: http://llvm.org/viewvc/llvm-project?rev=120474&view=rev Log: remove a fixed fixme Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=120474&r1=120473&r2=120474&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Tue Nov 30 16:18:11 2010 @@ -1045,8 +1045,6 @@ // If the load and store don't overlap at all, the store doesn't provide // anything to the load. In this case, they really don't alias at all, AA // must have gotten confused. - // FIXME: Investigate cases where this bails out, e.g. rdar://7238614. Then - // remove this check, as it is duplicated with what we have below. uint64_t LoadSize = TD.getTypeSizeInBits(LoadTy); if ((WriteSizeInBits & 7) | (LoadSize & 7)) From sabre at nondot.org Tue Nov 30 16:25:26 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 22:25:26 -0000 Subject: [llvm-commits] [llvm] r120476 - in /llvm/trunk: include/llvm/Analysis/ValueTracking.h lib/Analysis/ValueTracking.cpp lib/Transforms/Scalar/GVN.cpp Message-ID: <20101130222526.BA7342A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 16:25:26 2010 New Revision: 120476 URL: http://llvm.org/viewvc/llvm-project?rev=120476&view=rev Log: move GetPointerBaseWithConstantOffset out of GVN into ValueTracking.h Modified: llvm/trunk/include/llvm/Analysis/ValueTracking.h llvm/trunk/lib/Analysis/ValueTracking.cpp llvm/trunk/lib/Transforms/Scalar/GVN.cpp Modified: llvm/trunk/include/llvm/Analysis/ValueTracking.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ValueTracking.h?rev=120476&r1=120475&r2=120476&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/ValueTracking.h (original) +++ llvm/trunk/include/llvm/Analysis/ValueTracking.h Tue Nov 30 16:25:26 2010 @@ -97,6 +97,12 @@ return FindInsertedValue(V, &Idxs[0], &Idxs[1], InsertBefore); } + /// GetPointerBaseWithConstantOffset - Analyze the specified pointer to see if + /// it can be expressed as a base pointer plus a constant offset. Return the + /// base and offset to the caller. + Value *GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, + const TargetData &TD); + /// GetConstantStringInfo - This function computes the length of a /// null-terminated C string pointed to by V. If successful, it returns true /// and returns the string in Str. If unsuccessful, it returns false. If Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=120476&r1=120475&r2=120476&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original) +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Tue Nov 30 16:25:26 2010 @@ -1160,6 +1160,47 @@ return 0; } +/// GetPointerBaseWithConstantOffset - Analyze the specified pointer to see if +/// it can be expressed as a base pointer plus a constant offset. Return the +/// base and offset to the caller. +Value *llvm::GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, + const TargetData &TD) { + Operator *PtrOp = dyn_cast(Ptr); + if (PtrOp == 0) return Ptr; + + // Just look through bitcasts. + if (PtrOp->getOpcode() == Instruction::BitCast) + return GetPointerBaseWithConstantOffset(PtrOp->getOperand(0), Offset, TD); + + // If this is a GEP with constant indices, we can look through it. + GEPOperator *GEP = dyn_cast(PtrOp); + if (GEP == 0 || !GEP->hasAllConstantIndices()) return Ptr; + + gep_type_iterator GTI = gep_type_begin(GEP); + for (User::op_iterator I = GEP->idx_begin(), E = GEP->idx_end(); I != E; + ++I, ++GTI) { + ConstantInt *OpC = cast(*I); + if (OpC->isZero()) continue; + + // Handle a struct and array indices which add their offset to the pointer. + if (const StructType *STy = dyn_cast(*GTI)) { + Offset += TD.getStructLayout(STy)->getElementOffset(OpC->getZExtValue()); + } else { + uint64_t Size = TD.getTypeAllocSize(GTI.getIndexedType()); + Offset += OpC->getSExtValue()*Size; + } + } + + // Re-sign extend from the pointer size if needed to get overflow edge cases + // right. + unsigned PtrSize = TD.getPointerSizeInBits(); + if (PtrSize < 64) + Offset = (Offset << (64-PtrSize)) >> (64-PtrSize); + + return GetPointerBaseWithConstantOffset(GEP->getPointerOperand(), Offset, TD); +} + + /// GetConstantStringInfo - This function computes the length of a /// null-terminated C string pointed to by V. If successful, it returns true /// and returns the string in Str. If unsuccessful, it returns false. Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=120476&r1=120475&r2=120476&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Tue Nov 30 16:25:26 2010 @@ -17,21 +17,12 @@ #define DEBUG_TYPE "gvn" #include "llvm/Transforms/Scalar.h" -#include "llvm/BasicBlock.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" #include "llvm/Function.h" #include "llvm/IntrinsicInst.h" -#include "llvm/LLVMContext.h" #include "llvm/Operator.h" -#include "llvm/Value.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/DepthFirstIterator.h" -#include "llvm/ADT/PostOrderIterator.h" -#include "llvm/ADT/SmallPtrSet.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/Statistic.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/Dominators.h" @@ -40,6 +31,16 @@ #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Analysis/MemoryDependenceAnalysis.h" #include "llvm/Analysis/PHITransAddr.h" +#include "llvm/Analysis/ValueTracking.h" +#include "llvm/Target/TargetData.h" +#include "llvm/Transforms/Utils/BasicBlockUtils.h" +#include "llvm/Transforms/Utils/Local.h" +#include "llvm/Transforms/Utils/SSAUpdater.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/DepthFirstIterator.h" +#include "llvm/ADT/PostOrderIterator.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/Statistic.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/CFG.h" #include "llvm/Support/CommandLine.h" @@ -47,11 +48,6 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/IRBuilder.h" -#include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetData.h" -#include "llvm/Transforms/Utils/BasicBlockUtils.h" -#include "llvm/Transforms/Utils/Local.h" -#include "llvm/Transforms/Utils/SSAUpdater.h" #include using namespace llvm; @@ -962,47 +958,6 @@ return new BitCastInst(StoredVal, LoadedTy, "bitcast", InsertPt); } -/// GetBaseWithConstantOffset - Analyze the specified pointer to see if it can -/// be expressed as a base pointer plus a constant offset. Return the base and -/// offset to the caller. -static Value *GetBaseWithConstantOffset(Value *Ptr, int64_t &Offset, - const TargetData &TD) { - Operator *PtrOp = dyn_cast(Ptr); - if (PtrOp == 0) return Ptr; - - // Just look through bitcasts. - if (PtrOp->getOpcode() == Instruction::BitCast) - return GetBaseWithConstantOffset(PtrOp->getOperand(0), Offset, TD); - - // If this is a GEP with constant indices, we can look through it. - GEPOperator *GEP = dyn_cast(PtrOp); - if (GEP == 0 || !GEP->hasAllConstantIndices()) return Ptr; - - gep_type_iterator GTI = gep_type_begin(GEP); - for (User::op_iterator I = GEP->idx_begin(), E = GEP->idx_end(); I != E; - ++I, ++GTI) { - ConstantInt *OpC = cast(*I); - if (OpC->isZero()) continue; - - // Handle a struct and array indices which add their offset to the pointer. - if (const StructType *STy = dyn_cast(*GTI)) { - Offset += TD.getStructLayout(STy)->getElementOffset(OpC->getZExtValue()); - } else { - uint64_t Size = TD.getTypeAllocSize(GTI.getIndexedType()); - Offset += OpC->getSExtValue()*Size; - } - } - - // Re-sign extend from the pointer size if needed to get overflow edge cases - // right. - unsigned PtrSize = TD.getPointerSizeInBits(); - if (PtrSize < 64) - Offset = (Offset << (64-PtrSize)) >> (64-PtrSize); - - return GetBaseWithConstantOffset(GEP->getPointerOperand(), Offset, TD); -} - - /// AnalyzeLoadFromClobberingWrite - This function is called when we have a /// memdep query of a load that ends up being a clobbering memory write (store, /// memset, memcpy, memmove). This means that the write *may* provide bits used @@ -1021,9 +976,8 @@ return -1; int64_t StoreOffset = 0, LoadOffset = 0; - Value *StoreBase = GetBaseWithConstantOffset(WritePtr, StoreOffset, TD); - Value *LoadBase = - GetBaseWithConstantOffset(LoadPtr, LoadOffset, TD); + Value *StoreBase = GetPointerBaseWithConstantOffset(WritePtr, StoreOffset,TD); + Value *LoadBase = GetPointerBaseWithConstantOffset(LoadPtr, LoadOffset, TD); if (StoreBase != LoadBase) return -1; From grosbach at apple.com Tue Nov 30 16:33:49 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 14:33:49 -0800 Subject: [llvm-commits] [llvm] r119760 - in /llvm/trunk: lib/Target/ARM/ARMCodeEmitter.cpp lib/Target/ARM/ARMELFWriterInfo.cpp lib/Target/ARM/ARMFixupKinds.h lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMMCCodeEmitter.cpp utils/TableGen/EDEmitter.cpp In-Reply-To: <20101118233716.042ED2A6C12C@llvm.org> References: <20101118233716.042ED2A6C12C@llvm.org> Message-ID: Hi Jason, Sorry for the late comment on this. I believe you need to add any new fixups to the table in ARMMCCodeEmitter.cpp:getFixupKindInfo(). I'm surprised you haven't been hitting assertion errors with these fixups without that being present. -Jim On Nov 18, 2010, at 3:37 PM, Jason W Kim wrote: > Author: jasonwkim > Date: Thu Nov 18 17:37:15 2010 > New Revision: 119760 > > URL: http://llvm.org/viewvc/llvm-project?rev=119760&view=rev > Log: > Fix .o emission of ARM movt/movw. MCSymbolRefExpr::VK_ARM_(HI||LO)16 for the .o path now works for ARM. > Note: lo16AllZero remains in ARMInstrInfo.td - It can be factored out when Thumb movt is repaired. > Existing tests cover this update. > > > Modified: > llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp > llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp > llvm/trunk/lib/Target/ARM/ARMFixupKinds.h > llvm/trunk/lib/Target/ARM/ARMInstrInfo.td > llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp > llvm/trunk/utils/TableGen/EDEmitter.cpp > > Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=119760&r1=119759&r2=119760&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) > +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Thu Nov 18 17:37:15 2010 > @@ -214,6 +214,11 @@ > Binary |= (Reg << 13); > return Binary; > } > + > + unsigned getMovtImmOpValue(const MachineInstr &MI, unsigned Op) const { > + return 0; > + } > + > uint32_t getAddrMode2OpValue(const MachineInstr &MI, unsigned OpIdx) > const { return 0;} > uint32_t getAddrMode2OffsetOpValue(const MachineInstr &MI, unsigned OpIdx) > > Modified: llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp?rev=119760&r1=119759&r2=119760&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp (original) > +++ llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp Thu Nov 18 17:37:15 2010 > @@ -27,13 +27,27 @@ > ARMELFWriterInfo::ARMELFWriterInfo(TargetMachine &TM) > : TargetELFWriterInfo(TM.getTargetData()->getPointerSizeInBits() == 64, > TM.getTargetData()->isLittleEndian()) { > - // silently OK construction > } > > ARMELFWriterInfo::~ARMELFWriterInfo() {} > > unsigned ARMELFWriterInfo::getRelocationType(unsigned MachineRelTy) const { > - assert(0 && "ARMELFWriterInfo::getRelocationType() not implemented"); > + switch (MachineRelTy) { > + case ARM::reloc_arm_absolute: > + case ARM::reloc_arm_relative: > + case ARM::reloc_arm_cp_entry: > + case ARM::reloc_arm_vfp_cp_entry: > + case ARM::reloc_arm_machine_cp_entry: > + case ARM::reloc_arm_jt_base: > + case ARM::reloc_arm_pic_jt: > + assert(0 && "unsupported ARM relocation type"); break; > + > + case ARM::reloc_arm_branch: return R_ARM_CALL; break; > + case ARM::reloc_arm_movt: return R_ARM_MOVT_ABS; break; > + case ARM::reloc_arm_movw: return R_ARM_MOVW_ABS_NC; break; > + default: > + llvm_unreachable("unknown ARM relocation type"); break; > + } > return 0; > } > > > Modified: llvm/trunk/lib/Target/ARM/ARMFixupKinds.h > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFixupKinds.h?rev=119760&r1=119759&r2=119760&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/ARM/ARMFixupKinds.h (original) > +++ llvm/trunk/lib/Target/ARM/ARMFixupKinds.h Thu Nov 18 17:37:15 2010 > @@ -25,6 +25,12 @@ > // instructions. > fixup_arm_branch, > > + // The next two are for the movt/movw pair > + // the 16bit imm field are split into imm{15-12} and imm{11-0} > + // Fixme: We need new ones for Thumb. > + fixup_arm_movt_hi16, // :upper16: > + fixup_arm_movw_lo16, // :lower16: > + > // Marker > LastTargetFixupKind, > NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind > > Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=119760&r1=119759&r2=119760&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) > +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Thu Nov 18 17:37:15 2010 > @@ -442,6 +442,13 @@ > let EncoderMethod = "getImmMinusOneOpValue"; > } > > +// For movt/movw - sets the MC Encoder method. > +// The imm is split into imm{15-12}, imm{11-0} > +// > +def movt_imm : Operand { > + let EncoderMethod = "getMovtImmOpValue"; > +} > + > // Define ARM specific addressing modes. > > > @@ -1970,7 +1977,7 @@ > } > > let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in > -def MOVi16 : AI1<0b1000, (outs GPR:$Rd), (ins i32imm:$imm), > +def MOVi16 : AI1<0b1000, (outs GPR:$Rd), (ins movt_imm:$imm), > DPFrm, IIC_iMOVi, > "movw", "\t$Rd, $imm", > [(set GPR:$Rd, imm0_65535:$imm)]>, > @@ -1985,7 +1992,7 @@ > } > > let Constraints = "$src = $Rd" in > -def MOVTi16 : AI1<0b1010, (outs GPR:$Rd), (ins GPR:$src, i32imm:$imm), > +def MOVTi16 : AI1<0b1010, (outs GPR:$Rd), (ins GPR:$src, movt_imm:$imm), > DPFrm, IIC_iMOVi, > "movt", "\t$Rd, $imm", > [(set GPR:$Rd, > @@ -3056,7 +3063,7 @@ > } > > let isMoveImm = 1 in > -def MOVCCi16 : AI1<0b1000, (outs GPR:$Rd), (ins GPR:$false, i32imm:$imm), > +def MOVCCi16 : AI1<0b1000, (outs GPR:$Rd), (ins GPR:$false, movt_imm:$imm), > DPFrm, IIC_iMOVi, > "movw", "\t$Rd, $imm", > []>, > > Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=119760&r1=119759&r2=119760&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) > +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Thu Nov 18 17:37:15 2010 > @@ -70,6 +70,10 @@ > unsigned getMachineOpValue(const MCInst &MI,const MCOperand &MO, > SmallVectorImpl &Fixups) const; > > + /// getMovtImmOpValue - Return the encoding for the movw/movt pair > + uint32_t getMovtImmOpValue(const MCInst &MI, unsigned OpIdx, > + SmallVectorImpl &Fixups) const; > + > bool EncodeAddrModeOpValues(const MCInst &MI, unsigned OpIdx, > unsigned &Reg, unsigned &Imm, > SmallVectorImpl &Fixups) const; > @@ -396,6 +400,33 @@ > } > > uint32_t ARMMCCodeEmitter:: > +getMovtImmOpValue(const MCInst &MI, unsigned OpIdx, > + SmallVectorImpl &Fixups) const { > + // {20-16} = imm{15-12} > + // {11-0} = imm{11-0} > + const MCOperand &MO = MI.getOperand(OpIdx); > + if (MO.isImm()) { > + return static_cast(MO.getImm()); > + } else if (const MCSymbolRefExpr *Expr = > + dyn_cast(MO.getExpr())) { > + MCFixupKind Kind; > + switch (Expr->getKind()) { > + case MCSymbolRefExpr::VK_ARM_HI16: > + Kind = MCFixupKind(ARM::fixup_arm_movt_hi16); > + break; > + case MCSymbolRefExpr::VK_ARM_LO16: > + Kind = MCFixupKind(ARM::fixup_arm_movw_lo16); > + break; > + default: assert(0 && "Unsupported ARMFixup"); break; > + } > + Fixups.push_back(MCFixup::Create(0, Expr, Kind)); > + return 0; > + }; > + llvm_unreachable(0 && "Unsupported MCExpr type in MCOperand"); > + return 0; > +} > + > +uint32_t ARMMCCodeEmitter:: > getLdStSORegOpValue(const MCInst &MI, unsigned OpIdx, > SmallVectorImpl &Fixups) const { > const MCOperand &MO = MI.getOperand(OpIdx); > > Modified: llvm/trunk/utils/TableGen/EDEmitter.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/EDEmitter.cpp?rev=119760&r1=119759&r2=119760&view=diff > ============================================================================== > --- llvm/trunk/utils/TableGen/EDEmitter.cpp (original) > +++ llvm/trunk/utils/TableGen/EDEmitter.cpp Thu Nov 18 17:37:15 2010 > @@ -563,6 +563,7 @@ > REG("QQQQPR"); > > IMM("i32imm"); > + IMM("movt_imm"); > IMM("bf_inv_mask_imm"); > IMM("jtblock_operand"); > IMM("nohash_imm"); > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From grosbach at apple.com Tue Nov 30 16:40:36 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 22:40:36 -0000 Subject: [llvm-commits] [llvm] r120480 - in /llvm/trunk/lib/Target/ARM: ARMAsmBackend.cpp ARMMCCodeEmitter.cpp Message-ID: <20101130224036.52AD42A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 16:40:36 2010 New Revision: 120480 URL: http://llvm.org/viewvc/llvm-project?rev=120480&view=rev Log: Fix handling of ARM negative pc-relative fixups for loads and stores. Modified: llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp?rev=120480&r1=120479&r2=120480&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp Tue Nov 30 16:40:36 2010 @@ -131,8 +131,8 @@ switch (Kind) { default: llvm_unreachable("Unknown fixup kind!"); case FK_Data_4: return 4; - case ARM::fixup_arm_pcrel_12: return 2; - case ARM::fixup_arm_vfp_pcrel_12: return 1; + case ARM::fixup_arm_pcrel_12: return 3; + case ARM::fixup_arm_vfp_pcrel_12: return 3; case ARM::fixup_arm_branch: return 3; } } @@ -143,14 +143,36 @@ llvm_unreachable("Unknown fixup kind!"); case FK_Data_4: return Value; - case ARM::fixup_arm_pcrel_12: + case ARM::fixup_arm_pcrel_12: { + bool isAdd = true; // ARM PC-relative values are offset by 8. - return Value - 8; + Value -= 8; + if ((int64_t)Value < 0) { + Value = -Value; + isAdd = false; + } + assert ((Value < 4096) && "Out of range pc-relative fixup value!"); + Value |= isAdd << 23; + return Value; + } case ARM::fixup_arm_branch: - case ARM::fixup_arm_vfp_pcrel_12: // These values don't encode the low two bits since they're always zero. // Offset by 8 just as above. return (Value - 8) >> 2; + case ARM::fixup_arm_vfp_pcrel_12: { + // Offset by 8 just as above. + Value = Value - 8; + bool isAdd = true; + if ((int64_t)Value < 0) { + Value = -Value; + isAdd = false; + } + // These values don't encode the low two bits since they're always zero. + Value >>= 2; + assert ((Value < 256) && "Out of range pc-relative fixup value!"); + Value |= isAdd << 23; + return Value; + } } } Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120480&r1=120479&r2=120480&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Nov 30 16:40:36 2010 @@ -46,8 +46,8 @@ const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const { const static MCFixupKindInfo Infos[] = { // name offset bits flags - { "fixup_arm_pcrel_12", 2, 12, MCFixupKindInfo::FKF_IsPCRel }, - { "fixup_arm_vfp_pcrel_12", 3, 8, MCFixupKindInfo::FKF_IsPCRel }, + { "fixup_arm_pcrel_12", 1, 24, MCFixupKindInfo::FKF_IsPCRel }, + { "fixup_arm_vfp_pcrel_12", 1, 24, MCFixupKindInfo::FKF_IsPCRel }, { "fixup_arm_branch", 1, 24, MCFixupKindInfo::FKF_IsPCRel }, }; @@ -395,6 +395,7 @@ if (!MO.isReg()) { Reg = getARMRegisterNumbering(ARM::PC); // Rn is PC. Imm12 = 0; + isAdd = false ; // 'U' bit is set as part of the fixup. assert(MO.isExpr() && "Unexpected machine operand type!"); const MCExpr *Expr = MO.getExpr(); @@ -574,11 +575,13 @@ // {8} = (U)nsigned (add == '1', sub == '0') // {7-0} = imm8 unsigned Reg, Imm8; + bool isAdd; // If The first operand isn't a register, we have a label reference. const MCOperand &MO = MI.getOperand(OpIdx); if (!MO.isReg()) { Reg = getARMRegisterNumbering(ARM::PC); // Rn is PC. Imm8 = 0; + isAdd = false; // 'U' bit is handled as part of the fixup. assert(MO.isExpr() && "Unexpected machine operand type!"); const MCExpr *Expr = MO.getExpr(); @@ -586,12 +589,14 @@ Fixups.push_back(MCFixup::Create(0, Expr, Kind)); ++MCNumCPRelocations; - } else + } else { EncodeAddrModeOpValues(MI, OpIdx, Reg, Imm8, Fixups); + isAdd = ARM_AM::getAM5Op(Imm8) == ARM_AM::add; + } uint32_t Binary = ARM_AM::getAM5Offset(Imm8); // Immediate is always encoded as positive. The 'U' bit controls add vs sub. - if (ARM_AM::getAM5Op(Imm8) == ARM_AM::add) + if (isAdd) Binary |= (1 << 8); Binary |= (Reg << 9); return Binary; From resistor at mac.com Tue Nov 30 16:45:48 2010 From: resistor at mac.com (Owen Anderson) Date: Tue, 30 Nov 2010 22:45:48 -0000 Subject: [llvm-commits] [llvm] r120481 - in /llvm/trunk: lib/Target/ARM/ARMInstrThumb2.td lib/Target/ARM/ARMMCCodeEmitter.cpp lib/Target/ARM/Disassembler/ARMDisassembler.cpp lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h utils/TableGen/EDEmitter.cpp Message-ID: <20101130224548.2754D2A6C12D@llvm.org> Author: resistor Date: Tue Nov 30 16:45:47 2010 New Revision: 120481 URL: http://llvm.org/viewvc/llvm-project?rev=120481&view=rev Log: Simplify the encoding of reg+/-imm12 values that allow PC-relative encoding. This allows the Thumb2 encoding to share code with the ARM encoding, which gets use fixup support for free. It also allows us to fold away at least one codegen-only pattern. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h llvm/trunk/utils/TableGen/EDEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=120481&r1=120480&r2=120481&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Tue Nov 30 16:45:47 2010 @@ -127,7 +127,7 @@ def t2addrmode_imm12 : Operand, ComplexPattern { let PrintMethod = "printAddrModeImm12Operand"; - string EncoderMethod = "getT2AddrModeImm12OpValue"; + string EncoderMethod = "getAddrModeImm12OpValue"; let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm); } @@ -146,11 +146,6 @@ string EncoderMethod = "getT2AddrModeImm8OffsetOpValue"; } -def t2am_imm12_offset : Operand { - string EncoderMethod = "getT2AddrModeImm12OffsetOpValue"; -} - - // t2addrmode_imm8s4 := reg +/- (imm8 << 2) def t2addrmode_imm8s4 : Operand { let PrintMethod = "printT2AddrModeImm8s4Operand"; @@ -845,9 +840,10 @@ bits<4> Rt; let Inst{15-12} = Rt{3-0}; - bits<16> addr; - let Inst{19-16} = addr{15-12}; // Rn - let Inst{11-0} = addr{11-0}; // imm + bits<17> addr; + let Inst{19-16} = addr{16-13}; // Rn + let Inst{23} = addr{12}; // U + let Inst{11-0} = addr{11-0}; // imm } def i8 : T2Ii8 <(outs GPR:$Rt), (ins t2addrmode_imm8:$addr), iii, opc, "\t$Rt, $addr", @@ -925,9 +921,10 @@ bits<4> Rt; let Inst{15-12} = Rt{3-0}; - bits<16> addr; - let Inst{19-16} = addr{15-12}; // Rn - let Inst{11-0} = addr{11-0}; // imm + bits<17> addr; + let Inst{19-16} = addr{16-13}; // Rn + let Inst{23} = addr{12}; // U + let Inst{11-0} = addr{11-0}; // imm } def i8 : T2Ii8 <(outs), (ins GPR:$Rt, t2addrmode_imm8:$addr), iii, opc, "\t$Rt, $addr", @@ -1539,14 +1536,14 @@ [(ARMPreload t2addrmode_imm12:$addr, (i32 write), (i32 instr))]> { let Inst{31-25} = 0b1111100; let Inst{24} = instr; - let Inst{23} = 1; // U = 1 let Inst{22} = 0; let Inst{21} = write; let Inst{20} = 1; let Inst{15-12} = 0b1111; - bits<16> addr; - let Inst{19-16} = addr{15-12}; // Rn + bits<17> addr; + let Inst{19-16} = addr{16-13}; // Rn + let Inst{23} = addr{12}; // U let Inst{11-0} = addr{11-0}; // imm12 } @@ -1584,24 +1581,6 @@ let Inst{3-0} = addr{5-2}; // Rm let Inst{5-4} = addr{1-0}; // imm2 } - - let isCodeGenOnly = 1 in - def pci : T2Ipc<(outs), (ins t2am_imm12_offset:$addr), IIC_Preload, opc, - "\t$addr", - []> { - let Inst{31-25} = 0b1111100; - let Inst{24} = write; - let Inst{23} = ?; // add = (U == 1) - let Inst{22} = 0; - let Inst{21} = instr; - let Inst{20} = 1; - let Inst{19-16} = 0b1111; // Rn = 0b1111 - let Inst{15-12} = 0b1111; - - bits<13> addr; - let Inst{23} = addr{12}; - let Inst{11-0} = addr{11-0}; - } } defm t2PLD : T2Ipl<0, 0, "pld">, Requires<[IsThumb2]>; Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120481&r1=120480&r2=120481&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Nov 30 16:45:47 2010 @@ -185,8 +185,6 @@ SmallVectorImpl &Fixups) const; unsigned getT2AddrModeImm12OffsetOpValue(const MCInst &MI, unsigned OpNum, SmallVectorImpl &Fixups) const; - unsigned getT2AddrModeImm12OpValue(const MCInst &MI, unsigned OpNum, - SmallVectorImpl &Fixups) const; /// getSORegOpValue - Return an encoded so_reg shifted register value. unsigned getSORegOpValue(const MCInst &MI, unsigned Op, @@ -746,19 +744,6 @@ } unsigned ARMMCCodeEmitter:: -getT2AddrModeImm12OpValue(const MCInst &MI, unsigned OpNum, - SmallVectorImpl &Fixups) const { - const MCOperand &MO1 = MI.getOperand(OpNum); - const MCOperand &MO2 = MI.getOperand(OpNum+1); - - // FIXME: Needs fixup support. - unsigned Value = getARMRegisterNumbering(MO1.getReg()); - Value <<= 12; - Value |= MO2.getImm() & 4095; - return Value; -} - -unsigned ARMMCCodeEmitter:: getT2SORegOpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const { // Sub-operands are [reg, imm]. The first register is Rm, the reg to be Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp?rev=120481&r1=120480&r2=120481&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassembler.cpp Tue Nov 30 16:45:47 2010 @@ -350,36 +350,6 @@ return decodeThumbInstruction(insn); } -static inline bool Thumb2PreloadOpcodeNoPCI(unsigned Opcode) { - switch (Opcode) { - default: - return false; - case ARM::t2PLDi12: case ARM::t2PLDi8: - case ARM::t2PLDs: - case ARM::t2PLDWi12: case ARM::t2PLDWi8: - case ARM::t2PLDWs: - case ARM::t2PLIi12: case ARM::t2PLIi8: - case ARM::t2PLIs: - return true; - } -} - -static inline unsigned T2Morph2Preload2PCI(unsigned Opcode) { - switch (Opcode) { - default: - return 0; - case ARM::t2PLDi12: case ARM::t2PLDi8: - case ARM::t2PLDs: - return ARM::t2PLDpci; - case ARM::t2PLDWi12: case ARM::t2PLDWi8: - case ARM::t2PLDWs: - return ARM::t2PLDWpci; - case ARM::t2PLIi12: case ARM::t2PLIi8: - case ARM::t2PLIs: - return ARM::t2PLIpci; - } -} - // // Public interface for the disassembler // @@ -486,11 +456,6 @@ // instructions as well. unsigned Opcode = decodeThumbSideEffect(IsThumb2, insn); - // A8.6.117/119/120/121. - // PLD/PLDW/PLI instructions with Rn==15 is transformed to the pci variant. - if (Thumb2PreloadOpcodeNoPCI(Opcode) && slice(insn, 19, 16) == 15) - Opcode = T2Morph2Preload2PCI(Opcode); - ARMFormat Format = ARMFormats[Opcode]; Size = IsThumb2 ? 4 : 2; Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h?rev=120481&r1=120480&r2=120481&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h (original) +++ llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Tue Nov 30 16:45:47 2010 @@ -1711,11 +1711,11 @@ switch (Opcode) { default: return false; - case ARM::t2PLDi12: case ARM::t2PLDi8: case ARM::t2PLDpci: + case ARM::t2PLDi12: case ARM::t2PLDi8: case ARM::t2PLDs: - case ARM::t2PLDWi12: case ARM::t2PLDWi8: case ARM::t2PLDWpci: + case ARM::t2PLDWi12: case ARM::t2PLDWi8: case ARM::t2PLDWs: - case ARM::t2PLIi12: case ARM::t2PLIi8: case ARM::t2PLIpci: + case ARM::t2PLIi12: case ARM::t2PLIi8: case ARM::t2PLIs: return true; } @@ -1752,8 +1752,7 @@ && !OpInfo[OpIdx].isOptionalDef() && "Pure imm operand expected"); int Offset = 0; - if (Opcode == ARM::t2PLDpci || Opcode == ARM::t2PLDWpci || - Opcode == ARM::t2PLIpci) { + if (slice(insn, 19, 16) == 0xFF) { bool Negative = slice(insn, 23, 23) == 0; unsigned Imm12 = getImm12(insn); Offset = Negative ? -1 - Imm12 : 1 * Imm12; Modified: llvm/trunk/utils/TableGen/EDEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/EDEmitter.cpp?rev=120481&r1=120480&r2=120481&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/EDEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/EDEmitter.cpp Tue Nov 30 16:45:47 2010 @@ -614,7 +614,6 @@ MISC("it_mask", "kOperandTypeThumbITMask"); // I MISC("t2addrmode_imm8", "kOperandTypeThumb2AddrModeImm8"); // R, I MISC("t2am_imm8_offset", "kOperandTypeThumb2AddrModeImm8Offset");//I - MISC("t2am_imm12_offset", "kOperandTypeThumb2AddrModeImm12Offset");//I MISC("t2addrmode_imm12", "kOperandTypeThumb2AddrModeImm12"); // R, I MISC("t2addrmode_so_reg", "kOperandTypeThumb2AddrModeSoReg"); // R, R, I MISC("t2addrmode_imm8s4", "kOperandTypeThumb2AddrModeImm8s4"); // R, I @@ -841,7 +840,6 @@ operandTypes.addEntry("kOperandTypeThumb2SoImm"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8Offset"); - operandTypes.addEntry("kOperandTypeThumb2AddrModeImm12Offset"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm12"); operandTypes.addEntry("kOperandTypeThumb2AddrModeSoReg"); operandTypes.addEntry("kOperandTypeThumb2AddrModeImm8s4"); From isanbard at gmail.com Tue Nov 30 16:57:21 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 22:57:21 -0000 Subject: [llvm-commits] [llvm] r120482 - in /llvm/trunk/lib/Target/ARM: ARMCodeEmitter.cpp ARMInstrFormats.td ARMInstrThumb.td ARMMCCodeEmitter.cpp AsmParser/ARMAsmParser.cpp Message-ID: <20101130225721.A44262A6C12D@llvm.org> Author: void Date: Tue Nov 30 16:57:21 2010 New Revision: 120482 URL: http://llvm.org/viewvc/llvm-project?rev=120482&view=rev Log: * Add support for encoding t_addrmode_s2 and t_addrmode_s1. They are the same as t_addrmode_s4, but with a different scaling factor. * Encode the Thumb1 load and store instructions. This involved a bit of refactoring (hi, Chris! :-). Some of the patterns became dead afterwards and were removed. Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrThumb.td llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=120482&r1=120481&r2=120482&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Tue Nov 30 16:57:21 2010 @@ -241,6 +241,10 @@ const { return 0; } uint32_t getAddrModeS4OpValue(const MachineInstr &MI, unsigned Op) const { return 0; } + uint32_t getAddrModeS2OpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } + uint32_t getAddrModeS1OpValue(const MachineInstr &MI, unsigned Op) + const { return 0; } uint32_t getAddrMode5OpValue(const MachineInstr &MI, unsigned Op) const { // {17-13} = reg // {12} = (U)nsigned (add == '1', sub == '0') Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120482&r1=120481&r2=120482&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Tue Nov 30 16:57:21 2010 @@ -863,15 +863,6 @@ : Thumb1pI; -class T1pI1 pattern> - : Thumb1pI; -class T1pI2 pattern> - : Thumb1pI; -class T1pI4 pattern> - : Thumb1pI; class T1pIs pattern> : Thumb1pI; @@ -909,11 +900,39 @@ let Inst{11-9} = opB; } class T1LdSt opB> : T1LoadStore<0b0101, opB>; -class T1LdSt4Imm opB> : T1LoadStore<0b0110, opB>; // Immediate, 4 bytes -class T1LdSt1Imm opB> : T1LoadStore<0b0111, opB>; // Immediate, 1 byte -class T1LdSt2Imm opB> : T1LoadStore<0b1000, opB>; // Immediate, 2 bytes class T1LdStSP opB> : T1LoadStore<0b1001, opB>; // SP relative +// Helper classes to encode Thumb1 loads and stores. For immediates, the +// following bits are used for "opA": +// +// 0b0110 => Immediate, 4 bytes +// 0b1000 => Immediate, 2 bytes +// 0b0111 => Immediate, 1 byte +class T1LdStImm opA, bits<3> opB> : T1LoadStore; + +class T1pIEncode opcode, dag oops, dag iops, AddrMode am, + InstrItinClass itin, string opc, string asm, + list pattern> + : Thumb1pI, + T1LdSt { + bits<3> Rt; + bits<8> addr; + let Inst{8-6} = addr{5-3}; // Rm + let Inst{5-3} = addr{2-0}; // Rn + let Inst{2-0} = Rt; +} +class T1pIEncodeImm opA, bit opB, dag oops, dag iops, AddrMode am, + InstrItinClass itin, string opc, string asm, + list pattern> + : Thumb1pI, + T1LdStImm { + bits<3> Rt; + bits<8> addr; + let Inst{10-6} = addr{7-3}; // imm5 + let Inst{5-3} = addr{2-0}; // Rn + let Inst{2-0} = Rt; +} + // A6.2.5 Miscellaneous 16-bit instructions encoding. class T1Misc opcode> : Encoding16 { let Inst{15-12} = 0b1011; Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120482&r1=120481&r2=120482&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 16:57:21 2010 @@ -103,8 +103,10 @@ // def t_addrmode_s2 : Operand, ComplexPattern { + string EncoderMethod = "getAddrModeS2OpValue"; let PrintMethod = "printThumbAddrModeS2Operand"; let MIOperandInfo = (ops tGPR:$base, i32imm:$offsimm, tGPR:$offsreg); + let ParserMatchClass = MemModeThumbAsmOperand; } // t_addrmode_s1 := reg + reg @@ -112,8 +114,10 @@ // def t_addrmode_s1 : Operand, ComplexPattern { + string EncoderMethod = "getAddrModeS1OpValue"; let PrintMethod = "printThumbAddrModeS1Operand"; let MIOperandInfo = (ops tGPR:$base, i32imm:$offsimm, tGPR:$offsreg); + let ParserMatchClass = MemModeThumbAsmOperand; } // t_addrmode_sp := sp + imm8 * 4 @@ -122,6 +126,7 @@ ComplexPattern { let PrintMethod = "printThumbAddrModeSPOperand"; let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm); + let ParserMatchClass = MemModeThumbAsmOperand; } //===----------------------------------------------------------------------===// @@ -508,59 +513,55 @@ // let canFoldAsLoad = 1, isReMaterializable = 1 in -def tLDR : T1pI4<(outs tGPR:$Rt), (ins t_addrmode_s4:$addr), IIC_iLoad_r, - "ldr", "\t$Rt, $addr", - [(set tGPR:$Rt, (load t_addrmode_s4:$addr))]>, - T1LdSt<0b100> { - // A8.6.60 - bits<3> Rt; - bits<8> addr; - let Inst{8-6} = addr{5-3}; // Rm - let Inst{5-3} = addr{2-0}; // Rn - let Inst{2-0} = Rt; -} - -def tLDRi: T1pI4<(outs tGPR:$Rt), (ins t_addrmode_s4:$addr), IIC_iLoad_r, - "ldr", "\t$Rt, $addr", - []>, - T1LdSt4Imm<{1,?,?}> { - // A8.6.57 - bits<3> Rt; - bits<8> addr; - let Inst{10-6} = addr{7-3}; // imm5 - let Inst{5-3} = addr{2-0}; // Rn - let Inst{2-0} = Rt; -} - -def tLDRB : T1pI1<(outs tGPR:$dst), (ins t_addrmode_s1:$addr), IIC_iLoad_bh_r, +def tLDR : // A8.6.60 + T1pIEncode<0b100, (outs tGPR:$Rt), (ins t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iLoad_r, + "ldr", "\t$Rt, $addr", + [(set tGPR:$Rt, (load t_addrmode_s4:$addr))]>; + +def tLDRi: // A8.6.57 + T1pIEncodeImm<0b0110, 1, (outs tGPR:$Rt), (ins t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iLoad_r, + "ldr", "\t$Rt, $addr", + []>; + +def tLDRB : // A8.6.64 + T1pIEncode<0b110, (outs tGPR:$Rt), (ins t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iLoad_bh_r, + "ldrb", "\t$Rt, $addr", + [(set tGPR:$Rt, (zextloadi8 t_addrmode_s1:$addr))]>; + +def tLDRBi : // A8.6.61 + T1pIEncodeImm<0b0111, 1, (outs tGPR:$dst), (ins t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iLoad_bh_r, "ldrb", "\t$dst, $addr", - [(set tGPR:$dst, (zextloadi8 t_addrmode_s1:$addr))]>, - T1LdSt<0b110>; -def tLDRBi: T1pI1<(outs tGPR:$dst), (ins t_addrmode_s1:$addr), IIC_iLoad_bh_r, - "ldrb", "\t$dst, $addr", - []>, - T1LdSt1Imm<{1,?,?}>; + []>; -def tLDRH : T1pI2<(outs tGPR:$dst), (ins t_addrmode_s2:$addr), IIC_iLoad_bh_r, - "ldrh", "\t$dst, $addr", - [(set tGPR:$dst, (zextloadi16 t_addrmode_s2:$addr))]>, - T1LdSt<0b101>; -def tLDRHi: T1pI2<(outs tGPR:$dst), (ins t_addrmode_s2:$addr), IIC_iLoad_bh_r, +def tLDRH : // A8.6.76 + T1pIEncode<0b101, (outs tGPR:$dst), (ins t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iLoad_bh_r, + "ldrh", "\t$dst, $addr", + [(set tGPR:$dst, (zextloadi16 t_addrmode_s2:$addr))]>; + +def tLDRHi: // A8.6.73 + T1pIEncodeImm<0b1000, 1, (outs tGPR:$dst), (ins t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iLoad_bh_r, "ldrh", "\t$dst, $addr", - []>, - T1LdSt2Imm<{1,?,?}>; + []>; let AddedComplexity = 10 in -def tLDRSB : T1pI1<(outs tGPR:$dst), (ins t_addrmode_rr:$addr), IIC_iLoad_bh_r, - "ldrsb", "\t$dst, $addr", - [(set tGPR:$dst, (sextloadi8 t_addrmode_rr:$addr))]>, - T1LdSt<0b011>; +def tLDRSB : // A8.6.80 + T1pIEncode<0b011, (outs tGPR:$dst), (ins t_addrmode_rr:$addr), + AddrModeT1_1, IIC_iLoad_bh_r, + "ldrsb", "\t$dst, $addr", + [(set tGPR:$dst, (sextloadi8 t_addrmode_rr:$addr))]>; let AddedComplexity = 10 in -def tLDRSH : T1pI2<(outs tGPR:$dst), (ins t_addrmode_rr:$addr), IIC_iLoad_bh_r, - "ldrsh", "\t$dst, $addr", - [(set tGPR:$dst, (sextloadi16 t_addrmode_rr:$addr))]>, - T1LdSt<0b111>; +def tLDRSH : // A8.6.84 + T1pIEncode<0b111, (outs tGPR:$dst), (ins t_addrmode_rr:$addr), + AddrModeT1_2, IIC_iLoad_bh_r, + "ldrsh", "\t$dst, $addr", + [(set tGPR:$dst, (sextloadi16 t_addrmode_rr:$addr))]>; let canFoldAsLoad = 1 in def tLDRspi : T1pIs<(outs tGPR:$dst), (ins t_addrmode_sp:$addr), IIC_iLoad_i, @@ -590,32 +591,41 @@ "ldr", "\t$dst, $addr", []>, T1LdStSP<{1,?,?}>; -def tSTR : T1pI4<(outs), (ins tGPR:$src, t_addrmode_s4:$addr), IIC_iStore_r, - "str", "\t$src, $addr", - [(store tGPR:$src, t_addrmode_s4:$addr)]>, - T1LdSt<0b000>; -def tSTRi: T1pI4<(outs), (ins tGPR:$src, t_addrmode_s4:$addr), IIC_iStore_r, - "str", "\t$src, $addr", - []>, - T1LdSt4Imm<{0,?,?}>; - -def tSTRB : T1pI1<(outs), (ins tGPR:$src, t_addrmode_s1:$addr), IIC_iStore_bh_r, - "strb", "\t$src, $addr", - [(truncstorei8 tGPR:$src, t_addrmode_s1:$addr)]>, - T1LdSt<0b010>; -def tSTRBi: T1pI1<(outs), (ins tGPR:$src, t_addrmode_s1:$addr), IIC_iStore_bh_r, - "strb", "\t$src, $addr", - []>, - T1LdSt1Imm<{0,?,?}>; - -def tSTRH : T1pI2<(outs), (ins tGPR:$src, t_addrmode_s2:$addr), IIC_iStore_bh_r, - "strh", "\t$src, $addr", - [(truncstorei16 tGPR:$src, t_addrmode_s2:$addr)]>, - T1LdSt<0b001>; -def tSTRHi: T1pI2<(outs), (ins tGPR:$src, t_addrmode_s2:$addr), IIC_iStore_bh_r, - "strh", "\t$src, $addr", - []>, - T1LdSt2Imm<{0,?,?}>; +def tSTR : // A8.6.194 + T1pIEncode<0b000, (outs), (ins tGPR:$src, t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iStore_r, + "str", "\t$src, $addr", + [(store tGPR:$src, t_addrmode_s4:$addr)]>; + +def tSTRi : // A8.6.192 + T1pIEncodeImm<0b0110, 0, (outs), (ins tGPR:$src, t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iStore_r, + "str", "\t$src, $addr", + []>; + +def tSTRB : // A8.6.197 + T1pIEncode<0b010, (outs), (ins tGPR:$src, t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iStore_bh_r, + "strb", "\t$src, $addr", + [(truncstorei8 tGPR:$src, t_addrmode_s1:$addr)]>; + +def tSTRBi : // A8.6.195 + T1pIEncodeImm<0b0111, 0, (outs), (ins tGPR:$src, t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iStore_bh_r, + "strb", "\t$src, $addr", + []>; + +def tSTRH : // A8.6.207 + T1pIEncode<0b001, (outs), (ins tGPR:$src, t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iStore_bh_r, + "strh", "\t$src, $addr", + [(truncstorei16 tGPR:$src, t_addrmode_s2:$addr)]>; + +def tSTRHi : // A8.6.205 + T1pIEncodeImm<0b1000, 0, (outs), (ins tGPR:$src, t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iStore_bh_r, + "strh", "\t$src, $addr", + []>; def tSTRspi : T1pIs<(outs), (ins tGPR:$src, t_addrmode_sp:$addr), IIC_iStore_i, "str", "\t$src, $addr", Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120482&r1=120481&r2=120482&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Nov 30 16:57:21 2010 @@ -140,6 +140,14 @@ uint32_t getAddrModeS4OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const; + /// getAddrModeS2OpValue - Return encoding for t_addrmode_s2 operands. + uint32_t getAddrModeS2OpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &Fixups) const; + + /// getAddrModeS1OpValue - Return encoding for t_addrmode_s1 operands. + uint32_t getAddrModeS1OpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &Fixups) const; + /// getAddrMode5OpValue - Return encoding info for 'reg +/- imm8' operand. uint32_t getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx, SmallVectorImpl &Fixups) const; @@ -545,10 +553,9 @@ return (Rn << 9) | Imm8 | (isAdd << 8) | (isImm << 13); } -/// getAddrModeS4OpValue - Return encoding for t_addrmode_s4 operands. -uint32_t ARMMCCodeEmitter:: -getAddrModeS4OpValue(const MCInst &MI, unsigned OpIdx, - SmallVectorImpl &Fixups) const { +/// getAddrModeSOpValue - Encode the t_addrmode_s# operands. +static unsigned getAddrModeSOpValue(const MCInst &MI, unsigned OpIdx, + unsigned Scale) { // [Rn, Rm] // {5-3} = Rm // {2-0} = Rn @@ -560,11 +567,32 @@ const MCOperand &MO1 = MI.getOperand(OpIdx + 1); const MCOperand &MO2 = MI.getOperand(OpIdx + 2); unsigned Rn = getARMRegisterNumbering(MO.getReg()); - unsigned Imm5 = MO1.getImm(); + unsigned Imm5 = (MO1.getImm() / Scale) & 0x1f; unsigned Rm = getARMRegisterNumbering(MO2.getReg()); return (Rm << 3) | (Imm5 << 3) | Rn; } +/// getAddrModeS4OpValue - Return encoding for t_addrmode_s4 operands. +uint32_t ARMMCCodeEmitter:: +getAddrModeS4OpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &) const { + return getAddrModeSOpValue(MI, OpIdx, 4); +} + +/// getAddrModeS2OpValue - Return encoding for t_addrmode_s2 operands. +uint32_t ARMMCCodeEmitter:: +getAddrModeS2OpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &) const { + return getAddrModeSOpValue(MI, OpIdx, 2); +} + +/// getAddrModeS1OpValue - Return encoding for t_addrmode_s1 operands. +uint32_t ARMMCCodeEmitter:: +getAddrModeS1OpValue(const MCInst &MI, unsigned OpIdx, + SmallVectorImpl &) const { + return getAddrModeSOpValue(MI, OpIdx, 1); +} + /// getAddrMode5OpValue - Return encoding info for 'reg +/- imm12' operand. uint32_t ARMMCCodeEmitter:: getAddrMode5OpValue(const MCInst &MI, unsigned OpIdx, Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=120482&r1=120481&r2=120482&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original) +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Tue Nov 30 16:57:21 2010 @@ -323,7 +323,7 @@ if (Mem.Offset) { const MCConstantExpr *CE = dyn_cast(Mem.Offset); assert(CE && "Non-constant mode offset operand!"); - Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4)); + Inst.addOperand(MCOperand::CreateImm(CE->getValue())); Inst.addOperand(MCOperand::CreateReg(0)); } else { Inst.addOperand(MCOperand::CreateImm(0)); From dmalyshev at accesssoftek.com Tue Nov 30 17:06:22 2010 From: dmalyshev at accesssoftek.com (Danil Malyshev) Date: Tue, 30 Nov 2010 15:06:22 -0800 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> <6AE1604EE3EC5F4296C096518C6B77EE1705A19BB4@mail.accesssoftek.com> Message-ID: <6AE1604EE3EC5F4296C096518C6B77EE1705A19C19@mail.accesssoftek.com> Hi all, Changed tests look good. However, they will not catch the "output stream opened in wrong mode" issue. llvm-ar produce binary output and this should be tested. I propose a test to check this. The patch is attached. Thank you, Danil -----Original Message----- From: Chris Lattner [mailto:clattner at apple.com] Sent: Tuesday, November 30, 2010 9:13 PM To: NAKAMURA Takumi Cc: Danil Malyshev; llvm-commits LLVM Subject: Re: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW On Nov 30, 2010, at 6:39 AM, NAKAMURA Takumi wrote: > Good evening Danil. > > We should not rely on svn:eol-style nor eol-intolerant diff.exe. > Some person does not use CRLF(eol-style=native) on windows (me, too). > > I propose a patch. It is FileCheck-ized. Looks great to me! Please apply, -Chris -------------- next part -------------- A non-text attachment was scrubbed... Name: test-archive-binary-output-01.diff Type: application/octet-stream Size: 527 bytes Desc: test-archive-binary-output-01.diff Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/7a24d293/attachment.obj From sabre at nondot.org Tue Nov 30 17:05:20 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 23:05:20 -0000 Subject: [llvm-commits] [llvm] r120485 - in /llvm/trunk: include/llvm/Analysis/ValueTracking.h lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/PartialStore.ll Message-ID: <20101130230520.D13A72A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 17:05:20 2010 New Revision: 120485 URL: http://llvm.org/viewvc/llvm-project?rev=120485&view=rev Log: teach DSE to use GetPointerBaseWithConstantOffset to analyze may-aliasing stores that partially overlap with different base pointers. This implements PR6043 and the non-variable part of PR8657 Modified: llvm/trunk/include/llvm/Analysis/ValueTracking.h llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll Modified: llvm/trunk/include/llvm/Analysis/ValueTracking.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ValueTracking.h?rev=120485&r1=120484&r2=120485&view=diff ============================================================================== --- llvm/trunk/include/llvm/Analysis/ValueTracking.h (original) +++ llvm/trunk/include/llvm/Analysis/ValueTracking.h Tue Nov 30 17:05:20 2010 @@ -102,6 +102,11 @@ /// base and offset to the caller. Value *GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const TargetData &TD); + static inline const Value * + GetPointerBaseWithConstantOffset(const Value *Ptr, int64_t &Offset, + const TargetData &TD) { + return GetPointerBaseWithConstantOffset(const_cast(Ptr), Offset,TD); + } /// GetConstantStringInfo - This function computes the length of a /// null-terminated C string pointed to by V. If successful, it returns true Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120485&r1=120484&r2=120485&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 17:05:20 2010 @@ -28,6 +28,7 @@ #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Analysis/MemoryDependenceAnalysis.h" +#include "llvm/Analysis/ValueTracking.h" #include "llvm/Target/TargetData.h" #include "llvm/Transforms/Utils/Local.h" using namespace llvm; @@ -260,28 +261,60 @@ static bool isCompleteOverwrite(const AliasAnalysis::Location &Later, const AliasAnalysis::Location &Earlier, AliasAnalysis &AA) { - const Value *P1 = Later.Ptr->stripPointerCasts(); - const Value *P2 = Earlier.Ptr->stripPointerCasts(); + const Value *P1 = Earlier.Ptr->stripPointerCasts(); + const Value *P2 = Later.Ptr->stripPointerCasts(); - // Make sure that the start pointers are the same. - if (P1 != P2) - return false; - - // If we don't know the sizes of either access, then we can't do a comparison. + // If the start pointers are the same, we just have to compare sizes to see if + // the later store was larger than the earlier store. + if (P1 == P2) { + // If we don't know the sizes of either access, then we can't do a + // comparison. + if (Later.Size == AliasAnalysis::UnknownSize || + Earlier.Size == AliasAnalysis::UnknownSize) { + // If we have no TargetData information around, then the size of the store + // is inferrable from the pointee type. If they are the same type, then + // we know that the store is safe. + if (AA.getTargetData() == 0) + return Later.Ptr->getType() == Earlier.Ptr->getType(); + return false; + } + + // Make sure that the Later size is >= the Earlier size. + if (Later.Size < Earlier.Size) + return false; + return true; + } + + // Otherwise, we have to have size information, and the later store has to be + // larger than the earlier one. if (Later.Size == AliasAnalysis::UnknownSize || - Earlier.Size == AliasAnalysis::UnknownSize) { - // If we have no TargetData information around, then the size of the store - // is inferrable from the pointee type. If they are the same type, then we - // know that the store is safe. - if (AA.getTargetData() == 0) - return Later.Ptr->getType() == Earlier.Ptr->getType(); + Earlier.Size == AliasAnalysis::UnknownSize || + Later.Size <= Earlier.Size || + AA.getTargetData() == 0) return false; - } - // Make sure that the Later size is >= the Earlier size. - if (Later.Size < Earlier.Size) + const TargetData &TD = *AA.getTargetData(); + + // Okay, we have stores to two completely different pointers. Try to + // decompose the pointer into a "base + constant_offset" form. If the base + // pointers are equal, then we can reason about the two stores. + int64_t Off1 = 0, Off2 = 0; + const Value *BP1 = GetPointerBaseWithConstantOffset(P1, Off1, TD); + const Value *BP2 = GetPointerBaseWithConstantOffset(P2, Off2, TD); + + // If the base pointers still differ, we have two completely different stores. + if (BP1 != BP2) return false; + // Otherwise, we might have a situation like: + // store i16 -> P + 1 Byte + // store i32 -> P + // In this case, we see if the later store completely overlaps all bytes + // stored by the previous store. + if (Off1 < Off2 || // Earlier starts before Later. + Off1+Earlier.Size > Off2+Later.Size) // Earlier goes beyond Later. + return false; + // Otherwise, we have complete overlap. return true; } Modified: llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll?rev=120485&r1=120484&r2=120485&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll Tue Nov 30 17:05:20 2010 @@ -36,3 +36,19 @@ %tmp.7 = zext i1 %tmp.6 to i32 ret i32 %tmp.7 } + +; PR6043 +define void @test4(i8* %P) { +; CHECK: @test4 +; CHECK-NEXT: bitcast +; CHECK-NEXT: store double + + store i8 19, i8* %P ;; dead + %A = getelementptr i8* %P, i32 3 + + store i8 42, i8* %A ;; dead + + %Q = bitcast i8* %P to double* + store double 0.0, double* %Q + ret void +} From isanbard at gmail.com Tue Nov 30 17:16:25 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 23:16:25 -0000 Subject: [llvm-commits] [llvm] r120488 - /llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Message-ID: <20101130231625.C212C2A6C12D@llvm.org> Author: void Date: Tue Nov 30 17:16:25 2010 New Revision: 120488 URL: http://llvm.org/viewvc/llvm-project?rev=120488&view=rev Log: Inline classes that were used in only one place. Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120488&r1=120487&r2=120488&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Tue Nov 30 17:16:25 2010 @@ -899,7 +899,6 @@ let Inst{15-12} = opA; let Inst{11-9} = opB; } -class T1LdSt opB> : T1LoadStore<0b0101, opB>; class T1LdStSP opB> : T1LoadStore<0b1001, opB>; // SP relative // Helper classes to encode Thumb1 loads and stores. For immediates, the @@ -908,13 +907,11 @@ // 0b0110 => Immediate, 4 bytes // 0b1000 => Immediate, 2 bytes // 0b0111 => Immediate, 1 byte -class T1LdStImm opA, bits<3> opB> : T1LoadStore; - class T1pIEncode opcode, dag oops, dag iops, AddrMode am, InstrItinClass itin, string opc, string asm, list pattern> : Thumb1pI, - T1LdSt { + T1LoadStore<0b0101, opcode> { bits<3> Rt; bits<8> addr; let Inst{8-6} = addr{5-3}; // Rm @@ -925,7 +922,7 @@ InstrItinClass itin, string opc, string asm, list pattern> : Thumb1pI, - T1LdStImm { + T1LoadStore { bits<3> Rt; bits<8> addr; let Inst{10-6} = addr{7-3}; // imm5 From jasonwkim at google.com Tue Nov 30 17:13:58 2010 From: jasonwkim at google.com (Jason Kim) Date: Tue, 30 Nov 2010 15:13:58 -0800 Subject: [llvm-commits] [llvm] r119760 - in /llvm/trunk: lib/Target/ARM/ARMCodeEmitter.cpp lib/Target/ARM/ARMELFWriterInfo.cpp lib/Target/ARM/ARMFixupKinds.h lib/Target/ARM/ARMInstrInfo.td lib/Target/ARM/ARMMCCodeEmitter.cpp utils/TableGen/EDEmitter.cpp In-Reply-To: References: <20101118233716.042ED2A6C12C@llvm.org> Message-ID: On Tue, Nov 30, 2010 at 2:33 PM, Jim Grosbach wrote: > Hi Jason, > > Sorry for the late comment on this. I believe you need to add any new fixups to the table in ARMMCCodeEmitter.cpp:getFixupKindInfo(). I'm surprised you haven't been hitting assertion errors with these fixups without that being present. Good catch! There was a hidden memory access bug. The assert wasn't being triggered because merely listing the enum is enough for getNumFixupKinds() to return the "correct" value. Fixing now.. Thanks! > > -Jim > > On Nov 18, 2010, at 3:37 PM, Jason W Kim wrote: > >> Author: jasonwkim >> Date: Thu Nov 18 17:37:15 2010 >> New Revision: 119760 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=119760&view=rev >> Log: >> Fix .o emission of ARM movt/movw. MCSymbolRefExpr::VK_ARM_(HI||LO)16 for the .o path now works for ARM. >> Note: lo16AllZero remains in ARMInstrInfo.td - It can be factored out when Thumb movt is repaired. >> Existing tests cover this update. >> >> >> Modified: >> ? ?llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp >> ? ?llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp >> ? ?llvm/trunk/lib/Target/ARM/ARMFixupKinds.h >> ? ?llvm/trunk/lib/Target/ARM/ARMInstrInfo.td >> ? ?llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp >> ? ?llvm/trunk/utils/TableGen/EDEmitter.cpp >> >> Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=119760&r1=119759&r2=119760&view=diff >> ============================================================================== >> --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original) >> +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Thu Nov 18 17:37:15 2010 >> @@ -214,6 +214,11 @@ >> ? ? ? Binary |= (Reg << 13); >> ? ? ? return Binary; >> ? ? } >> + >> + ? ?unsigned getMovtImmOpValue(const MachineInstr &MI, unsigned Op) const { >> + ? ? ?return 0; >> + ? ?} >> + >> ? ? uint32_t getAddrMode2OpValue(const MachineInstr &MI, unsigned OpIdx) >> ? ? ? const { return 0;} >> ? ? uint32_t getAddrMode2OffsetOpValue(const MachineInstr &MI, unsigned OpIdx) >> >> Modified: llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp?rev=119760&r1=119759&r2=119760&view=diff >> ============================================================================== >> --- llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp (original) >> +++ llvm/trunk/lib/Target/ARM/ARMELFWriterInfo.cpp Thu Nov 18 17:37:15 2010 >> @@ -27,13 +27,27 @@ >> ARMELFWriterInfo::ARMELFWriterInfo(TargetMachine &TM) >> ? : TargetELFWriterInfo(TM.getTargetData()->getPointerSizeInBits() == 64, >> ? ? ? ? ? ? ? ? ? ? ? ? TM.getTargetData()->isLittleEndian()) { >> - ?// silently OK construction >> } >> >> ARMELFWriterInfo::~ARMELFWriterInfo() {} >> >> unsigned ARMELFWriterInfo::getRelocationType(unsigned MachineRelTy) const { >> - ?assert(0 && "ARMELFWriterInfo::getRelocationType() not implemented"); >> + ?switch (MachineRelTy) { >> + ?case ARM::reloc_arm_absolute: >> + ?case ARM::reloc_arm_relative: >> + ?case ARM::reloc_arm_cp_entry: >> + ?case ARM::reloc_arm_vfp_cp_entry: >> + ?case ARM::reloc_arm_machine_cp_entry: >> + ?case ARM::reloc_arm_jt_base: >> + ?case ARM::reloc_arm_pic_jt: >> + ? ?assert(0 && "unsupported ARM relocation type"); break; >> + >> + ?case ARM::reloc_arm_branch: return R_ARM_CALL; break; >> + ?case ARM::reloc_arm_movt: ? return R_ARM_MOVT_ABS; break; >> + ?case ARM::reloc_arm_movw: ? return R_ARM_MOVW_ABS_NC; break; >> + ?default: >> + ? ?llvm_unreachable("unknown ARM relocation type"); break; >> + ?} >> ? return 0; >> } >> >> >> Modified: llvm/trunk/lib/Target/ARM/ARMFixupKinds.h >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFixupKinds.h?rev=119760&r1=119759&r2=119760&view=diff >> ============================================================================== >> --- llvm/trunk/lib/Target/ARM/ARMFixupKinds.h (original) >> +++ llvm/trunk/lib/Target/ARM/ARMFixupKinds.h Thu Nov 18 17:37:15 2010 >> @@ -25,6 +25,12 @@ >> ? // instructions. >> ? fixup_arm_branch, >> >> + ?// The next two are for the movt/movw pair >> + ?// the 16bit imm field are split into imm{15-12} and imm{11-0} >> + ?// Fixme: We need new ones for Thumb. >> + ?fixup_arm_movt_hi16, // :upper16: >> + ?fixup_arm_movw_lo16, // :lower16: >> + >> ? // Marker >> ? LastTargetFixupKind, >> ? NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind >> >> Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=119760&r1=119759&r2=119760&view=diff >> ============================================================================== >> --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) >> +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Thu Nov 18 17:37:15 2010 >> @@ -442,6 +442,13 @@ >> ? let EncoderMethod = "getImmMinusOneOpValue"; >> } >> >> +// For movt/movw - sets the MC Encoder method. >> +// The imm is split into imm{15-12}, imm{11-0} >> +// >> +def movt_imm : Operand { >> + ?let EncoderMethod = "getMovtImmOpValue"; >> +} >> + >> // Define ARM specific addressing modes. >> >> >> @@ -1970,7 +1977,7 @@ >> } >> >> let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in >> -def MOVi16 : AI1<0b1000, (outs GPR:$Rd), (ins i32imm:$imm), >> +def MOVi16 : AI1<0b1000, (outs GPR:$Rd), (ins movt_imm:$imm), >> ? ? ? ? ? ? ? ? ?DPFrm, IIC_iMOVi, >> ? ? ? ? ? ? ? ? ?"movw", "\t$Rd, $imm", >> ? ? ? ? ? ? ? ? ?[(set GPR:$Rd, imm0_65535:$imm)]>, >> @@ -1985,7 +1992,7 @@ >> } >> >> let Constraints = "$src = $Rd" in >> -def MOVTi16 : AI1<0b1010, (outs GPR:$Rd), (ins GPR:$src, i32imm:$imm), >> +def MOVTi16 : AI1<0b1010, (outs GPR:$Rd), (ins GPR:$src, movt_imm:$imm), >> ? ? ? ? ? ? ? ? ? DPFrm, IIC_iMOVi, >> ? ? ? ? ? ? ? ? ? "movt", "\t$Rd, $imm", >> ? ? ? ? ? ? ? ? ? [(set GPR:$Rd, >> @@ -3056,7 +3063,7 @@ >> } >> >> let isMoveImm = 1 in >> -def MOVCCi16 : AI1<0b1000, (outs GPR:$Rd), (ins GPR:$false, i32imm:$imm), >> +def MOVCCi16 : AI1<0b1000, (outs GPR:$Rd), (ins GPR:$false, movt_imm:$imm), >> ? ? ? ? ? ? ? ? ?DPFrm, IIC_iMOVi, >> ? ? ? ? ? ? ? ? ?"movw", "\t$Rd, $imm", >> ? ? ? ? ? ? ? ? ?[]>, >> >> Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=119760&r1=119759&r2=119760&view=diff >> ============================================================================== >> --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) >> +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Thu Nov 18 17:37:15 2010 >> @@ -70,6 +70,10 @@ >> ? unsigned getMachineOpValue(const MCInst &MI,const MCOperand &MO, >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?SmallVectorImpl &Fixups) const; >> >> + ?/// getMovtImmOpValue - Return the encoding for the movw/movt pair >> + ?uint32_t getMovtImmOpValue(const MCInst &MI, unsigned OpIdx, >> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? SmallVectorImpl &Fixups) const; >> + >> ? bool EncodeAddrModeOpValues(const MCInst &MI, unsigned OpIdx, >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? unsigned &Reg, unsigned &Imm, >> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SmallVectorImpl &Fixups) const; >> @@ -396,6 +400,33 @@ >> } >> >> uint32_t ARMMCCodeEmitter:: >> +getMovtImmOpValue(const MCInst &MI, unsigned OpIdx, >> + ? ? ? ? ? ? ? ? ?SmallVectorImpl &Fixups) const { >> + ?// {20-16} = imm{15-12} >> + ?// {11-0} ?= imm{11-0} >> + ?const MCOperand &MO = MI.getOperand(OpIdx); >> + ?if (MO.isImm()) { >> + ? ?return static_cast(MO.getImm()); >> + ?} else if (const MCSymbolRefExpr *Expr = >> + ? ? ? ? ? ? dyn_cast(MO.getExpr())) { >> + ? ?MCFixupKind Kind; >> + ? ?switch (Expr->getKind()) { >> + ? ?case MCSymbolRefExpr::VK_ARM_HI16: >> + ? ? ?Kind = MCFixupKind(ARM::fixup_arm_movt_hi16); >> + ? ? ?break; >> + ? ?case MCSymbolRefExpr::VK_ARM_LO16: >> + ? ? ?Kind = MCFixupKind(ARM::fixup_arm_movw_lo16); >> + ? ? ?break; >> + ? ?default: assert(0 && "Unsupported ARMFixup"); break; >> + ? ?} >> + ? ?Fixups.push_back(MCFixup::Create(0, Expr, Kind)); >> + ? ?return 0; >> + ?}; >> + ?llvm_unreachable(0 && "Unsupported MCExpr type in MCOperand"); >> + ?return 0; >> +} >> + >> +uint32_t ARMMCCodeEmitter:: >> getLdStSORegOpValue(const MCInst &MI, unsigned OpIdx, >> ? ? ? ? ? ? ? ? ? ? SmallVectorImpl &Fixups) const { >> ? const MCOperand &MO = MI.getOperand(OpIdx); >> >> Modified: llvm/trunk/utils/TableGen/EDEmitter.cpp >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/EDEmitter.cpp?rev=119760&r1=119759&r2=119760&view=diff >> ============================================================================== >> --- llvm/trunk/utils/TableGen/EDEmitter.cpp (original) >> +++ llvm/trunk/utils/TableGen/EDEmitter.cpp Thu Nov 18 17:37:15 2010 >> @@ -563,6 +563,7 @@ >> ? REG("QQQQPR"); >> >> ? IMM("i32imm"); >> + ?IMM("movt_imm"); >> ? IMM("bf_inv_mask_imm"); >> ? IMM("jtblock_operand"); >> ? IMM("nohash_imm"); >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > From atrick at apple.com Tue Nov 30 17:18:48 2010 From: atrick at apple.com (Andrew Trick) Date: Tue, 30 Nov 2010 23:18:48 -0000 Subject: [llvm-commits] [llvm] r120490 - in /llvm/trunk/lib/CodeGen: LiveIntervalUnion.cpp LiveIntervalUnion.h RegAllocBase.h RegAllocBasic.cpp Message-ID: <20101130231848.387922A6C12D@llvm.org> Author: atrick Date: Tue Nov 30 17:18:47 2010 New Revision: 120490 URL: http://llvm.org/viewvc/llvm-project?rev=120490&view=rev Log: Coding style. No significant functionality. Abandon linear scan style in favor of the widespread llvm style. Capitalize variables and add newlines for visual parsing. Rename variables for readability. And other cleanup. Modified: llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp llvm/trunk/lib/CodeGen/LiveIntervalUnion.h llvm/trunk/lib/CodeGen/RegAllocBase.h llvm/trunk/lib/CodeGen/RegAllocBasic.cpp Modified: llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp?rev=120490&r1=120489&r2=120490&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp (original) +++ llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp Tue Nov 30 17:18:47 2010 @@ -21,85 +21,92 @@ #include using namespace llvm; -// Find the first segment in the range [segBegin,segments_.end()) that -// intersects with seg. If no intersection is found, return the first segI -// such that segI.start >= seg.end +// Find the first segment in the range [SegBegin,Segments.end()) that +// intersects with LS. If no intersection is found, return the first SI +// such that SI.start >= LS.End. // // This logic is tied to the underlying LiveSegments data structure. For now, we // use set::upper_bound to find the nearest starting position, // then reverse iterate to find the first overlap. // -// Upon entry we have segBegin.start < seg.end -// seg |--... -// \ . -// lvr ...-| -// -// After set::upper_bound, we have segI.start >= seg.start: -// seg |--... -// / -// lvr |--... +// Upon entry we have SegBegin.Start < LS.End +// SegBegin |--... +// \ . +// LS ...-| +// +// After set::upper_bound, we have SI.start >= LS.start: +// SI |--... +// / +// LS |--... // // Assuming intervals are disjoint, if an intersection exists, it must be the // segment found or the one immediately preceeding it. We continue reverse // iterating to return the first overlapping segment. LiveIntervalUnion::SegmentIter -LiveIntervalUnion::upperBound(SegmentIter segBegin, - const LiveSegment &seg) { - assert(seg.end > segBegin->start && "segment iterator precondition"); - // get the next LIU segment such that segI->start is not less than seg.start - // - // FIXME: Once we have a B+tree, we can make good use of segBegin as a hint to +LiveIntervalUnion::upperBound(SegmentIter SegBegin, + const LiveSegment &LS) { + assert(LS.End > SegBegin->Start && "segment iterator precondition"); + + // Get the next LIU segment such that segI->Start is not less than seg.Start + // + // FIXME: Once we have a B+tree, we can make good use of SegBegin as a hint to // upper_bound. For now, we're forced to search again from the root each time. - SegmentIter segI = segments_.upper_bound(seg); - while (segI != segBegin) { - --segI; - if (seg.start >= segI->end) - return ++segI; + SegmentIter SI = Segments.upper_bound(LS); + while (SI != SegBegin) { + --SI; + if (LS.Start >= SI->End) + return ++SI; } - return segI; + return SI; } // Merge a LiveInterval's segments. Guarantee no overlaps. // -// Consider coalescing adjacent segments to save space, even though it makes -// extraction more complicated. -void LiveIntervalUnion::unify(LiveInterval &lvr) { - // Insert each of the virtual register's live segments into the map - SegmentIter segPos = segments_.begin(); - for (LiveInterval::iterator lvrI = lvr.begin(), lvrEnd = lvr.end(); - lvrI != lvrEnd; ++lvrI ) { - LiveSegment segment(lvrI->start, lvrI->end, &lvr); - segPos = segments_.insert(segPos, segment); - assert(*segPos == segment && "need equal val for equal key"); +// After implementing B+tree, segments will be coalesced. +void LiveIntervalUnion::unify(LiveInterval &VirtReg) { + + // Insert each of the virtual register's live segments into the map. + SegmentIter SegPos = Segments.begin(); + for (LiveInterval::iterator VirtRegI = VirtReg.begin(), + VirtRegEnd = VirtReg.end(); + VirtRegI != VirtRegEnd; ++VirtRegI ) { + + LiveSegment Seg(*VirtRegI, &VirtReg); + SegPos = Segments.insert(SegPos, Seg); + + assert(*SegPos == Seg && "need equal val for equal key"); #ifndef NDEBUG - // check for overlap (inductively) - if (segPos != segments_.begin()) { - assert(llvm::prior(segPos)->end <= segment.start && - "overlapping segments" ); + // Check for overlap (inductively). + if (SegPos != Segments.begin()) { + assert(llvm::prior(SegPos)->End <= Seg.Start && "overlapping segments" ); } - SegmentIter nextPos = llvm::next(segPos); - if (nextPos != segments_.end()) - assert(segment.end <= nextPos->start && "overlapping segments" ); + SegmentIter NextPos = llvm::next(SegPos); + if (NextPos != Segments.end()) + assert(Seg.End <= NextPos->Start && "overlapping segments" ); #endif // NDEBUG } } // Remove a live virtual register's segments from this union. -void LiveIntervalUnion::extract(const LiveInterval &lvr) { +void LiveIntervalUnion::extract(const LiveInterval &VirtReg) { + // Remove each of the virtual register's live segments from the map. - SegmentIter segPos = segments_.begin(); - for (LiveInterval::const_iterator lvrI = lvr.begin(), lvrEnd = lvr.end(); - lvrI != lvrEnd; ++lvrI) { - LiveSegment seg(lvrI->start, lvrI->end, const_cast(&lvr)); - segPos = upperBound(segPos, seg); - assert(segPos != segments_.end() && "missing lvr segment"); - segments_.erase(segPos++); + SegmentIter SegPos = Segments.begin(); + for (LiveInterval::const_iterator VirtRegI = VirtReg.begin(), + VirtRegEnd = VirtReg.end(); + VirtRegI != VirtRegEnd; ++VirtRegI) { + + LiveSegment Seg(*VirtRegI, const_cast(&VirtReg)); + SegPos = upperBound(SegPos, Seg); + assert(SegPos != Segments.end() && "missing VirtReg segment"); + + Segments.erase(SegPos++); } } -raw_ostream& llvm::operator<<(raw_ostream& os, const LiveSegment &ls) { - return os << '[' << ls.start << ',' << ls.end << ':' << - ls.liveVirtReg->reg << ")"; +raw_ostream& llvm::operator<<(raw_ostream& OS, const LiveSegment &LS) { + return OS << '[' << LS.Start << ',' << LS.End << ':' << + LS.VirtReg->reg << ")"; } void LiveSegment::dump() const { @@ -107,35 +114,35 @@ } void -LiveIntervalUnion::print(raw_ostream &os, - const AbstractRegisterDescription *rdesc) const { - os << "LIU "; - if (rdesc != NULL) - os << rdesc->getName(repReg_); +LiveIntervalUnion::print(raw_ostream &OS, + const AbstractRegisterDescription *RegDesc) const { + OS << "LIU "; + if (RegDesc != NULL) + OS << RegDesc->getName(RepReg); else { - os << repReg_; + OS << RepReg; } - for (LiveSegments::const_iterator segI = segments_.begin(), - segEnd = segments_.end(); segI != segEnd; ++segI) { - dbgs() << " " << *segI; + for (LiveSegments::const_iterator SI = Segments.begin(), + SegEnd = Segments.end(); SI != SegEnd; ++SI) { + dbgs() << " " << *SI; } - os << "\n"; + OS << "\n"; } -void LiveIntervalUnion::dump(const AbstractRegisterDescription *rdesc) const { - print(dbgs(), rdesc); +void LiveIntervalUnion::dump(const AbstractRegisterDescription *RegDesc) const { + print(dbgs(), RegDesc); } #ifndef NDEBUG // Verify the live intervals in this union and add them to the visited set. -void LiveIntervalUnion::verify(LvrBitSet& visitedVRegs) { - SegmentIter segI = segments_.begin(); - SegmentIter segEnd = segments_.end(); - if (segI == segEnd) return; - visitedVRegs.set(segI->liveVirtReg->reg); - for (++segI; segI != segEnd; ++segI) { - visitedVRegs.set(segI->liveVirtReg->reg); - assert(llvm::prior(segI)->end <= segI->start && "overlapping segments" ); +void LiveIntervalUnion::verify(LiveVirtRegBitSet& VisitedVRegs) { + SegmentIter SI = Segments.begin(); + SegmentIter SegEnd = Segments.end(); + if (SI == SegEnd) return; + VisitedVRegs.set(SI->VirtReg->reg); + for (++SI; SI != SegEnd; ++SI) { + VisitedVRegs.set(SI->VirtReg->reg); + assert(llvm::prior(SI)->End <= SI->Start && "overlapping segments" ); } } #endif //!NDEBUG @@ -146,147 +153,164 @@ // (LiveInterval), and the other in this LiveIntervalUnion. The caller (Query) // is responsible for advancing the LiveIntervalUnion segments to find a // "notable" intersection, which requires query-specific logic. -// +// // This design assumes only a fast mechanism for intersecting a single live // virtual register segment with a set of LiveIntervalUnion segments. This may -// be ok since most LVRs have very few segments. If we had a data +// be ok since most VIRTREGs have very few segments. If we had a data // structure that optimizd MxN intersection of segments, then we would bypass // the loop that advances within the LiveInterval. // -// If no intersection exists, set lvrI = lvrEnd, and set segI to the first +// If no intersection exists, set VirtRegI = VirtRegEnd, and set SI to the first // segment whose start point is greater than LiveInterval's end point. // // Assumes that segments are sorted by start position in both // LiveInterval and LiveSegments. -void LiveIntervalUnion::Query::findIntersection(InterferenceResult &ir) const { - LiveInterval::iterator lvrEnd = lvr_->end(); - SegmentIter liuEnd = liu_->end(); - while (ir.liuSegI_ != liuEnd) { +void LiveIntervalUnion::Query::findIntersection(InterferenceResult &IR) const { + + // Search until reaching the end of the LiveUnion segments. + LiveInterval::iterator VirtRegEnd = VirtReg->end(); + SegmentIter LiveUnionEnd = LiveUnion->end(); + while (IR.LiveUnionI != LiveUnionEnd) { + // Slowly advance the live virtual reg iterator until we surpass the next - // segment in this union. If this is ever used for coalescing of fixed - // registers and we have a live vreg with thousands of segments, then use - // upper bound instead. - while (ir.lvrSegI_ != lvrEnd && ir.lvrSegI_->end <= ir.liuSegI_->start) - ++ir.lvrSegI_; - if (ir.lvrSegI_ == lvrEnd) - break; - // lvrSegI_ may have advanced far beyond liuSegI_, + // segment in LiveUnion. + // + // Note: If this is ever used for coalescing of fixed registers and we have + // a live vreg with thousands of segments, then change this code to use + // upperBound instead. + while (IR.VirtRegI != VirtRegEnd && + IR.VirtRegI->end <= IR.LiveUnionI->Start) + ++IR.VirtRegI; + if (IR.VirtRegI == VirtRegEnd) + break; // Retain current (nonoverlapping) LiveUnionI + + // VirtRegI may have advanced far beyond LiveUnionI, // do a fast intersection test to "catch up" - LiveSegment seg(ir.lvrSegI_->start, ir.lvrSegI_->end, lvr_); - ir.liuSegI_ = liu_->upperBound(ir.liuSegI_, seg); - // Check if no liuSegI_ exists with lvrSegI_->start < liuSegI_.end - if (ir.liuSegI_ == liuEnd) + LiveSegment Seg(*IR.VirtRegI, VirtReg); + IR.LiveUnionI = LiveUnion->upperBound(IR.LiveUnionI, Seg); + + // Check if no LiveUnionI exists with VirtRegI->Start < LiveUnionI.end + if (IR.LiveUnionI == LiveUnionEnd) break; - if (ir.liuSegI_->start < ir.lvrSegI_->end) { - assert(overlap(*ir.lvrSegI_, *ir.liuSegI_) && "upperBound postcondition"); + if (IR.LiveUnionI->Start < IR.VirtRegI->end) { + assert(overlap(*IR.VirtRegI, *IR.LiveUnionI) && + "upperBound postcondition"); break; } } - if (ir.liuSegI_ == liuEnd) - ir.lvrSegI_ = lvrEnd; + if (IR.LiveUnionI == LiveUnionEnd) + IR.VirtRegI = VirtRegEnd; } // Find the first intersection, and cache interference info -// (retain segment iterators into both lvr_ and liu_). +// (retain segment iterators into both VirtReg and LiveUnion). LiveIntervalUnion::InterferenceResult LiveIntervalUnion::Query::firstInterference() { - if (firstInterference_ != LiveIntervalUnion::InterferenceResult()) { - return firstInterference_; + if (FirstInterference != LiveIntervalUnion::InterferenceResult()) { + return FirstInterference; } - firstInterference_ = InterferenceResult(lvr_->begin(), liu_->begin()); - findIntersection(firstInterference_); - return firstInterference_; + FirstInterference = InterferenceResult(VirtReg->begin(), LiveUnion->begin()); + findIntersection(FirstInterference); + return FirstInterference; } // Treat the result as an iterator and advance to the next interfering pair // of segments. This is a plain iterator with no filter. -bool LiveIntervalUnion::Query::nextInterference(InterferenceResult &ir) const { - assert(isInterference(ir) && "iteration past end of interferences"); - // Advance either the lvr or liu segment to ensure that we visit all unique - // overlapping pairs. - if (ir.lvrSegI_->end < ir.liuSegI_->end) { - if (++ir.lvrSegI_ == lvr_->end()) +bool LiveIntervalUnion::Query::nextInterference(InterferenceResult &IR) const { + assert(isInterference(IR) && "iteration past end of interferences"); + + // Advance either the VirtReg or LiveUnion segment to ensure that we visit all + // unique overlapping pairs. + if (IR.VirtRegI->end < IR.LiveUnionI->End) { + if (++IR.VirtRegI == VirtReg->end()) return false; } else { - if (++ir.liuSegI_ == liu_->end()) { - ir.lvrSegI_ = lvr_->end(); + if (++IR.LiveUnionI == LiveUnion->end()) { + IR.VirtRegI = VirtReg->end(); return false; } } - if (overlap(*ir.lvrSegI_, *ir.liuSegI_)) + // Short-circuit findIntersection() if possible. + if (overlap(*IR.VirtRegI, *IR.LiveUnionI)) return true; - // find the next intersection - findIntersection(ir); - return isInterference(ir); + + // Find the next intersection. + findIntersection(IR); + return isInterference(IR); } -// Scan the vector of interfering virtual registers in this union. Assuming it's +// Scan the vector of interfering virtual registers in this union. Assume it's // quite small. -bool LiveIntervalUnion::Query::isSeenInterference(LiveInterval *lvr) const { +bool LiveIntervalUnion::Query::isSeenInterference(LiveInterval *VirtReg) const { SmallVectorImpl::const_iterator I = - std::find(interferingVRegs_.begin(), interferingVRegs_.end(), lvr); - return I != interferingVRegs_.end(); + std::find(InterferingVRegs.begin(), InterferingVRegs.end(), VirtReg); + return I != InterferingVRegs.end(); } // Count the number of virtual registers in this union that interfere with this -// query's live virtual register. -// -// The number of times that we either advance ir.lvrSegI_ or call -// liu_.upperBound() will be no more than the number of holes in -// lvr_. So each invocation of collectInterferingVirtReg() takes -// time proportional to |lvr-holes| * time(liu_.upperBound()). +// query's live virtual register. +// +// The number of times that we either advance IR.VirtRegI or call +// LiveUnion.upperBound() will be no more than the number of holes in +// VirtReg. So each invocation of collectInterferingVRegs() takes +// time proportional to |VirtReg Holes| * time(LiveUnion.upperBound()). // // For comments on how to speed it up, see Query::findIntersection(). unsigned LiveIntervalUnion::Query:: -collectInterferingVRegs(unsigned maxInterferingRegs) { - InterferenceResult ir = firstInterference(); - LiveInterval::iterator lvrEnd = lvr_->end(); - SegmentIter liuEnd = liu_->end(); - LiveInterval *recentInterferingVReg = NULL; - while (ir.liuSegI_ != liuEnd) { +collectInterferingVRegs(unsigned MaxInterferingRegs) { + InterferenceResult IR = firstInterference(); + LiveInterval::iterator VirtRegEnd = VirtReg->end(); + SegmentIter LiveUnionEnd = LiveUnion->end(); + LiveInterval *RecentInterferingVReg = NULL; + while (IR.LiveUnionI != LiveUnionEnd) { // Advance the union's iterator to reach an unseen interfering vreg. do { - if (ir.liuSegI_->liveVirtReg == recentInterferingVReg) + if (IR.LiveUnionI->VirtReg == RecentInterferingVReg) continue; - if (!isSeenInterference(ir.liuSegI_->liveVirtReg)) + if (!isSeenInterference(IR.LiveUnionI->VirtReg)) break; // Cache the most recent interfering vreg to bypass isSeenInterference. - recentInterferingVReg = ir.liuSegI_->liveVirtReg; + RecentInterferingVReg = IR.LiveUnionI->VirtReg; - } while( ++ir.liuSegI_ != liuEnd); - if (ir.liuSegI_ == liuEnd) + } while( ++IR.LiveUnionI != LiveUnionEnd); + if (IR.LiveUnionI == LiveUnionEnd) break; - // Advance the live vreg reg iterator until surpassing the next - // segment in this union. If this is ever used for coalescing of fixed - // registers and we have a live vreg with thousands of segments, then use - // upper bound instead. - while (ir.lvrSegI_ != lvrEnd && ir.lvrSegI_->end <= ir.liuSegI_->start) - ++ir.lvrSegI_; - if (ir.lvrSegI_ == lvrEnd) + // Advance the VirtReg iterator until surpassing the next segment in + // LiveUnion. + // + // Note: If this is ever used for coalescing of fixed registers and we have + // a live virtual register with thousands of segments, then use upperBound + // instead. + while (IR.VirtRegI != VirtRegEnd && + IR.VirtRegI->end <= IR.LiveUnionI->Start) + ++IR.VirtRegI; + if (IR.VirtRegI == VirtRegEnd) break; // Check for intersection with the union's segment. - if (overlap(*ir.lvrSegI_, *ir.liuSegI_)) { - if (!ir.liuSegI_->liveVirtReg->isSpillable()) - seenUnspillableVReg_ = true; - - interferingVRegs_.push_back(ir.liuSegI_->liveVirtReg); - if (interferingVRegs_.size() == maxInterferingRegs) - return maxInterferingRegs; + if (overlap(*IR.VirtRegI, *IR.LiveUnionI)) { + + if (!IR.LiveUnionI->VirtReg->isSpillable()) + SeenUnspillableVReg = true; + + InterferingVRegs.push_back(IR.LiveUnionI->VirtReg); + if (InterferingVRegs.size() == MaxInterferingRegs) + return MaxInterferingRegs; // Cache the most recent interfering vreg to bypass isSeenInterference. - recentInterferingVReg = ir.liuSegI_->liveVirtReg; - ++ir.liuSegI_; + RecentInterferingVReg = IR.LiveUnionI->VirtReg; + ++IR.LiveUnionI; continue; } - // lvrSegI_ may have advanced far beyond liuSegI_, + // VirtRegI may have advanced far beyond LiveUnionI, // do a fast intersection test to "catch up" - LiveSegment seg(ir.lvrSegI_->start, ir.lvrSegI_->end, lvr_); - ir.liuSegI_ = liu_->upperBound(ir.liuSegI_, seg); + LiveSegment Seg(*IR.VirtRegI, VirtReg); + IR.LiveUnionI = LiveUnion->upperBound(IR.LiveUnionI, Seg); } - return interferingVRegs_.size(); + SeenAllInterferences = true; + return InterferingVRegs.size(); } Modified: llvm/trunk/lib/CodeGen/LiveIntervalUnion.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalUnion.h?rev=120490&r1=120489&r2=120490&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveIntervalUnion.h (original) +++ llvm/trunk/lib/CodeGen/LiveIntervalUnion.h Tue Nov 30 17:18:47 2010 @@ -26,7 +26,7 @@ #ifndef NDEBUG // forward declaration template class SparseBitVector; -typedef SparseBitVector<128> LvrBitSet; +typedef SparseBitVector<128> LiveVirtRegBitSet; #endif /// A LiveSegment is a copy of a LiveRange object used within @@ -37,52 +37,54 @@ /// interval within a virtual register's liveness. To limit confusion, in this /// file we refer it as a live segment. /// -/// Note: This currently represents a half-open interval [start,end). +/// Note: This currently represents a half-open interval [Start,End). /// If LiveRange is modified to represent a closed interval, so should this. struct LiveSegment { - SlotIndex start; - SlotIndex end; - LiveInterval *liveVirtReg; + SlotIndex Start; + SlotIndex End; + LiveInterval *VirtReg; - LiveSegment(SlotIndex s, SlotIndex e, LiveInterval *lvr) - : start(s), end(e), liveVirtReg(lvr) {} + LiveSegment(const LiveRange& LR, LiveInterval *VReg) + : Start(LR.start), End(LR.end), VirtReg(VReg) {} - bool operator==(const LiveSegment &ls) const { - return start == ls.start && end == ls.end && liveVirtReg == ls.liveVirtReg; + bool operator==(const LiveSegment &LS) const { + return Start == LS.Start && End == LS.End && VirtReg == LS.VirtReg; } - bool operator!=(const LiveSegment &ls) const { - return !operator==(ls); + bool operator!=(const LiveSegment &LS) const { + return !operator==(LS); } // Order segments by starting point only--we expect them to be disjoint. - bool operator<(const LiveSegment &ls) const { return start < ls.start; } + bool operator<(const LiveSegment &LS) const { return Start < LS.Start; } void dump() const; - void print(raw_ostream &os) const; + void print(raw_ostream &OS) const; }; -inline bool operator<(SlotIndex V, const LiveSegment &ls) { - return V < ls.start; +inline bool operator<(SlotIndex Idx, const LiveSegment &LS) { + return Idx < LS.Start; } -inline bool operator<(const LiveSegment &ls, SlotIndex V) { - return ls.start < V; +inline bool operator<(const LiveSegment &LS, SlotIndex Idx) { + return LS.Start < Idx; } /// Compare a live virtual register segment to a LiveIntervalUnion segment. -inline bool overlap(const LiveRange &lvrSeg, const LiveSegment &liuSeg) { - return lvrSeg.start < liuSeg.end && liuSeg.start < lvrSeg.end; +inline bool overlap(const LiveRange &VirtRegSegment, + const LiveSegment &LiveUnionSegment) { + return VirtRegSegment.start < LiveUnionSegment.End && + LiveUnionSegment.Start < VirtRegSegment.end; } template <> struct isPodLike { static const bool value = true; }; -raw_ostream& operator<<(raw_ostream& os, const LiveSegment &ls); +raw_ostream& operator<<(raw_ostream& OS, const LiveSegment &LS); /// Abstraction to provide info for the representative register. class AbstractRegisterDescription { public: - virtual const char *getName(unsigned reg) const = 0; + virtual const char *getName(unsigned Reg) const = 0; virtual ~AbstractRegisterDescription() {} }; @@ -92,7 +94,7 @@ /// eventually make exceptions to handle value-based interference. class LiveIntervalUnion { // A set of live virtual register segments that supports fast insertion, - // intersection, and removal. + // intersection, and removal. // // FIXME: std::set is a placeholder until we decide how to // efficiently represent it. Probably need to roll our own B-tree. @@ -103,7 +105,7 @@ // This is traditionally known as a live range, but we refer is as a live // virtual register to avoid confusing it with the misnamed LiveRange // class. - typedef std::vector LiveVirtRegs; + typedef std::vector LiveVRegs; public: // SegmentIter can advance to the next segment ordered by starting position @@ -115,41 +117,41 @@ class Query; private: - unsigned repReg_; // representative register number - LiveSegments segments_; // union of virtual reg segements + unsigned RepReg; // representative register number + LiveSegments Segments; // union of virtual reg segements public: // default ctor avoids placement new - LiveIntervalUnion() : repReg_(0) {} + LiveIntervalUnion() : RepReg(0) {} // Initialize the union by associating it with a representative register // number. - void init(unsigned repReg) { repReg_ = repReg; } + void init(unsigned Reg) { RepReg = Reg; } // Iterate over all segments in the union of live virtual registers ordered // by their starting position. - SegmentIter begin() { return segments_.begin(); } - SegmentIter end() { return segments_.end(); } + SegmentIter begin() { return Segments.begin(); } + SegmentIter end() { return Segments.end(); } // Return an iterator to the first segment after or including begin that - // intersects with lvrSeg. - SegmentIter upperBound(SegmentIter begin, const LiveSegment &seg); + // intersects with LS. + SegmentIter upperBound(SegmentIter SegBegin, const LiveSegment &LS); // Add a live virtual register to this union and merge its segments. - // Holds a nonconst reference to the LVR for later maniplution. - void unify(LiveInterval &lvr); + // Holds a nonconst reference to the VirtReg for later maniplution. + void unify(LiveInterval &VirtReg); // Remove a live virtual register's segments from this union. - void extract(const LiveInterval &lvr); + void extract(const LiveInterval &VirtReg); - void dump(const AbstractRegisterDescription *regInfo) const; + void dump(const AbstractRegisterDescription *RegDesc) const; + + // If tri != NULL, use it to decode RepReg + void print(raw_ostream &OS, const AbstractRegisterDescription *RegDesc) const; - // If tri != NULL, use it to decode repReg_ - void print(raw_ostream &os, const AbstractRegisterDescription *rdesc) const; - #ifndef NDEBUG // Verify the live intervals in this union and add them to the visited set. - void verify(LvrBitSet& visitedVRegs); + void verify(LiveVirtRegBitSet& VisitedVRegs); #endif /// Cache a single interference test result in the form of two intersecting @@ -159,85 +161,89 @@ class InterferenceResult { friend class Query; - LiveInterval::iterator lvrSegI_; // current position in _lvr - SegmentIter liuSegI_; // current position in _liu - + LiveInterval::iterator VirtRegI; // current position in VirtReg + SegmentIter LiveUnionI; // current position in LiveUnion + // Internal ctor. - InterferenceResult(LiveInterval::iterator lvrSegI, SegmentIter liuSegI) - : lvrSegI_(lvrSegI), liuSegI_(liuSegI) {} + InterferenceResult(LiveInterval::iterator VRegI, SegmentIter UnionI) + : VirtRegI(VRegI), LiveUnionI(UnionI) {} public: // Public default ctor. - InterferenceResult(): lvrSegI_(), liuSegI_() {} + InterferenceResult(): VirtRegI(), LiveUnionI() {} // Note: this interface provides raw access to the iterators because the // result has no way to tell if it's valid to dereference them. - // Access the lvr segment. - LiveInterval::iterator lvrSegPos() const { return lvrSegI_; } + // Access the VirtReg segment. + LiveInterval::iterator virtRegPos() const { return VirtRegI; } - // Access the liu segment. - SegmentIter liuSegPos() const { return liuSegI_; } + // Access the LiveUnion segment. + SegmentIter liveUnionPos() const { return LiveUnionI; } - bool operator==(const InterferenceResult &ir) const { - return lvrSegI_ == ir.lvrSegI_ && liuSegI_ == ir.liuSegI_; + bool operator==(const InterferenceResult &IR) const { + return VirtRegI == IR.VirtRegI && LiveUnionI == IR.LiveUnionI; } - bool operator!=(const InterferenceResult &ir) const { - return !operator==(ir); + bool operator!=(const InterferenceResult &IR) const { + return !operator==(IR); } }; /// Query interferences between a single live virtual register and a live /// interval union. class Query { - LiveIntervalUnion *liu_; - LiveInterval *lvr_; - InterferenceResult firstInterference_; - SmallVector interferingVRegs_; - bool seenUnspillableVReg_; + LiveIntervalUnion *LiveUnion; + LiveInterval *VirtReg; + InterferenceResult FirstInterference; + SmallVector InterferingVRegs; + bool SeenAllInterferences; + bool SeenUnspillableVReg; public: - Query(): liu_(), lvr_() {} + Query(): LiveUnion(), VirtReg() {} - Query(LiveInterval *lvr, LiveIntervalUnion *liu): - liu_(liu), lvr_(lvr), seenUnspillableVReg_(false) {} + Query(LiveInterval *VReg, LiveIntervalUnion *LIU): + LiveUnion(LIU), VirtReg(VReg), SeenAllInterferences(false), + SeenUnspillableVReg(false) + {} void clear() { - liu_ = NULL; - lvr_ = NULL; - firstInterference_ = InterferenceResult(); - interferingVRegs_.clear(); - seenUnspillableVReg_ = false; - } - - void init(LiveInterval *lvr, LiveIntervalUnion *liu) { - if (lvr_ == lvr) { + LiveUnion = NULL; + VirtReg = NULL; + FirstInterference = InterferenceResult(); + InterferingVRegs.clear(); + SeenAllInterferences = false; + SeenUnspillableVReg = false; + } + + void init(LiveInterval *VReg, LiveIntervalUnion *LIU) { + if (VirtReg == VReg) { // We currently allow query objects to be reused acrossed live virtual // registers, but always for the same live interval union. - assert(liu_ == liu && "inconsistent initialization"); + assert(LiveUnion == LIU && "inconsistent initialization"); // Retain cached results, e.g. firstInterference. return; } - liu_ = liu; - lvr_ = lvr; - // Clear cached results. - firstInterference_ = InterferenceResult(); - interferingVRegs_.clear(); - seenUnspillableVReg_ = false; + clear(); + LiveUnion = LIU; + VirtReg = VReg; + } + + LiveInterval &virtReg() const { + assert(VirtReg && "uninitialized"); + return *VirtReg; } - LiveInterval &lvr() const { assert(lvr_ && "uninitialized"); return *lvr_; } - - bool isInterference(const InterferenceResult &ir) const { - if (ir.lvrSegI_ != lvr_->end()) { - assert(overlap(*ir.lvrSegI_, *ir.liuSegI_) && + bool isInterference(const InterferenceResult &IR) const { + if (IR.VirtRegI != VirtReg->end()) { + assert(overlap(*IR.VirtRegI, *IR.LiveUnionI) && "invalid segment iterators"); return true; } return false; } - // Does this live virtual register interfere with the union. + // Does this live virtual register interfere with the union? bool checkInterference() { return isInterference(firstInterference()); } // Get the first pair of interfering segments, or a noninterfering result. @@ -246,32 +252,33 @@ // Treat the result as an iterator and advance to the next interfering pair // of segments. Visiting each unique interfering pairs means that the same - // lvr or liu segment may be visited multiple times. - bool nextInterference(InterferenceResult &ir) const; + // VirtReg or LiveUnion segment may be visited multiple times. + bool nextInterference(InterferenceResult &IR) const; // Count the virtual registers in this union that interfere with this // query's live virtual register, up to maxInterferingRegs. - unsigned collectInterferingVRegs(unsigned maxInterferingRegs = UINT_MAX); + unsigned collectInterferingVRegs(unsigned MaxInterferingRegs = UINT_MAX); // Was this virtual register visited during collectInterferingVRegs? - bool isSeenInterference(LiveInterval *lvr) const; + bool isSeenInterference(LiveInterval *VReg) const; + + // Did collectInterferingVRegs collect all interferences? + bool seenAllInterferences() const { return SeenAllInterferences; } // Did collectInterferingVRegs encounter an unspillable vreg? - bool seenUnspillableVReg() const { - return seenUnspillableVReg_; - } + bool seenUnspillableVReg() const { return SeenUnspillableVReg; } // Vector generated by collectInterferingVRegs. const SmallVectorImpl &interferingVRegs() const { - return interferingVRegs_; + return InterferingVRegs; } - + private: Query(const Query&); // DO NOT IMPLEMENT void operator=(const Query&); // DO NOT IMPLEMENT - + // Private interface for queries - void findIntersection(InterferenceResult &ir) const; + void findIntersection(InterferenceResult &IR) const; }; }; Modified: llvm/trunk/lib/CodeGen/RegAllocBase.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocBase.h?rev=120490&r1=120489&r2=120490&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/RegAllocBase.h (original) +++ llvm/trunk/lib/CodeGen/RegAllocBase.h Tue Nov 30 17:18:47 2010 @@ -11,11 +11,11 @@ // register allocation algorithm and interface for extending it. It provides the // building blocks on which to construct other experimental allocators and test // the validity of two principles: -// +// // - If virtual and physical register liveness is modeled using intervals, then // on-the-fly interference checking is cheap. Furthermore, interferences can be // lazily cached and reused. -// +// // - Register allocation complexity, and generated code performance is // determined by the effectiveness of live range splitting rather than optimal // coloring. @@ -52,8 +52,8 @@ // The default is to simply compare spill weights. struct LessSpillWeightPriority : public std::binary_function { - bool operator()(const LiveInterval *left, const LiveInterval *right) const { - return left->weight < right->weight; + bool operator()(const LiveInterval *Left, const LiveInterval *Right) const { + return Left->weight < Right->weight; } }; @@ -65,41 +65,40 @@ /// RegAllocBase provides the register allocation driver and interface that can /// be extended to add interesting heuristics. /// -/// More sophisticated allocators must override the selectOrSplit() method to -/// implement live range splitting and must specify a comparator to determine -/// register assignment priority. LessSpillWeightPriority is provided as a -/// standard comparator. +/// Register allocators must override the selectOrSplit() method to implement +/// live range splitting. LessSpillWeightPriority is provided as a standard +/// comparator, but we may add an interface to override it if necessary. class RegAllocBase { protected: // Array of LiveIntervalUnions indexed by physical register. - class LIUArray { - unsigned nRegs_; - OwningArrayPtr array_; + class LiveUnionArray { + unsigned NumRegs; + OwningArrayPtr Array; public: - LIUArray(): nRegs_(0) {} + LiveUnionArray(): NumRegs(0) {} - unsigned numRegs() const { return nRegs_; } + unsigned numRegs() const { return NumRegs; } - void init(unsigned nRegs); + void init(unsigned NRegs); void clear(); - - LiveIntervalUnion& operator[](unsigned physReg) { - assert(physReg < nRegs_ && "physReg out of bounds"); - return array_[physReg]; + + LiveIntervalUnion& operator[](unsigned PhysReg) { + assert(PhysReg < NumRegs && "physReg out of bounds"); + return Array[PhysReg]; } }; - - const TargetRegisterInfo *tri_; - VirtRegMap *vrm_; - LiveIntervals *lis_; - LIUArray physReg2liu_; + + const TargetRegisterInfo *TRI; + VirtRegMap *VRM; + LiveIntervals *LIS; + LiveUnionArray PhysReg2LiveUnion; // Current queries, one per physreg. They must be reinitialized each time we // query on a new live virtual register. - OwningArrayPtr queries_; + OwningArrayPtr Queries; - RegAllocBase(): tri_(0), vrm_(0), lis_(0) {} + RegAllocBase(): TRI(0), VRM(0), LIS(0) {} virtual ~RegAllocBase() {} @@ -108,13 +107,13 @@ // Get an initialized query to check interferences between lvr and preg. Note // that Query::init must be called at least once for each physical register - // before querying a new live virtual register. This ties queries_ and - // physReg2liu_ together. - LiveIntervalUnion::Query &query(LiveInterval &lvr, unsigned preg) { - queries_[preg].init(&lvr, &physReg2liu_[preg]); - return queries_[preg]; + // before querying a new live virtual register. This ties Queries and + // PhysReg2LiveUnion together. + LiveIntervalUnion::Query &query(LiveInterval &VirtReg, unsigned PhysReg) { + Queries[PhysReg].init(&VirtReg, &PhysReg2LiveUnion[PhysReg]); + return Queries[PhysReg]; } - + // The top-level driver. The output is a VirtRegMap that us updated with // physical register assignments. // @@ -125,12 +124,12 @@ // Get a temporary reference to a Spiller instance. virtual Spiller &spiller() = 0; - + // A RegAlloc pass should override this to provide the allocation heuristics. // Each call must guarantee forward progess by returning an available PhysReg // or new set of split live virtual registers. It is up to the splitter to // converge quickly toward fully spilled live ranges. - virtual unsigned selectOrSplit(LiveInterval &lvr, + virtual unsigned selectOrSplit(LiveInterval &VirtReg, SmallVectorImpl &splitLVRs) = 0; // A RegAlloc pass should call this when PassManager releases its memory. @@ -139,24 +138,24 @@ // Helper for checking interference between a live virtual register and a // physical register, including all its register aliases. If an interference // exists, return the interfering register, which may be preg or an alias. - unsigned checkPhysRegInterference(LiveInterval& lvr, unsigned preg); + unsigned checkPhysRegInterference(LiveInterval& VirtReg, unsigned PhysReg); // Helper for spilling all live virtual registers currently unified under preg // that interfere with the most recently queried lvr. Return true if spilling // was successful, and append any new spilled/split intervals to splitLVRs. - bool spillInterferences(LiveInterval &lvr, unsigned preg, - SmallVectorImpl &splitLVRs); + bool spillInterferences(LiveInterval &VirtReg, unsigned PhysReg, + SmallVectorImpl &SplitVRegs); #ifndef NDEBUG // Verify each LiveIntervalUnion. void verify(); #endif - + private: - void seedLiveVirtRegs(LiveVirtRegQueue &lvrQ); + void seedLiveVirtRegs(LiveVirtRegQueue &VirtRegQ); - void spillReg(LiveInterval &lvr, unsigned reg, - SmallVectorImpl &splitLVRs); + void spillReg(LiveInterval &VirtReg, unsigned PhysReg, + SmallVectorImpl &SplitVRegs); }; } // end namespace llvm Modified: llvm/trunk/lib/CodeGen/RegAllocBasic.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocBasic.cpp?rev=120490&r1=120489&r2=120490&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/RegAllocBasic.cpp (original) +++ llvm/trunk/lib/CodeGen/RegAllocBasic.cpp Tue Nov 30 17:18:47 2010 @@ -59,10 +59,10 @@ namespace { class PhysicalRegisterDescription : public AbstractRegisterDescription { - const TargetRegisterInfo *tri_; + const TargetRegisterInfo *TRI; public: - PhysicalRegisterDescription(const TargetRegisterInfo *tri): tri_(tri) {} - virtual const char *getName(unsigned reg) const { return tri_->getName(reg); } + PhysicalRegisterDescription(const TargetRegisterInfo *T): TRI(T) {} + virtual const char *getName(unsigned Reg) const { return TRI->getName(Reg); } }; /// RABasic provides a minimal implementation of the basic register allocation @@ -73,17 +73,18 @@ class RABasic : public MachineFunctionPass, public RegAllocBase { // context - MachineFunction *mf_; - const TargetMachine *tm_; - MachineRegisterInfo *mri_; - BitVector reservedRegs_; + MachineFunction *MF; + const TargetMachine *TM; + MachineRegisterInfo *MRI; + + BitVector ReservedRegs; // analyses - LiveStacks *ls_; - RenderMachineFunction *rmf_; + LiveStacks *LS; + RenderMachineFunction *RMF; // state - std::auto_ptr spiller_; + std::auto_ptr SpillerInstance; public: RABasic(); @@ -94,14 +95,14 @@ } /// RABasic analysis usage. - virtual void getAnalysisUsage(AnalysisUsage &au) const; + virtual void getAnalysisUsage(AnalysisUsage &AU) const; virtual void releaseMemory(); - virtual Spiller &spiller() { return *spiller_; } + virtual Spiller &spiller() { return *SpillerInstance; } - virtual unsigned selectOrSplit(LiveInterval &lvr, - SmallVectorImpl &splitLVRs); + virtual unsigned selectOrSplit(LiveInterval &VirtReg, + SmallVectorImpl &SplitVRegs); /// Perform register allocation. virtual bool runOnMachineFunction(MachineFunction &mf); @@ -116,25 +117,6 @@ } // end anonymous namespace -// We should not need to publish the initializer as long as no other passes -// require RABasic. -#if 0 // disable INITIALIZE_PASS -INITIALIZE_PASS_BEGIN(RABasic, "basic-regalloc", - "Basic Register Allocator", false, false) -INITIALIZE_PASS_DEPENDENCY(LiveIntervals) -INITIALIZE_PASS_DEPENDENCY(StrongPHIElimination) -INITIALIZE_AG_DEPENDENCY(RegisterCoalescer) -INITIALIZE_PASS_DEPENDENCY(CalculateSpillWeights) -INITIALIZE_PASS_DEPENDENCY(LiveStacks) -INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo) -INITIALIZE_PASS_DEPENDENCY(VirtRegMap) -#ifndef NDEBUG -INITIALIZE_PASS_DEPENDENCY(RenderMachineFunction) -#endif -INITIALIZE_PASS_END(RABasic, "basic-regalloc", - "Basic Register Allocator", false, false) -#endif // disable INITIALIZE_PASS - RABasic::RABasic(): MachineFunctionPass(ID) { initializeLiveIntervalsPass(*PassRegistry::getPassRegistry()); initializeSlotIndexesPass(*PassRegistry::getPassRegistry()); @@ -148,58 +130,62 @@ initializeRenderMachineFunctionPass(*PassRegistry::getPassRegistry()); } -void RABasic::getAnalysisUsage(AnalysisUsage &au) const { - au.setPreservesCFG(); - au.addRequired(); - au.addPreserved(); - au.addRequired(); - au.addPreserved(); +void RABasic::getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesCFG(); + AU.addRequired(); + AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); if (StrongPHIElim) - au.addRequiredID(StrongPHIEliminationID); - au.addRequiredTransitive(); - au.addRequired(); - au.addRequired(); - au.addPreserved(); - au.addRequiredID(MachineDominatorsID); - au.addPreservedID(MachineDominatorsID); - au.addRequired(); - au.addPreserved(); - au.addRequired(); - au.addPreserved(); - DEBUG(au.addRequired()); - MachineFunctionPass::getAnalysisUsage(au); + AU.addRequiredID(StrongPHIEliminationID); + AU.addRequiredTransitive(); + AU.addRequired(); + AU.addRequired(); + AU.addPreserved(); + AU.addRequiredID(MachineDominatorsID); + AU.addPreservedID(MachineDominatorsID); + AU.addRequired(); + AU.addPreserved(); + AU.addRequired(); + AU.addPreserved(); + DEBUG(AU.addRequired()); + MachineFunctionPass::getAnalysisUsage(AU); } void RABasic::releaseMemory() { - spiller_.reset(0); + SpillerInstance.reset(0); RegAllocBase::releaseMemory(); } #ifndef NDEBUG // Verify each LiveIntervalUnion. void RegAllocBase::verify() { - LvrBitSet visitedVRegs; - OwningArrayPtr unionVRegs(new LvrBitSet[physReg2liu_.numRegs()]); + LiveVirtRegBitSet VisitedVRegs; + OwningArrayPtr + unionVRegs(new LiveVirtRegBitSet[PhysReg2LiveUnion.numRegs()]); + // Verify disjoint unions. - for (unsigned preg = 0; preg < physReg2liu_.numRegs(); ++preg) { - DEBUG(PhysicalRegisterDescription prd(tri_); physReg2liu_[preg].dump(&prd)); - LvrBitSet &vregs = unionVRegs[preg]; - physReg2liu_[preg].verify(vregs); + for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) { + DEBUG(PhysicalRegisterDescription PRD(TRI); + PhysReg2LiveUnion[PhysReg].dump(&PRD)); + LiveVirtRegBitSet &VRegs = unionVRegs[PhysReg]; + PhysReg2LiveUnion[PhysReg].verify(VRegs); // Union + intersection test could be done efficiently in one pass, but // don't add a method to SparseBitVector unless we really need it. - assert(!visitedVRegs.intersects(vregs) && "vreg in multiple unions"); - visitedVRegs |= vregs; + assert(!VisitedVRegs.intersects(VRegs) && "vreg in multiple unions"); + VisitedVRegs |= VRegs; } + // Verify vreg coverage. - for (LiveIntervals::iterator liItr = lis_->begin(), liEnd = lis_->end(); + for (LiveIntervals::iterator liItr = LIS->begin(), liEnd = LIS->end(); liItr != liEnd; ++liItr) { unsigned reg = liItr->first; if (TargetRegisterInfo::isPhysicalRegister(reg)) continue; - if (!vrm_->hasPhys(reg)) continue; // spilled? - unsigned preg = vrm_->getPhys(reg); - if (!unionVRegs[preg].test(reg)) { + if (!VRM->hasPhys(reg)) continue; // spilled? + unsigned PhysReg = VRM->getPhys(reg); + if (!unionVRegs[PhysReg].test(reg)) { dbgs() << "LiveVirtReg " << reg << " not in union " << - tri_->getName(preg) << "\n"; + TRI->getName(PhysReg) << "\n"; llvm_unreachable("unallocated live vreg"); } } @@ -212,31 +198,31 @@ //===----------------------------------------------------------------------===// // Instantiate a LiveIntervalUnion for each physical register. -void RegAllocBase::LIUArray::init(unsigned nRegs) { - array_.reset(new LiveIntervalUnion[nRegs]); - nRegs_ = nRegs; - for (unsigned pr = 0; pr < nRegs; ++pr) { - array_[pr].init(pr); +void RegAllocBase::LiveUnionArray::init(unsigned NRegs) { + Array.reset(new LiveIntervalUnion[NRegs]); + NumRegs = NRegs; + for (unsigned RegNum = 0; RegNum < NRegs; ++RegNum) { + Array[RegNum].init(RegNum); } } void RegAllocBase::init(const TargetRegisterInfo &tri, VirtRegMap &vrm, LiveIntervals &lis) { - tri_ = &tri; - vrm_ = &vrm; - lis_ = &lis; - physReg2liu_.init(tri_->getNumRegs()); + TRI = &tri; + VRM = &vrm; + LIS = &lis; + PhysReg2LiveUnion.init(TRI->getNumRegs()); // Cache an interferece query for each physical reg - queries_.reset(new LiveIntervalUnion::Query[physReg2liu_.numRegs()]); + Queries.reset(new LiveIntervalUnion::Query[PhysReg2LiveUnion.numRegs()]); } -void RegAllocBase::LIUArray::clear() { - nRegs_ = 0; - array_.reset(0); +void RegAllocBase::LiveUnionArray::clear() { + NumRegs = 0; + Array.reset(0); } void RegAllocBase::releaseMemory() { - physReg2liu_.clear(); + PhysReg2LiveUnion.clear(); } namespace llvm { @@ -248,22 +234,23 @@ /// to override the priority queue comparator. class LiveVirtRegQueue { typedef std::priority_queue - , LessSpillWeightPriority> PQ; - PQ pq_; + , LessSpillWeightPriority> + PriorityQ; + PriorityQ PQ; public: // Is the queue empty? - bool empty() { return pq_.empty(); } + bool empty() { return PQ.empty(); } // Get the highest priority lvr (top + pop) LiveInterval *get() { - LiveInterval *lvr = pq_.top(); - pq_.pop(); - return lvr; + LiveInterval *VirtReg = PQ.top(); + PQ.pop(); + return VirtReg; } // Add this lvr to the queue - void push(LiveInterval *lvr) { - pq_.push(lvr); + void push(LiveInterval *VirtReg) { + PQ.push(VirtReg); } }; } // end namespace llvm @@ -271,128 +258,132 @@ // Visit all the live virtual registers. If they are already assigned to a // physical register, unify them with the corresponding LiveIntervalUnion, // otherwise push them on the priority queue for later assignment. -void RegAllocBase::seedLiveVirtRegs(LiveVirtRegQueue &lvrQ) { - for (LiveIntervals::iterator liItr = lis_->begin(), liEnd = lis_->end(); - liItr != liEnd; ++liItr) { - unsigned reg = liItr->first; - LiveInterval &li = *liItr->second; - if (TargetRegisterInfo::isPhysicalRegister(reg)) { - physReg2liu_[reg].unify(li); +void RegAllocBase::seedLiveVirtRegs(LiveVirtRegQueue &VirtRegQ) { + for (LiveIntervals::iterator I = LIS->begin(), E = LIS->end(); I != E; ++I) { + unsigned RegNum = I->first; + LiveInterval &VirtReg = *I->second; + if (TargetRegisterInfo::isPhysicalRegister(RegNum)) { + PhysReg2LiveUnion[RegNum].unify(VirtReg); } else { - lvrQ.push(&li); + VirtRegQ.push(&VirtReg); } } } -// Top-level driver to manage the queue of unassigned LiveVirtRegs and call the +// Top-level driver to manage the queue of unassigned VirtRegs and call the // selectOrSplit implementation. void RegAllocBase::allocatePhysRegs() { - LiveVirtRegQueue lvrQ; - seedLiveVirtRegs(lvrQ); - while (!lvrQ.empty()) { - LiveInterval *lvr = lvrQ.get(); - typedef SmallVector LVRVec; - LVRVec splitLVRs; - unsigned availablePhysReg = selectOrSplit(*lvr, splitLVRs); - if (availablePhysReg) { - DEBUG(dbgs() << "allocating: " << tri_->getName(availablePhysReg) << - " " << *lvr << '\n'); - assert(!vrm_->hasPhys(lvr->reg) && "duplicate vreg in interval unions"); - vrm_->assignVirt2Phys(lvr->reg, availablePhysReg); - physReg2liu_[availablePhysReg].unify(*lvr); + + // Push each vreg onto a queue or "precolor" by adding it to a physreg union. + LiveVirtRegQueue VirtRegQ; + seedLiveVirtRegs(VirtRegQ); + + // Continue assigning vregs one at a time to available physical registers. + while (!VirtRegQ.empty()) { + // Pop the highest priority vreg. + LiveInterval *VirtReg = VirtRegQ.get(); + + // selectOrSplit requests the allocator to return an available physical + // register if possible and populate a list of new live intervals that + // result from splitting. + typedef SmallVector VirtRegVec; + VirtRegVec SplitVRegs; + unsigned AvailablePhysReg = selectOrSplit(*VirtReg, SplitVRegs); + + if (AvailablePhysReg) { + DEBUG(dbgs() << "allocating: " << TRI->getName(AvailablePhysReg) << + " " << *VirtReg << '\n'); + assert(!VRM->hasPhys(VirtReg->reg) && "duplicate vreg in union"); + VRM->assignVirt2Phys(VirtReg->reg, AvailablePhysReg); + PhysReg2LiveUnion[AvailablePhysReg].unify(*VirtReg); } - for (LVRVec::iterator lvrI = splitLVRs.begin(), lvrEnd = splitLVRs.end(); - lvrI != lvrEnd; ++lvrI) { - if ((*lvrI)->empty()) continue; - DEBUG(dbgs() << "queuing new interval: " << **lvrI << "\n"); - assert(TargetRegisterInfo::isVirtualRegister((*lvrI)->reg) && + for (VirtRegVec::iterator I = SplitVRegs.begin(), E = SplitVRegs.end(); + I != E; ++I) { + LiveInterval* SplitVirtReg = *I; + if (SplitVirtReg->empty()) continue; + DEBUG(dbgs() << "queuing new interval: " << *SplitVirtReg << "\n"); + assert(TargetRegisterInfo::isVirtualRegister(SplitVirtReg->reg) && "expect split value in virtual register"); - lvrQ.push(*lvrI); + VirtRegQ.push(SplitVirtReg); } } } -// Check if this live virtual reg interferes with a physical register. If not, -// then check for interference on each register that aliases with the physical -// register. Return the interfering register. -unsigned RegAllocBase::checkPhysRegInterference(LiveInterval &lvr, - unsigned preg) { - if (query(lvr, preg).checkInterference()) - return preg; - for (const unsigned *asI = tri_->getAliasSet(preg); *asI; ++asI) { - if (query(lvr, *asI).checkInterference()) - return *asI; +// Check if this live virtual register interferes with a physical register. If +// not, then check for interference on each register that aliases with the +// physical register. Return the interfering register. +unsigned RegAllocBase::checkPhysRegInterference(LiveInterval &VirtReg, + unsigned PhysReg) { + if (query(VirtReg, PhysReg).checkInterference()) + return PhysReg; + for (const unsigned *AliasI = TRI->getAliasSet(PhysReg); *AliasI; ++AliasI) { + if (query(VirtReg, *AliasI).checkInterference()) + return *AliasI; } return 0; } -// Sort live virtual registers by their register number. -struct LessLiveVirtualReg - : public std::binary_function { - bool operator()(const LiveInterval *left, const LiveInterval *right) const { - return left->reg < right->reg; - } -}; - -// Spill all interferences currently assigned to this physical register. -void RegAllocBase::spillReg(LiveInterval& lvr, unsigned reg, - SmallVectorImpl &splitLVRs) { - LiveIntervalUnion::Query &Q = query(lvr, reg); - const SmallVectorImpl &pendingSpills = Q.interferingVRegs(); - - for (SmallVectorImpl::const_iterator I = pendingSpills.begin(), - E = pendingSpills.end(); I != E; ++I) { - LiveInterval &spilledLVR = **I; +// Helper for spillInteferences() that spills all interfering vregs currently +// assigned to this physical register. +void RegAllocBase::spillReg(LiveInterval& VirtReg, unsigned PhysReg, + SmallVectorImpl &SplitVRegs) { + LiveIntervalUnion::Query &Q = query(VirtReg, PhysReg); + assert(Q.seenAllInterferences() && "need collectInterferences()"); + const SmallVectorImpl &PendingSpills = Q.interferingVRegs(); + + for (SmallVectorImpl::const_iterator I = PendingSpills.begin(), + E = PendingSpills.end(); I != E; ++I) { + LiveInterval &SpilledVReg = **I; DEBUG(dbgs() << "extracting from " << - tri_->getName(reg) << " " << spilledLVR << '\n'); + TRI->getName(PhysReg) << " " << SpilledVReg << '\n'); // Deallocate the interfering vreg by removing it from the union. // A LiveInterval instance may not be in a union during modification! - physReg2liu_[reg].extract(spilledLVR); + PhysReg2LiveUnion[PhysReg].extract(SpilledVReg); // Clear the vreg assignment. - vrm_->clearVirt(spilledLVR.reg); + VRM->clearVirt(SpilledVReg.reg); // Spill the extracted interval. - spiller().spill(&spilledLVR, splitLVRs, pendingSpills); + spiller().spill(&SpilledVReg, SplitVRegs, PendingSpills); } // After extracting segments, the query's results are invalid. But keep the // contents valid until we're done accessing pendingSpills. Q.clear(); } -// Spill or split all live virtual registers currently unified under preg that -// interfere with lvr. The newly spilled or split live intervals are returned by -// appending them to splitLVRs. +// Spill or split all live virtual registers currently unified under PhysReg +// that interfere with VirtReg. The newly spilled or split live intervals are +// returned by appending them to SplitVRegs. bool -RegAllocBase::spillInterferences(LiveInterval &lvr, unsigned preg, - SmallVectorImpl &splitLVRs) { +RegAllocBase::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg, + SmallVectorImpl &SplitVRegs) { // Record each interference and determine if all are spillable before mutating // either the union or live intervals. // Collect interferences assigned to the requested physical register. - LiveIntervalUnion::Query &QPreg = query(lvr, preg); - unsigned numInterferences = QPreg.collectInterferingVRegs(); + LiveIntervalUnion::Query &QPreg = query(VirtReg, PhysReg); + unsigned NumInterferences = QPreg.collectInterferingVRegs(); if (QPreg.seenUnspillableVReg()) { return false; } // Collect interferences assigned to any alias of the physical register. - for (const unsigned *asI = tri_->getAliasSet(preg); *asI; ++asI) { - LiveIntervalUnion::Query &QAlias = query(lvr, *asI); - numInterferences += QAlias.collectInterferingVRegs(); + for (const unsigned *asI = TRI->getAliasSet(PhysReg); *asI; ++asI) { + LiveIntervalUnion::Query &QAlias = query(VirtReg, *asI); + NumInterferences += QAlias.collectInterferingVRegs(); if (QAlias.seenUnspillableVReg()) { return false; } } - DEBUG(dbgs() << "spilling " << tri_->getName(preg) << - " interferences with " << lvr << "\n"); - assert(numInterferences > 0 && "expect interference"); - - // Spill each interfering vreg allocated to preg or an alias. - spillReg(lvr, preg, splitLVRs); - for (const unsigned *asI = tri_->getAliasSet(preg); *asI; ++asI) - spillReg(lvr, *asI, splitLVRs); + DEBUG(dbgs() << "spilling " << TRI->getName(PhysReg) << + " interferences with " << VirtReg << "\n"); + assert(NumInterferences > 0 && "expect interference"); + + // Spill each interfering vreg allocated to PhysReg or an alias. + spillReg(VirtReg, PhysReg, SplitVRegs); + for (const unsigned *AliasI = TRI->getAliasSet(PhysReg); *AliasI; ++AliasI) + spillReg(VirtReg, *AliasI, SplitVRegs); return true; } @@ -403,134 +394,135 @@ // Driver for the register assignment and splitting heuristics. // Manages iteration over the LiveIntervalUnions. // -// Minimal implementation of register assignment and splitting--spills whenever -// we run out of registers. +// This is a minimal implementation of register assignment and splitting that +// spills whenever we run out of registers. // // selectOrSplit can only be called once per live virtual register. We then do a // single interference test for each register the correct class until we find an // available register. So, the number of interference tests in the worst case is // |vregs| * |machineregs|. And since the number of interference tests is -// minimal, there is no value in caching them. -unsigned RABasic::selectOrSplit(LiveInterval &lvr, - SmallVectorImpl &splitLVRs) { +// minimal, there is no value in caching them outside the scope of +// selectOrSplit(). +unsigned RABasic::selectOrSplit(LiveInterval &VirtReg, + SmallVectorImpl &SplitVRegs) { // Populate a list of physical register spill candidates. - SmallVector pregSpillCands; + SmallVector PhysRegSpillCands; // Check for an available register in this class. - const TargetRegisterClass *trc = mri_->getRegClass(lvr.reg); - for (TargetRegisterClass::iterator trcI = trc->allocation_order_begin(*mf_), - trcEnd = trc->allocation_order_end(*mf_); - trcI != trcEnd; ++trcI) { - unsigned preg = *trcI; - if (reservedRegs_.test(preg)) continue; + const TargetRegisterClass *TRC = MRI->getRegClass(VirtReg.reg); + DEBUG(dbgs() << "RegClass: " << TRC->getName() << ' '); - // Check interference and intialize queries for this lvr as a side effect. - unsigned interfReg = checkPhysRegInterference(lvr, preg); + for (TargetRegisterClass::iterator I = TRC->allocation_order_begin(*MF), + E = TRC->allocation_order_end(*MF); + I != E; ++I) { + + unsigned PhysReg = *I; + if (ReservedRegs.test(PhysReg)) continue; + + // Check interference and as a side effect, intialize queries for this + // VirtReg and its aliases. + unsigned interfReg = checkPhysRegInterference(VirtReg, PhysReg); if (interfReg == 0) { // Found an available register. - return preg; + return PhysReg; } LiveInterval *interferingVirtReg = - queries_[interfReg].firstInterference().liuSegPos()->liveVirtReg; + Queries[interfReg].firstInterference().liveUnionPos()->VirtReg; - // The current lvr must either spillable, or one of its interferences must - // have less spill weight. - if (interferingVirtReg->weight < lvr.weight ) { - pregSpillCands.push_back(preg); + // The current VirtReg must either spillable, or one of its interferences + // must have less spill weight. + if (interferingVirtReg->weight < VirtReg.weight ) { + PhysRegSpillCands.push_back(PhysReg); } } // Try to spill another interfering reg with less spill weight. // // FIXME: RAGreedy will sort this list by spill weight. - for (SmallVectorImpl::iterator pregI = pregSpillCands.begin(), - pregE = pregSpillCands.end(); pregI != pregE; ++pregI) { + for (SmallVectorImpl::iterator PhysRegI = PhysRegSpillCands.begin(), + PhysRegE = PhysRegSpillCands.end(); PhysRegI != PhysRegE; ++PhysRegI) { - if (!spillInterferences(lvr, *pregI, splitLVRs)) continue; + if (!spillInterferences(VirtReg, *PhysRegI, SplitVRegs)) continue; - unsigned interfReg = checkPhysRegInterference(lvr, *pregI); - if (interfReg != 0) { + unsigned InterferingReg = checkPhysRegInterference(VirtReg, *PhysRegI); + if (InterferingReg != 0) { const LiveSegment &seg = - *queries_[interfReg].firstInterference().liuSegPos(); - dbgs() << "spilling cannot free " << tri_->getName(*pregI) << - " for " << lvr.reg << " with interference " << *seg.liveVirtReg << "\n"; + *Queries[InterferingReg].firstInterference().liveUnionPos(); + + dbgs() << "spilling cannot free " << TRI->getName(*PhysRegI) << + " for " << VirtReg.reg << " with interference " << *seg.VirtReg << "\n"; llvm_unreachable("Interference after spill."); } // Tell the caller to allocate to this newly freed physical register. - return *pregI; + return *PhysRegI; } - // No other spill candidates were found, so spill the current lvr. - DEBUG(dbgs() << "spilling: " << lvr << '\n'); + // No other spill candidates were found, so spill the current VirtReg. + DEBUG(dbgs() << "spilling: " << VirtReg << '\n'); SmallVector pendingSpills; - spiller().spill(&lvr, splitLVRs, pendingSpills); + + spiller().spill(&VirtReg, SplitVRegs, pendingSpills); // The live virtual register requesting allocation was spilled, so tell // the caller not to allocate anything during this round. return 0; } -// Add newly allocated physical register to the MBB live in sets. +// Add newly allocated physical registers to the MBB live in sets. void RABasic::addMBBLiveIns() { - SmallVector liveInMBBs; - MachineBasicBlock &entryMBB = *mf_->begin(); + typedef SmallVector MBBVec; + MBBVec liveInMBBs; + MachineBasicBlock &entryMBB = *MF->begin(); + + for (unsigned PhysReg = 0; PhysReg < PhysReg2LiveUnion.numRegs(); ++PhysReg) { + LiveIntervalUnion &LiveUnion = PhysReg2LiveUnion[PhysReg]; + + for (LiveIntervalUnion::SegmentIter SI = LiveUnion.begin(), + SegEnd = LiveUnion.end(); + SI != SegEnd; ++SI) { - for (unsigned preg = 0; preg < physReg2liu_.numRegs(); ++preg) { - LiveIntervalUnion &liu = physReg2liu_[preg]; - for (LiveIntervalUnion::SegmentIter segI = liu.begin(), segE = liu.end(); - segI != segE; ++segI) { // Find the set of basic blocks which this range is live into... - if (lis_->findLiveInMBBs(segI->start, segI->end, liveInMBBs)) { - // And add the physreg for this interval to their live-in sets. - for (unsigned i = 0; i != liveInMBBs.size(); ++i) { - if (liveInMBBs[i] != &entryMBB) { - if (!liveInMBBs[i]->isLiveIn(preg)) { - liveInMBBs[i]->addLiveIn(preg); - } - } - } - liveInMBBs.clear(); + liveInMBBs.clear(); + if (!LIS->findLiveInMBBs(SI->Start, SI->End, liveInMBBs)) continue; + + // And add the physreg for this interval to their live-in sets. + for (MBBVec::iterator I = liveInMBBs.begin(), E = liveInMBBs.end(); + I != E; ++I) { + MachineBasicBlock *MBB = *I; + if (MBB == &entryMBB) continue; + if (MBB->isLiveIn(PhysReg)) continue; + MBB->addLiveIn(PhysReg); } } } } -namespace llvm { -Spiller *createInlineSpiller(MachineFunctionPass &pass, - MachineFunction &mf, - VirtRegMap &vrm); -} - bool RABasic::runOnMachineFunction(MachineFunction &mf) { DEBUG(dbgs() << "********** BASIC REGISTER ALLOCATION **********\n" << "********** Function: " << ((Value*)mf.getFunction())->getName() << '\n'); - mf_ = &mf; - tm_ = &mf.getTarget(); - mri_ = &mf.getRegInfo(); + MF = &mf; + TM = &mf.getTarget(); + MRI = &mf.getRegInfo(); - DEBUG(rmf_ = &getAnalysis()); + DEBUG(RMF = &getAnalysis()); - const TargetRegisterInfo *TRI = tm_->getRegisterInfo(); + const TargetRegisterInfo *TRI = TM->getRegisterInfo(); RegAllocBase::init(*TRI, getAnalysis(), getAnalysis()); - reservedRegs_ = TRI->getReservedRegs(*mf_); + ReservedRegs = TRI->getReservedRegs(*MF); - // We may want to force InlineSpiller for this register allocator. For - // now we're also experimenting with the standard spiller. - // - //spiller_.reset(createInlineSpiller(*this, *mf_, *vrm_)); - spiller_.reset(createSpiller(*this, *mf_, *vrm_)); + SpillerInstance.reset(createSpiller(*this, *MF, *VRM)); allocatePhysRegs(); addMBBLiveIns(); // Diagnostic output before rewriting - DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *vrm_ << "\n"); + DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *VRM << "\n"); // optional HTML output - DEBUG(rmf_->renderMachineFunction("After basic register allocation.", vrm_)); + DEBUG(RMF->renderMachineFunction("After basic register allocation.", VRM)); // FIXME: Verification currently must run before VirtRegRewriter. We should // make the rewriter a separate pass and override verifyAnalysis instead. When @@ -540,9 +532,11 @@ // Verify accuracy of LiveIntervals. The standard machine code verifier // ensures that each LiveIntervals covers all uses of the virtual reg. - // FIXME: MachineVerifier is currently broken when using the standard - // spiller. Enable it for InlineSpiller only. - // mf_->verify(this); + // FIXME: MachineVerifier is badly broken when using the standard + // spiller. Always use -spiller=inline with -verify-regalloc. Even with the + // inline spiller, some tests fail to verify because the coalescer does not + // always generate verifiable code. + MF->verify(this); // Verify that LiveIntervals are partitioned into unions and disjoint within // the unions. @@ -552,7 +546,7 @@ // Run rewriter std::auto_ptr rewriter(createVirtRegRewriter()); - rewriter->runOnMachineFunction(*mf_, *vrm_, lis_); + rewriter->runOnMachineFunction(*MF, *VRM, LIS); // The pass output is in VirtRegMap. Release all the transient data. releaseMemory(); From sabre at nondot.org Tue Nov 30 17:23:59 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 23:23:59 -0000 Subject: [llvm-commits] [llvm] r120492 - /llvm/trunk/test/Analysis/BasicAA/modref.ll Message-ID: <20101130232359.4BDA32A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 17:23:59 2010 New Revision: 120492 URL: http://llvm.org/viewvc/llvm-project?rev=120492&view=rev Log: check in *all* files. This is now handled by my previous DSE commit. Modified: llvm/trunk/test/Analysis/BasicAA/modref.ll Modified: llvm/trunk/test/Analysis/BasicAA/modref.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/modref.ll?rev=120492&r1=120491&r2=120492&view=diff ============================================================================== --- llvm/trunk/test/Analysis/BasicAA/modref.ll (original) +++ llvm/trunk/test/Analysis/BasicAA/modref.ll Tue Nov 30 17:23:59 2010 @@ -86,7 +86,7 @@ %P2 = getelementptr i8* %P, i32 2 store i8 %Y, i8* %P2 ;; FIXME: Killed by llvm.lifetime.end, should be zapped. -; CHECK: store i8 %Y, i8* %P2 +; CHECK-NOT: store call void @llvm.lifetime.end(i64 10, i8* %P) ret void ; CHECK: ret void From sabre at nondot.org Tue Nov 30 17:25:01 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 23:25:01 -0000 Subject: [llvm-commits] [llvm] r120493 - /llvm/trunk/test/Analysis/BasicAA/modref.ll Message-ID: <20101130232501.7E6882A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 17:25:01 2010 New Revision: 120493 URL: http://llvm.org/viewvc/llvm-project?rev=120493&view=rev Log: remove fixme comment too. Modified: llvm/trunk/test/Analysis/BasicAA/modref.ll Modified: llvm/trunk/test/Analysis/BasicAA/modref.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/modref.ll?rev=120493&r1=120492&r2=120493&view=diff ============================================================================== --- llvm/trunk/test/Analysis/BasicAA/modref.ll (original) +++ llvm/trunk/test/Analysis/BasicAA/modref.ll Tue Nov 30 17:25:01 2010 @@ -85,11 +85,11 @@ %Y = add i8 %X, 1 ;; Dead, because the only use (the store) is dead. %P2 = getelementptr i8* %P, i32 2 - store i8 %Y, i8* %P2 ;; FIXME: Killed by llvm.lifetime.end, should be zapped. -; CHECK-NOT: store + store i8 %Y, i8* %P2 +; CHECK-NEXT: call void @llvm.lifetime.end call void @llvm.lifetime.end(i64 10, i8* %P) ret void -; CHECK: ret void +; CHECK-NEXT: ret void } @G1 = external global i32 From jason.w.kim.2009 at gmail.com Tue Nov 30 17:27:18 2010 From: jason.w.kim.2009 at gmail.com (Jason W Kim) Date: Tue, 30 Nov 2010 23:27:18 -0000 Subject: [llvm-commits] [llvm] r120494 - /llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Message-ID: <20101130232718.C08772A6C12D@llvm.org> Author: jasonwkim Date: Tue Nov 30 17:27:18 2010 New Revision: 120494 URL: http://llvm.org/viewvc/llvm-project?rev=120494&view=rev Log: Thanks to JimG for catching this! Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120494&r1=120493&r2=120494&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Nov 30 17:27:18 2010 @@ -49,6 +49,8 @@ { "fixup_arm_pcrel_12", 1, 24, MCFixupKindInfo::FKF_IsPCRel }, { "fixup_arm_vfp_pcrel_12", 1, 24, MCFixupKindInfo::FKF_IsPCRel }, { "fixup_arm_branch", 1, 24, MCFixupKindInfo::FKF_IsPCRel }, + { "fixup_arm_movt_hi16", 0, 16, 0 }, + { "fixup_arm_movw_lo16", 0, 16, 0 }, }; if (Kind < FirstTargetFixupKind) From bigcheesegs at gmail.com Tue Nov 30 17:27:35 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Tue, 30 Nov 2010 23:27:35 -0000 Subject: [llvm-commits] [llvm] r120495 - in /llvm/trunk: include/llvm/ADT/StringRef.h lib/Support/StringRef.cpp Message-ID: <20101130232735.CFAD32A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 17:27:35 2010 New Revision: 120495 URL: http://llvm.org/viewvc/llvm-project?rev=120495&view=rev Log: Support/ADT/StringRef: Add find_last_of. Modified: llvm/trunk/include/llvm/ADT/StringRef.h llvm/trunk/lib/Support/StringRef.cpp Modified: llvm/trunk/include/llvm/ADT/StringRef.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringRef.h?rev=120495&r1=120494&r2=120495&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/StringRef.h (original) +++ llvm/trunk/include/llvm/ADT/StringRef.h Tue Nov 30 17:27:35 2010 @@ -256,6 +256,18 @@ /// Note: O(size() + Chars.size()) size_type find_first_not_of(StringRef Chars, size_t From = 0) const; + /// find_last_of - Find the last character in the string that is \arg C, or + /// npos if not found. + size_type find_last_of(char C, size_t From = npos) const { + return rfind(C, From); + } + + /// find_last_of - Find the last character in the string that is in \arg C, + /// or npos if not found. + /// + /// Note: O(size() + Chars.size()) + size_type find_last_of(StringRef Chars, size_t From = npos) const; + /// @} /// @name Helpful Algorithms /// @{ Modified: llvm/trunk/lib/Support/StringRef.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/StringRef.cpp?rev=120495&r1=120494&r2=120495&view=diff ============================================================================== --- llvm/trunk/lib/Support/StringRef.cpp (original) +++ llvm/trunk/lib/Support/StringRef.cpp Tue Nov 30 17:27:35 2010 @@ -200,6 +200,21 @@ return npos; } +/// find_last_of - Find the last character in the string that is in \arg C, +/// or npos if not found. +/// +/// Note: O(size() + Chars.size()) +StringRef::size_type StringRef::find_last_of(StringRef Chars, + size_t From) const { + std::bitset<1 << CHAR_BIT> CharBits; + for (size_type i = 0; i != Chars.size(); ++i) + CharBits.set((unsigned char)Chars[i]); + + for (size_type i = min(From, Length) - 1, e = -1; i != e; --i) + if (CharBits.test((unsigned char)Data[i])) + return i; + return npos; +} //===----------------------------------------------------------------------===// // Helpful Algorithms From bigcheesegs at gmail.com Tue Nov 30 17:28:07 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Tue, 30 Nov 2010 23:28:07 -0000 Subject: [llvm-commits] [llvm] r120496 - in /llvm/trunk: include/llvm/Support/PathV2.h lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101130232807.92CF12A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 17:28:07 2010 New Revision: 120496 URL: http://llvm.org/viewvc/llvm-project?rev=120496&view=rev Log: Support/PathV2: Implement reverse iteration and parent_path. Modified: llvm/trunk/include/llvm/Support/PathV2.h llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/include/llvm/Support/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?rev=120496&r1=120495&r2=120496&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Tue Nov 30 17:28:07 2010 @@ -81,16 +81,21 @@ typedef value_type *pointer; typedef std::bidirectional_iterator_tag iterator_category; - reference operator*() const; - pointer operator->() const; + reference operator*() const { return Component; } + pointer operator->() const { return &Component; } const_iterator &operator++(); // preincrement const_iterator &operator++(int); // postincrement const_iterator &operator--(); // predecrement const_iterator &operator--(int); // postdecrement bool operator==(const const_iterator &RHS) const; bool operator!=(const const_iterator &RHS) const; + + /// @brief Difference in bytes between this and RHS. + ptrdiff_t operator-(const const_iterator &RHS) const; }; +typedef std::reverse_iterator reverse_iterator; + /// @brief Get begin iterator over \a path. /// @param path Input path. /// @returns Iterator initialized with the first component of \a path. @@ -101,6 +106,20 @@ /// @returns Iterator initialized to the end of \a path. const_iterator end(const StringRef &path); +/// @brief Get reverse begin iterator over \a path. +/// @param path Input path. +/// @returns Iterator initialized with the first reverse component of \a path. +inline reverse_iterator rbegin(const StringRef &path) { + return reverse_iterator(end(path)); +} + +/// @brief Get reverse end iterator over \a path. +/// @param path Input path. +/// @returns Iterator initialized to the reverse end of \a path. +inline reverse_iterator rend(const StringRef &path) { + return reverse_iterator(begin(path)); +} + /// @} /// @name Lexical Modifiers /// @{ Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120496&r1=120495&r2=120496&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Tue Nov 30 17:28:07 2010 @@ -82,6 +82,78 @@ return StringRef(); } + + size_t filename_pos(const StringRef &str) { + if (str.size() == 2 && + is_separator(str[0]) && + is_separator(str[1])) + return 0; + + if (str.size() > 0 && is_separator(str[str.size() - 1])) + return str.size() - 1; + + size_t pos = str.find_last_of(separators, str.size() - 1); + +#ifdef LLVM_ON_WIN32 + if (pos == StringRef::npos) + pos = str.find_last_of(':', str.size() - 2); +#endif + + if (pos == StringRef::npos || + (pos == 1 && is_separator(str[0]))) + return 0; + + return pos + 1; + } + + size_t root_dir_start(const StringRef &str) { + // case "c:/" +#ifdef LLVM_ON_WIN32 + if (str.size() > 2 && + str[1] == ':' && + is_separator(str[2])) + return 2; +#endif + + // case "//" + if (str.size() == 2 && + is_separator(str[0]) && + str[0] == str[1]) + return StringRef::npos; + + // case "//net" + if (str.size() > 3 && + is_separator(str[0]) && + str[0] == str[1] && + !is_separator(str[2])) { + return str.find_first_of(separators, 2); + } + + // case "/" + if (str.size() > 0 && is_separator(str[0])) + return 0; + + return StringRef::npos; + } + + size_t parent_path_end(const StringRef &path) { + size_t end_pos = filename_pos(path); + + bool filename_was_sep = path.size() > 0 && is_separator(path[end_pos]); + + // Skip separators except for root dir. + size_t root_dir_pos = root_dir_start(StringRef(path.begin(), end_pos)); + + while(end_pos > 0 && + (end_pos - 1) != root_dir_pos && + is_separator(path[end_pos - 1])) + --end_pos; + + if (end_pos == 1 && root_dir_pos == 0 && filename_was_sep) + return StringRef::npos; + + return end_pos; + } } namespace llvm { @@ -103,14 +175,6 @@ return i; } -const_iterator::reference const_iterator::operator*() const { - return Component; -} - -const_iterator::pointer const_iterator::operator->() const { - return &Component; -} - const_iterator &const_iterator::operator++() { assert(Position < Path.size() && "Tried to increment past end!"); @@ -166,6 +230,36 @@ return *this; } +const_iterator &const_iterator::operator--() { + // If we're at the end and the previous char was a '/', return '.'. + if (Position == Path.size() && + Path.size() > 1 && + is_separator(Path[Position - 1]) +#ifdef LLVM_ON_WIN32 + && Path[Position - 2] != ':' +#endif + ) { + --Position; + Component = "."; + return *this; + } + + // Skip separators unless it's the root directory. + size_t root_dir_pos = root_dir_start(Path); + size_t end_pos = Position; + + while(end_pos > 0 && + (end_pos - 1) != root_dir_pos && + is_separator(Path[end_pos - 1])) + --end_pos; + + // Find next separator. + size_t start_pos = filename_pos(StringRef(Path.begin(), end_pos)); + Component = StringRef(Path.begin() + start_pos, end_pos - start_pos); + Position = start_pos; + return *this; +} + bool const_iterator::operator==(const const_iterator &RHS) const { return Path.begin() == RHS.Path.begin() && Position == RHS.Position; @@ -175,6 +269,10 @@ return !(*this == RHS); } +ptrdiff_t const_iterator::operator-(const const_iterator &RHS) const { + return Position - RHS.Position; +} + error_code root_path(const StringRef &path, StringRef &result) { const_iterator b = begin(path), pos = b, @@ -396,6 +494,15 @@ "occurred above!"); } +error_code parent_path(const StringRef &path, StringRef &result) { + size_t end_pos = parent_path_end(path); + if (end_pos == StringRef::npos) + result = StringRef(); + else + result = StringRef(path.data(), end_pos); + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120496&r1=120495&r2=120496&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Tue Nov 30 17:28:07 2010 @@ -71,6 +71,15 @@ } outs() << "]\n"; + outs() << " Reverse Iteration: ["; + for (sys::path::reverse_iterator ci = sys::path::rbegin(*i), + ce = sys::path::rend(*i); + ci != ce; + ++ci) { + outs() << *ci << ','; + } + outs() << "]\n"; + StringRef res; SmallString<16> temp_store; if (error_code ec = sys::path::root_path(*i, res)) @@ -82,6 +91,9 @@ if (error_code ec = sys::path::root_directory(*i, res)) ASSERT_FALSE(ec.message().c_str()); outs() << " root_directory: " << res << '\n'; + if (error_code ec = sys::path::parent_path(*i, res)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " parent_path: " << res << '\n'; temp_store = *i; if (error_code ec = sys::path::make_absolute(temp_store)) From grosbach at apple.com Tue Nov 30 17:29:24 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 23:29:24 -0000 Subject: [llvm-commits] [llvm] r120497 - /llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp Message-ID: <20101130232924.8B3552A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 17:29:24 2010 New Revision: 120497 URL: http://llvm.org/viewvc/llvm-project?rev=120497&view=rev Log: Trailing whitespace. Modified: llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp Modified: llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp?rev=120497&r1=120496&r2=120497&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp Tue Nov 30 17:29:24 2010 @@ -41,13 +41,13 @@ Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_PLT, Ctx); break; } - + if (!MO.isJTI() && MO.getOffset()) Expr = MCBinaryExpr::CreateAdd(Expr, MCConstantExpr::Create(MO.getOffset(), Ctx), Ctx); return MCOperand::CreateExpr(Expr); - + } void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, @@ -79,7 +79,7 @@ MCOp = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP); break; case MachineOperand::MO_ExternalSymbol: - MCOp = GetSymbolRef(MO, + MCOp = GetSymbolRef(MO, AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP); break; case MachineOperand::MO_JumpTableIndex: From sabre at nondot.org Tue Nov 30 17:43:23 2010 From: sabre at nondot.org (Chris Lattner) Date: Tue, 30 Nov 2010 23:43:23 -0000 Subject: [llvm-commits] [llvm] r120498 - in /llvm/trunk: lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/PartialStore.ll Message-ID: <20101130234323.657052A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 17:43:23 2010 New Revision: 120498 URL: http://llvm.org/viewvc/llvm-project?rev=120498&view=rev Log: Enhance DSE to handle the variable index case in PR8657. Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll Modified: llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp?rev=120498&r1=120497&r2=120498&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 17:43:23 2010 @@ -19,6 +19,7 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/Constants.h" #include "llvm/Function.h" +#include "llvm/GlobalVariable.h" #include "llvm/Instructions.h" #include "llvm/IntrinsicInst.h" #include "llvm/Pass.h" @@ -255,6 +256,17 @@ return TD->getTypeAllocSize(PT->getElementType()); } +/// isObjectPointerWithTrustworthySize - Return true if the specified Value* is +/// pointing to an object with a pointer size we can trust. +static bool isObjectPointerWithTrustworthySize(const Value *V) { + if (const AllocaInst *AI = dyn_cast(V)) + return !AI->isArrayAllocation(); + if (const GlobalVariable *GV = dyn_cast(V)) + return !GV->isWeakForLinker(); + if (const Argument *A = dyn_cast(V)) + return A->hasByValAttr(); + return false; +} /// isCompleteOverwrite - Return true if a store to the 'Later' location /// completely overwrites a store to the 'Earlier' location. @@ -289,12 +301,29 @@ // larger than the earlier one. if (Later.Size == AliasAnalysis::UnknownSize || Earlier.Size == AliasAnalysis::UnknownSize || - Later.Size <= Earlier.Size || - AA.getTargetData() == 0) + Later.Size <= Earlier.Size || AA.getTargetData() == 0) return false; + // Check to see if the later store is to the entire object (either a global, + // an alloca, or a byval argument). If so, then it clearly overwrites any + // other store to the same object. const TargetData &TD = *AA.getTargetData(); + const Value *UO1 = P1->getUnderlyingObject(), *UO2 = P2->getUnderlyingObject(); + + // If we can't resolve the same pointers to the same object, then we can't + // analyze them at all. + if (UO1 != UO2) + return false; + + // If the "Later" store is to a recognizable object, get its size. + if (isObjectPointerWithTrustworthySize(UO2)) { + uint64_t ObjectSize = + TD.getTypeAllocSize(cast(UO2->getType())->getElementType()); + if (ObjectSize == Later.Size) + return true; + } + // Okay, we have stores to two completely different pointers. Try to // decompose the pointer into a "base + constant_offset" form. If the base // pointers are equal, then we can reason about the two stores. Modified: llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll?rev=120498&r1=120497&r2=120498&view=diff ============================================================================== --- llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll (original) +++ llvm/trunk/test/Transforms/DeadStoreElimination/PartialStore.ll Tue Nov 30 17:43:23 2010 @@ -52,3 +52,20 @@ store double 0.0, double* %Q ret void } + +; PR8657 +declare void @test5a(i32*) +define void @test5(i32 %i) nounwind ssp { + %A = alloca i32 + %B = bitcast i32* %A to i8* + %C = getelementptr i8* %B, i32 %i + store i8 10, i8* %C ;; Dead store to variable index. + store i32 20, i32* %A + + call void @test5a(i32* %A) + ret void +; CHECK: @test5( +; CHECK-NEXT: alloca +; CHECK-NEXT: store i32 20 +; CHECK-NEXT: call void @test5a +} From grosbach at apple.com Tue Nov 30 17:51:41 2010 From: grosbach at apple.com (Jim Grosbach) Date: Tue, 30 Nov 2010 23:51:41 -0000 Subject: [llvm-commits] [llvm] r120499 - /llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Message-ID: <20101130235141.2A7472A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 17:51:41 2010 New Revision: 120499 URL: http://llvm.org/viewvc/llvm-project?rev=120499&view=rev Log: Fix typo. Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=120499&r1=120498&r2=120499&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Nov 30 17:51:41 2010 @@ -324,7 +324,7 @@ unsigned Reg = MO.getReg(); unsigned RegNo = getARMRegisterNumbering(Reg); - // Q registers are encodes as 2x their register number. + // Q registers are encoded as 2x their register number. switch (Reg) { default: return RegNo; From isanbard at gmail.com Tue Nov 30 17:54:45 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 23:54:45 -0000 Subject: [llvm-commits] [llvm] r120500 - in /llvm/trunk/lib/Target/ARM: ARMInstrFormats.td ARMInstrThumb.td Message-ID: <20101130235445.CBC442A6C12D@llvm.org> Author: void Date: Tue Nov 30 17:54:45 2010 New Revision: 120500 URL: http://llvm.org/viewvc/llvm-project?rev=120500&view=rev Log: Rename operands to match ARM documentation. No functionality change. Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120500&r1=120499&r2=120500&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Tue Nov 30 17:54:45 2010 @@ -839,7 +839,7 @@ class T1sIt pattern> : Thumb1sI; + "$Rn = $Rdn", pattern>; // Thumb1 instruction that can be predicated. class Thumb1pI opB> : T1LoadStore<0b1001, opB>; // SP relative // Helper classes to encode Thumb1 loads and stores. For immediates, the -// following bits are used for "opA": +// following bits are used for "opA" (see A6.2.4): // // 0b0110 => Immediate, 4 bytes // 0b1000 => Immediate, 2 bytes Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120500&r1=120499&r2=120500&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 17:54:45 2010 @@ -579,10 +579,15 @@ // Load tconstpool // FIXME: Use ldr.n to work around a Darwin assembler bug. let canFoldAsLoad = 1, isReMaterializable = 1 in -def tLDRpci : T1pIs<(outs tGPR:$dst), (ins i32imm:$addr), IIC_iLoad_i, - "ldr", ".n\t$dst, $addr", - [(set tGPR:$dst, (load (ARMWrapper tconstpool:$addr)))]>, - T1Encoding<{0,1,0,0,1,?}>; // A6.2 & A8.6.59 +def tLDRpci : T1pIs<(outs tGPR:$Rt), (ins i32imm:$addr), IIC_iLoad_i, + "ldr", ".n\t$Rt, $addr", + [(set tGPR:$Rt, (load (ARMWrapper tconstpool:$addr)))]>, + T1Encoding<{0,1,0,0,1,?}> { + // A6.2 & A8.6.59 + bits<3> Rt; + let Inst{10-8} = Rt; + // FIXME: Finish for the addr. +} // Special LDR for loads from non-pc-relative constpools. let canFoldAsLoad = 1, mayLoad = 1, neverHasSideEffects = 1, @@ -632,13 +637,12 @@ [(store tGPR:$src, t_addrmode_sp:$addr)]>, T1LdStSP<{0,?,?}>; -let mayStore = 1, neverHasSideEffects = 1 in { -// Special instruction for spill. It cannot clobber condition register -// when it's expanded by eliminateCallFramePseudoInstr(). +let mayStore = 1, neverHasSideEffects = 1 in +// Special instruction for spill. It cannot clobber condition register when it's +// expanded by eliminateCallFramePseudoInstr(). def tSpill : T1pIs<(outs), (ins tGPR:$src, t_addrmode_sp:$addr), IIC_iStore_i, "str", "\t$src, $addr", []>, T1LdStSP<{0,?,?}>; -} //===----------------------------------------------------------------------===// // Load / store multiple Instructions. @@ -706,15 +710,15 @@ // Add with carry register let isCommutable = 1, Uses = [CPSR] in -def tADC : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iALUr, - "adc", "\t$dst, $rhs", - [(set tGPR:$dst, (adde tGPR:$lhs, tGPR:$rhs))]>, +def tADC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, + "adc", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0101> { // A8.6.2 - bits<3> lhs; - bits<3> rhs; - let Inst{5-3} = lhs; - let Inst{2-0} = rhs; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rdn; + let Inst{2-0} = Rm; } // Add immediate @@ -731,15 +735,15 @@ let Inst{2-0} = Rd; } -def tADDi8 : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, i32imm:$rhs), IIC_iALUi, - "add", "\t$dst, $rhs", - [(set tGPR:$dst, (add tGPR:$lhs, imm8_255:$rhs))]>, +def tADDi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, + "add", "\t$Rdn, $imm8", + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255:$imm8))]>, T1General<{1,1,0,?,?}> { // A8.6.4 T2 - bits<3> lhs; - bits<8> rhs; - let Inst{10-8} = lhs; - let Inst{7-0} = rhs; + bits<3> Rdn; + bits<8> imm8; + let Inst{10-8} = Rdn; + let Inst{7-0} = imm8; } // Add register @@ -771,15 +775,15 @@ // AND register let isCommutable = 1 in -def tAND : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iBITr, - "and", "\t$dst, $rhs", - [(set tGPR:$dst, (and tGPR:$lhs, tGPR:$rhs))]>, +def tAND : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, + "and", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0000> { // A8.6.12 - bits<3> rhs; - bits<3> dst; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // ASR immediate @@ -797,27 +801,27 @@ } // ASR register -def tASRrr : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iMOVsr, - "asr", "\t$dst, $rhs", - [(set tGPR:$dst, (sra tGPR:$lhs, tGPR:$rhs))]>, +def tASRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, + "asr", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (sra tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0100> { // A8.6.15 - bits<3> rhs; - bits<3> dst; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // BIC register -def tBIC : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iBITr, - "bic", "\t$dst, $rhs", - [(set tGPR:$dst, (and tGPR:$lhs, (not tGPR:$rhs)))]>, +def tBIC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, + "bic", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (and tGPR:$Rn, (not tGPR:$Rm)))]>, T1DataProcessing<0b1110> { // A8.6.20 - bits<3> dst; - bits<3> rhs; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // CMN register @@ -911,15 +915,15 @@ // XOR register let isCommutable = 1 in -def tEOR : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iBITr, - "eor", "\t$dst, $rhs", - [(set tGPR:$dst, (xor tGPR:$lhs, tGPR:$rhs))]>, +def tEOR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, + "eor", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0001> { // A8.6.45 - bits<3> dst; - bits<3> rhs; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // LSL immediate @@ -937,15 +941,15 @@ } // LSL register -def tLSLrr : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iMOVsr, - "lsl", "\t$dst, $rhs", - [(set tGPR:$dst, (shl tGPR:$lhs, tGPR:$rhs))]>, +def tLSLrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, + "lsl", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0010> { // A8.6.89 - bits<3> dst; - bits<3> rhs; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // LSR immediate @@ -963,15 +967,15 @@ } // LSR register -def tLSRrr : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iMOVsr, - "lsr", "\t$dst, $rhs", - [(set tGPR:$dst, (srl tGPR:$lhs, tGPR:$rhs))]>, +def tLSRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, + "lsr", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (srl tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0011> { // A8.6.91 - bits<3> dst; - bits<3> rhs; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // Move register @@ -1014,15 +1018,15 @@ // multiply register let isCommutable = 1 in -def tMUL : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iMUL32, - "mul", "\t$dst, $rhs, $dst", /* A8.6.105 MUL Encoding T1 */ - [(set tGPR:$dst, (mul tGPR:$lhs, tGPR:$rhs))]>, +def tMUL : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMUL32, + "mul", "\t$Rdn, $Rm, $Rdn", /* A8.6.105 MUL Encoding T1 */ + [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b1101> { // A8.6.105 - bits<3> dst; - bits<3> rhs; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // move inverse register @@ -1039,15 +1043,15 @@ // Bitwise or register let isCommutable = 1 in -def tORR : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iBITr, - "orr", "\t$dst, $rhs", - [(set tGPR:$dst, (or tGPR:$lhs, tGPR:$rhs))]>, +def tORR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, + "orr", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b1100> { // A8.6.114 - bits<3> dst; - bits<3> rhs; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // Swaps @@ -1095,15 +1099,15 @@ } // rotate right register -def tROR : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iMOVsr, - "ror", "\t$dst, $rhs", - [(set tGPR:$dst, (rotr tGPR:$lhs, tGPR:$rhs))]>, +def tROR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, + "ror", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0111> { // A8.6.139 - bits<3> rhs; - bits<3> dst; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // negate register @@ -1120,15 +1124,15 @@ // Subtract with carry register let Uses = [CPSR] in -def tSBC : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, tGPR:$rhs), IIC_iALUr, - "sbc", "\t$dst, $rhs", - [(set tGPR:$dst, (sube tGPR:$lhs, tGPR:$rhs))]>, +def tSBC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, + "sbc", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>, T1DataProcessing<0b0110> { // A8.6.151 - bits<3> rhs; - bits<3> dst; - let Inst{5-3} = rhs; - let Inst{2-0} = dst; + bits<3> Rdn; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; } // Subtract immediate @@ -1145,15 +1149,15 @@ let Inst{2-0} = Rd; } -def tSUBi8 : T1sIt<(outs tGPR:$dst), (ins tGPR:$lhs, i32imm:$rhs), IIC_iALUi, - "sub", "\t$dst, $rhs", - [(set tGPR:$dst, (add tGPR:$lhs, imm8_255_neg:$rhs))]>, +def tSUBi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, + "sub", "\t$Rdn, $imm8", + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>, T1General<{1,1,1,?,?}> { // A8.6.210 T2 - bits<8> rhs; - bits<3> dst; - let Inst{10-8} = dst; - let Inst{7-0} = rhs; + bits<3> Rdn; + bits<8> imm8; + let Inst{10-8} = Rdn; + let Inst{7-0} = imm8; } // subtract register From evan.cheng at apple.com Tue Nov 30 17:55:39 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 30 Nov 2010 23:55:39 -0000 Subject: [llvm-commits] [llvm] r120501 - in /llvm/trunk: include/llvm/CodeGen/Analysis.h include/llvm/Target/TargetLowering.h lib/CodeGen/Analysis.cpp lib/CodeGen/SelectionDAG/LegalizeDAG.cpp lib/Target/ARM/ARMFrameInfo.cpp lib/Target/ARM/ARMISelLowering.cpp lib/Target/ARM/ARMISelLowering.h lib/Target/X86/README.txt lib/Target/X86/X86FrameInfo.cpp lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h test/CodeGen/ARM/call-tc.ll test/CodeGen/X86/sibcall-5.ll Message-ID: <20101130235540.2543B2A6C12D@llvm.org> Author: evancheng Date: Tue Nov 30 17:55:39 2010 New Revision: 120501 URL: http://llvm.org/viewvc/llvm-project?rev=120501&view=rev Log: Enable sibling call optimization of libcalls which are expanded during legalization time. Since at legalization time there is no mapping from SDNode back to the corresponding LLVM instruction and the return SDNode is target specific, this requires a target hook to check for eligibility. Only x86 and ARM support this form of sibcall optimization right now. rdar://8707777 Added: llvm/trunk/test/CodeGen/X86/sibcall-5.ll Modified: llvm/trunk/include/llvm/CodeGen/Analysis.h llvm/trunk/include/llvm/Target/TargetLowering.h llvm/trunk/lib/CodeGen/Analysis.cpp llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp llvm/trunk/lib/Target/ARM/ARMFrameInfo.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp llvm/trunk/lib/Target/ARM/ARMISelLowering.h llvm/trunk/lib/Target/X86/README.txt llvm/trunk/lib/Target/X86/X86FrameInfo.cpp llvm/trunk/lib/Target/X86/X86ISelLowering.cpp llvm/trunk/lib/Target/X86/X86ISelLowering.h llvm/trunk/test/CodeGen/ARM/call-tc.ll Modified: llvm/trunk/include/llvm/CodeGen/Analysis.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/Analysis.h?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/include/llvm/CodeGen/Analysis.h (original) +++ llvm/trunk/include/llvm/CodeGen/Analysis.h Tue Nov 30 17:55:39 2010 @@ -23,8 +23,10 @@ namespace llvm { -class TargetLowering; class GlobalVariable; +class TargetLowering; +class SDNode; +class SelectionDAG; /// ComputeLinearIndex - Given an LLVM IR aggregate type and a sequence /// of insertvalue or extractvalue indices that identify a member, return @@ -75,6 +77,9 @@ bool isInTailCallPosition(ImmutableCallSite CS, Attributes CalleeRetAttr, const TargetLowering &TLI); +bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node, + const TargetLowering &TLI); + } // End llvm namespace #endif Modified: llvm/trunk/include/llvm/Target/TargetLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/include/llvm/Target/TargetLowering.h (original) +++ llvm/trunk/include/llvm/Target/TargetLowering.h Tue Nov 30 17:55:39 2010 @@ -1258,6 +1258,13 @@ return SDValue(); // this is here to silence compiler errors } + /// isUsedByReturnOnly - Return true if result of the specified node is used + /// by a return node only. This is used to determine whether it is possible + /// to codegen a libcall as tail call at legalization time. + virtual bool isUsedByReturnOnly(SDNode *N) const { + return false; + } + /// LowerOperationWrapper - This callback is invoked by the type legalizer /// to legalize nodes with an illegal operand type but legal result types. /// It replaces the LowerOperation callback in the type Legalizer. Modified: llvm/trunk/lib/CodeGen/Analysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/Analysis.cpp?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/Analysis.cpp (original) +++ llvm/trunk/lib/CodeGen/Analysis.cpp Tue Nov 30 17:55:39 2010 @@ -19,6 +19,7 @@ #include "llvm/LLVMContext.h" #include "llvm/Module.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetOptions.h" @@ -283,3 +284,20 @@ return true; } +bool llvm::isInTailCallPosition(SelectionDAG &DAG, SDNode *Node, + const TargetLowering &TLI) { + const Function *F = DAG.getMachineFunction().getFunction(); + + // Conservatively require the attributes of the call to match those of + // the return. Ignore noalias because it doesn't affect the call sequence. + unsigned CallerRetAttr = F->getAttributes().getRetAttributes(); + if (CallerRetAttr & ~Attribute::NoAlias) + return false; + + // It's not safe to eliminate the sign / zero extension of the return value. + if ((CallerRetAttr & Attribute::ZExt) || (CallerRetAttr & Attribute::SExt)) + return false; + + // Check if the only use is a function return node. + return TLI.isUsedByReturnOnly(Node); +} Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Nov 30 17:55:39 2010 @@ -11,13 +11,14 @@ // //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/SelectionDAG.h" +#include "llvm/Analysis/DebugInfo.h" +#include "llvm/CodeGen/Analysis.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/MachineModuleInfo.h" -#include "llvm/Analysis/DebugInfo.h" #include "llvm/CodeGen/PseudoSourceValue.h" +#include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Target/TargetFrameInfo.h" #include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetData.h" @@ -1948,12 +1949,20 @@ // Splice the libcall in wherever FindInputOutputChains tells us to. const Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); + + // isTailCall may be true since the callee does not reference caller stack + // frame. Check if it's in the right position. + bool isTailCall = isInTailCallPosition(DAG, Node, TLI); std::pair CallInfo = TLI.LowerCallTo(InChain, RetTy, isSigned, !isSigned, false, false, - 0, TLI.getLibcallCallingConv(LC), false, + 0, TLI.getLibcallCallingConv(LC), isTailCall, /*isReturnValueUsed=*/true, Callee, Args, DAG, Node->getDebugLoc()); + if (!CallInfo.second.getNode()) + // It's a tailcall, return the chain (which is the DAG root). + return DAG.getRoot(); + // Legalize the call sequence, starting with the chain. This will advance // the LastCALLSEQ_END to the legalized version of the CALLSEQ_END node that // was added by LowerCallTo (guaranteeing proper serialization of calls). @@ -1988,7 +1997,7 @@ const Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); std::pair CallInfo = TLI.LowerCallTo(InChain, RetTy, isSigned, !isSigned, false, false, - 0, TLI.getLibcallCallingConv(LC), false, + 0, TLI.getLibcallCallingConv(LC), /*isTailCall=*/false, /*isReturnValueUsed=*/true, Callee, Args, DAG, Node->getDebugLoc()); @@ -2558,7 +2567,8 @@ TargetLowering::ArgListTy Args; std::pair CallResult = TLI.LowerCallTo(Node->getOperand(0), Type::getVoidTy(*DAG.getContext()), - false, false, false, false, 0, CallingConv::C, false, + false, false, false, false, 0, CallingConv::C, + /*isTailCall=*/false, /*isReturnValueUsed=*/true, DAG.getExternalSymbol("__sync_synchronize", TLI.getPointerTy()), @@ -2609,7 +2619,8 @@ TargetLowering::ArgListTy Args; std::pair CallResult = TLI.LowerCallTo(Node->getOperand(0), Type::getVoidTy(*DAG.getContext()), - false, false, false, false, 0, CallingConv::C, false, + false, false, false, false, 0, CallingConv::C, + /*isTailCall=*/false, /*isReturnValueUsed=*/true, DAG.getExternalSymbol("abort", TLI.getPointerTy()), Args, DAG, dl); Modified: llvm/trunk/lib/Target/ARM/ARMFrameInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFrameInfo.cpp?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMFrameInfo.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMFrameInfo.cpp Tue Nov 30 17:55:39 2010 @@ -374,16 +374,19 @@ MachineOperand &JumpTarget = MBBI->getOperand(0); // Jump to label or value in register. - if (RetOpcode == ARM::TCRETURNdi) { - BuildMI(MBB, MBBI, dl, - TII.get(STI.isThumb() ? ARM::TAILJMPdt : ARM::TAILJMPd)). - addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), - JumpTarget.getTargetFlags()); - } else if (RetOpcode == ARM::TCRETURNdiND) { - BuildMI(MBB, MBBI, dl, - TII.get(STI.isThumb() ? ARM::TAILJMPdNDt : ARM::TAILJMPdND)). - addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), - JumpTarget.getTargetFlags()); + if (RetOpcode == ARM::TCRETURNdi || RetOpcode == ARM::TCRETURNdiND) { + unsigned TCOpcode = (RetOpcode == ARM::TCRETURNdi) + ? (STI.isThumb() ? ARM::TAILJMPdt : ARM::TAILJMPd) + : (STI.isThumb() ? ARM::TAILJMPdNDt : ARM::TAILJMPdND); + MachineInstrBuilder MIB = BuildMI(MBB, MBBI, dl, TII.get(TCOpcode)); + if (JumpTarget.isGlobal()) + MIB.addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), + JumpTarget.getTargetFlags()); + else { + assert(JumpTarget.isSymbol()); + MIB.addExternalSymbol(JumpTarget.getSymbolName(), + JumpTarget.getTargetFlags()); + } } else if (RetOpcode == ARM::TCRETURNri) { BuildMI(MBB, MBBI, dl, TII.get(ARM::TAILJMPr)). addReg(JumpTarget.getReg(), RegState::Kill); Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Tue Nov 30 17:55:39 2010 @@ -1519,30 +1519,13 @@ // whether LR is going to be used. Probably the right approach is to // generate the tail call here and turn it back into CALL/RET in // emitEpilogue if LR is used. - if (Subtarget->isThumb1Only()) - return false; - - // For the moment, we can only do this to functions defined in this - // compilation, or to indirect calls. A Thumb B to an ARM function, - // or vice versa, is not easily fixed up in the linker unlike BL. - // (We could do this by loading the address of the callee into a register; - // that is an extra instruction over the direct call and burns a register - // as well, so is not likely to be a win.) - - // It might be safe to remove this restriction on non-Darwin. // Thumb1 PIC calls to external symbols use BX, so they can be tail calls, // but we need to make sure there are enough registers; the only valid // registers are the 4 used for parameters. We don't currently do this // case. - if (isa(Callee)) - return false; - - if (GlobalAddressSDNode *G = dyn_cast(Callee)) { - const GlobalValue *GV = G->getGlobal(); - if (GV->isDeclaration() || GV->isWeakForLinker()) - return false; - } + if (Subtarget->isThumb1Only()) + return false; // If the calling conventions do not match, then we'd better make sure the // results are returned in the same way as what the caller expects. @@ -1720,6 +1703,58 @@ return result; } +bool ARMTargetLowering::isUsedByReturnOnly(SDNode *N) const { + if (N->getNumValues() != 1) + return false; + if (!N->hasNUsesOfValue(1, 0)) + return false; + + unsigned NumCopies = 0; + SDNode* Copies[2]; + SDNode *Use = *N->use_begin(); + if (Use->getOpcode() == ISD::CopyToReg) { + Copies[NumCopies++] = Use; + } else if (Use->getOpcode() == ARMISD::VMOVRRD) { + // f64 returned in a pair of GPRs. + for (SDNode::use_iterator UI = Use->use_begin(), UE = Use->use_end(); + UI != UE; ++UI) { + if (UI->getOpcode() != ISD::CopyToReg) + return false; + Copies[UI.getUse().getResNo()] = *UI; + ++NumCopies; + } + } else if (Use->getOpcode() == ISD::BITCAST) { + // f32 returned in a single GPR. + if (!Use->hasNUsesOfValue(1, 0)) + return false; + Use = *Use->use_begin(); + if (Use->getOpcode() != ISD::CopyToReg || !Use->hasNUsesOfValue(1, 0)) + return false; + Copies[NumCopies++] = Use; + } else { + return false; + } + + if (NumCopies != 1 && NumCopies != 2) + return false; + for (unsigned i = 0; i < NumCopies; ++i) { + SDNode *Copy = Copies[i]; + for (SDNode::use_iterator UI = Copy->use_begin(), UE = Copy->use_end(); + UI != UE; ++UI) { + if (UI->getOpcode() == ISD::CopyToReg) { + SDNode *Use = *UI; + if (Use == Copies[0] || Use == Copies[1]) + continue; + return false; + } + if (UI->getOpcode() != ARMISD::RET_FLAG) + return false; + } + } + + return true; +} + // ConstantPool, JumpTable, GlobalAddress, and ExternalSymbol are lowered as // their target counterpart wrapped in the ARMISD::Wrapper node. Suppose N is // one of the above mentioned nodes. It has to be wrapped because otherwise Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original) +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Tue Nov 30 17:55:39 2010 @@ -421,6 +421,8 @@ const SmallVectorImpl &OutVals, DebugLoc dl, SelectionDAG &DAG) const; + virtual bool isUsedByReturnOnly(SDNode *N) const; + SDValue getARMCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue &ARMcc, SelectionDAG &DAG, DebugLoc dl) const; SDValue getVFPCmp(SDValue LHS, SDValue RHS, Modified: llvm/trunk/lib/Target/X86/README.txt URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/README.txt?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/README.txt (original) +++ llvm/trunk/lib/Target/X86/README.txt Tue Nov 30 17:55:39 2010 @@ -895,24 +895,6 @@ //===---------------------------------------------------------------------===// -Linux is missing some basic tail call support: - -#include -double foo(double a) { return sin(a); } - -This compiles into this on x86-64 Linux (but not darwin): -foo: - subq $8, %rsp - call sin - addq $8, %rsp - ret -vs: - -foo: - jmp sin - -//===---------------------------------------------------------------------===// - Tail call optimization improvements: Tail call optimization currently pushes all arguments on the top of the stack (their normal place for non-tail call optimized calls) that source from the callers arguments Modified: llvm/trunk/lib/Target/X86/X86FrameInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameInfo.cpp?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86FrameInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86FrameInfo.cpp Tue Nov 30 17:55:39 2010 @@ -712,10 +712,17 @@ // Jump to label or value in register. if (RetOpcode == X86::TCRETURNdi || RetOpcode == X86::TCRETURNdi64) { - BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNdi) - ? X86::TAILJMPd : X86::TAILJMPd64)). - addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), - JumpTarget.getTargetFlags()); + MachineInstrBuilder MIB = + BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNdi) + ? X86::TAILJMPd : X86::TAILJMPd64)); + if (JumpTarget.isGlobal()) + MIB.addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), + JumpTarget.getTargetFlags()); + else { + assert(JumpTarget.isSymbol()); + MIB.addExternalSymbol(JumpTarget.getSymbolName(), + JumpTarget.getTargetFlags()); + } } else if (RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64) { MachineInstrBuilder MIB = BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNmi) Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Nov 30 17:55:39 2010 @@ -1338,6 +1338,23 @@ MVT::Other, &RetOps[0], RetOps.size()); } +bool X86TargetLowering::isUsedByReturnOnly(SDNode *N) const { + if (N->getNumValues() != 1) + return false; + if (!N->hasNUsesOfValue(1, 0)) + return false; + + SDNode *Copy = *N->use_begin(); + if (Copy->getOpcode() != ISD::CopyToReg) + return false; + for (SDNode::use_iterator UI = Copy->use_begin(), UE = Copy->use_end(); + UI != UE; ++UI) + if (UI->getOpcode() != X86ISD::RET_FLAG) + return false; + + return true; +} + /// LowerCallResult - Lower the result values of a call into the /// appropriate copies out of appropriate physical registers. /// @@ -2142,17 +2159,19 @@ } else if (ExternalSymbolSDNode *S = dyn_cast(Callee)) { unsigned char OpFlags = 0; - // On ELF targets, in either X86-64 or X86-32 mode, direct calls to external - // symbols should go through the PLT. - if (Subtarget->isTargetELF() && - getTargetMachine().getRelocationModel() == Reloc::PIC_) { - OpFlags = X86II::MO_PLT; - } else if (Subtarget->isPICStyleStubAny() && - Subtarget->getDarwinVers() < 9) { - // PC-relative references to external symbols should go through $stub, - // unless we're building with the leopard linker or later, which - // automatically synthesizes these stubs. - OpFlags = X86II::MO_DARWIN_STUB; + if (!isTailCall) { + // On ELF targets, in either X86-64 or X86-32 mode, direct calls to + // external symbols should go through the PLT. + if (Subtarget->isTargetELF() && + getTargetMachine().getRelocationModel() == Reloc::PIC_) { + OpFlags = X86II::MO_PLT; + } else if (Subtarget->isPICStyleStubAny() && + Subtarget->getDarwinVers() < 9) { + // PC-relative references to external symbols should go through $stub, + // unless we're building with the leopard linker or later, which + // automatically synthesizes these stubs. + OpFlags = X86II::MO_DARWIN_STUB; + } } Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy(), Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.h (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Tue Nov 30 17:55:39 2010 @@ -805,6 +805,8 @@ const SmallVectorImpl &OutVals, DebugLoc dl, SelectionDAG &DAG) const; + virtual bool isUsedByReturnOnly(SDNode *N) const; + virtual bool CanLowerReturn(CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl &Outs, Modified: llvm/trunk/test/CodeGen/ARM/call-tc.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/call-tc.ll?rev=120501&r1=120500&r2=120501&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/ARM/call-tc.ll (original) +++ llvm/trunk/test/CodeGen/ARM/call-tc.ll Tue Nov 30 17:55:39 2010 @@ -1,8 +1,5 @@ -; RUN: llc < %s -mtriple=arm-apple-darwin -march=arm | FileCheck %s -check-prefix=CHECKV4 -; RUN: llc < %s -march=arm -mtriple=arm-apple-darwin -mattr=+v5t | FileCheck %s -check-prefix=CHECKV5 -; RUN: llc < %s -march=arm -mtriple=arm-linux-gnueabi\ -; RUN: -relocation-model=pic | FileCheck %s -check-prefix=CHECKELF -; XFAIL: * +; RUN: llc < %s -mtriple=armv6-apple-darwin -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKV6 +; RUN: llc < %s -mtriple=armv6-linux-gnueabi -relocation-model=pic -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKELF @t = weak global i32 ()* null ; [#uses=1] @@ -10,40 +7,59 @@ define void @t1() { ; CHECKELF: t1: -; CHECKELF: PLT +; CHECKELF: bl g(PLT) call void @g( i32 1, i32 2, i32 3, i32 4 ) ret void } define void @t2() { -; CHECKV4: t2: -; CHECKV4: bx r0 @ TAILCALL -; CHECKV5: t2: -; CHECKV5: bx r0 @ TAILCALL +; CHECKV6: t2: +; CHECKV6: bx r0 @ TAILCALL %tmp = load i32 ()** @t ; [#uses=1] %tmp.upgrd.2 = tail call i32 %tmp( ) ; [#uses=0] ret void } -define i32* @t3(i32, i32, i32*, i32*, i32*) nounwind { -; CHECKV4: t3: -; CHECKV4: bx r{{.*}} -BB0: - %5 = inttoptr i32 %0 to i32* ; [#uses=1] - %t35 = volatile load i32* %5 ; [#uses=1] - %6 = inttoptr i32 %t35 to i32** ; [#uses=1] - %7 = getelementptr i32** %6, i32 86 ; [#uses=1] - %8 = load i32** %7 ; [#uses=1] - %9 = bitcast i32* %8 to i32* (i32, i32*, i32, i32*, i32*, i32*)* ; [#uses=1] - %10 = call i32* %9(i32 %0, i32* null, i32 %1, i32* %2, i32* %3, i32* %4) ; [#uses=1] - ret i32* %10 -} - -define void @t4() { -; CHECKV4: t4: -; CHECKV4: b _t2 @ TAILCALL -; CHECKV5: t4: -; CHECKV5: b _t2 @ TAILCALL +define void @t3() { +; CHECKV6: t3: +; CHECKV6: b _t2 @ TAILCALL +; CHECKELF: t3: +; CHECKELF: b t2(PLT) @ TAILCALL tail call void @t2( ) ; [#uses=0] ret void } + +; Sibcall optimization of expanded libcalls. rdar://8707777 +define double @t4(double %a) nounwind readonly ssp { +entry: +; CHECKV6: t4: +; CHECKV6: b _sin @ TAILCALL +; CHECKELF: t4: +; CHECKELF: b sin(PLT) @ TAILCALL + %0 = tail call double @sin(double %a) nounwind readonly ; [#uses=1] + ret double %0 +} + +define float @t5(float %a) nounwind readonly ssp { +entry: +; CHECKV6: t5: +; CHECKV6: b _sinf @ TAILCALL +; CHECKELF: t5: +; CHECKELF: b sinf(PLT) @ TAILCALL + %0 = tail call float @sinf(float %a) nounwind readonly ; [#uses=1] + ret float %0 +} + +declare float @sinf(float) nounwind readonly + +declare double @sin(double) nounwind readonly + +define i32 @t6(i32 %a, i32 %b) nounwind readnone { +entry: +; CHECKV6: t6: +; CHECKV6: b ___divsi3 @ TAILCALL +; CHECKELF: t6: +; CHECKELF: b __aeabi_idiv(PLT) @ TAILCALL + %0 = sdiv i32 %a, %b + ret i32 %0 +} Added: llvm/trunk/test/CodeGen/X86/sibcall-5.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sibcall-5.ll?rev=120501&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/sibcall-5.ll (added) +++ llvm/trunk/test/CodeGen/X86/sibcall-5.ll Tue Nov 30 17:55:39 2010 @@ -0,0 +1,24 @@ +; RUN: llc < %s -march=x86-64 | FileCheck %s + +; Sibcall optimization of expanded libcalls. +; rdar://8707777 + +define double @foo(double %a) nounwind readonly ssp { +entry: +; CHECK: foo: +; CHECK: jmp {{_?}}sin + %0 = tail call double @sin(double %a) nounwind readonly + ret double %0 +} + +define float @bar(float %a) nounwind readonly ssp { +; CHECK: bar: +; CHECK: jmp {{_?}}sinf +entry: + %0 = tail call float @sinf(float %a) nounwind readonly + ret float %0 +} + +declare float @sinf(float) nounwind readonly + +declare double @sin(double) nounwind readonly From jasonwkim at google.com Tue Nov 30 17:57:53 2010 From: jasonwkim at google.com (Jason Kim) Date: Tue, 30 Nov 2010 15:57:53 -0800 Subject: [llvm-commits] new fail on Analysis/BasicAA/modref.ll Message-ID: Anyone else seeing this? (Looks like from -r12048 or later. -rr120470 seems to be fine. Thanks -jason ******************** TEST 'LLVM :: Analysis/BasicAA/modref.ll' FAILED ******************** Script: -- opt < /usr/local/google/Work/hg-llvm/llvm-tip-rw-svn/test/Analysis/BasicAA/modref.ll -basicaa -gvn -dse -S | FileCheck /usr/local/google/Work/hg-llvm/llvm-tip-rw-svn/test/Analysis/BasicAA/modref.ll -- Exit Code: 1 Command Output (stderr): -- /usr/local/google/Work/hg-llvm/llvm-tip-rw-svn/test/Analysis/BasicAA/modref.ll:89:10: error: expected string not found in input ; CHECK: store i8 %Y, i8* %P2 ^ :41:20: note: scanning from here define void @test3a(i8* %P, i8 %X) { ^ :60:13: note: possible intended match here define i8 @test6(i8* %p, i8* noalias %a) { ^ -- From jasonwkim at google.com Tue Nov 30 17:59:31 2010 From: jasonwkim at google.com (Jason Kim) Date: Tue, 30 Nov 2010 15:59:31 -0800 Subject: [llvm-commits] new fail on Analysis/BasicAA/modref.ll In-Reply-To: References: Message-ID: Yikes! On Tue, Nov 30, 2010 at 3:57 PM, Jason Kim wrote: > Anyone else seeing this? > > (Looks like from -r12048 or later. should read: -rr120471 or later > -rr120470 seems to be fine. > > Thanks > -jason > > ******************** TEST 'LLVM :: Analysis/BasicAA/modref.ll' FAILED > ******************** > Script: > -- > opt < /usr/local/google/Work/hg-llvm/llvm-tip-rw-svn/test/Analysis/BasicAA/modref.ll > -basicaa -gvn -dse -S | FileCheck > /usr/local/google/Work/hg-llvm/llvm-tip-rw-svn/test/Analysis/BasicAA/modref.ll > -- > Exit Code: 1 > Command Output (stderr): > -- > /usr/local/google/Work/hg-llvm/llvm-tip-rw-svn/test/Analysis/BasicAA/modref.ll:89:10: > error: expected string not found in input > ; CHECK: store i8 %Y, i8* %P2 > ? ? ? ? ^ > :41:20: note: scanning from here > define void @test3a(i8* %P, i8 %X) { > ? ? ? ? ? ? ? ? ? ^ > :60:13: note: possible intended match here > define i8 @test6(i8* %p, i8* noalias %a) { > ? ? ? ? ? ?^ > -- > From atrick at apple.com Tue Nov 30 17:59:50 2010 From: atrick at apple.com (Andrew Trick) Date: Tue, 30 Nov 2010 23:59:50 -0000 Subject: [llvm-commits] [llvm] r120504 - /llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp Message-ID: <20101130235951.052562A6C12D@llvm.org> Author: atrick Date: Tue Nov 30 17:59:50 2010 New Revision: 120504 URL: http://llvm.org/viewvc/llvm-project?rev=120504&view=rev Log: Comment typo. Modified: llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp Modified: llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp?rev=120504&r1=120503&r2=120504&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp (original) +++ llvm/trunk/lib/CodeGen/LiveIntervalUnion.cpp Tue Nov 30 17:59:50 2010 @@ -156,7 +156,7 @@ // // This design assumes only a fast mechanism for intersecting a single live // virtual register segment with a set of LiveIntervalUnion segments. This may -// be ok since most VIRTREGs have very few segments. If we had a data +// be ok since most virtual registers have very few segments. If we had a data // structure that optimizd MxN intersection of segments, then we would bypass // the loop that advances within the LiveInterval. // From geek4civic at gmail.com Tue Nov 30 18:09:25 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Wed, 01 Dec 2010 00:09:25 -0000 Subject: [llvm-commits] [llvm] r120506 - in /llvm/trunk/test/Archive: GNU.toc MacOSX.toc SVR4.toc toc_GNU.ll toc_MacOSX.ll toc_SVR4.ll toc_xpg4.ll xpg4.toc Message-ID: <20101201000925.E6E182A6C12D@llvm.org> Author: chapuni Date: Tue Nov 30 18:09:25 2010 New Revision: 120506 URL: http://llvm.org/viewvc/llvm-project?rev=120506&view=rev Log: test/Archive: FileCheck-ize, and remove *.toc. These may be CRLF-tolerant. Removed: llvm/trunk/test/Archive/GNU.toc llvm/trunk/test/Archive/MacOSX.toc llvm/trunk/test/Archive/SVR4.toc llvm/trunk/test/Archive/xpg4.toc Modified: llvm/trunk/test/Archive/toc_GNU.ll llvm/trunk/test/Archive/toc_MacOSX.ll llvm/trunk/test/Archive/toc_SVR4.ll llvm/trunk/test/Archive/toc_xpg4.ll Removed: llvm/trunk/test/Archive/GNU.toc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/GNU.toc?rev=120505&view=auto ============================================================================== --- llvm/trunk/test/Archive/GNU.toc (original) +++ llvm/trunk/test/Archive/GNU.toc (removed) @@ -1,4 +0,0 @@ -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o Removed: llvm/trunk/test/Archive/MacOSX.toc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/MacOSX.toc?rev=120505&view=auto ============================================================================== --- llvm/trunk/test/Archive/MacOSX.toc (original) +++ llvm/trunk/test/Archive/MacOSX.toc (removed) @@ -1,5 +0,0 @@ -__.SYMDEF SORTED -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o Removed: llvm/trunk/test/Archive/SVR4.toc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/SVR4.toc?rev=120505&view=auto ============================================================================== --- llvm/trunk/test/Archive/SVR4.toc (original) +++ llvm/trunk/test/Archive/SVR4.toc (removed) @@ -1,4 +0,0 @@ -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o Modified: llvm/trunk/test/Archive/toc_GNU.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/toc_GNU.ll?rev=120506&r1=120505&r2=120506&view=diff ============================================================================== --- llvm/trunk/test/Archive/toc_GNU.ll (original) +++ llvm/trunk/test/Archive/toc_GNU.ll Tue Nov 30 18:09:25 2010 @@ -1,5 +1,8 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;GNU style archives -;RUN: llvm-ar t %p/GNU.a > %t1 -;RUN: diff %t1 %p/GNU.toc +;RUN: llvm-ar t %p/GNU.a | FileCheck %s +;CHECK: evenlen +;CHECK-NEXT: oddlen +;CHECK-NEXT: very_long_bytecode_file_name.bc +;CHECK-NEXT: IsNAN.o Modified: llvm/trunk/test/Archive/toc_MacOSX.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/toc_MacOSX.ll?rev=120506&r1=120505&r2=120506&view=diff ============================================================================== --- llvm/trunk/test/Archive/toc_MacOSX.ll (original) +++ llvm/trunk/test/Archive/toc_MacOSX.ll Tue Nov 30 18:09:25 2010 @@ -1,5 +1,9 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;MacOSX style archives -;RUN: llvm-ar t %p/MacOSX.a > %t1 -;RUN: diff %t1 %p/MacOSX.toc +;RUN: llvm-ar t %p/MacOSX.a | FileCheck %s +;CHECK: __.SYMDEF SORTED +;CHECK-NEXT: evenlen +;CHECK-NEXT: oddlen +;CHECK-NEXT: very_long_bytecode_file_name.bc +;CHECK-NEXT: IsNAN.o Modified: llvm/trunk/test/Archive/toc_SVR4.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/toc_SVR4.ll?rev=120506&r1=120505&r2=120506&view=diff ============================================================================== --- llvm/trunk/test/Archive/toc_SVR4.ll (original) +++ llvm/trunk/test/Archive/toc_SVR4.ll Tue Nov 30 18:09:25 2010 @@ -1,5 +1,8 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;SVR4 style archives -;RUN: llvm-ar t %p/SVR4.a > %t1 -;RUN: diff %t1 %p/SVR4.toc +;RUN: llvm-ar t %p/SVR4.a | FileCheck %s +;CHECK: evenlen +;CHECK-NEXT: oddlen +;CHECK-NEXT: very_long_bytecode_file_name.bc +;CHECK-NEXT: IsNAN.o Modified: llvm/trunk/test/Archive/toc_xpg4.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/toc_xpg4.ll?rev=120506&r1=120505&r2=120506&view=diff ============================================================================== --- llvm/trunk/test/Archive/toc_xpg4.ll (original) +++ llvm/trunk/test/Archive/toc_xpg4.ll Tue Nov 30 18:09:25 2010 @@ -1,5 +1,8 @@ ;This isn't really an assembly file, its just here to run the test. ;This test just makes sure that llvm-ar can generate a table of contents for ;xpg4 style archives -;RUN: llvm-ar t %p/xpg4.a > %t1 -;RUN: diff %t1 %p/xpg4.toc +;RUN: llvm-ar t %p/xpg4.a | FileCheck %s +CHECK: evenlen +CHECK-NEXT: oddlen +CHECK-NEXT: very_long_bytecode_file_name.bc +CHECK-NEXT: IsNAN.o Removed: llvm/trunk/test/Archive/xpg4.toc URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Archive/xpg4.toc?rev=120505&view=auto ============================================================================== --- llvm/trunk/test/Archive/xpg4.toc (original) +++ llvm/trunk/test/Archive/xpg4.toc (removed) @@ -1,4 +0,0 @@ -evenlen -oddlen -very_long_bytecode_file_name.bc -IsNAN.o From geek4civic at gmail.com Tue Nov 30 18:18:07 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Wed, 1 Dec 2010 09:18:07 +0900 Subject: [llvm-commits] Fix output stream opened in text instead of binary mode on MinGW In-Reply-To: <6AE1604EE3EC5F4296C096518C6B77EE1705A19C19@mail.accesssoftek.com> References: <6AE1604EE3EC5F4296C096518C6B77EE1705A19A78@mail.accesssoftek.com> <1D923093-7E74-457D-AF4E-CE879B273076@2pi.dk> <6AE1604EE3EC5F4296C096518C6B77EE1705A19B31@mail.accesssoftek.com> <6AE1604EE3EC5F4296C096518C6B77EE1705A19BB4@mail.accesssoftek.com> <6AE1604EE3EC5F4296C096518C6B77EE1705A19C19@mail.accesssoftek.com> Message-ID: Committed in r120506, thank you! 2010/12/1 Danil Malyshev : > However, they will not catch the "output stream opened in wrong mode" issue. > llvm-ar produce binary output and this should be tested. > I propose a test to check this. The patch is attached. I have no concrete patches now, though, using diff(1) for binary files would not be better idea(on win32), IMHO. - use cmp(1) - use llvm's opt to verify. - use md5sum sha1sum or similar. ...Takumi From clattner at apple.com Tue Nov 30 18:18:53 2010 From: clattner at apple.com (Chris Lattner) Date: Tue, 30 Nov 2010 16:18:53 -0800 Subject: [llvm-commits] new fail on Analysis/BasicAA/modref.ll In-Reply-To: References: Message-ID: <7AD3B49F-6335-4A78-8ED6-3BBD46A0CF66@apple.com> On Nov 30, 2010, at 3:59 PM, Jason Kim wrote: > Yikes! > > On Tue, Nov 30, 2010 at 3:57 PM, Jason Kim wrote: >> Anyone else seeing this? >> >> (Looks like from -r12048 or later. > should read: -rr120471 or later Sorry, my bug, should be fixed on mainline. -Chris From resistor at mac.com Tue Nov 30 18:28:25 2010 From: resistor at mac.com (Owen Anderson) Date: Wed, 01 Dec 2010 00:28:25 -0000 Subject: [llvm-commits] [llvm] r120507 - /llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Message-ID: <20101201002825.A9FB12A6C12D@llvm.org> Author: resistor Date: Tue Nov 30 18:28:25 2010 New Revision: 120507 URL: http://llvm.org/viewvc/llvm-project?rev=120507&view=rev Log: Use by-name rather than by-order matching for NEON operands. Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrNEON.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrNEON.td?rev=120507&r1=120506&r2=120507&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrNEON.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrNEON.td Tue Nov 30 18:28:25 2010 @@ -1655,83 +1655,83 @@ bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode> : N2V; + (outs DPR_VFP2:$Vd), (ins DPR_VFP2:$Vm), + IIC_VUNAD, OpcodeStr, Dt, "$Vd, $Vm", "", []>; class N2VD op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode> - : N2V; + : N2V; class N2VQ op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode> - : N2V; + : N2V; // Basic 2-register intrinsics, both double- and quad-register. class N2VDInt op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op4, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> - : N2V; + : N2V; class N2VQInt op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op4, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> - : N2V; + : N2V; // Narrow 2-register operations. class N2VN op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op6, bit op4, InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyD, ValueType TyQ, SDNode OpNode> - : N2V; + : N2V; // Narrow 2-register intrinsics. class N2VNInt op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op6, bit op4, InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyD, ValueType TyQ, Intrinsic IntOp> - : N2V; + : N2V; // Long 2-register operations (currently only used for VMOVL). class N2VL op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op6, bit op4, InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, SDNode OpNode> - : N2V; + : N2V; // 2-register shuffles (VTRN/VZIP/VUZP), both double- and quad-register. class N2VDShuffle op19_18, bits<5> op11_7, string OpcodeStr, string Dt> - : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 0, 0, (outs DPR:$dst1, DPR:$dst2), + : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 0, 0, (outs DPR:$Vd, DPR:$Vm), (ins DPR:$src1, DPR:$src2), IIC_VPERMD, - OpcodeStr, Dt, "$dst1, $dst2", - "$src1 = $dst1, $src2 = $dst2", []>; + OpcodeStr, Dt, "$Vd, $Vm", + "$src1 = $Vd, $src2 = $Vm", []>; class N2VQShuffle op19_18, bits<5> op11_7, InstrItinClass itin, string OpcodeStr, string Dt> - : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 1, 0, (outs QPR:$dst1, QPR:$dst2), - (ins QPR:$src1, QPR:$src2), itin, OpcodeStr, Dt, "$dst1, $dst2", - "$src1 = $dst1, $src2 = $dst2", []>; + : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 1, 0, (outs QPR:$Vd, QPR:$Vm), + (ins QPR:$src1, QPR:$src2), itin, OpcodeStr, Dt, "$Vd, $Vm", + "$src1 = $Vd, $src2 = $Vm", []>; // Basic 3-register operations: single-, double- and quad-register. class N3VS op21_20, bits<4> op11_8, bit op4, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable> : N3V { + (outs DPR_VFP2:$Vd), (ins DPR_VFP2:$Vn, DPR_VFP2:$Vm), N3RegFrm, + IIC_VBIND, OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", []> { let isCommutable = Commutable; } @@ -1760,21 +1760,21 @@ InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty, SDNode ShOp> : N3V<0, 1, op21_20, op11_8, 1, 0, - (outs DPR:$dst), (ins DPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane), - NVMulSLFrm, itin, OpcodeStr, Dt, "$dst, $src1, $src2[$lane]", "", - [(set (Ty DPR:$dst), - (Ty (ShOp (Ty DPR:$src1), - (Ty (NEONvduplane (Ty DPR_VFP2:$src2),imm:$lane)))))]> { + (outs DPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set (Ty DPR:$Vd), + (Ty (ShOp (Ty DPR:$Vn), + (Ty (NEONvduplane (Ty DPR_VFP2:$Vm),imm:$lane)))))]> { let isCommutable = 0; } class N3VDSL16 op21_20, bits<4> op11_8, string OpcodeStr, string Dt, ValueType Ty, SDNode ShOp> : N3V<0, 1, op21_20, op11_8, 1, 0, - (outs DPR:$dst), (ins DPR:$src1, DPR_8:$src2, nohash_imm:$lane), - NVMulSLFrm, IIC_VMULi16D, OpcodeStr, Dt,"$dst, $src1, $src2[$lane]","", - [(set (Ty DPR:$dst), - (Ty (ShOp (Ty DPR:$src1), - (Ty (NEONvduplane (Ty DPR_8:$src2), imm:$lane)))))]> { + (outs DPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane), + NVMulSLFrm, IIC_VMULi16D, OpcodeStr, Dt,"$Vd, $Vn, $Vm[$lane]","", + [(set (Ty DPR:$Vd), + (Ty (ShOp (Ty DPR:$Vn), + (Ty (NEONvduplane (Ty DPR_8:$Vm), imm:$lane)))))]> { let isCommutable = 0; } @@ -1782,40 +1782,40 @@ InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable> : N3V { + (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]> { let isCommutable = Commutable; } class N3VQX op21_20, bits<4> op11_8, bit op4, InstrItinClass itin, string OpcodeStr, ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable> : N3VX{ + (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, itin, + OpcodeStr, "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]>{ let isCommutable = Commutable; } class N3VQSL op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode ShOp> : N3V<1, 1, op21_20, op11_8, 1, 0, - (outs QPR:$dst), (ins QPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane), - NVMulSLFrm, itin, OpcodeStr, Dt, "$dst, $src1, $src2[$lane]", "", - [(set (ResTy QPR:$dst), - (ResTy (ShOp (ResTy QPR:$src1), - (ResTy (NEONvduplane (OpTy DPR_VFP2:$src2), + (outs QPR:$Vd), (ins QPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set (ResTy QPR:$Vd), + (ResTy (ShOp (ResTy QPR:$Vn), + (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm), imm:$lane)))))]> { let isCommutable = 0; } class N3VQSL16 op21_20, bits<4> op11_8, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode ShOp> : N3V<1, 1, op21_20, op11_8, 1, 0, - (outs QPR:$dst), (ins QPR:$src1, DPR_8:$src2, nohash_imm:$lane), - NVMulSLFrm, IIC_VMULi16Q, OpcodeStr, Dt,"$dst, $src1, $src2[$lane]","", - [(set (ResTy QPR:$dst), - (ResTy (ShOp (ResTy QPR:$src1), - (ResTy (NEONvduplane (OpTy DPR_8:$src2), + (outs QPR:$Vd), (ins QPR:$Vn, DPR_8:$Vm, nohash_imm:$lane), + NVMulSLFrm, IIC_VMULi16Q, OpcodeStr, Dt,"$Vd, $Vn, $Vm[$lane]","", + [(set (ResTy QPR:$Vd), + (ResTy (ShOp (ResTy QPR:$Vn), + (ResTy (NEONvduplane (OpTy DPR_8:$Vm), imm:$lane)))))]> { let isCommutable = 0; } @@ -1833,22 +1833,22 @@ class N3VDIntSL op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty, Intrinsic IntOp> : N3V<0, 1, op21_20, op11_8, 1, 0, - (outs DPR:$dst), (ins DPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane), - NVMulSLFrm, itin, OpcodeStr, Dt, "$dst, $src1, $src2[$lane]", "", - [(set (Ty DPR:$dst), - (Ty (IntOp (Ty DPR:$src1), - (Ty (NEONvduplane (Ty DPR_VFP2:$src2), + (outs DPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set (Ty DPR:$Vd), + (Ty (IntOp (Ty DPR:$Vn), + (Ty (NEONvduplane (Ty DPR_VFP2:$Vm), imm:$lane)))))]> { let isCommutable = 0; } class N3VDIntSL16 op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty, Intrinsic IntOp> : N3V<0, 1, op21_20, op11_8, 1, 0, - (outs DPR:$dst), (ins DPR:$src1, DPR_8:$src2, nohash_imm:$lane), - NVMulSLFrm, itin, OpcodeStr, Dt, "$dst, $src1, $src2[$lane]", "", - [(set (Ty DPR:$dst), - (Ty (IntOp (Ty DPR:$src1), - (Ty (NEONvduplane (Ty DPR_8:$src2), imm:$lane)))))]> { + (outs DPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set (Ty DPR:$Vd), + (Ty (IntOp (Ty DPR:$Vn), + (Ty (NEONvduplane (Ty DPR_8:$Vm), imm:$lane)))))]> { let isCommutable = 0; } class N3VDIntSh op21_20, bits<4> op11_8, bit op4, @@ -1874,11 +1874,11 @@ string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V<1, 1, op21_20, op11_8, 1, 0, - (outs QPR:$dst), (ins QPR:$src1, DPR_VFP2:$src2, nohash_imm:$lane), - NVMulSLFrm, itin, OpcodeStr, Dt, "$dst, $src1, $src2[$lane]", "", - [(set (ResTy QPR:$dst), - (ResTy (IntOp (ResTy QPR:$src1), - (ResTy (NEONvduplane (OpTy DPR_VFP2:$src2), + (outs QPR:$Vd), (ins QPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set (ResTy QPR:$Vd), + (ResTy (IntOp (ResTy QPR:$Vn), + (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm), imm:$lane)))))]> { let isCommutable = 0; } @@ -1886,11 +1886,11 @@ string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V<1, 1, op21_20, op11_8, 1, 0, - (outs QPR:$dst), (ins QPR:$src1, DPR_8:$src2, nohash_imm:$lane), - NVMulSLFrm, itin, OpcodeStr, Dt, "$dst, $src1, $src2[$lane]", "", - [(set (ResTy QPR:$dst), - (ResTy (IntOp (ResTy QPR:$src1), - (ResTy (NEONvduplane (OpTy DPR_8:$src2), + (outs QPR:$Vd), (ins QPR:$Vn, DPR_8:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set (ResTy QPR:$Vd), + (ResTy (IntOp (ResTy QPR:$Vn), + (ResTy (NEONvduplane (OpTy DPR_8:$Vm), imm:$lane)))))]> { let isCommutable = 0; } @@ -1909,9 +1909,9 @@ InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty, SDNode MulOp, SDNode OpNode> : N3V; + (outs DPR_VFP2:$Vd), + (ins DPR_VFP2:$src1, DPR_VFP2:$Vn, DPR_VFP2:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd", []>; class N3VDMulOp op21_20, bits<4> op11_8, bit op4, InstrItinClass itin, string OpcodeStr, string Dt, @@ -1926,14 +1926,14 @@ string OpcodeStr, string Dt, ValueType Ty, SDNode MulOp, SDNode ShOp> : N3V<0, 1, op21_20, op11_8, 1, 0, - (outs DPR:$dst), - (ins DPR:$src1, DPR:$src2, DPR_VFP2:$src3, nohash_imm:$lane), + (outs DPR:$Vd), + (ins DPR:$src1, DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane), NVMulSLFrm, itin, - OpcodeStr, Dt, "$dst, $src2, $src3[$lane]", "$src1 = $dst", - [(set (Ty DPR:$dst), + OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd", + [(set (Ty DPR:$Vd), (Ty (ShOp (Ty DPR:$src1), - (Ty (MulOp DPR:$src2, - (Ty (NEONvduplane (Ty DPR_VFP2:$src3), + (Ty (MulOp DPR:$Vn, + (Ty (NEONvduplane (Ty DPR_VFP2:$Vm), imm:$lane)))))))]>; class N3VDMulOpSL16 op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, @@ -1961,28 +1961,28 @@ string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode MulOp, SDNode ShOp> : N3V<1, 1, op21_20, op11_8, 1, 0, - (outs QPR:$dst), - (ins QPR:$src1, QPR:$src2, DPR_VFP2:$src3, nohash_imm:$lane), + (outs QPR:$Vd), + (ins QPR:$src1, QPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane), NVMulSLFrm, itin, - OpcodeStr, Dt, "$dst, $src2, $src3[$lane]", "$src1 = $dst", - [(set (ResTy QPR:$dst), + OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd", + [(set (ResTy QPR:$Vd), (ResTy (ShOp (ResTy QPR:$src1), - (ResTy (MulOp QPR:$src2, - (ResTy (NEONvduplane (OpTy DPR_VFP2:$src3), + (ResTy (MulOp QPR:$Vn, + (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm), imm:$lane)))))))]>; class N3VQMulOpSL16 op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode MulOp, SDNode ShOp> : N3V<1, 1, op21_20, op11_8, 1, 0, - (outs QPR:$dst), - (ins QPR:$src1, QPR:$src2, DPR_8:$src3, nohash_imm:$lane), + (outs QPR:$Vd), + (ins QPR:$src1, QPR:$Vn, DPR_8:$Vm, nohash_imm:$lane), NVMulSLFrm, itin, - OpcodeStr, Dt, "$dst, $src2, $src3[$lane]", "$src1 = $dst", - [(set (ResTy QPR:$dst), + OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd", + [(set (ResTy QPR:$Vd), (ResTy (ShOp (ResTy QPR:$src1), - (ResTy (MulOp QPR:$src2, - (ResTy (NEONvduplane (OpTy DPR_8:$src3), + (ResTy (MulOp QPR:$Vn, + (ResTy (NEONvduplane (OpTy DPR_8:$Vm), imm:$lane)))))))]>; // Neon Intrinsic-Op instructions (VABA): double- and quad-register. @@ -2009,18 +2009,18 @@ InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V; + (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd", + [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$src1), + (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]>; class N3VQInt3 op21_20, bits<4> op11_8, bit op4, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V; + (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd", + [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$src1), + (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]>; // Long Multiply-Add/Sub operations. class N3VLMulOp op21_20, bits<4> op11_8, bit op4, @@ -2035,26 +2035,26 @@ class N3VLMulOpSL op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode> - : N3V; class N3VLMulOpSL16 op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode> - : N3V; // Long Intrinsic-Op vector operations with explicit extend (VABAL). @@ -2083,27 +2083,27 @@ string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V; class N3VLInt3SL16 op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V; // Narrowing 3-register intrinsics. @@ -2111,9 +2111,9 @@ string OpcodeStr, string Dt, ValueType TyD, ValueType TyQ, Intrinsic IntOp, bit Commutable> : N3V { + (outs DPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINi4D, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", + [(set DPR:$Vd, (TyD (IntOp (TyQ QPR:$Vn), (TyQ QPR:$Vm))))]> { let isCommutable = Commutable; } @@ -2122,29 +2122,29 @@ InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, SDNode OpNode, bit Commutable> : N3V { + (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (TyQ (OpNode (TyD DPR:$Vn), (TyD DPR:$Vm))))]> { let isCommutable = Commutable; } class N3VLSL op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, SDNode OpNode> : N3V; + (outs QPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set QPR:$Vd, + (TyQ (OpNode (TyD DPR:$Vn), + (TyD (NEONvduplane (TyD DPR_VFP2:$Vm),imm:$lane)))))]>; class N3VLSL16 op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, SDNode OpNode> : N3V; + (outs QPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane), + NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "", + [(set QPR:$Vd, + (TyQ (OpNode (TyD DPR:$Vn), + (TyD (NEONvduplane (TyD DPR_8:$Vm), imm:$lane)))))]>; // Long 3-register operations with explicitly extended operands. class N3VLExt op21_20, bits<4> op11_8, bit op4, @@ -2152,10 +2152,10 @@ ValueType TyQ, ValueType TyD, SDNode OpNode, SDNode ExtOp, bit Commutable> : N3V { + (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (OpNode (TyQ (ExtOp (TyD DPR:$Vn))), + (TyQ (ExtOp (TyD DPR:$Vm)))))]> { let isCommutable = Commutable; } @@ -2165,10 +2165,10 @@ ValueType TyQ, ValueType TyD, Intrinsic IntOp, SDNode ExtOp, bit Commutable> : N3V { + (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (TyQ (ExtOp (TyD (IntOp (TyD DPR:$Vn), + (TyD DPR:$Vm))))))]> { let isCommutable = Commutable; } @@ -2177,30 +2177,30 @@ InstrItinClass itin, string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, Intrinsic IntOp, bit Commutable> : N3V { + (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (TyQ (IntOp (TyD DPR:$Vn), (TyD DPR:$Vm))))]> { let isCommutable = Commutable; } class N3VLIntSL op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V; class N3VLIntSL16 op21_20, bits<4> op11_8, InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> : N3V; // Wide 3-register operations. @@ -2208,10 +2208,10 @@ string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD, SDNode OpNode, SDNode ExtOp, bit Commutable> : N3V { + (outs QPR:$Vd), (ins QPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VSUBiD, + OpcodeStr, Dt, "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (OpNode (TyQ QPR:$Vn), + (TyQ (ExtOp (TyD DPR:$Vm)))))]> { let isCommutable = Commutable; } @@ -2220,16 +2220,16 @@ bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> - : N2V; + : N2V; class N2VQPLInt op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, Intrinsic IntOp> - : N2V; + : N2V; // Pairwise long 2-register accumulate intrinsics, // both double- and quad-register. @@ -2257,25 +2257,25 @@ Format f, InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty, SDNode OpNode> : N2VImm; + (outs DPR:$Vd), (ins DPR:$Vm, i32imm:$SIMM), f, itin, + OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "", + [(set DPR:$Vd, (Ty (OpNode (Ty DPR:$Vm), (i32 imm:$SIMM))))]>; class N2VQSh op11_8, bit op7, bit op4, Format f, InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty, SDNode OpNode> : N2VImm; + (outs QPR:$Vd), (ins QPR:$Vm, i32imm:$SIMM), f, itin, + OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "", + [(set QPR:$Vd, (Ty (OpNode (Ty QPR:$Vm), (i32 imm:$SIMM))))]>; // Long shift by immediate. class N2VLSh op11_8, bit op7, bit op6, bit op4, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode> : N2VImm; // Narrow shift by immediate. @@ -2283,9 +2283,9 @@ InstrItinClass itin, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode> : N2VImm; // Shift right by immediate and accumulate, @@ -2355,41 +2355,41 @@ string asm, SDNode OpNode> { // 64-bit vector types. def v8i8 : N2V; + [(set DPR:$Vd, (v8i8 (OpNode (v8i8 DPR:$Vm))))]>; def v4i16 : N2V; + [(set DPR:$Vd, (v4i16 (OpNode (v4i16 DPR:$Vm))))]>; def v2i32 : N2V; + [(set DPR:$Vd, (v2i32 (OpNode (v2i32 DPR:$Vm))))]>; def v2f32 : N2V { + [(set DPR:$Vd, (v2f32 (OpNode (v2f32 DPR:$Vm))))]> { let Inst{10} = 1; // overwrite F = 1 } // 128-bit vector types. def v16i8 : N2V; + [(set QPR:$Vd, (v16i8 (OpNode (v16i8 QPR:$Vm))))]>; def v8i16 : N2V; + [(set QPR:$Vd, (v8i16 (OpNode (v8i16 QPR:$Vm))))]>; def v4i32 : N2V; + [(set QPR:$Vd, (v4i32 (OpNode (v4i32 QPR:$Vm))))]>; def v4f32 : N2V { + [(set QPR:$Vd, (v4f32 (OpNode (v4f32 QPR:$Vm))))]> { let Inst{10} = 1; // overwrite F = 1 } } @@ -3432,7 +3432,7 @@ NEONvceq, 1>; defm VCEQz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00010, 0, "vceq", "i", - "$dst, $src, #0", NEONvceqz>; + "$Vd, $Vm, #0", NEONvceqz>; // VCGE : Vector Compare Greater Than or Equal defm VCGEs : N3V_QHS<0, 0, 0b0011, 1, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, @@ -3445,9 +3445,9 @@ NEONvcge, 0>; defm VCGEz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00001, 0, "vcge", "s", - "$dst, $src, #0", NEONvcgez>; + "$Vd, $Vm, #0", NEONvcgez>; defm VCLEz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00011, 0, "vcle", "s", - "$dst, $src, #0", NEONvclez>; + "$Vd, $Vm, #0", NEONvclez>; // VCGT : Vector Compare Greater Than defm VCGTs : N3V_QHS<0, 0, 0b0011, 0, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, @@ -3460,9 +3460,9 @@ NEONvcgt, 0>; defm VCGTz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00000, 0, "vcgt", "s", - "$dst, $src, #0", NEONvcgtz>; + "$Vd, $Vm, #0", NEONvcgtz>; defm VCLTz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00100, 0, "vclt", "s", - "$dst, $src, #0", NEONvcltz>; + "$Vd, $Vm, #0", NEONvcltz>; // VACGE : Vector Absolute Compare Greater Than or Equal (aka VCAGE) def VACGEd : N3VDInt<1, 0, 0b00, 0b1110, 1, N3RegFrm, IIC_VBIND, "vacge", @@ -3542,16 +3542,16 @@ // VBIC : Vector Bitwise Bit Clear (AND NOT) -def VBICd : N3VX<0, 0, 0b01, 0b0001, 0, 1, (outs DPR:$dst), - (ins DPR:$src1, DPR:$src2), N3RegFrm, IIC_VBINiD, - "vbic", "$dst, $src1, $src2", "", - [(set DPR:$dst, (v2i32 (and DPR:$src1, - (vnotd DPR:$src2))))]>; -def VBICq : N3VX<0, 0, 0b01, 0b0001, 1, 1, (outs QPR:$dst), - (ins QPR:$src1, QPR:$src2), N3RegFrm, IIC_VBINiQ, - "vbic", "$dst, $src1, $src2", "", - [(set QPR:$dst, (v4i32 (and QPR:$src1, - (vnotq QPR:$src2))))]>; +def VBICd : N3VX<0, 0, 0b01, 0b0001, 0, 1, (outs DPR:$Vd), + (ins DPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VBINiD, + "vbic", "$Vd, $Vn, $Vm", "", + [(set DPR:$Vd, (v2i32 (and DPR:$Vn, + (vnotd DPR:$Vm))))]>; +def VBICq : N3VX<0, 0, 0b01, 0b0001, 1, 1, (outs QPR:$Vd), + (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINiQ, + "vbic", "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (v4i32 (and QPR:$Vn, + (vnotq QPR:$Vm))))]>; def VBICiv4i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 0, 1, 1, (outs DPR:$Vd), (ins nModImm:$SIMM, DPR:$src), @@ -3590,59 +3590,59 @@ } // VORN : Vector Bitwise OR NOT -def VORNd : N3VX<0, 0, 0b11, 0b0001, 0, 1, (outs DPR:$dst), - (ins DPR:$src1, DPR:$src2), N3RegFrm, IIC_VBINiD, - "vorn", "$dst, $src1, $src2", "", - [(set DPR:$dst, (v2i32 (or DPR:$src1, - (vnotd DPR:$src2))))]>; -def VORNq : N3VX<0, 0, 0b11, 0b0001, 1, 1, (outs QPR:$dst), - (ins QPR:$src1, QPR:$src2), N3RegFrm, IIC_VBINiQ, - "vorn", "$dst, $src1, $src2", "", - [(set QPR:$dst, (v4i32 (or QPR:$src1, - (vnotq QPR:$src2))))]>; +def VORNd : N3VX<0, 0, 0b11, 0b0001, 0, 1, (outs DPR:$Vd), + (ins DPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VBINiD, + "vorn", "$Vd, $Vn, $Vm", "", + [(set DPR:$Vd, (v2i32 (or DPR:$Vn, + (vnotd DPR:$Vm))))]>; +def VORNq : N3VX<0, 0, 0b11, 0b0001, 1, 1, (outs QPR:$Vd), + (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINiQ, + "vorn", "$Vd, $Vn, $Vm", "", + [(set QPR:$Vd, (v4i32 (or QPR:$Vn, + (vnotq QPR:$Vm))))]>; // VMVN : Vector Bitwise NOT (Immediate) let isReMaterializable = 1 in { -def VMVNv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 1, 1, (outs DPR:$dst), +def VMVNv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 1, 1, (outs DPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmvn", "i16", "$dst, $SIMM", "", - [(set DPR:$dst, (v4i16 (NEONvmvnImm timm:$SIMM)))]> { + "vmvn", "i16", "$Vd, $SIMM", "", + [(set DPR:$Vd, (v4i16 (NEONvmvnImm timm:$SIMM)))]> { let Inst{9} = SIMM{9}; } -def VMVNv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 1, 1, (outs QPR:$dst), +def VMVNv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 1, 1, (outs QPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmvn", "i16", "$dst, $SIMM", "", - [(set QPR:$dst, (v8i16 (NEONvmvnImm timm:$SIMM)))]> { + "vmvn", "i16", "$Vd, $SIMM", "", + [(set QPR:$Vd, (v8i16 (NEONvmvnImm timm:$SIMM)))]> { let Inst{9} = SIMM{9}; } -def VMVNv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 1, 1, (outs DPR:$dst), +def VMVNv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 1, 1, (outs DPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmvn", "i32", "$dst, $SIMM", "", - [(set DPR:$dst, (v2i32 (NEONvmvnImm timm:$SIMM)))]> { + "vmvn", "i32", "$Vd, $SIMM", "", + [(set DPR:$Vd, (v2i32 (NEONvmvnImm timm:$SIMM)))]> { let Inst{11-8} = SIMM{11-8}; } -def VMVNv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 1, 1, (outs QPR:$dst), +def VMVNv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 1, 1, (outs QPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmvn", "i32", "$dst, $SIMM", "", - [(set QPR:$dst, (v4i32 (NEONvmvnImm timm:$SIMM)))]> { + "vmvn", "i32", "$Vd, $SIMM", "", + [(set QPR:$Vd, (v4i32 (NEONvmvnImm timm:$SIMM)))]> { let Inst{11-8} = SIMM{11-8}; } } // VMVN : Vector Bitwise NOT def VMVNd : N2VX<0b11, 0b11, 0b00, 0b00, 0b01011, 0, 0, - (outs DPR:$dst), (ins DPR:$src), IIC_VSUBiD, - "vmvn", "$dst, $src", "", - [(set DPR:$dst, (v2i32 (vnotd DPR:$src)))]>; + (outs DPR:$Vd), (ins DPR:$Vm), IIC_VSUBiD, + "vmvn", "$Vd, $Vm", "", + [(set DPR:$Vd, (v2i32 (vnotd DPR:$Vm)))]>; def VMVNq : N2VX<0b11, 0b11, 0b00, 0b00, 0b01011, 1, 0, - (outs QPR:$dst), (ins QPR:$src), IIC_VSUBiD, - "vmvn", "$dst, $src", "", - [(set QPR:$dst, (v4i32 (vnotq QPR:$src)))]>; + (outs QPR:$Vd), (ins QPR:$Vm), IIC_VSUBiD, + "vmvn", "$Vd, $Vm", "", + [(set QPR:$Vd, (v4i32 (vnotq QPR:$Vm)))]>; def : Pat<(v2i32 (vnotd DPR:$src)), (VMVNd DPR:$src)>; def : Pat<(v4i32 (vnotq QPR:$src)), (VMVNq QPR:$src)>; @@ -4002,13 +4002,13 @@ (sub (bitconvert (v4i32 NEONimmAllZerosV)), node:$in)>; class VNEGD size, string OpcodeStr, string Dt, ValueType Ty> - : N2V<0b11, 0b11, size, 0b01, 0b00111, 0, 0, (outs DPR:$dst), (ins DPR:$src), - IIC_VSHLiD, OpcodeStr, Dt, "$dst, $src", "", - [(set DPR:$dst, (Ty (vnegd DPR:$src)))]>; + : N2V<0b11, 0b11, size, 0b01, 0b00111, 0, 0, (outs DPR:$Vd), (ins DPR:$Vm), + IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm", "", + [(set DPR:$Vd, (Ty (vnegd DPR:$Vm)))]>; class VNEGQ size, string OpcodeStr, string Dt, ValueType Ty> - : N2V<0b11, 0b11, size, 0b01, 0b00111, 1, 0, (outs QPR:$dst), (ins QPR:$src), - IIC_VSHLiQ, OpcodeStr, Dt, "$dst, $src", "", - [(set QPR:$dst, (Ty (vnegq QPR:$src)))]>; + : N2V<0b11, 0b11, size, 0b01, 0b00111, 1, 0, (outs QPR:$Vd), (ins QPR:$Vm), + IIC_VSHLiQ, OpcodeStr, Dt, "$Vd, $Vm", "", + [(set QPR:$Vd, (Ty (vnegq QPR:$Vm)))]>; // VNEG : Vector Negate (integer) def VNEGs8d : VNEGD<0b00, "vneg", "s8", v8i8>; @@ -4020,13 +4020,13 @@ // VNEG : Vector Negate (floating-point) def VNEGfd : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 0, 0, - (outs DPR:$dst), (ins DPR:$src), IIC_VUNAD, - "vneg", "f32", "$dst, $src", "", - [(set DPR:$dst, (v2f32 (fneg DPR:$src)))]>; + (outs DPR:$Vd), (ins DPR:$Vm), IIC_VUNAD, + "vneg", "f32", "$Vd, $Vm", "", + [(set DPR:$Vd, (v2f32 (fneg DPR:$Vm)))]>; def VNEGf32q : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 1, 0, - (outs QPR:$dst), (ins QPR:$src), IIC_VUNAQ, - "vneg", "f32", "$dst, $src", "", - [(set QPR:$dst, (v4f32 (fneg QPR:$src)))]>; + (outs QPR:$Vd), (ins QPR:$Vm), IIC_VUNAQ, + "vneg", "f32", "$Vd, $Vm", "", + [(set QPR:$Vd, (v4f32 (fneg QPR:$Vm)))]>; def : Pat<(v8i8 (vnegd DPR:$src)), (VNEGs8d DPR:$src)>; def : Pat<(v4i16 (vnegd DPR:$src)), (VNEGs16d DPR:$src)>; @@ -4060,11 +4060,11 @@ // Vector Swap -- for disassembly only. def VSWPd : N2VX<0b11, 0b11, 0b00, 0b10, 0b00000, 0, 0, - (outs DPR:$dst), (ins DPR:$src), NoItinerary, - "vswp", "$dst, $src", "", []>; + (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary, + "vswp", "$Vd, $Vm", "", []>; def VSWPq : N2VX<0b11, 0b11, 0b00, 0b10, 0b00000, 1, 0, - (outs QPR:$dst), (ins QPR:$src), NoItinerary, - "vswp", "$dst, $src", "", []>; + (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary, + "vswp", "$Vd, $Vm", "", []>; // Vector Move Operations. @@ -4092,51 +4092,51 @@ // VMOV : Vector Move (Immediate) let isReMaterializable = 1 in { -def VMOVv8i8 : N1ModImm<1, 0b000, 0b1110, 0, 0, 0, 1, (outs DPR:$dst), +def VMOVv8i8 : N1ModImm<1, 0b000, 0b1110, 0, 0, 0, 1, (outs DPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i8", "$dst, $SIMM", "", - [(set DPR:$dst, (v8i8 (NEONvmovImm timm:$SIMM)))]>; -def VMOVv16i8 : N1ModImm<1, 0b000, 0b1110, 0, 1, 0, 1, (outs QPR:$dst), + "vmov", "i8", "$Vd, $SIMM", "", + [(set DPR:$Vd, (v8i8 (NEONvmovImm timm:$SIMM)))]>; +def VMOVv16i8 : N1ModImm<1, 0b000, 0b1110, 0, 1, 0, 1, (outs QPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i8", "$dst, $SIMM", "", - [(set QPR:$dst, (v16i8 (NEONvmovImm timm:$SIMM)))]>; + "vmov", "i8", "$Vd, $SIMM", "", + [(set QPR:$Vd, (v16i8 (NEONvmovImm timm:$SIMM)))]>; -def VMOVv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 0, 1, (outs DPR:$dst), +def VMOVv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 0, 1, (outs DPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i16", "$dst, $SIMM", "", - [(set DPR:$dst, (v4i16 (NEONvmovImm timm:$SIMM)))]> { + "vmov", "i16", "$Vd, $SIMM", "", + [(set DPR:$Vd, (v4i16 (NEONvmovImm timm:$SIMM)))]> { let Inst{9} = SIMM{9}; } -def VMOVv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 0, 1, (outs QPR:$dst), +def VMOVv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 0, 1, (outs QPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i16", "$dst, $SIMM", "", - [(set QPR:$dst, (v8i16 (NEONvmovImm timm:$SIMM)))]> { + "vmov", "i16", "$Vd, $SIMM", "", + [(set QPR:$Vd, (v8i16 (NEONvmovImm timm:$SIMM)))]> { let Inst{9} = SIMM{9}; } -def VMOVv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 0, 1, (outs DPR:$dst), +def VMOVv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 0, 1, (outs DPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i32", "$dst, $SIMM", "", - [(set DPR:$dst, (v2i32 (NEONvmovImm timm:$SIMM)))]> { + "vmov", "i32", "$Vd, $SIMM", "", + [(set DPR:$Vd, (v2i32 (NEONvmovImm timm:$SIMM)))]> { let Inst{11-8} = SIMM{11-8}; } -def VMOVv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 0, 1, (outs QPR:$dst), +def VMOVv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 0, 1, (outs QPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i32", "$dst, $SIMM", "", - [(set QPR:$dst, (v4i32 (NEONvmovImm timm:$SIMM)))]> { + "vmov", "i32", "$Vd, $SIMM", "", + [(set QPR:$Vd, (v4i32 (NEONvmovImm timm:$SIMM)))]> { let Inst{11-8} = SIMM{11-8}; } -def VMOVv1i64 : N1ModImm<1, 0b000, 0b1110, 0, 0, 1, 1, (outs DPR:$dst), +def VMOVv1i64 : N1ModImm<1, 0b000, 0b1110, 0, 0, 1, 1, (outs DPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i64", "$dst, $SIMM", "", - [(set DPR:$dst, (v1i64 (NEONvmovImm timm:$SIMM)))]>; -def VMOVv2i64 : N1ModImm<1, 0b000, 0b1110, 0, 1, 1, 1, (outs QPR:$dst), + "vmov", "i64", "$Vd, $SIMM", "", + [(set DPR:$Vd, (v1i64 (NEONvmovImm timm:$SIMM)))]>; +def VMOVv2i64 : N1ModImm<1, 0b000, 0b1110, 0, 1, 1, 1, (outs QPR:$Vd), (ins nModImm:$SIMM), IIC_VMOVImm, - "vmov", "i64", "$dst, $SIMM", "", - [(set QPR:$dst, (v2i64 (NEONvmovImm timm:$SIMM)))]>; + "vmov", "i64", "$Vd, $SIMM", "", + [(set QPR:$Vd, (v2i64 (NEONvmovImm timm:$SIMM)))]>; } // isReMaterializable // VMOV : Vector Get Lane (move scalar to ARM core register) @@ -4301,13 +4301,13 @@ // VDUP : Vector Duplicate (from ARM core register to all elements) class VDUPD opcod1, bits<2> opcod3, string Dt, ValueType Ty> - : NVDup; + : NVDup; class VDUPQ opcod1, bits<2> opcod3, string Dt, ValueType Ty> - : NVDup; + : NVDup; def VDUP8d : VDUPD<0b11101100, 0b00, "8", v8i8>; def VDUP16d : VDUPD<0b11101000, 0b01, "16", v4i16>; @@ -4316,28 +4316,28 @@ def VDUP16q : VDUPQ<0b11101010, 0b01, "16", v8i16>; def VDUP32q : VDUPQ<0b11101010, 0b00, "32", v4i32>; -def VDUPfd : NVDup<0b11101000, 0b1011, 0b00, (outs DPR:$dst), (ins GPR:$src), - IIC_VMOVIS, "vdup", "32", "$dst, $src", - [(set DPR:$dst, (v2f32 (NEONvdup - (f32 (bitconvert GPR:$src)))))]>; -def VDUPfq : NVDup<0b11101010, 0b1011, 0b00, (outs QPR:$dst), (ins GPR:$src), - IIC_VMOVIS, "vdup", "32", "$dst, $src", - [(set QPR:$dst, (v4f32 (NEONvdup - (f32 (bitconvert GPR:$src)))))]>; +def VDUPfd : NVDup<0b11101000, 0b1011, 0b00, (outs DPR:$V), (ins GPR:$R), + IIC_VMOVIS, "vdup", "32", "$V, $R", + [(set DPR:$V, (v2f32 (NEONvdup + (f32 (bitconvert GPR:$R)))))]>; +def VDUPfq : NVDup<0b11101010, 0b1011, 0b00, (outs QPR:$V), (ins GPR:$R), + IIC_VMOVIS, "vdup", "32", "$V, $R", + [(set QPR:$V, (v4f32 (NEONvdup + (f32 (bitconvert GPR:$R)))))]>; // VDUP : Vector Duplicate Lane (from scalar to all elements) class VDUPLND op19_16, string OpcodeStr, string Dt, ValueType Ty> - : NVDupLane; + : NVDupLane; class VDUPLNQ op19_16, string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy> - : NVDupLane; // Inst{19-16} is partially specified depending on the element size. @@ -4719,29 +4719,29 @@ // Vector Absolute used for single-precision FP let neverHasSideEffects = 1 in def VABSfd_sfp : N2V<0b11, 0b11, 0b10, 0b01, 0b01110, 0, 0, - (outs DPR_VFP2:$dst), (ins DPR_VFP2:$src), IIC_VUNAD, - "vabs", "f32", "$dst, $src", "", []>; + (outs DPR_VFP2:$Vd), (ins DPR_VFP2:$Vm), IIC_VUNAD, + "vabs", "f32", "$Vd, $Vm", "", []>; def : N2VSPat; // Vector Negate used for single-precision FP let neverHasSideEffects = 1 in def VNEGfd_sfp : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 0, 0, - (outs DPR_VFP2:$dst), (ins DPR_VFP2:$src), IIC_VUNAD, - "vneg", "f32", "$dst, $src", "", []>; + (outs DPR_VFP2:$Vd), (ins DPR_VFP2:$Vm), IIC_VUNAD, + "vneg", "f32", "$Vd, $Vm", "", []>; def : N2VSPat; // Vector Maximum used for single-precision FP let neverHasSideEffects = 1 in -def VMAXfd_sfp : N3V<0, 0, 0b00, 0b1111, 0, 0, (outs DPR_VFP2:$dst), - (ins DPR_VFP2:$src1, DPR_VFP2:$src2), N3RegFrm, IIC_VBIND, - "vmax", "f32", "$dst, $src1, $src2", "", []>; +def VMAXfd_sfp : N3V<0, 0, 0b00, 0b1111, 0, 0, (outs DPR_VFP2:$Vd), + (ins DPR_VFP2:$Vn, DPR_VFP2:$Vm), N3RegFrm, IIC_VBIND, + "vmax", "f32", "$Vd, $Vn, $Vm", "", []>; def : N3VSPat; // Vector Minimum used for single-precision FP let neverHasSideEffects = 1 in -def VMINfd_sfp : N3V<0, 0, 0b00, 0b1111, 0, 0, (outs DPR_VFP2:$dst), - (ins DPR_VFP2:$src1, DPR_VFP2:$src2), N3RegFrm, IIC_VBIND, - "vmin", "f32", "$dst, $src1, $src2", "", []>; +def VMINfd_sfp : N3V<0, 0, 0b00, 0b1111, 0, 0, (outs DPR_VFP2:$Vd), + (ins DPR_VFP2:$Vn, DPR_VFP2:$Vm), N3RegFrm, IIC_VBIND, + "vmin", "f32", "$Vd, $Vn, $Vm", "", []>; def : N3VSPat; // Vector Convert between single-precision FP and integer From isanbard at gmail.com Tue Nov 30 18:48:45 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 00:48:45 -0000 Subject: [llvm-commits] [llvm] r120512 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101201004845.0FC532A6C12D@llvm.org> Author: void Date: Tue Nov 30 18:48:44 2010 New Revision: 120512 URL: http://llvm.org/viewvc/llvm-project?rev=120512&view=rev Log: Refactor the T1sIt encodings into a parent class to get rid of all of the "let" statements. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120512&r1=120511&r2=120512&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 18:48:44 2010 @@ -708,19 +708,33 @@ // Arithmetic Instructions. // -// Add with carry register -let isCommutable = 1, Uses = [CPSR] in -def tADC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, - "adc", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0101> { - // A8.6.2 +// Helper classes to encode the various T1sIt patterns. +class T1sItDPEncode opA, dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T1sIt, + T1DataProcessing { bits<3> Rdn; bits<3> Rm; - let Inst{5-3} = Rdn; - let Inst{2-0} = Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rdn; +} +class T1sItGenEncodeImm opA, dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T1sIt, + T1General { + bits<3> Rdn; + bits<8> imm8; + let Inst{10-8} = Rdn; + let Inst{7-0} = imm8; } +// Add with carry register +let isCommutable = 1, Uses = [CPSR] in +def tADC : // A8.6.2 + T1sItDPEncode<0b0101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, + "adc", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>; + // Add immediate def tADDi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, "add", "\t$Rd, $Rn, $imm3", @@ -735,16 +749,11 @@ let Inst{2-0} = Rd; } -def tADDi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, - "add", "\t$Rdn, $imm8", - [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255:$imm8))]>, - T1General<{1,1,0,?,?}> { - // A8.6.4 T2 - bits<3> Rdn; - bits<8> imm8; - let Inst{10-8} = Rdn; - let Inst{7-0} = imm8; -} +def tADDi8 : // A8.6.4 T2 + T1sItGenEncodeImm<{1,1,0,?,?}, (outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), + IIC_iALUi, + "add", "\t$Rdn, $imm8", + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255:$imm8))]>; // Add register let isCommutable = 1 in @@ -775,16 +784,11 @@ // AND register let isCommutable = 1 in -def tAND : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, - "and", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0000> { - // A8.6.12 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tAND : // A8.6.12 + T1sItDPEncode<0b0000, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iBITr, + "and", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>; // ASR immediate def tASRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, @@ -801,28 +805,18 @@ } // ASR register -def tASRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, - "asr", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (sra tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0100> { - // A8.6.15 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tASRrr : // A8.6.15 + T1sItDPEncode<0b0100, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iMOVsr, + "asr", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (sra tGPR:$Rn, tGPR:$Rm))]>; // BIC register -def tBIC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, - "bic", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (and tGPR:$Rn, (not tGPR:$Rm)))]>, - T1DataProcessing<0b1110> { - // A8.6.20 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tBIC : // A8.6.20 + T1sItDPEncode<0b1110, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iBITr, + "bic", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (and tGPR:$Rn, (not tGPR:$Rm)))]>; // CMN register let isCompare = 1, Defs = [CPSR] in { @@ -915,16 +909,11 @@ // XOR register let isCommutable = 1 in -def tEOR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, - "eor", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0001> { - // A8.6.45 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tEOR : // A8.6.45 + T1sItDPEncode<0b0001, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iBITr, + "eor", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>; // LSL immediate def tLSLri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, @@ -941,16 +930,11 @@ } // LSL register -def tLSLrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, - "lsl", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0010> { - // A8.6.89 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tLSLrr : // A8.6.89 + T1sItDPEncode<0b0010, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iMOVsr, + "lsl", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>; // LSR immediate def tLSRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, @@ -967,16 +951,11 @@ } // LSR register -def tLSRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, - "lsr", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (srl tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0011> { - // A8.6.91 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tLSRrr : // A8.6.91 + T1sItDPEncode<0b0011, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iMOVsr, + "lsr", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (srl tGPR:$Rn, tGPR:$Rm))]>; // Move register let isMoveImm = 1 in @@ -1018,16 +997,11 @@ // multiply register let isCommutable = 1 in -def tMUL : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMUL32, - "mul", "\t$Rdn, $Rm, $Rdn", /* A8.6.105 MUL Encoding T1 */ - [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b1101> { - // A8.6.105 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tMUL : // A8.6.105 T1 + T1sItDPEncode<0b1101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iMUL32, + "mul", "\t$Rdn, $Rm, $Rdn", + [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>; // move inverse register def tMVN : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iMVNr, @@ -1043,16 +1017,11 @@ // Bitwise or register let isCommutable = 1 in -def tORR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, - "orr", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b1100> { - // A8.6.114 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tORR : // A8.6.114 + T1sItDPEncode<0b1100, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iBITr, + "orr", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>; // Swaps def tREV : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, @@ -1098,19 +1067,14 @@ let Inst{2-0} = Rd; } -// rotate right register -def tROR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, - "ror", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0111> { - // A8.6.139 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +// Rotate right register +def tROR : // A8.6.139 + T1sItDPEncode<0b0111, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iMOVsr, + "ror", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>; -// negate register +// Negate register def tRSB : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn), IIC_iALUi, "rsb", "\t$Rd, $Rn, #0", [(set tGPR:$Rd, (ineg tGPR:$Rn))]>, @@ -1124,16 +1088,11 @@ // Subtract with carry register let Uses = [CPSR] in -def tSBC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, - "sbc", "\t$Rdn, $Rm", - [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>, - T1DataProcessing<0b0110> { - // A8.6.151 - bits<3> Rdn; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rdn; -} +def tSBC : // A8.6.151 + T1sItDPEncode<0b0110, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iALUr, + "sbc", "\t$Rdn, $Rm", + [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>; // Subtract immediate def tSUBi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, @@ -1149,16 +1108,11 @@ let Inst{2-0} = Rd; } -def tSUBi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, - "sub", "\t$Rdn, $imm8", - [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>, - T1General<{1,1,1,?,?}> { - // A8.6.210 T2 - bits<3> Rdn; - bits<8> imm8; - let Inst{10-8} = Rdn; - let Inst{7-0} = imm8; -} +def tSUBi8 : // A8.6.210 T2 + T1sItGenEncodeImm<{1,1,1,?,?}, (outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), + IIC_iALUi, + "sub", "\t$Rdn, $imm8", + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>; // subtract register def tSUBrr : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, From bigcheesegs at gmail.com Tue Nov 30 18:52:28 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 00:52:28 -0000 Subject: [llvm-commits] [llvm] r120513 - in /llvm/trunk: include/llvm/Support/PathV2.h lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201005228.A9A252A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 18:52:28 2010 New Revision: 120513 URL: http://llvm.org/viewvc/llvm-project?rev=120513&view=rev Log: Support/PathV2: Add remove_filename implementation. Modified: llvm/trunk/include/llvm/Support/PathV2.h llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/include/llvm/Support/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?rev=120513&r1=120512&r2=120513&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Tue Nov 30 18:52:28 2010 @@ -140,7 +140,7 @@ /// @brief Remove the last component from \a path if it exists. /// /// directory/filename.cpp => directory/ -/// directory/ => directory/ +/// directory/ => directory /// /// @param path A path that is modified to not have a file component. /// @returns errc::success if \a path's file name has been removed (or there was Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120513&r1=120512&r2=120513&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Tue Nov 30 18:52:28 2010 @@ -503,6 +503,14 @@ return make_error_code(errc::success); } +error_code remove_filename(SmallVectorImpl &path) { + size_t end_pos = parent_path_end(StringRef(path.begin(), path.size())); + if (end_pos == StringRef::npos) + return make_error_code(errc::success); + path.set_size(end_pos); + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120513&r1=120512&r2=120513&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Tue Nov 30 18:52:28 2010 @@ -99,6 +99,10 @@ if (error_code ec = sys::path::make_absolute(temp_store)) ASSERT_FALSE(ec.message().c_str()); outs() << " make_absolute: " << temp_store << '\n'; + temp_store = *i; + if (error_code ec = sys::path::remove_filename(temp_store)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " remove_filename: " << temp_store << '\n'; outs().flush(); } From bigcheesegs at gmail.com Tue Nov 30 18:52:55 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 00:52:55 -0000 Subject: [llvm-commits] [llvm] r120514 - in /llvm/trunk: lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201005255.80C072A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 18:52:55 2010 New Revision: 120514 URL: http://llvm.org/viewvc/llvm-project?rev=120514&view=rev Log: Support/PathV2: Add replace_extension implementation. Modified: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120514&r1=120513&r2=120514&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Tue Nov 30 18:52:55 2010 @@ -511,6 +511,26 @@ return make_error_code(errc::success); } +error_code replace_extension(SmallVectorImpl &path, + const Twine &extension) { + StringRef p(path.begin(), path.size()); + SmallString<32> ext_storage; + StringRef ext = extension.toStringRef(ext_storage); + + // Erase existing extension. + size_t pos = p.find_last_of('.'); + if (pos != StringRef::npos && pos >= filename_pos(p)) + path.set_size(pos); + + // Append '.' if needed. + if (ext.size() > 0 && ext[0] != '.') + path.push_back('.'); + + // Append extension. + path.append(ext.begin(), ext.end()); + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120514&r1=120513&r2=120514&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Tue Nov 30 18:52:55 2010 @@ -103,6 +103,10 @@ if (error_code ec = sys::path::remove_filename(temp_store)) ASSERT_FALSE(ec.message().c_str()); outs() << " remove_filename: " << temp_store << '\n'; + temp_store = *i; + if (error_code ec = sys::path::replace_extension(temp_store, "ext")) + ASSERT_FALSE(ec.message().c_str()); + outs() << " replace_extension: " << temp_store << '\n'; outs().flush(); } From isanbard at gmail.com Tue Nov 30 19:20:16 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 01:20:16 -0000 Subject: [llvm-commits] [llvm] r120518 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101201012016.2CB842A6C12D@llvm.org> Author: void Date: Tue Nov 30 19:20:15 2010 New Revision: 120518 URL: http://llvm.org/viewvc/llvm-project?rev=120518&view=rev Log: Refactor T1sI and T1sIt encodings into helper classes. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120518&r1=120517&r2=120518&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 19:20:15 2010 @@ -708,7 +708,38 @@ // Arithmetic Instructions. // -// Helper classes to encode the various T1sIt patterns. +// Helper classes for encoding T1sI patterns: +class T1sIDPEncode opA, dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T1sI, + T1DataProcessing { + bits<3> Rd; + bits<3> Rn; + let Inst{5-3} = Rn; + let Inst{2-0} = Rd; +} +class T1sIGenEncode opA, dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T1sI, + T1General { + bits<3> Rm; + bits<3> Rn; + bits<3> Rd; + let Inst{8-6} = Rm; + let Inst{5-3} = Rn; + let Inst{2-0} = Rd; +} +class T1sIGenEncodeImm opA, dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T1sI, + T1General { + bits<3> Rd; + bits<3> Rm; + let Inst{5-3} = Rm; + let Inst{2-0} = Rd; +} + +// Helper classes for encoding T1sIt patterns: class T1sItDPEncode opA, dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> : T1sIt, @@ -736,17 +767,12 @@ [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>; // Add immediate -def tADDi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, - "add", "\t$Rd, $Rn, $imm3", - [(set tGPR:$Rd, (add tGPR:$Rn, imm0_7:$imm3))]>, - T1General<0b01110> { - // A8.6.4 T1 - bits<3> Rd; - bits<3> Rn; +def tADDi3 : // A8.6.4 T1 + T1sIGenEncodeImm<0b01110, (outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm3), IIC_iALUi, + "add", "\t$Rd, $Rm, $imm3", + [(set tGPR:$Rd, (add tGPR:$Rm, imm0_7:$imm3))]> { bits<3> imm3; let Inst{8-6} = imm3; - let Inst{5-3} = Rn; - let Inst{2-0} = Rd; } def tADDi8 : // A8.6.4 T2 @@ -757,18 +783,11 @@ // Add register let isCommutable = 1 in -def tADDrr : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, - "add", "\t$Rd, $Rn, $Rm", - [(set tGPR:$Rd, (add tGPR:$Rn, tGPR:$Rm))]>, - T1General<0b01100> { - // A8.6.6 T1 - bits<3> Rm; - bits<3> Rn; - bits<3> Rd; - let Inst{8-6} = Rm; - let Inst{5-3} = Rn; - let Inst{2-0} = Rd; -} +def tADDrr : // A8.6.6 T1 + T1sIGenEncode<0b01100, (outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iALUr, + "add", "\t$Rd, $Rn, $Rm", + [(set tGPR:$Rd, (add tGPR:$Rn, tGPR:$Rm))]>; let neverHasSideEffects = 1 in def tADDhirr : T1pIt<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, @@ -791,17 +810,13 @@ [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>; // ASR immediate -def tASRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, - "asr", "\t$Rd, $Rm, $imm5", - [(set tGPR:$Rd, (sra tGPR:$Rm, (i32 imm:$imm5)))]>, - T1General<{0,1,0,?,?}> { - // A8.6.14 - bits<3> Rd; - bits<3> Rm; +def tASRri : // A8.6.14 + T1sIGenEncodeImm<{0,1,0,?,?}, (outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), + IIC_iMOVsi, + "asr", "\t$Rd, $Rm, $imm5", + [(set tGPR:$Rd, (sra tGPR:$Rm, (i32 imm:$imm5)))]> { bits<5> imm5; let Inst{10-6} = imm5; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; } // ASR register @@ -916,17 +931,13 @@ [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>; // LSL immediate -def tLSLri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, - "lsl", "\t$Rd, $Rm, $imm5", - [(set tGPR:$Rd, (shl tGPR:$Rm, (i32 imm:$imm5)))]>, - T1General<{0,0,0,?,?}> { - // A8.6.88 - bits<3> Rd; - bits<3> Rm; +def tLSLri : // A8.6.88 + T1sIGenEncodeImm<{0,0,0,?,?}, (outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), + IIC_iMOVsi, + "lsl", "\t$Rd, $Rm, $imm5", + [(set tGPR:$Rd, (shl tGPR:$Rm, (i32 imm:$imm5)))]> { bits<5> imm5; let Inst{10-6} = imm5; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; } // LSL register @@ -937,17 +948,13 @@ [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>; // LSR immediate -def tLSRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, - "lsr", "\t$Rd, $Rm, $imm5", - [(set tGPR:$Rd, (srl tGPR:$Rm, (i32 imm:$imm5)))]>, - T1General<{0,0,1,?,?}> { - // A8.6.90 - bits<3> Rd; - bits<3> Rm; +def tLSRri : // A8.6.90 + T1sIGenEncodeImm<{0,0,1,?,?}, (outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), + IIC_iMOVsi, + "lsr", "\t$Rd, $Rm, $imm5", + [(set tGPR:$Rd, (srl tGPR:$Rm, (i32 imm:$imm5)))]> { bits<5> imm5; let Inst{10-6} = imm5; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; } // LSR register @@ -1003,17 +1010,11 @@ "mul", "\t$Rdn, $Rm, $Rdn", [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>; -// move inverse register -def tMVN : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iMVNr, - "mvn", "\t$Rd, $Rm", - [(set tGPR:$Rd, (not tGPR:$Rm))]>, - T1DataProcessing<0b1111> { - // A8.6.107 - bits<3> Rd; - bits<3> Rm; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} +// Move inverse register +def tMVN : // A8.6.107 + T1sIDPEncode<0b1111, (outs tGPR:$Rd), (ins tGPR:$Rn), IIC_iMVNr, + "mvn", "\t$Rd, $Rn", + [(set tGPR:$Rd, (not tGPR:$Rn))]>; // Bitwise or register let isCommutable = 1 in @@ -1075,16 +1076,11 @@ [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>; // Negate register -def tRSB : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn), IIC_iALUi, - "rsb", "\t$Rd, $Rn, #0", - [(set tGPR:$Rd, (ineg tGPR:$Rn))]>, - T1DataProcessing<0b1001> { - // A8.6.141 - bits<3> Rn; - bits<3> Rd; - let Inst{5-3} = Rn; - let Inst{2-0} = Rd; -} +def tRSB : // A8.6.141 + T1sIDPEncode<0b1001, (outs tGPR:$Rd), (ins tGPR:$Rn), + IIC_iALUi, + "rsb", "\t$Rd, $Rn, #0", + [(set tGPR:$Rd, (ineg tGPR:$Rn))]>; // Subtract with carry register let Uses = [CPSR] in @@ -1095,17 +1091,13 @@ [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>; // Subtract immediate -def tSUBi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, - "sub", "\t$Rd, $Rn, $imm3", - [(set tGPR:$Rd, (add tGPR:$Rn, imm0_7_neg:$imm3))]>, - T1General<0b01111> { - // A8.6.210 T1 +def tSUBi3 : // A8.6.210 T1 + T1sIGenEncodeImm<0b01111, (outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm3), + IIC_iALUi, + "sub", "\t$Rd, $Rm, $imm3", + [(set tGPR:$Rd, (add tGPR:$Rm, imm0_7_neg:$imm3))]> { bits<3> imm3; - bits<3> Rn; - bits<3> Rd; let Inst{8-6} = imm3; - let Inst{5-3} = Rn; - let Inst{2-0} = Rd; } def tSUBi8 : // A8.6.210 T2 @@ -1114,23 +1106,16 @@ "sub", "\t$Rdn, $imm8", [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>; -// subtract register -def tSUBrr : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, - "sub", "\t$Rd, $Rn, $Rm", - [(set tGPR:$Rd, (sub tGPR:$Rn, tGPR:$Rm))]>, - T1General<0b01101> { - // A8.6.212 - bits<3> Rm; - bits<3> Rn; - bits<3> Rd; - let Inst{8-6} = Rm; - let Inst{5-3} = Rn; - let Inst{2-0} = Rd; -} +// Subtract register +def tSUBrr : // A8.6.212 + T1sIGenEncode<0b01101, (outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iALUr, + "sub", "\t$Rd, $Rn, $Rm", + [(set tGPR:$Rd, (sub tGPR:$Rn, tGPR:$Rm))]>; // TODO: A7-96: STMIA - store multiple. -// sign-extend byte +// Sign-extend byte def tSXTB : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, "sxtb", "\t$Rd, $Rm", [(set tGPR:$Rd, (sext_inreg tGPR:$Rm, i8))]>, From bob.wilson at apple.com Tue Nov 30 19:24:45 2010 From: bob.wilson at apple.com (Bob Wilson) Date: Tue, 30 Nov 2010 17:24:45 -0800 Subject: [llvm-commits] [llvm] r120512 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td In-Reply-To: <20101201004845.0FC532A6C12D@llvm.org> References: <20101201004845.0FC532A6C12D@llvm.org> Message-ID: <65443524-7649-418B-88DE-AD66C24759B2@apple.com> Thank you, thank you, thank you! On Nov 30, 2010, at 4:48 PM, Bill Wendling wrote: > Author: void > Date: Tue Nov 30 18:48:44 2010 > New Revision: 120512 > > URL: http://llvm.org/viewvc/llvm-project?rev=120512&view=rev > Log: > Refactor the T1sIt encodings into a parent class to get rid of all of the "let" > statements. > > Modified: > llvm/trunk/lib/Target/ARM/ARMInstrThumb.td > > Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120512&r1=120511&r2=120512&view=diff > ============================================================================== > --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) > +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 18:48:44 2010 > @@ -708,19 +708,33 @@ > // Arithmetic Instructions. > // > > -// Add with carry register > -let isCommutable = 1, Uses = [CPSR] in > -def tADC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, > - "adc", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0101> { > - // A8.6.2 > +// Helper classes to encode the various T1sIt patterns. > +class T1sItDPEncode opA, dag oops, dag iops, InstrItinClass itin, > + string opc, string asm, list pattern> > + : T1sIt, > + T1DataProcessing { > bits<3> Rdn; > bits<3> Rm; > - let Inst{5-3} = Rdn; > - let Inst{2-0} = Rm; > + let Inst{5-3} = Rm; > + let Inst{2-0} = Rdn; > +} > +class T1sItGenEncodeImm opA, dag oops, dag iops, InstrItinClass itin, > + string opc, string asm, list pattern> > + : T1sIt, > + T1General { > + bits<3> Rdn; > + bits<8> imm8; > + let Inst{10-8} = Rdn; > + let Inst{7-0} = imm8; > } > > +// Add with carry register > +let isCommutable = 1, Uses = [CPSR] in > +def tADC : // A8.6.2 > + T1sItDPEncode<0b0101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, > + "adc", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>; > + > // Add immediate > def tADDi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, > "add", "\t$Rd, $Rn, $imm3", > @@ -735,16 +749,11 @@ > let Inst{2-0} = Rd; > } > > -def tADDi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, > - "add", "\t$Rdn, $imm8", > - [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255:$imm8))]>, > - T1General<{1,1,0,?,?}> { > - // A8.6.4 T2 > - bits<3> Rdn; > - bits<8> imm8; > - let Inst{10-8} = Rdn; > - let Inst{7-0} = imm8; > -} > +def tADDi8 : // A8.6.4 T2 > + T1sItGenEncodeImm<{1,1,0,?,?}, (outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), > + IIC_iALUi, > + "add", "\t$Rdn, $imm8", > + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255:$imm8))]>; > > // Add register > let isCommutable = 1 in > @@ -775,16 +784,11 @@ > > // AND register > let isCommutable = 1 in > -def tAND : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, > - "and", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0000> { > - // A8.6.12 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tAND : // A8.6.12 > + T1sItDPEncode<0b0000, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iBITr, > + "and", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>; > > // ASR immediate > def tASRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, > @@ -801,28 +805,18 @@ > } > > // ASR register > -def tASRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, > - "asr", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (sra tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0100> { > - // A8.6.15 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tASRrr : // A8.6.15 > + T1sItDPEncode<0b0100, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iMOVsr, > + "asr", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (sra tGPR:$Rn, tGPR:$Rm))]>; > > // BIC register > -def tBIC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, > - "bic", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (and tGPR:$Rn, (not tGPR:$Rm)))]>, > - T1DataProcessing<0b1110> { > - // A8.6.20 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tBIC : // A8.6.20 > + T1sItDPEncode<0b1110, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iBITr, > + "bic", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (and tGPR:$Rn, (not tGPR:$Rm)))]>; > > // CMN register > let isCompare = 1, Defs = [CPSR] in { > @@ -915,16 +909,11 @@ > > // XOR register > let isCommutable = 1 in > -def tEOR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, > - "eor", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0001> { > - // A8.6.45 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tEOR : // A8.6.45 > + T1sItDPEncode<0b0001, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iBITr, > + "eor", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>; > > // LSL immediate > def tLSLri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, > @@ -941,16 +930,11 @@ > } > > // LSL register > -def tLSLrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, > - "lsl", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0010> { > - // A8.6.89 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tLSLrr : // A8.6.89 > + T1sItDPEncode<0b0010, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iMOVsr, > + "lsl", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>; > > // LSR immediate > def tLSRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, > @@ -967,16 +951,11 @@ > } > > // LSR register > -def tLSRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, > - "lsr", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (srl tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0011> { > - // A8.6.91 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tLSRrr : // A8.6.91 > + T1sItDPEncode<0b0011, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iMOVsr, > + "lsr", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (srl tGPR:$Rn, tGPR:$Rm))]>; > > // Move register > let isMoveImm = 1 in > @@ -1018,16 +997,11 @@ > > // multiply register > let isCommutable = 1 in > -def tMUL : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMUL32, > - "mul", "\t$Rdn, $Rm, $Rdn", /* A8.6.105 MUL Encoding T1 */ > - [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b1101> { > - // A8.6.105 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tMUL : // A8.6.105 T1 > + T1sItDPEncode<0b1101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iMUL32, > + "mul", "\t$Rdn, $Rm, $Rdn", > + [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>; > > // move inverse register > def tMVN : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iMVNr, > @@ -1043,16 +1017,11 @@ > > // Bitwise or register > let isCommutable = 1 in > -def tORR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, > - "orr", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b1100> { > - // A8.6.114 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tORR : // A8.6.114 > + T1sItDPEncode<0b1100, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iBITr, > + "orr", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>; > > // Swaps > def tREV : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, > @@ -1098,19 +1067,14 @@ > let Inst{2-0} = Rd; > } > > -// rotate right register > -def tROR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, > - "ror", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0111> { > - // A8.6.139 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +// Rotate right register > +def tROR : // A8.6.139 > + T1sItDPEncode<0b0111, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iMOVsr, > + "ror", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>; > > -// negate register > +// Negate register > def tRSB : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn), IIC_iALUi, > "rsb", "\t$Rd, $Rn, #0", > [(set tGPR:$Rd, (ineg tGPR:$Rn))]>, > @@ -1124,16 +1088,11 @@ > > // Subtract with carry register > let Uses = [CPSR] in > -def tSBC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, > - "sbc", "\t$Rdn, $Rm", > - [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>, > - T1DataProcessing<0b0110> { > - // A8.6.151 > - bits<3> Rdn; > - bits<3> Rm; > - let Inst{5-3} = Rm; > - let Inst{2-0} = Rdn; > -} > +def tSBC : // A8.6.151 > + T1sItDPEncode<0b0110, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), > + IIC_iALUr, > + "sbc", "\t$Rdn, $Rm", > + [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>; > > // Subtract immediate > def tSUBi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, > @@ -1149,16 +1108,11 @@ > let Inst{2-0} = Rd; > } > > -def tSUBi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, > - "sub", "\t$Rdn, $imm8", > - [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>, > - T1General<{1,1,1,?,?}> { > - // A8.6.210 T2 > - bits<3> Rdn; > - bits<8> imm8; > - let Inst{10-8} = Rdn; > - let Inst{7-0} = imm8; > -} > +def tSUBi8 : // A8.6.210 T2 > + T1sItGenEncodeImm<{1,1,1,?,?}, (outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), > + IIC_iALUi, > + "sub", "\t$Rdn, $imm8", > + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>; > > // subtract register > def tSUBrr : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From isanbard at gmail.com Tue Nov 30 19:26:13 2010 From: isanbard at gmail.com (Bill Wendling) Date: Tue, 30 Nov 2010 17:26:13 -0800 Subject: [llvm-commits] [llvm] r120512 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td In-Reply-To: <65443524-7649-418B-88DE-AD66C24759B2@apple.com> References: <20101201004845.0FC532A6C12D@llvm.org> <65443524-7649-418B-88DE-AD66C24759B2@apple.com> Message-ID: You're welcome^3. :-) (More to come...) -bw On Nov 30, 2010, at 5:24 PM, Bob Wilson wrote: > Thank you, thank you, thank you! > > On Nov 30, 2010, at 4:48 PM, Bill Wendling wrote: > >> Author: void >> Date: Tue Nov 30 18:48:44 2010 >> New Revision: 120512 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=120512&view=rev >> Log: >> Refactor the T1sIt encodings into a parent class to get rid of all of the "let" >> statements. >> >> Modified: >> llvm/trunk/lib/Target/ARM/ARMInstrThumb.td >> >> Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120512&r1=120511&r2=120512&view=diff >> ============================================================================== >> --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) >> +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 18:48:44 2010 >> @@ -708,19 +708,33 @@ >> // Arithmetic Instructions. >> // >> >> -// Add with carry register >> -let isCommutable = 1, Uses = [CPSR] in >> -def tADC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, >> - "adc", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0101> { >> - // A8.6.2 >> +// Helper classes to encode the various T1sIt patterns. >> +class T1sItDPEncode opA, dag oops, dag iops, InstrItinClass itin, >> + string opc, string asm, list pattern> >> + : T1sIt, >> + T1DataProcessing { >> bits<3> Rdn; >> bits<3> Rm; >> - let Inst{5-3} = Rdn; >> - let Inst{2-0} = Rm; >> + let Inst{5-3} = Rm; >> + let Inst{2-0} = Rdn; >> +} >> +class T1sItGenEncodeImm opA, dag oops, dag iops, InstrItinClass itin, >> + string opc, string asm, list pattern> >> + : T1sIt, >> + T1General { >> + bits<3> Rdn; >> + bits<8> imm8; >> + let Inst{10-8} = Rdn; >> + let Inst{7-0} = imm8; >> } >> >> +// Add with carry register >> +let isCommutable = 1, Uses = [CPSR] in >> +def tADC : // A8.6.2 >> + T1sItDPEncode<0b0101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, >> + "adc", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (adde tGPR:$Rn, tGPR:$Rm))]>; >> + >> // Add immediate >> def tADDi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, >> "add", "\t$Rd, $Rn, $imm3", >> @@ -735,16 +749,11 @@ >> let Inst{2-0} = Rd; >> } >> >> -def tADDi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, >> - "add", "\t$Rdn, $imm8", >> - [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255:$imm8))]>, >> - T1General<{1,1,0,?,?}> { >> - // A8.6.4 T2 >> - bits<3> Rdn; >> - bits<8> imm8; >> - let Inst{10-8} = Rdn; >> - let Inst{7-0} = imm8; >> -} >> +def tADDi8 : // A8.6.4 T2 >> + T1sItGenEncodeImm<{1,1,0,?,?}, (outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), >> + IIC_iALUi, >> + "add", "\t$Rdn, $imm8", >> + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255:$imm8))]>; >> >> // Add register >> let isCommutable = 1 in >> @@ -775,16 +784,11 @@ >> >> // AND register >> let isCommutable = 1 in >> -def tAND : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, >> - "and", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0000> { >> - // A8.6.12 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tAND : // A8.6.12 >> + T1sItDPEncode<0b0000, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iBITr, >> + "and", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (and tGPR:$Rn, tGPR:$Rm))]>; >> >> // ASR immediate >> def tASRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, >> @@ -801,28 +805,18 @@ >> } >> >> // ASR register >> -def tASRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, >> - "asr", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (sra tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0100> { >> - // A8.6.15 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tASRrr : // A8.6.15 >> + T1sItDPEncode<0b0100, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iMOVsr, >> + "asr", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (sra tGPR:$Rn, tGPR:$Rm))]>; >> >> // BIC register >> -def tBIC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, >> - "bic", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (and tGPR:$Rn, (not tGPR:$Rm)))]>, >> - T1DataProcessing<0b1110> { >> - // A8.6.20 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tBIC : // A8.6.20 >> + T1sItDPEncode<0b1110, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iBITr, >> + "bic", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (and tGPR:$Rn, (not tGPR:$Rm)))]>; >> >> // CMN register >> let isCompare = 1, Defs = [CPSR] in { >> @@ -915,16 +909,11 @@ >> >> // XOR register >> let isCommutable = 1 in >> -def tEOR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, >> - "eor", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0001> { >> - // A8.6.45 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tEOR : // A8.6.45 >> + T1sItDPEncode<0b0001, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iBITr, >> + "eor", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (xor tGPR:$Rn, tGPR:$Rm))]>; >> >> // LSL immediate >> def tLSLri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, >> @@ -941,16 +930,11 @@ >> } >> >> // LSL register >> -def tLSLrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, >> - "lsl", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0010> { >> - // A8.6.89 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tLSLrr : // A8.6.89 >> + T1sItDPEncode<0b0010, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iMOVsr, >> + "lsl", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (shl tGPR:$Rn, tGPR:$Rm))]>; >> >> // LSR immediate >> def tLSRri : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm, i32imm:$imm5), IIC_iMOVsi, >> @@ -967,16 +951,11 @@ >> } >> >> // LSR register >> -def tLSRrr : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, >> - "lsr", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (srl tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0011> { >> - // A8.6.91 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tLSRrr : // A8.6.91 >> + T1sItDPEncode<0b0011, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iMOVsr, >> + "lsr", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (srl tGPR:$Rn, tGPR:$Rm))]>; >> >> // Move register >> let isMoveImm = 1 in >> @@ -1018,16 +997,11 @@ >> >> // multiply register >> let isCommutable = 1 in >> -def tMUL : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMUL32, >> - "mul", "\t$Rdn, $Rm, $Rdn", /* A8.6.105 MUL Encoding T1 */ >> - [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b1101> { >> - // A8.6.105 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tMUL : // A8.6.105 T1 >> + T1sItDPEncode<0b1101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iMUL32, >> + "mul", "\t$Rdn, $Rm, $Rdn", >> + [(set tGPR:$Rdn, (mul tGPR:$Rn, tGPR:$Rm))]>; >> >> // move inverse register >> def tMVN : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iMVNr, >> @@ -1043,16 +1017,11 @@ >> >> // Bitwise or register >> let isCommutable = 1 in >> -def tORR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iBITr, >> - "orr", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b1100> { >> - // A8.6.114 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tORR : // A8.6.114 >> + T1sItDPEncode<0b1100, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iBITr, >> + "orr", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>; >> >> // Swaps >> def tREV : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, >> @@ -1098,19 +1067,14 @@ >> let Inst{2-0} = Rd; >> } >> >> -// rotate right register >> -def tROR : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iMOVsr, >> - "ror", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0111> { >> - // A8.6.139 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +// Rotate right register >> +def tROR : // A8.6.139 >> + T1sItDPEncode<0b0111, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iMOVsr, >> + "ror", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (rotr tGPR:$Rn, tGPR:$Rm))]>; >> >> -// negate register >> +// Negate register >> def tRSB : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn), IIC_iALUi, >> "rsb", "\t$Rd, $Rn, #0", >> [(set tGPR:$Rd, (ineg tGPR:$Rn))]>, >> @@ -1124,16 +1088,11 @@ >> >> // Subtract with carry register >> let Uses = [CPSR] in >> -def tSBC : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, >> - "sbc", "\t$Rdn, $Rm", >> - [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>, >> - T1DataProcessing<0b0110> { >> - // A8.6.151 >> - bits<3> Rdn; >> - bits<3> Rm; >> - let Inst{5-3} = Rm; >> - let Inst{2-0} = Rdn; >> -} >> +def tSBC : // A8.6.151 >> + T1sItDPEncode<0b0110, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), >> + IIC_iALUr, >> + "sbc", "\t$Rdn, $Rm", >> + [(set tGPR:$Rdn, (sube tGPR:$Rn, tGPR:$Rm))]>; >> >> // Subtract immediate >> def tSUBi3 : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, i32imm:$imm3), IIC_iALUi, >> @@ -1149,16 +1108,11 @@ >> let Inst{2-0} = Rd; >> } >> >> -def tSUBi8 : T1sIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), IIC_iALUi, >> - "sub", "\t$Rdn, $imm8", >> - [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>, >> - T1General<{1,1,1,?,?}> { >> - // A8.6.210 T2 >> - bits<3> Rdn; >> - bits<8> imm8; >> - let Inst{10-8} = Rdn; >> - let Inst{7-0} = imm8; >> -} >> +def tSUBi8 : // A8.6.210 T2 >> + T1sItGenEncodeImm<{1,1,1,?,?}, (outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$imm8), >> + IIC_iALUi, >> + "sub", "\t$Rdn, $imm8", >> + [(set tGPR:$Rdn, (add tGPR:$Rn, imm8_255_neg:$imm8))]>; >> >> // subtract register >> def tSUBrr : T1sI<(outs tGPR:$Rd), (ins tGPR:$Rn, tGPR:$Rm), IIC_iALUr, >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits From sabre at nondot.org Tue Nov 30 19:24:55 2010 From: sabre at nondot.org (Chris Lattner) Date: Wed, 01 Dec 2010 01:24:55 -0000 Subject: [llvm-commits] [llvm] r120519 - in /llvm/trunk: lib/Transforms/Scalar/MemCpyOptimizer.cpp test/Transforms/MemCpyOpt/memcpy.ll Message-ID: <20101201012455.5672C2A6C12D@llvm.org> Author: lattner Date: Tue Nov 30 19:24:55 2010 New Revision: 120519 URL: http://llvm.org/viewvc/llvm-project?rev=120519&view=rev Log: fix a bozo bug I introduced in r119930, causing a miscompile of 20040709-1.c from the gcc testsuite. I was using the size of a pointer instead of the pointee. This fixes rdar://8713376 Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=120519&r1=120518&r2=120519&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Tue Nov 30 19:24:55 2010 @@ -814,7 +814,8 @@ // Find out what feeds this byval argument. Value *ByValArg = CS.getArgument(ArgNo); - uint64_t ByValSize = TD->getTypeAllocSize(ByValArg->getType()); + const Type *ByValTy =cast(ByValArg->getType())->getElementType(); + uint64_t ByValSize = TD->getTypeAllocSize(ByValTy); MemDepResult DepInfo = MD->getPointerDependencyFrom(AliasAnalysis::Location(ByValArg, ByValSize), true, CS.getInstruction(), Modified: llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll?rev=120519&r1=120518&r2=120519&view=diff ============================================================================== --- llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll (original) +++ llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll Tue Nov 30 19:24:55 2010 @@ -77,3 +77,26 @@ declare void @test4a(i8* byval align 1) declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind + +%struct.S = type { i128, [4 x i8]} + + at sS = external global %struct.S, align 16 + +declare void @test5a(%struct.S* byval align 16) nounwind ssp + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind + +; rdar://8713376 - This memcpy can't be eliminated. +define i32 @test5(i32 %x) nounwind ssp { +entry: + %y = alloca %struct.S, align 16 + %tmp = bitcast %struct.S* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp, i8* bitcast (%struct.S* @sS to i8*), i64 32, i32 16, i1 false) + %a = getelementptr %struct.S* %y, i64 0, i32 1, i64 0 + store i8 4, i8* %a + call void @test5a(%struct.S* byval align 16 %y) + ret i32 0 + ; CHECK: @test5( + ; CHECK: store i8 4 + ; CHECK: call void @test5a(%struct.S* byval align 16 %y) +} From isanbard at gmail.com Tue Nov 30 19:32:02 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 01:32:02 -0000 Subject: [llvm-commits] [llvm] r120522 - in /llvm/trunk/lib/Target/ARM: ARMInstrFormats.td ARMInstrThumb.td Message-ID: <20101201013202.3BF142A6C12D@llvm.org> Author: void Date: Tue Nov 30 19:32:02 2010 New Revision: 120522 URL: http://llvm.org/viewvc/llvm-project?rev=120522&view=rev Log: Renaming variables to coincide with documentation. No functionality change. Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120522&r1=120521&r2=120522&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Tue Nov 30 19:32:02 2010 @@ -861,7 +861,7 @@ class T1pIt pattern> : Thumb1pI; + "$Rn = $Rdn", pattern>; class T1pIs pattern> Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120522&r1=120521&r2=120522&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 19:32:02 2010 @@ -790,15 +790,15 @@ [(set tGPR:$Rd, (add tGPR:$Rn, tGPR:$Rm))]>; let neverHasSideEffects = 1 in -def tADDhirr : T1pIt<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, - "add", "\t$dst, $rhs", []>, +def tADDhirr : T1pIt<(outs GPR:$Rdn), (ins GPR:$Rn, GPR:$Rm), IIC_iALUr, + "add", "\t$Rdn, $Rm", []>, T1Special<{0,0,?,?}> { // A8.6.6 T2 - bits<4> dst; - bits<4> rhs; - let Inst{6-3} = rhs; - let Inst{7} = dst{3}; - let Inst{2-0} = dst{2-0}; + bits<4> Rdn; + bits<4> Rm; + let Inst{7} = Rdn{3}; + let Inst{6-3} = Rm; + let Inst{2-0} = Rdn{2-0}; } // AND register @@ -1192,24 +1192,24 @@ // 16-bit movcc in IT blocks for Thumb2. let neverHasSideEffects = 1 in { -def tMOVCCr : T1pIt<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iCMOVr, - "mov", "\t$dst, $rhs", []>, +def tMOVCCr : T1pIt<(outs GPR:$Rdn), (ins GPR:$Rn, GPR:$Rm), IIC_iCMOVr, + "mov", "\t$Rdn, $Rm", []>, T1Special<{1,0,?,?}> { - bits<4> rhs; - bits<4> dst; - let Inst{7} = dst{3}; - let Inst{6-3} = rhs; - let Inst{2-0} = dst{2-0}; + bits<4> Rdn; + bits<4> Rm; + let Inst{7} = Rdn{3}; + let Inst{6-3} = Rm; + let Inst{2-0} = Rdn{2-0}; } let isMoveImm = 1 in -def tMOVCCi : T1pIt<(outs tGPR:$dst), (ins tGPR:$lhs, i32imm:$rhs), IIC_iCMOVi, - "mov", "\t$dst, $rhs", []>, +def tMOVCCi : T1pIt<(outs tGPR:$Rdn), (ins tGPR:$Rn, i32imm:$Rm), IIC_iCMOVi, + "mov", "\t$Rdn, $Rm", []>, T1General<{1,0,0,?,?}> { - bits<8> rhs; - bits<3> dst; - let Inst{10-8} = dst; - let Inst{7-0} = rhs; + bits<3> Rdn; + bits<8> Rm; + let Inst{10-8} = Rdn; + let Inst{7-0} = Rm; } } // neverHasSideEffects From isanbard at gmail.com Tue Nov 30 19:38:08 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 01:38:08 -0000 Subject: [llvm-commits] [llvm] r120524 - in /llvm/trunk/lib/Target/ARM: ARMInstrFormats.td ARMInstrThumb.td Message-ID: <20101201013808.ADEBD2A6C12D@llvm.org> Author: void Date: Tue Nov 30 19:38:08 2010 New Revision: 120524 URL: http://llvm.org/viewvc/llvm-project?rev=120524&view=rev Log: s/T1pIEncode/T1pILdStEncode/g s/T1pIEncodeImm/T1pILdStEncodeImm/g Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120524&r1=120523&r2=120524&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Tue Nov 30 19:38:08 2010 @@ -907,9 +907,9 @@ // 0b0110 => Immediate, 4 bytes // 0b1000 => Immediate, 2 bytes // 0b0111 => Immediate, 1 byte -class T1pIEncode opcode, dag oops, dag iops, AddrMode am, - InstrItinClass itin, string opc, string asm, - list pattern> +class T1pILdStEncode opcode, dag oops, dag iops, AddrMode am, + InstrItinClass itin, string opc, string asm, + list pattern> : Thumb1pI, T1LoadStore<0b0101, opcode> { bits<3> Rt; @@ -918,9 +918,9 @@ let Inst{5-3} = addr{2-0}; // Rn let Inst{2-0} = Rt; } -class T1pIEncodeImm opA, bit opB, dag oops, dag iops, AddrMode am, - InstrItinClass itin, string opc, string asm, - list pattern> +class T1pILdStEncodeImm opA, bit opB, dag oops, dag iops, AddrMode am, + InstrItinClass itin, string opc, string asm, + list pattern> : Thumb1pI, T1LoadStore { bits<3> Rt; Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120524&r1=120523&r2=120524&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 19:38:08 2010 @@ -514,54 +514,54 @@ let canFoldAsLoad = 1, isReMaterializable = 1 in def tLDR : // A8.6.60 - T1pIEncode<0b100, (outs tGPR:$Rt), (ins t_addrmode_s4:$addr), - AddrModeT1_4, IIC_iLoad_r, - "ldr", "\t$Rt, $addr", - [(set tGPR:$Rt, (load t_addrmode_s4:$addr))]>; + T1pILdStEncode<0b100, (outs tGPR:$Rt), (ins t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iLoad_r, + "ldr", "\t$Rt, $addr", + [(set tGPR:$Rt, (load t_addrmode_s4:$addr))]>; def tLDRi: // A8.6.57 - T1pIEncodeImm<0b0110, 1, (outs tGPR:$Rt), (ins t_addrmode_s4:$addr), - AddrModeT1_4, IIC_iLoad_r, - "ldr", "\t$Rt, $addr", - []>; + T1pILdStEncodeImm<0b0110, 1, (outs tGPR:$Rt), (ins t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iLoad_r, + "ldr", "\t$Rt, $addr", + []>; def tLDRB : // A8.6.64 - T1pIEncode<0b110, (outs tGPR:$Rt), (ins t_addrmode_s1:$addr), - AddrModeT1_1, IIC_iLoad_bh_r, - "ldrb", "\t$Rt, $addr", - [(set tGPR:$Rt, (zextloadi8 t_addrmode_s1:$addr))]>; + T1pILdStEncode<0b110, (outs tGPR:$Rt), (ins t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iLoad_bh_r, + "ldrb", "\t$Rt, $addr", + [(set tGPR:$Rt, (zextloadi8 t_addrmode_s1:$addr))]>; def tLDRBi : // A8.6.61 - T1pIEncodeImm<0b0111, 1, (outs tGPR:$dst), (ins t_addrmode_s1:$addr), - AddrModeT1_1, IIC_iLoad_bh_r, - "ldrb", "\t$dst, $addr", - []>; + T1pILdStEncodeImm<0b0111, 1, (outs tGPR:$dst), (ins t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iLoad_bh_r, + "ldrb", "\t$dst, $addr", + []>; def tLDRH : // A8.6.76 - T1pIEncode<0b101, (outs tGPR:$dst), (ins t_addrmode_s2:$addr), - AddrModeT1_2, IIC_iLoad_bh_r, - "ldrh", "\t$dst, $addr", - [(set tGPR:$dst, (zextloadi16 t_addrmode_s2:$addr))]>; + T1pILdStEncode<0b101, (outs tGPR:$dst), (ins t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iLoad_bh_r, + "ldrh", "\t$dst, $addr", + [(set tGPR:$dst, (zextloadi16 t_addrmode_s2:$addr))]>; def tLDRHi: // A8.6.73 - T1pIEncodeImm<0b1000, 1, (outs tGPR:$dst), (ins t_addrmode_s2:$addr), - AddrModeT1_2, IIC_iLoad_bh_r, - "ldrh", "\t$dst, $addr", - []>; + T1pILdStEncodeImm<0b1000, 1, (outs tGPR:$dst), (ins t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iLoad_bh_r, + "ldrh", "\t$dst, $addr", + []>; let AddedComplexity = 10 in def tLDRSB : // A8.6.80 - T1pIEncode<0b011, (outs tGPR:$dst), (ins t_addrmode_rr:$addr), - AddrModeT1_1, IIC_iLoad_bh_r, - "ldrsb", "\t$dst, $addr", - [(set tGPR:$dst, (sextloadi8 t_addrmode_rr:$addr))]>; + T1pILdStEncode<0b011, (outs tGPR:$dst), (ins t_addrmode_rr:$addr), + AddrModeT1_1, IIC_iLoad_bh_r, + "ldrsb", "\t$dst, $addr", + [(set tGPR:$dst, (sextloadi8 t_addrmode_rr:$addr))]>; let AddedComplexity = 10 in def tLDRSH : // A8.6.84 - T1pIEncode<0b111, (outs tGPR:$dst), (ins t_addrmode_rr:$addr), - AddrModeT1_2, IIC_iLoad_bh_r, - "ldrsh", "\t$dst, $addr", - [(set tGPR:$dst, (sextloadi16 t_addrmode_rr:$addr))]>; + T1pILdStEncode<0b111, (outs tGPR:$dst), (ins t_addrmode_rr:$addr), + AddrModeT1_2, IIC_iLoad_bh_r, + "ldrsh", "\t$dst, $addr", + [(set tGPR:$dst, (sextloadi16 t_addrmode_rr:$addr))]>; let canFoldAsLoad = 1 in def tLDRspi : T1pIs<(outs tGPR:$dst), (ins t_addrmode_sp:$addr), IIC_iLoad_i, @@ -597,40 +597,40 @@ T1LdStSP<{1,?,?}>; def tSTR : // A8.6.194 - T1pIEncode<0b000, (outs), (ins tGPR:$src, t_addrmode_s4:$addr), - AddrModeT1_4, IIC_iStore_r, - "str", "\t$src, $addr", - [(store tGPR:$src, t_addrmode_s4:$addr)]>; + T1pILdStEncode<0b000, (outs), (ins tGPR:$src, t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iStore_r, + "str", "\t$src, $addr", + [(store tGPR:$src, t_addrmode_s4:$addr)]>; def tSTRi : // A8.6.192 - T1pIEncodeImm<0b0110, 0, (outs), (ins tGPR:$src, t_addrmode_s4:$addr), - AddrModeT1_4, IIC_iStore_r, - "str", "\t$src, $addr", - []>; + T1pILdStEncodeImm<0b0110, 0, (outs), (ins tGPR:$src, t_addrmode_s4:$addr), + AddrModeT1_4, IIC_iStore_r, + "str", "\t$src, $addr", + []>; def tSTRB : // A8.6.197 - T1pIEncode<0b010, (outs), (ins tGPR:$src, t_addrmode_s1:$addr), - AddrModeT1_1, IIC_iStore_bh_r, - "strb", "\t$src, $addr", - [(truncstorei8 tGPR:$src, t_addrmode_s1:$addr)]>; + T1pILdStEncode<0b010, (outs), (ins tGPR:$src, t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iStore_bh_r, + "strb", "\t$src, $addr", + [(truncstorei8 tGPR:$src, t_addrmode_s1:$addr)]>; def tSTRBi : // A8.6.195 - T1pIEncodeImm<0b0111, 0, (outs), (ins tGPR:$src, t_addrmode_s1:$addr), - AddrModeT1_1, IIC_iStore_bh_r, - "strb", "\t$src, $addr", - []>; + T1pILdStEncodeImm<0b0111, 0, (outs), (ins tGPR:$src, t_addrmode_s1:$addr), + AddrModeT1_1, IIC_iStore_bh_r, + "strb", "\t$src, $addr", + []>; def tSTRH : // A8.6.207 - T1pIEncode<0b001, (outs), (ins tGPR:$src, t_addrmode_s2:$addr), - AddrModeT1_2, IIC_iStore_bh_r, - "strh", "\t$src, $addr", - [(truncstorei16 tGPR:$src, t_addrmode_s2:$addr)]>; + T1pILdStEncode<0b001, (outs), (ins tGPR:$src, t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iStore_bh_r, + "strh", "\t$src, $addr", + [(truncstorei16 tGPR:$src, t_addrmode_s2:$addr)]>; def tSTRHi : // A8.6.205 - T1pIEncodeImm<0b1000, 0, (outs), (ins tGPR:$src, t_addrmode_s2:$addr), - AddrModeT1_2, IIC_iStore_bh_r, - "strh", "\t$src, $addr", - []>; + T1pILdStEncodeImm<0b1000, 0, (outs), (ins tGPR:$src, t_addrmode_s2:$addr), + AddrModeT1_2, IIC_iStore_bh_r, + "strh", "\t$src, $addr", + []>; def tSTRspi : T1pIs<(outs), (ins tGPR:$src, t_addrmode_sp:$addr), IIC_iStore_i, "str", "\t$src, $addr", From jvoung at google.com Tue Nov 30 19:38:58 2010 From: jvoung at google.com (Jan Wen Voung) Date: Wed, 01 Dec 2010 01:38:58 -0000 Subject: [llvm-commits] [llvm] r120525 - /llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp Message-ID: <20101201013858.8B5DE2A6C12D@llvm.org> Author: jvoung Date: Tue Nov 30 19:38:58 2010 New Revision: 120525 URL: http://llvm.org/viewvc/llvm-project?rev=120525&view=rev Log: Initialize an ARMConstantPoolValue field. Modified: llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp Modified: llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp?rev=120525&r1=120524&r2=120525&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMConstantPoolValue.cpp Tue Nov 30 19:38:58 2010 @@ -43,7 +43,7 @@ ARMCP::ARMCPModifier Modif) : MachineConstantPoolValue((const Type*)Type::getInt32Ty(gv->getContext())), CVal(gv), S(NULL), LabelId(0), Kind(ARMCP::CPValue), PCAdjust(0), - Modifier(Modif) {} + Modifier(Modif), AddCurrentAddress(false) {} const GlobalValue *ARMConstantPoolValue::getGV() const { return dyn_cast_or_null(CVal); From echristo at apple.com Tue Nov 30 19:40:24 2010 From: echristo at apple.com (Eric Christopher) Date: Wed, 01 Dec 2010 01:40:24 -0000 Subject: [llvm-commits] [llvm] r120526 - /llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Message-ID: <20101201014024.C5E962A6C12D@llvm.org> Author: echristo Date: Tue Nov 30 19:40:24 2010 New Revision: 120526 URL: http://llvm.org/viewvc/llvm-project?rev=120526&view=rev Log: Refactor load/store handling again. Simplify and make some room for reg+reg handling. Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFastISel.cpp?rev=120526&r1=120525&r2=120526&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMFastISel.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Tue Nov 30 19:40:24 2010 @@ -192,6 +192,8 @@ private: bool DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR); const MachineInstrBuilder &AddOptionalDefs(const MachineInstrBuilder &MIB); + void AddLoadStoreOperands(EVT VT, Address &Addr, + const MachineInstrBuilder &MIB); }; } // end anonymous namespace @@ -785,16 +787,52 @@ } } +void ARMFastISel::AddLoadStoreOperands(EVT VT, Address &Addr, + const MachineInstrBuilder &MIB) { + // addrmode5 output depends on the selection dag addressing dividing the + // offset by 4 that it then later multiplies. Do this here as well. + if (VT.getSimpleVT().SimpleTy == MVT::f32 || + VT.getSimpleVT().SimpleTy == MVT::f64) + Addr.Offset /= 4; + + // Frame base works a bit differently. Handle it separately. + if (Addr.BaseType == Address::FrameIndexBase) { + int FI = Addr.Base.FI; + int Offset = Addr.Offset; + MachineMemOperand *MMO = + FuncInfo.MF->getMachineMemOperand( + MachinePointerInfo::getFixedStack(FI, Offset), + MachineMemOperand::MOLoad, + MFI.getObjectSize(FI), + MFI.getObjectAlignment(FI)); + // Now add the rest of the operands. + MIB.addFrameIndex(FI); + + // ARM halfword load/stores need an additional operand. + if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) MIB.addReg(0); + + MIB.addImm(Addr.Offset); + MIB.addMemOperand(MMO); + } else { + // Now add the rest of the operands. + MIB.addReg(Addr.Base.Reg); + + // ARM halfword load/stores need an additional operand. + if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) MIB.addReg(0); + + MIB.addImm(Addr.Offset); + } + AddOptionalDefs(MIB); +} + bool ARMFastISel::ARMEmitLoad(EVT VT, unsigned &ResultReg, Address &Addr) { assert(VT.isSimple() && "Non-simple types are invalid here!"); unsigned Opc; TargetRegisterClass *RC; - bool isFloat = false; switch (VT.getSimpleVT().SimpleTy) { - default: - // This is mostly going to be Neon/vector support. - return false; + // This is mostly going to be Neon/vector support. + default: return false; case MVT::i16: Opc = isThumb ? ARM::t2LDRHi12 : ARM::LDRH; RC = ARM::GPRRegisterClass; @@ -810,55 +848,20 @@ case MVT::f32: Opc = ARM::VLDRS; RC = TLI.getRegClassFor(VT); - isFloat = true; break; case MVT::f64: Opc = ARM::VLDRD; RC = TLI.getRegClassFor(VT); - isFloat = true; break; } - - ResultReg = createResultReg(RC); - + // Simplify this down to something we can handle. ARMSimplifyAddress(Addr, VT); - // addrmode5 output depends on the selection dag addressing dividing the - // offset by 4 that it then later multiplies. Do this here as well. - if (isFloat) - Addr.Offset /= 4; - - if (Addr.BaseType == Address::FrameIndexBase) { - int FI = Addr.Base.FI; - int Offset = Addr.Offset; - MachineMemOperand *MMO = - FuncInfo.MF->getMachineMemOperand( - MachinePointerInfo::getFixedStack(FI, Offset), - MachineMemOperand::MOLoad, - MFI.getObjectSize(FI), - MFI.getObjectAlignment(FI)); - // LDRH needs an additional operand. - if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(Opc), ResultReg) - .addFrameIndex(FI).addReg(0).addImm(Offset) - .addMemOperand(MMO)); - else - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(Opc), ResultReg) - .addFrameIndex(FI).addImm(Offset).addMemOperand(MMO)); - return true; - } - - // LDRH needs an additional operand. - if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(Opc), ResultReg) - .addReg(Addr.Base.Reg).addReg(0).addImm(Addr.Offset)); - else - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(Opc), ResultReg) - .addReg(Addr.Base.Reg).addImm(Addr.Offset)); + // Create the base instruction, then add the operands. + ResultReg = createResultReg(RC); + MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, + TII.get(Opc), ResultReg); + AddLoadStoreOperands(VT, Addr, MIB); return true; } @@ -868,24 +871,20 @@ if (!isLoadTypeLegal(I->getType(), VT)) return false; - // Our register and offset with innocuous defaults. + // See if we can handle this address. Address Addr; - - // See if we can handle this as Reg + Offset - if (!ARMComputeAddress(I->getOperand(0), Addr)) - return false; + if (!ARMComputeAddress(I->getOperand(0), Addr)) return false; unsigned ResultReg; if (!ARMEmitLoad(VT, ResultReg, Addr)) return false; - UpdateValueMap(I, ResultReg); return true; } bool ARMFastISel::ARMEmitStore(EVT VT, unsigned SrcReg, Address &Addr) { unsigned StrOpc; - bool isFloat = false; switch (VT.getSimpleVT().SimpleTy) { + // This is mostly going to be Neon/vector support. default: return false; case MVT::i1: { unsigned Res = createResultReg(isThumb ? ARM::tGPRRegisterClass : @@ -908,58 +907,20 @@ case MVT::f32: if (!Subtarget->hasVFP2()) return false; StrOpc = ARM::VSTRS; - isFloat = true; break; case MVT::f64: if (!Subtarget->hasVFP2()) return false; StrOpc = ARM::VSTRD; - isFloat = true; break; } - + // Simplify this down to something we can handle. ARMSimplifyAddress(Addr, VT); - // addrmode5 output depends on the selection dag addressing dividing the - // offset by 4 that it then later multiplies. Do this here as well. - if (isFloat) - Addr.Offset /= 4; - - if (Addr.BaseType == Address::FrameIndexBase) { - int FI = Addr.Base.FI; - int Offset = Addr.Offset; - MachineMemOperand *MMO = - FuncInfo.MF->getMachineMemOperand( - MachinePointerInfo::getFixedStack(FI, Offset), - MachineMemOperand::MOLoad, - MFI.getObjectSize(FI), - MFI.getObjectAlignment(FI)); - // ARM::STRH needs an additional operand. - if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(StrOpc)) - .addReg(SrcReg, getKillRegState(true)) - .addFrameIndex(FI).addReg(0).addImm(Offset) - .addMemOperand(MMO)); - else - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(StrOpc)) - .addReg(SrcReg, getKillRegState(true)) - .addFrameIndex(FI).addImm(Offset).addMemOperand(MMO)); - - return true; - } - - // ARM::STRH needs an additional operand. - if (!isThumb && VT.getSimpleVT().SimpleTy == MVT::i16) - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(StrOpc)) - .addReg(SrcReg).addReg(Addr.Base.Reg) - .addReg(0).addImm(Addr.Offset)); - else - AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, - TII.get(StrOpc)) - .addReg(SrcReg).addReg(Addr.Base.Reg).addImm(Addr.Offset)); - + // Create the base instruction, then add the operands. + MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, + TII.get(StrOpc)) + .addReg(SrcReg, getKillRegState(true)); + AddLoadStoreOperands(VT, Addr, MIB); return true; } @@ -967,25 +928,21 @@ Value *Op0 = I->getOperand(0); unsigned SrcReg = 0; - // Yay type legalization + // Verify we have a legal type before going any further. MVT VT; if (!isLoadTypeLegal(I->getOperand(0)->getType(), VT)) return false; // Get the value to be stored into a register. SrcReg = getRegForValue(Op0); - if (SrcReg == 0) - return false; + if (SrcReg == 0) return false; - // Our register and offset with innocuous defaults. + // See if we can handle this address. Address Addr; - - // See if we can handle this as Reg + Offset if (!ARMComputeAddress(I->getOperand(1), Addr)) return false; if (!ARMEmitStore(VT, SrcReg, Addr)) return false; - return true; } From aggarwa4 at illinois.edu Tue Nov 30 20:03:41 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Wed, 01 Dec 2010 02:03:41 -0000 Subject: [llvm-commits] [poolalloc] r120529 - /poolalloc/trunk/lib/DSA/DSGraph.cpp Message-ID: <20101201020341.195892A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 20:03:40 2010 New Revision: 120529 URL: http://llvm.org/viewvc/llvm-project?rev=120529&view=rev Log: Comments added. No functionality changes. Modified: poolalloc/trunk/lib/DSA/DSGraph.cpp Modified: poolalloc/trunk/lib/DSA/DSGraph.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/DSGraph.cpp?rev=120529&r1=120528&r2=120529&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/DSGraph.cpp (original) +++ poolalloc/trunk/lib/DSA/DSGraph.cpp Tue Nov 30 20:03:40 2010 @@ -1102,6 +1102,8 @@ // from the caller's graph entirely. This is only appropriate to use when // inlining graphs. // +// This function also clones information about globals back into the globals +// graph before it deletes the nodes. void DSGraph::removeDeadNodes(unsigned Flags) { DEBUG(AssertGraphOK(); if (GlobalsGraph) GlobalsGraph->AssertGraphOK()); @@ -1118,10 +1120,14 @@ // Copy and merge all information about globals to the GlobalsGraph if this is // not a final pass (where unreachable globals are removed). // - // Strip all alloca bits since the current function is only for the BU pass. + // Strip all alloca bits since we are merging information into the globals + // graph. // Strip all incomplete bits since they are short-lived properties and they // will be correctly computed when rematerializing nodes into the functions. // + // This code merges information learned about the globals in 'this' graph + // back into the globals graph, before it deletes any such global nodes, + // (with some new information possibly) from 'this' current function graph. ReachabilityCloner GGCloner(GlobalsGraph, this, DSGraph::StripAllocaBit | DSGraph::StripIncompleteBit); From dpatel at apple.com Tue Nov 30 20:12:04 2010 From: dpatel at apple.com (Devang Patel) Date: Tue, 30 Nov 2010 18:12:04 -0800 Subject: [llvm-commits] [llvm] r119613 - in /llvm/trunk: include/llvm/MC/MCAsmInfo.h lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/CodeGen/AsmPrinter/DwarfDebug.h lib/MC/MCAsmInfo.cpp lib/Target/CellSPU/SPUMCAsmInfo.cpp test/CodeGen/X86/unknown-location.ll test/DebugInfo/2010-09-16-EmptyFilename.ll In-Reply-To: <20101118020425.988862A6C12C@llvm.org> References: <20101118020425.988862A6C12C@llvm.org> Message-ID: <98994152-C6A4-4F87-8D9C-EE1572435093@apple.com> Rafael, On Nov 17, 2010, at 6:04 PM, Rafael Espindola wrote: > Author: rafael > Date: Wed Nov 17 20:04:25 2010 > New Revision: 119613 > > URL: http://llvm.org/viewvc/llvm-project?rev=119613&view=rev > Log: > Change CodeGen to use .loc directives. This produces a lot more readable output > and testing is easier. A good example is the unknown-location.ll test that > now can just look for ".loc 1 0 0". We also don't use a DW_LNE_set_address for > every address change anymore. > > Modified: > llvm/trunk/include/llvm/MC/MCAsmInfo.h > llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp > llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h > llvm/trunk/lib/MC/MCAsmInfo.cpp > llvm/trunk/lib/Target/CellSPU/SPUMCAsmInfo.cpp > llvm/trunk/test/CodeGen/X86/unknown-location.ll > llvm/trunk/test/DebugInfo/2010-09-16-EmptyFilename.ll > > Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=119613&r1=119612&r2=119613&view=diff > ============================================================================== > --- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original) > +++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Wed Nov 17 20:04:25 2010 > @@ -237,10 +237,6 @@ > /// HasLEB128 - True if target asm supports leb128 directives. > bool HasLEB128; // Defaults to false. > > - /// hasDotLocAndDotFile - True if target asm supports .loc and .file > - /// directives for emitting debugging information. > - bool HasDotLocAndDotFile; // Defaults to false. > - > /// SupportsDebugInformation - True if target supports emission of debugging > /// information. > bool SupportsDebugInformation; // Defaults to false. > @@ -410,9 +406,6 @@ > bool hasLEB128() const { > return HasLEB128; > } > - bool hasDotLocAndDotFile() const { > - return HasDotLocAndDotFile; > - } > bool doesSupportDebugInformation() const { > return SupportsDebugInformation; > } > > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=119613&r1=119612&r2=119613&view=diff > ============================================================================== > --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original) > +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Nov 17 20:04:25 2010 > @@ -514,8 +514,7 @@ > unsigned Line = V.getLineNumber(); > if (Line == 0) > return; > - unsigned FileID = GetOrCreateSourceID(V.getContext().getDirectory(), > - V.getContext().getFilename()); > + unsigned FileID = GetOrCreateSourceID(V.getContext().getFilename()); > assert(FileID && "Invalid file id"); > addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); > addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); You are dropping directory name here and everywhere else. Is it not needed anymore ? - Devang -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101130/61988ab1/attachment.html From dpatel at apple.com Tue Nov 30 20:16:54 2010 From: dpatel at apple.com (Devang Patel) Date: Tue, 30 Nov 2010 18:16:54 -0800 Subject: [llvm-commits] [llvm] r119777 - in /llvm/trunk: include/llvm/MC/MCDwarf.h include/llvm/MC/MCStreamer.h include/llvm/Target/TargetMachine.h lib/CodeGen/LLVMTargetMachine.cpp lib/MC/MCAsmStreamer.cpp lib/MC/MCDwarf.cpp lib/MC/MCELFStreamer.cpp lib/MC/MCMachOStreamer.cpp lib/Target/TargetMachine.cpp In-Reply-To: <20101119022617.0DB782A6C12C@llvm.org> References: <20101119022617.0DB782A6C12C@llvm.org> Message-ID: <18511615-55D4-4FD8-B9C2-EADBA998C0FE@apple.com> On Nov 18, 2010, at 6:26 PM, Rafael Espindola wrote: > Author: rafael > Date: Thu Nov 18 20:26:16 2010 > New Revision: 119777 > > URL: http://llvm.org/viewvc/llvm-project?rev=119777&view=rev > Log: > Change some methods in MCDwarf.cpp to be able to handle an arbitrary > MCStreamer instead of just MCObjectStreamer. Address changes cannot > be as efficient as we have to use DW_LNE_set_addres, but at least > most of the logic is shared. > > This will be used so that, with CodeGen still using EmitDwarfLocDirective, > llvm-gcc is able to produce debug_line sections without needing an > assembler that supports .loc. This means debug_line section entries do not have comments. We need these comments to debug line table bugs. How are you going to address this ? Right now I am debugging a regression caused by related patches in .debug_line output and it is very difficult to investigate with comments in assembly output. - Devang From aggarwa4 at illinois.edu Tue Nov 30 20:24:33 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Wed, 01 Dec 2010 02:24:33 -0000 Subject: [llvm-commits] [poolalloc] r120531 - /poolalloc/trunk/lib/DSA/Local.cpp Message-ID: <20101201022433.A47CF2A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 20:24:33 2010 New Revision: 120531 URL: http://llvm.org/viewvc/llvm-project?rev=120531&view=rev Log: Remove redundant code. Use iterator for iterating over scalar map. Modified: poolalloc/trunk/lib/DSA/Local.cpp Modified: poolalloc/trunk/lib/DSA/Local.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/Local.cpp?rev=120531&r1=120530&r2=120531&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/Local.cpp (original) +++ poolalloc/trunk/lib/DSA/Local.cpp Tue Nov 30 20:24:33 2010 @@ -44,7 +44,6 @@ STATISTIC(NumDirectCall, "Number of direct calls added"); STATISTIC(NumIndirectCall, "Number of indirect calls added"); STATISTIC(NumAsmCall, "Number of asm calls collapsed/seen"); -//STATISTIC(NumBoringCall, "Number of pointer-free direct calls ignored"); STATISTIC(NumIntrinsicCall, "Number of intrinsics called"); RegisterPass @@ -169,15 +168,14 @@ // Only merge info for nodes that already exist in the local pass // otherwise leaf functions could contain less collapsing than the globals // graph - if (g.getScalarMap().global_begin() != g.getScalarMap().global_end()) { + if (g.getScalarMap().global_begin() != g.getScalarMap().global_end()) { ReachabilityCloner RC(&g, g.getGlobalsGraph(), 0); - std::vector GVV(g.getScalarMap().global_begin(), - g.getScalarMap().global_end()); - for (std::vector::iterator I = GVV.begin(); - I != GVV.end(); ++I) + for (DSScalarMap::global_iterator I = g.getScalarMap().global_begin(), + E = g.getScalarMap().global_end(); I != E; ++I) { if (const GlobalVariable * GV = dyn_cast (*I)) if (GV->isConstant()) RC.merge(g.getNodeForValue(GV), g.getGlobalsGraph()->getNodeForValue(GV)); + } } g.markIncompleteNodes(DSGraph::MarkFormalArgs); @@ -941,13 +939,6 @@ return; } - //Removed so that call graph is correct. Keep information about call sites. - //uninteresting direct call - /*if (isa(Callee) && !DSCallGraph::hasPointers(CS)) { - ++NumBoringCall; - return; - }*/ - // Set up the return value... DSNodeHandle RetVal; Instruction *I = CS.getInstruction(); @@ -969,7 +960,6 @@ // local it's possible that we need to create a DSNode for the argument, as // opposed to getNodeForValue which simply retrieves the existing node. - // FIXME: refactor so we don't have this duplication. //Get the FunctionType for the called function const FunctionType *CalleeFuncType = DSCallSite::FunctionTypeOfCallSite(CS); From isanbard at gmail.com Tue Nov 30 20:28:08 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 02:28:08 -0000 Subject: [llvm-commits] [llvm] r120532 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101201022808.B0DC32A6C12D@llvm.org> Author: void Date: Tue Nov 30 20:28:08 2010 New Revision: 120532 URL: http://llvm.org/viewvc/llvm-project?rev=120532&view=rev Log: More refactoring. This time the T1pI pattern. Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120532&r1=120531&r2=120532&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 20:28:08 2010 @@ -708,6 +708,26 @@ // Arithmetic Instructions. // +// Helper classes for encoding T1pI patterns: +class T1pIDPEncode opA, dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T1pI, + T1DataProcessing { + bits<3> Rm; + bits<3> Rn; + let Inst{5-3} = Rm; + let Inst{2-0} = Rn; +} +class T1pIMiscEncode opA, dag oops, dag iops, InstrItinClass itin, + string opc, string asm, list pattern> + : T1pI, + T1Misc { + bits<3> Rm; + bits<3> Rd; + let Inst{5-3} = Rm; + let Inst{2-0} = Rd; +} + // Helper classes for encoding T1sI patterns: class T1sIDPEncode opA, dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> @@ -841,17 +861,14 @@ // "cmn", "\t$lhs, $rhs", // [(ARMcmp tGPR:$lhs, (ineg tGPR:$rhs))]>, // T1DataProcessing<0b1011>; -def tCMNz : T1pI<(outs), (ins tGPR:$Rn, tGPR:$Rm), IIC_iCMPr, - "cmn", "\t$Rn, $Rm", - [(ARMcmpZ tGPR:$Rn, (ineg tGPR:$Rm))]>, - T1DataProcessing<0b1011> { - // A8.6.33 - bits<3> Rm; - bits<3> Rn; - let Inst{5-3} = Rm; - let Inst{2-0} = Rn; -} -} + +def tCMNz : // A8.6.33 + T1pIDPEncode<0b1011, (outs), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iCMPr, + "cmn", "\t$Rn, $Rm", + [(ARMcmpZ tGPR:$Rn, (ineg tGPR:$Rm))]>; + +} // isCompare = 1, Defs = [CPSR] // CMP immediate let isCompare = 1, Defs = [CPSR] in { @@ -877,26 +894,16 @@ } // CMP register -def tCMPr : T1pI<(outs), (ins tGPR:$Rn, tGPR:$Rm), IIC_iCMPr, - "cmp", "\t$Rn, $Rm", - [(ARMcmp tGPR:$Rn, tGPR:$Rm)]>, - T1DataProcessing<0b1010> { - // A8.6.36 T1 - bits<3> Rm; - bits<3> Rn; - let Inst{5-3} = Rm; - let Inst{2-0} = Rn; -} -def tCMPzr : T1pI<(outs), (ins tGPR:$Rn, tGPR:$Rm), IIC_iCMPr, - "cmp", "\t$Rn, $Rm", - [(ARMcmpZ tGPR:$Rn, tGPR:$Rm)]>, - T1DataProcessing<0b1010> { - // A8.6.36 T1 - bits<3> Rm; - bits<3> Rn; - let Inst{5-3} = Rm; - let Inst{2-0} = Rn; -} +def tCMPr : // A8.6.36 T1 + T1pIDPEncode<0b1010, (outs), (ins tGPR:$Rn, tGPR:$Rm), + IIC_iCMPr, + "cmp", "\t$Rn, $Rm", + [(ARMcmp tGPR:$Rn, tGPR:$Rm)]>; + +def tCMPzr : // A8.6.36 T1 + T1pIDPEncode<0b1010, (outs), (ins tGPR:$Rn, tGPR:$Rm), IIC_iCMPr, + "cmp", "\t$Rn, $Rm", + [(ARMcmpZ tGPR:$Rn, tGPR:$Rm)]>; def tCMPhir : T1pI<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_iCMPr, "cmp", "\t$Rn, $Rm", []>, @@ -1025,48 +1032,33 @@ [(set tGPR:$Rdn, (or tGPR:$Rn, tGPR:$Rm))]>; // Swaps -def tREV : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, - "rev", "\t$Rd, $Rm", - [(set tGPR:$Rd, (bswap tGPR:$Rm))]>, - Requires<[IsThumb, IsThumb1Only, HasV6]>, - T1Misc<{1,0,1,0,0,0,?}> { - // A8.6.134 - bits<3> Rm; - bits<3> Rd; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} - -def tREV16 : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, - "rev16", "\t$Rd, $Rm", +def tREV : // A8.6.134 + T1pIMiscEncode<{1,0,1,0,0,0,?}, (outs tGPR:$Rd), (ins tGPR:$Rm), + IIC_iUNAr, + "rev", "\t$Rd, $Rm", + [(set tGPR:$Rd, (bswap tGPR:$Rm))]>, + Requires<[IsThumb, IsThumb1Only, HasV6]>; + +def tREV16 : // A8.6.135 + T1pIMiscEncode<{1,0,1,0,0,1,?}, (outs tGPR:$Rd), (ins tGPR:$Rm), + IIC_iUNAr, + "rev16", "\t$Rd, $Rm", [(set tGPR:$Rd, (or (and (srl tGPR:$Rm, (i32 8)), 0xFF), (or (and (shl tGPR:$Rm, (i32 8)), 0xFF00), (or (and (srl tGPR:$Rm, (i32 8)), 0xFF0000), (and (shl tGPR:$Rm, (i32 8)), 0xFF000000)))))]>, - Requires<[IsThumb, IsThumb1Only, HasV6]>, - T1Misc<{1,0,1,0,0,1,?}> { - // A8.6.135 - bits<3> Rm; - bits<3> Rd; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} + Requires<[IsThumb, IsThumb1Only, HasV6]>; -def tREVSH : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, - "revsh", "\t$Rd, $Rm", - [(set tGPR:$Rd, - (sext_inreg - (or (srl (and tGPR:$Rm, 0xFF00), (i32 8)), - (shl tGPR:$Rm, (i32 8))), i16))]>, - Requires<[IsThumb, IsThumb1Only, HasV6]>, - T1Misc<{1,0,1,0,1,1,?}> { - // A8.6.136 - bits<3> Rm; - bits<3> Rd; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} +def tREVSH : // A8.6.136 + T1pIMiscEncode<{1,0,1,0,1,1,?}, (outs tGPR:$Rd), (ins tGPR:$Rm), + IIC_iUNAr, + "revsh", "\t$Rd, $Rm", + [(set tGPR:$Rd, + (sext_inreg + (or (srl (and tGPR:$Rm, 0xFF00), (i32 8)), + (shl tGPR:$Rm, (i32 8))), i16))]>, + Requires<[IsThumb, IsThumb1Only, HasV6]>; // Rotate right register def tROR : // A8.6.139 @@ -1116,70 +1108,43 @@ // TODO: A7-96: STMIA - store multiple. // Sign-extend byte -def tSXTB : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, - "sxtb", "\t$Rd, $Rm", - [(set tGPR:$Rd, (sext_inreg tGPR:$Rm, i8))]>, - Requires<[IsThumb, IsThumb1Only, HasV6]>, - T1Misc<{0,0,1,0,0,1,?}> { - // A8.6.222 - bits<3> Rm; - bits<3> Rd; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} - -// sign-extend short -def tSXTH : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, - "sxth", "\t$Rd, $Rm", - [(set tGPR:$Rd, (sext_inreg tGPR:$Rm, i16))]>, - Requires<[IsThumb, IsThumb1Only, HasV6]>, - T1Misc<{0,0,1,0,0,0,?}> { - // A8.6.224 - bits<3> Rm; - bits<3> Rd; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} +def tSXTB : // A8.6.222 + T1pIMiscEncode<{0,0,1,0,0,1,?}, (outs tGPR:$Rd), (ins tGPR:$Rm), + IIC_iUNAr, + "sxtb", "\t$Rd, $Rm", + [(set tGPR:$Rd, (sext_inreg tGPR:$Rm, i8))]>, + Requires<[IsThumb, IsThumb1Only, HasV6]>; + +// Sign-extend short +def tSXTH : // A8.6.224 + T1pIMiscEncode<{0,0,1,0,0,0,?}, (outs tGPR:$Rd), (ins tGPR:$Rm), + IIC_iUNAr, + "sxth", "\t$Rd, $Rm", + [(set tGPR:$Rd, (sext_inreg tGPR:$Rm, i16))]>, + Requires<[IsThumb, IsThumb1Only, HasV6]>; -// test +// Test let isCompare = 1, isCommutable = 1, Defs = [CPSR] in -def tTST : T1pI<(outs), (ins tGPR:$Rn, tGPR:$Rm), IIC_iTSTr, - "tst", "\t$Rn, $Rm", - [(ARMcmpZ (and_su tGPR:$Rn, tGPR:$Rm), 0)]>, - T1DataProcessing<0b1000> { - // A8.6.230 - bits<3> Rm; - bits<3> Rn; - let Inst{5-3} = Rm; - let Inst{2-0} = Rn; -} - -// zero-extend byte -def tUXTB : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, - "uxtb", "\t$Rd, $Rm", - [(set tGPR:$Rd, (and tGPR:$Rm, 0xFF))]>, - Requires<[IsThumb, IsThumb1Only, HasV6]>, - T1Misc<{0,0,1,0,1,1,?}> { - // A8.6.262 - bits<3> Rm; - bits<3> Rd; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} - -// zero-extend short -def tUXTH : T1pI<(outs tGPR:$Rd), (ins tGPR:$Rm), IIC_iUNAr, - "uxth", "\t$Rd, $Rm", - [(set tGPR:$Rd, (and tGPR:$Rm, 0xFFFF))]>, - Requires<[IsThumb, IsThumb1Only, HasV6]>, - T1Misc<{0,0,1,0,1,0,?}> { - // A8.6.264 - bits<3> Rm; - bits<3> Rd; - let Inst{5-3} = Rm; - let Inst{2-0} = Rd; -} - +def tTST : // A8.6.230 + T1pIDPEncode<0b1000, (outs), (ins tGPR:$Rn, tGPR:$Rm), IIC_iTSTr, + "tst", "\t$Rn, $Rm", + [(ARMcmpZ (and_su tGPR:$Rn, tGPR:$Rm), 0)]>; + +// Zero-extend byte +def tUXTB : // A8.6.262 + T1pIMiscEncode<{0,0,1,0,1,1,?}, (outs tGPR:$Rd), (ins tGPR:$Rm), + IIC_iUNAr, + "uxtb", "\t$Rd, $Rm", + [(set tGPR:$Rd, (and tGPR:$Rm, 0xFF))]>, + Requires<[IsThumb, IsThumb1Only, HasV6]>; + +// Zero-extend short +def tUXTH : // A8.6.264 + T1pIMiscEncode<{0,0,1,0,1,0,?}, (outs tGPR:$Rd), (ins tGPR:$Rm), + IIC_iUNAr, + "uxth", "\t$Rd, $Rm", + [(set tGPR:$Rd, (and tGPR:$Rm, 0xFFFF))]>, + Requires<[IsThumb, IsThumb1Only, HasV6]>; // Conditional move tMOVCCr - Used to implement the Thumb SELECT_CC operation. // Expanded after instruction selection into a branch sequence. From isanbard at gmail.com Tue Nov 30 20:36:55 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 02:36:55 -0000 Subject: [llvm-commits] [llvm] r120533 - /llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Message-ID: <20101201023655.DCB972A6C12D@llvm.org> Author: void Date: Tue Nov 30 20:36:55 2010 New Revision: 120533 URL: http://llvm.org/viewvc/llvm-project?rev=120533&view=rev Log: Formatting. It's all the rage! Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=120533&r1=120532&r2=120533&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Tue Nov 30 20:36:55 2010 @@ -1,4 +1,4 @@ -//===- ARMInstrThumb.td - Thumb support for ARM ---------------------------===// +//===- ARMInstrThumb.td - Thumb support for ARM ------------*- tablegen -*-===// // // The LLVM Compiler Infrastructure // @@ -50,9 +50,9 @@ return Val >= 8 && Val < 256; }], imm_neg_XFORM>; -// Break imm's up into two pieces: an immediate + a left shift. -// This uses thumb_immshifted to match and thumb_immshifted_val and -// thumb_immshifted_shamt to get the val/shift pieces. +// Break imm's up into two pieces: an immediate + a left shift. This uses +// thumb_immshifted to match and thumb_immshifted_val and thumb_immshifted_shamt +// to get the val/shift pieces. def thumb_immshifted : PatLeaf<(imm), [{ return ARM_AM::isThumbImmShiftedVal((unsigned)N->getZExtValue()); }]>; @@ -208,10 +208,11 @@ // Change Processor State is a system instruction -- for disassembly only. // The singleton $opt operand contains the following information: -// opt{4-0} = mode ==> don't care -// opt{5} = changemode ==> 0 (false for 16-bit Thumb instr) -// opt{8-6} = AIF from Inst{2-0} -// opt{10-9} = 1:imod from Inst{4} with 0b10 as enable and 0b11 as disable +// +// opt{4-0} = mode ==> don't care +// opt{5} = changemode ==> 0 (false for 16-bit Thumb instr) +// opt{8-6} = AIF from Inst{2-0} +// opt{10-9} = 1:imod from Inst{4} with 0b10 as enable and 0b11 as disable // // The opt{4-0} and opt{5} sub-fields are to accommodate 32-bit Thumb and ARM // CPS which has more options. @@ -351,9 +352,9 @@ let Inst{7-0} = regs{7-0}; } -// All calls clobber the non-callee saved registers. SP is marked as -// a use to prevent stack-pointer assignments that appear immediately -// before calls from potentially appearing dead. +// All calls clobber the non-callee saved registers. SP is marked as a use to +// prevent stack-pointer assignments that appear immediately before calls from +// potentially appearing dead. let isCall = 1, // On non-Darwin platforms R9 is callee-saved. Defs = [R0, R1, R2, R3, R12, LR, @@ -435,12 +436,11 @@ Requires<[IsThumb, IsThumb1Only, IsDarwin]>; } -let isBranch = 1, isTerminator = 1 in { - let isBarrier = 1 in { - let isPredicable = 1 in - def tB : T1I<(outs), (ins brtarget:$target), IIC_Br, - "b\t$target", [(br bb:$target)]>, - T1Encoding<{1,1,1,0,0,?}>; +let isBranch = 1, isTerminator = 1, isBarrier = 1 in { + let isPredicable = 1 in + def tB : T1I<(outs), (ins brtarget:$target), IIC_Br, + "b\t$target", [(br bb:$target)]>, + T1Encoding<{1,1,1,0,0,?}>; // Far jump let Defs = [LR] in @@ -453,7 +453,6 @@ [(ARMbrjt tGPR:$target, tjumptable:$jt, imm:$id)]> { list Predicates = [IsThumb, IsThumb1Only]; } - } } // FIXME: should be able to write a pattern for ARMBrcond, but can't use @@ -857,10 +856,11 @@ let isCompare = 1, Defs = [CPSR] in { //FIXME: Disable CMN, as CCodes are backwards from compare expectations // Compare-to-zero still works out, just not the relationals -//def tCMN : T1pI<(outs), (ins tGPR:$lhs, tGPR:$rhs), IIC_iCMPr, -// "cmn", "\t$lhs, $rhs", -// [(ARMcmp tGPR:$lhs, (ineg tGPR:$rhs))]>, -// T1DataProcessing<0b1011>; +//def tCMN : // A8.6.33 +// T1pIDPEncode<0b1011, (outs), (ins tGPR:$lhs, tGPR:$rhs), +// IIC_iCMPr, +// "cmn", "\t$lhs, $rhs", +// [(ARMcmp tGPR:$lhs, (ineg tGPR:$rhs))]>; def tCMNz : // A8.6.33 T1pIDPEncode<0b1011, (outs), (ins tGPR:$Rn, tGPR:$Rm), @@ -1009,7 +1009,7 @@ T1Special<{1,0,?,?}>; } // neverHasSideEffects -// multiply register +// Multiply register let isCommutable = 1 in def tMUL : // A8.6.105 T1 T1sItDPEncode<0b1101, (outs tGPR:$Rdn), (ins tGPR:$Rn, tGPR:$Rm), @@ -1214,18 +1214,20 @@ let Inst = 0xf7fffffe; } +//===----------------------------------------------------------------------===// // SJLJ Exception handling intrinsics -// eh_sjlj_setjmp() is an instruction sequence to store the return -// address and save #0 in R0 for the non-longjmp case. -// Since by its nature we may be coming from some other function to get -// here, and we're using the stack frame for the containing function to -// save/restore registers, we can't keep anything live in regs across -// the eh_sjlj_setjmp(), else it will almost certainly have been tromped upon -// when we get here from a longjmp(). We force everthing out of registers -// except for our own input by listing the relevant registers in Defs. By -// doing so, we also cause the prologue/epilogue code to actively preserve -// all of the callee-saved resgisters, which is exactly what we want. -// $val is a scratch register for our use. +// + +// eh_sjlj_setjmp() is an instruction sequence to store the return address and +// save #0 in R0 for the non-longjmp case. Since by its nature we may be coming +// from some other function to get here, and we're using the stack frame for the +// containing function to save/restore registers, we can't keep anything live in +// regs across the eh_sjlj_setjmp(), else it will almost certainly have been +// tromped upon when we get here from a longjmp(). We force everthing out of +// registers except for our own input by listing the relevant registers in +// Defs. By doing so, we also cause the prologue/epilogue code to actively +// preserve all of the callee-saved resgisters, which is exactly what we want. +// $val is a scratch register for our use. let Defs = [ R0, R1, R2, R3, R4, R5, R6, R7, R12 ], hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in def tInt_eh_sjlj_setjmp : ThumbXI<(outs),(ins tGPR:$src, tGPR:$val), @@ -1324,7 +1326,7 @@ // scheduling. let isReMaterializable = 1 in def tLDRpci_pic : PseudoInst<(outs GPR:$dst), (ins i32imm:$addr, pclabel:$cp), - NoItinerary, + NoItinerary, [(set GPR:$dst, (ARMpic_add (load (ARMWrapper tconstpool:$addr)), imm:$cp))]>, Requires<[IsThumb, IsThumb1Only]>; From jason.w.kim.2009 at gmail.com Tue Nov 30 20:40:06 2010 From: jason.w.kim.2009 at gmail.com (Jason W Kim) Date: Wed, 01 Dec 2010 02:40:06 -0000 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll Message-ID: <20101201024006.7234C2A6C12D@llvm.org> Author: jasonwkim Date: Tue Nov 30 20:40:06 2010 New Revision: 120534 URL: http://llvm.org/viewvc/llvm-project?rev=120534&view=rev Log: ARM/MC/ELF relocation "hello world" for movw/movt. Lifted adjustFixupValue() from Darwin for sharing w ELF. Test added TODO: refactor ELFObjectWriter::RecordRelocation more. Possibly share more code with Darwin? Lots more relocations... Added: llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=120534&r1=120533&r2=120534&view=diff ============================================================================== --- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original) +++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Tue Nov 30 20:40:06 2010 @@ -396,6 +396,10 @@ const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue); + protected: + // Fixme: pull up to ELFObjectWriter + unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, + bool IsPCRel); private: static bool isFixupKindPCRel(unsigned Kind) { switch (Kind) { @@ -1434,13 +1438,105 @@ ARMELFObjectWriter::~ARMELFObjectWriter() {} +unsigned ARMELFObjectWriter::GetRelocType(const MCValue &Target, + const MCFixup &Fixup, + bool IsPCRel) { + MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ? + MCSymbolRefExpr::VK_None : Target.getSymA()->getKind(); + + if (IsPCRel) { + switch (Modifier) { + default: assert(0 && "Unimplemented Modifier"); + case MCSymbolRefExpr::VK_None: break; + } + switch ((unsigned)Fixup.getKind()) { + default: assert(0 && "Unimplemented"); + case ARM::fixup_arm_branch: return ELF::R_ARM_CALL; break; + } + } else { + switch ((unsigned)Fixup.getKind()) { + default: llvm_unreachable("invalid fixup kind!"); + case ARM::fixup_arm_pcrel_12: + case ARM::fixup_arm_vfp_pcrel_12: + assert(0 && "Unimplemented"); break; + case ARM::fixup_arm_branch: + return ELF::R_ARM_CALL; break; + case ARM::fixup_arm_movt_hi16: + return ELF::R_ARM_MOVT_ABS; break; + case ARM::fixup_arm_movw_lo16: + return ELF::R_ARM_MOVW_ABS_NC; break; + } + } + + if (RelocNeedsGOT(Modifier)) + NeedsGOT = true; + return -1; +} + void ARMELFObjectWriter::RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue) { - assert(0 && "ARMELFObjectWriter::RecordRelocation() unimplemented"); + int64_t Addend = 0; + int Index = 0; + int64_t Value = Target.getConstant(); + const MCSymbol *RelocSymbol = NULL; + + bool IsPCRel = isFixupKindPCRel(Fixup.getKind()); + if (!Target.isAbsolute()) { + const MCSymbol &Symbol = Target.getSymA()->getSymbol(); + const MCSymbol &ASymbol = Symbol.AliasedSymbol(); + RelocSymbol = SymbolToReloc(Asm, Target, *Fragment); + + if (const MCSymbolRefExpr *RefB = Target.getSymB()) { + const MCSymbol &SymbolB = RefB->getSymbol(); + MCSymbolData &SDB = Asm.getSymbolData(SymbolB); + IsPCRel = true; + MCSectionData *Sec = Fragment->getParent(); + + // Offset of the symbol in the section + int64_t a = Layout.getSymbolAddress(&SDB) - Layout.getSectionAddress(Sec); + + // Ofeset of the relocation in the section + int64_t b = Layout.getFragmentOffset(Fragment) + Fixup.getOffset(); + Value += b - a; + } + + if (!RelocSymbol) { + MCSymbolData &SD = Asm.getSymbolData(ASymbol); + MCFragment *F = SD.getFragment(); + + Index = F->getParent()->getOrdinal() + 1; + + MCSectionData *FSD = F->getParent(); + // Offset of the symbol in the section + Value += Layout.getSymbolAddress(&SD) - Layout.getSectionAddress(FSD); + } else { + if (Asm.getSymbolData(Symbol).getFlags() & ELF_Other_Weakref) + WeakrefUsedInReloc.insert(RelocSymbol); + else + UsedInReloc.insert(RelocSymbol); + Index = -1; + } + Addend = Value; + // Compensate for the addend on i386. + if (Is64Bit) + Value = 0; + } + + FixedValue = Value; + + // determine the type of the relocation + unsigned Type = GetRelocType(Target, Fixup, IsPCRel); + + uint64_t RelocOffset = Layout.getFragmentOffset(Fragment) + + Fixup.getOffset(); + + if (!HasRelocationAddend) Addend = 0; + ELFRelocationEntry ERE(RelocOffset, Index, Type, RelocSymbol, Addend); + Relocations[Fragment->getParent()].push_back(ERE); } //===- MBlazeELFObjectWriter -------------------------------------------===// Modified: llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp?rev=120534&r1=120533&r2=120534&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp Tue Nov 30 20:40:06 2010 @@ -38,6 +38,48 @@ unsigned getPointerSize() const { return 4; } + +protected: + static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { + switch (Kind) { + default: + llvm_unreachable("Unknown fixup kind!"); + case FK_Data_4: + case ARM::fixup_arm_movt_hi16: + case ARM::fixup_arm_movw_lo16: + return Value; + case ARM::fixup_arm_pcrel_12: { + bool isAdd = true; + // ARM PC-relative values are offset by 8. + Value -= 8; + if ((int64_t)Value < 0) { + Value = -Value; + isAdd = false; + } + assert ((Value < 4096) && "Out of range pc-relative fixup value!"); + Value |= isAdd << 23; + return Value; + } + case ARM::fixup_arm_branch: + // These values don't encode the low two bits since they're always zero. + // Offset by 8 just as above. + return (Value - 8) >> 2; + case ARM::fixup_arm_vfp_pcrel_12: { + // Offset by 8 just as above. + Value = Value - 8; + bool isAdd = true; + if ((int64_t)Value < 0) { + Value = -Value; + isAdd = false; + } + // These values don't encode the low two bits since they're always zero. + Value >>= 2; + assert ((Value < 256) && "Out of range pc-relative fixup value!"); + Value |= isAdd << 23; + return Value; + } + } + } }; } // end anonymous namespace @@ -52,10 +94,6 @@ } bool ARMAsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const { -// if ((Count % 4) != 0) { -// // Fixme: % 2 for Thumb? -// return false; -// } // FIXME: Zero fill for now. That's not right, but at least will get the // section size right. for (uint64_t i = 0; i != Count; ++i) @@ -94,7 +132,39 @@ // Fixme: can we raise this to share code between Darwin and ELF? void ELFARMAsmBackend::ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF, uint64_t Value) const { - assert(0 && "ELFARMAsmBackend::ApplyFixup() unimplemented"); + uint32_t Mask = 0; + // Fixme: 2 for Thumb + int NumBytes = 4; + Value = adjustFixupValue(Fixup.getKind(), Value); + + switch (Fixup.getKind()) { + default: assert(0 && "Unsupported Fixup kind"); break; + case ARM::fixup_arm_branch: { + unsigned Lo24 = Value & 0xFFFFFF; + Mask = ~(0xFFFFFF); + Value = Lo24; + }; break; + case ARM::fixup_arm_movt_hi16: + case ARM::fixup_arm_movw_lo16: { + unsigned Hi4 = (Value & 0xF000) >> 12; + unsigned Lo12 = Value & 0x0FFF; + // inst{19-16} = Hi4; + // inst{11-0} = Lo12; + Value = (Hi4 << 16) | (Lo12); + Mask = ~(0xF0FFF); + }; break; + } + + assert((Fixup.getOffset() % NumBytes == 0) + && "Offset mod NumBytes is nonzero!"); + // For each byte of the fragment that the fixup touches, mask in the + // bits from the fixup value. + // The Value has been "split up" into the appropriate bitfields above. + // Fixme: how to share code with the .td generated code? + for (unsigned i = 0; i != NumBytes; ++i) { + DF.getContents()[Fixup.getOffset() + i] &= uint8_t(Mask >> (i * 8)); + DF.getContents()[Fixup.getOffset() + i] |= uint8_t(Value >> (i * 8)); + } } namespace { @@ -137,45 +207,6 @@ } } -static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { - switch (Kind) { - default: - llvm_unreachable("Unknown fixup kind!"); - case FK_Data_4: - return Value; - case ARM::fixup_arm_pcrel_12: { - bool isAdd = true; - // ARM PC-relative values are offset by 8. - Value -= 8; - if ((int64_t)Value < 0) { - Value = -Value; - isAdd = false; - } - assert ((Value < 4096) && "Out of range pc-relative fixup value!"); - Value |= isAdd << 23; - return Value; - } - case ARM::fixup_arm_branch: - // These values don't encode the low two bits since they're always zero. - // Offset by 8 just as above. - return (Value - 8) >> 2; - case ARM::fixup_arm_vfp_pcrel_12: { - // Offset by 8 just as above. - Value = Value - 8; - bool isAdd = true; - if ((int64_t)Value < 0) { - Value = -Value; - isAdd = false; - } - // These values don't encode the low two bits since they're always zero. - Value >>= 2; - assert ((Value < 256) && "Out of range pc-relative fixup value!"); - Value |= isAdd << 23; - return Value; - } - } -} - void DarwinARMAsmBackend::ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF, uint64_t Value) const { unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind()); Added: llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll?rev=120534&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll (added) +++ llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll Tue Nov 30 20:40:06 2010 @@ -0,0 +1,42 @@ +; RUN: llc %s -mtriple=armv7-linux-gnueabi -arm-use-movt -filetype=obj -o - | \ +; RUN: elf-dump --dump-section-data | FileCheck -check-prefix=OBJ %s + +target triple = "armv7-none-linux-gnueabi" + + at a = external global i8 + +define arm_aapcs_vfpcc i32 @barf() nounwind { +entry: + %0 = tail call arm_aapcs_vfpcc i32 @foo(i8* @a) nounwind + ret i32 %0 +; OBJ: '.text' +; OBJ-NEXT: 'sh_type' +; OBJ-NEXT: 'sh_flags' +; OBJ-NEXT: 'sh_addr' +; OBJ-NEXT: 'sh_offset' +; OBJ-NEXT: 'sh_size' +; OBJ-NEXT: 'sh_link' +; OBJ-NEXT: 'sh_info' +; OBJ-NEXT: 'sh_addralign' +; OBJ-NEXT: 'sh_entsize' +; OBJ-NEXT: '_section_data', '00482de9 000000e3 000040e3 feffffeb 0088bde8' + +; OBJ: Relocation 0x00000000 +; OBJ-NEXT: 'r_offset', 0x00000004 +; OBJ-NEXT: 'r_sym', 0x00000007 +; OBJ-NEXT: 'r_type', 0x0000002b + +; OBJ: Relocation 0x00000001 +; OBJ-NEXT: 'r_offset', 0x00000008 +; OBJ-NEXT: 'r_sym' +; OBJ-NEXT: 'r_type', 0x0000002c + +; OBJ: # Relocation 0x00000002 +; OBJ-NEXT: 'r_offset', 0x0000000c +; OBJ-NEXT: 'r_sym', 0x00000008 +; OBJ-NEXT: 'r_type', 0x0000001c + +} + +declare arm_aapcs_vfpcc i32 @foo(i8*) + From aggarwa4 at illinois.edu Tue Nov 30 20:41:54 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Wed, 01 Dec 2010 02:41:54 -0000 Subject: [llvm-commits] [poolalloc] r120535 - in /poolalloc/trunk/lib/DSA: BottomUpClosure.cpp CompleteBottomUp.cpp DSGraph.cpp Message-ID: <20101201024154.E21D62A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 20:41:54 2010 New Revision: 120535 URL: http://llvm.org/viewvc/llvm-project?rev=120535&view=rev Log: BottomUpClosure - remove redundant code CompleteBottomUp - formatting change DSGraph - simplified the cloning to globals graph. Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp poolalloc/trunk/lib/DSA/DSGraph.cpp Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/BottomUpClosure.cpp?rev=120535&r1=120534&r2=120535&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/BottomUpClosure.cpp (original) +++ poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Tue Nov 30 20:41:54 2010 @@ -29,7 +29,6 @@ STATISTIC (MaxSCC, "Maximum SCC Size in Call Graph"); STATISTIC (NumInlines, "Number of graphs inlined"); STATISTIC (NumCallEdges, "Number of 'actual' call edges"); - STATISTIC (NumSCCMerges, "Number of SCC merges"); STATISTIC (NumIndResolved, "Number of resolved IndCalls"); STATISTIC (NumIndUnresolved, "Number of unresolved IndCalls"); STATISTIC (NumEmptyCalls, "Number of calls we know nothing about"); @@ -140,49 +139,6 @@ } // -// Method: mergeSCCs() -// -// Description: -// Create a single DSGraph for every Strongly Connected Component (SCC) in the -// callgraph. This is done by merging the DSGraphs of every function within -// each SCC. -// -void BUDataStructures::mergeSCCs() { - - for (DSCallGraph::flat_key_iterator ii = callgraph.flat_key_begin(), - ee = callgraph.flat_key_end(); ii != ee; ++ii) { - // - // External functions form their own singleton SCC. - // - if ((*ii)->isDeclaration()) continue; - - DSGraph* SCCGraph = getOrCreateGraph(*ii); - unsigned SCCSize = 1; - callgraph.assertSCCRoot(*ii); - - for (DSCallGraph::scc_iterator Fi = callgraph.scc_begin(*ii), - Fe = callgraph.scc_end(*ii); Fi != Fe; ++Fi) { - const Function* F = *Fi; - if (F->isDeclaration()) continue; - if (F == *ii) continue; - ++SCCSize; - DSGraph* NFG = getOrCreateGraph(F); - if (NFG != SCCGraph) { - ++NumSCCMerges; - // Update the Function -> DSG map. - for (DSGraph::retnodes_iterator I = NFG->retnodes_begin(), - E = NFG->retnodes_end(); I != E; ++I) - setDSGraph(*I->first, SCCGraph); - - SCCGraph->spliceFrom(NFG); - delete NFG; - } - } - if (MaxSCC < SCCSize) MaxSCC = SCCSize; - } -} - -// // Function: applyCallsiteFilter // // Description: Modified: poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp?rev=120535&r1=120534&r2=120535&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp (original) +++ poolalloc/trunk/lib/DSA/CompleteBottomUp.cpp Tue Nov 30 20:41:54 2010 @@ -57,9 +57,6 @@ buildIndirectFunctionSets(); formGlobalECs(); - - - for (Module::iterator F = M.begin(); F != M.end(); ++F) { if (!(F->isDeclaration())) { if (DSGraph * Graph = getOrCreateGraph(F)) { Modified: poolalloc/trunk/lib/DSA/DSGraph.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/DSGraph.cpp?rev=120535&r1=120534&r2=120535&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/DSGraph.cpp (original) +++ poolalloc/trunk/lib/DSA/DSGraph.cpp Tue Nov 30 20:41:54 2010 @@ -1141,11 +1141,6 @@ // Make sure that all globals are cloned over as roots. if (!(Flags & DSGraph::RemoveUnreachableGlobals) && GlobalsGraph) { - DSGraph::ScalarMapTy::iterator SMI = - GlobalsGraph->getScalarMap().find(I->first); - if (SMI != GlobalsGraph->getScalarMap().end()) - GGCloner.merge(SMI->second, I->second); - else GGCloner.getClonedNH(I->second); } } else { From isanbard at gmail.com Tue Nov 30 20:42:55 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 02:42:55 -0000 Subject: [llvm-commits] [llvm] r120536 - /llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Message-ID: <20101201024255.D78302A6C12D@llvm.org> Author: void Date: Tue Nov 30 20:42:55 2010 New Revision: 120536 URL: http://llvm.org/viewvc/llvm-project?rev=120536&view=rev Log: General cleanups of comments. Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrFormats.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrFormats.td?rev=120536&r1=120535&r2=120536&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrFormats.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrFormats.td Tue Nov 30 20:42:55 2010 @@ -1,4 +1,4 @@ -//===- ARMInstrFormats.td - ARM Instruction Formats --*- tablegen -*---------=// +//===- ARMInstrFormats.td - ARM Instruction Formats ----------*- tablegen -*-=// // // The LLVM Compiler Infrastructure // @@ -71,7 +71,7 @@ // Misc flags. -// the instruction has a Rn register operand. +// The instruction has an Rn register operand. // UnaryDP - Indicates this is a unary data processing instruction, i.e. // it doesn't have a Rn operand. class UnaryDP { bit isUnaryDataProc = 1; } @@ -135,7 +135,6 @@ def VFPNeonDomain : Domain<3>; // Instructions in both VFP & Neon domains //===----------------------------------------------------------------------===// - // ARM special operands. // @@ -185,7 +184,6 @@ } //===----------------------------------------------------------------------===// - // ARM Instruction templates. // @@ -754,12 +752,9 @@ } //===----------------------------------------------------------------------===// -// // Thumb Instruction Format Definitions. // -// TI - Thumb instruction. - class ThumbI pattern> : InstThumb { @@ -770,6 +765,7 @@ list Predicates = [IsThumb]; } +// TI - Thumb instruction. class TI pattern> : ThumbI; @@ -1297,8 +1293,8 @@ let Inst{4} = opcod5; } -// Single precision unary, if no NEON -// Same as ASuI except not available if NEON is enabled +// Single precision unary, if no NEON. Same as ASuI except not available if +// NEON is enabled. class ASuIn opcod1, bits<2> opcod2, bits<4> opcod3, bits<2> opcod4, bit opcod5, dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> @@ -1332,8 +1328,8 @@ let Inst{4} = op4; } -// Single precision binary, if no NEON -// Same as ASbI except not available if NEON is enabled +// Single precision binary, if no NEON. Same as ASbI except not available if +// NEON is enabled. class ASbIn opcod1, bits<2> opcod2, bit op6, bit op4, dag oops, dag iops, InstrItinClass itin, string opc, string asm, list pattern> From aggarwa4 at illinois.edu Tue Nov 30 20:46:18 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Wed, 01 Dec 2010 02:46:18 -0000 Subject: [llvm-commits] [poolalloc] r120537 - /poolalloc/trunk/include/dsa/DataStructure.h Message-ID: <20101201024618.E09282A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 20:46:18 2010 New Revision: 120537 URL: http://llvm.org/viewvc/llvm-project?rev=120537&view=rev Log: Removing declarations for functions no longer in use. Modified: poolalloc/trunk/include/dsa/DataStructure.h Modified: poolalloc/trunk/include/dsa/DataStructure.h URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/include/dsa/DataStructure.h?rev=120537&r1=120536&r2=120537&view=diff ============================================================================== --- poolalloc/trunk/include/dsa/DataStructure.h (original) +++ poolalloc/trunk/include/dsa/DataStructure.h Tue Nov 30 20:46:18 2010 @@ -255,19 +255,15 @@ typedef std::map TarjanMap; typedef std::vector TarjanStack; - void mergeSCCs(); void postOrderInline (Module & M); unsigned calculateGraphs (const Function *F, TarjanStack & Stack, unsigned & NextID, TarjanMap & ValMap); - DSGraph* postOrder(const Function*, - svset& marked); void calculateGraph(DSGraph* G); void CloneAuxIntoGlobal(DSGraph* G); - void finalizeGlobals(void); void getAllCallees(const DSCallSite &CS, std::vector &Callees); From gohman at apple.com Tue Nov 30 20:46:42 2010 From: gohman at apple.com (Dan Gohman) Date: Wed, 01 Dec 2010 02:46:42 -0000 Subject: [llvm-commits] [llvm] r120538 - in /llvm/trunk: include/llvm/Support/Path.h lib/Support/Path.cpp Message-ID: <20101201024642.09D632A6C12D@llvm.org> Author: djg Date: Tue Nov 30 20:46:41 2010 New Revision: 120538 URL: http://llvm.org/viewvc/llvm-project?rev=120538&view=rev Log: Delete Path::appendSuffix's return value; it wasn't used anywhere, which is fine since isn't really necessary to check isValid there anyway. Modified: llvm/trunk/include/llvm/Support/Path.h llvm/trunk/lib/Support/Path.cpp Modified: llvm/trunk/include/llvm/Support/Path.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Path.h?rev=120538&r1=120537&r2=120538&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/Path.h (original) +++ llvm/trunk/include/llvm/Support/Path.h Tue Nov 30 20:46:41 2010 @@ -455,14 +455,9 @@ bool appendComponent(StringRef component); /// A period and the \p suffix are appended to the end of the pathname. - /// The precondition for this function is that the Path reference a file - /// name (i.e. isFile() returns true). If the Path is not a file, no - /// action is taken and the function returns false. If the path would - /// become invalid for the host operating system, false is returned. When - /// the \p suffix is empty, no action is performed. - /// @returns false if the suffix could not be added, true if it was. + /// When the \p suffix is empty, no action is performed. /// @brief Adds a period and the \p suffix to the end of the pathname. - bool appendSuffix(StringRef suffix); + void appendSuffix(StringRef suffix); /// The suffix of the filename is erased. The suffix begins with and /// includes the last . character in the filename after the last directory Modified: llvm/trunk/lib/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Path.cpp?rev=120538&r1=120537&r2=120538&view=diff ============================================================================== --- llvm/trunk/lib/Support/Path.cpp (original) +++ llvm/trunk/lib/Support/Path.cpp Tue Nov 30 20:46:41 2010 @@ -195,19 +195,12 @@ return &(LTDL_SHLIB_EXT[1]); } -bool +void Path::appendSuffix(StringRef suffix) { if (!suffix.empty()) { - std::string save(path); path.append("."); path.append(suffix); - if (!isValid()) { - path = save; - return false; - } } - - return true; } bool From rafael.espindola at gmail.com Tue Nov 30 20:48:56 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Tue, 30 Nov 2010 21:48:56 -0500 Subject: [llvm-commits] [llvm] r119777 - in /llvm/trunk: include/llvm/MC/MCDwarf.h include/llvm/MC/MCStreamer.h include/llvm/Target/TargetMachine.h lib/CodeGen/LLVMTargetMachine.cpp lib/MC/MCAsmStreamer.cpp lib/MC/MCDwarf.cpp lib/MC/MCELFStreamer.cpp lib/ Message-ID: > This means debug_line section entries do not have comments. We need these comments to debug line table bugs. How are you going to address this ? By using .loc the assembler is a lot easier to read. The llvm-gcc output already had no comments in it. > Right now I am debugging a regression caused by related patches in .debug_line output and it is very difficult to investigate with comments in assembly output. There are two possibilities, the output with .loc is incorrect, in which case reading the assembly and finding out that a ".loc 1 2 3" should actually be ".loc 2 2 3" is not that hard. The assembler (MC) is wrong. In this case you should be able to compare the output of llvm-mc and the system assembler. > - > Devang > > Cheers, Rafael From bigcheesegs at gmail.com Tue Nov 30 20:48:27 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 02:48:27 -0000 Subject: [llvm-commits] [llvm] r120539 - in /llvm/trunk: lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201024827.3936C2A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 20:48:27 2010 New Revision: 120539 URL: http://llvm.org/viewvc/llvm-project?rev=120539&view=rev Log: Support/PathV2: Add native implementation. Modified: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120539&r1=120538&r2=120539&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Tue Nov 30 20:48:27 2010 @@ -531,6 +531,28 @@ return make_error_code(errc::success); } +error_code native(const Twine &path, SmallVectorImpl &result) { + // Clear result. + result.set_size(0); +#ifdef LLVM_ON_WIN32 + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + result.reserve(p.size()); + for (StringRef::const_iterator i = p.begin(), + e = p.end(); + i != e; + ++i) { + if (*i == '/') + result.push_back('\\'); + else + result.push_back(*i); + } +#else + path.toVector(result); +#endif + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120539&r1=120538&r2=120539&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Tue Nov 30 20:48:27 2010 @@ -107,6 +107,9 @@ if (error_code ec = sys::path::replace_extension(temp_store, "ext")) ASSERT_FALSE(ec.message().c_str()); outs() << " replace_extension: " << temp_store << '\n'; + if (error_code ec = sys::path::native(*i, temp_store)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " native: " << temp_store << '\n'; outs().flush(); } From bigcheesegs at gmail.com Tue Nov 30 20:48:44 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 02:48:44 -0000 Subject: [llvm-commits] [llvm] r120540 - /llvm/trunk/include/llvm/Support/PathV2.h Message-ID: <20101201024844.0B1602A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 20:48:43 2010 New Revision: 120540 URL: http://llvm.org/viewvc/llvm-project?rev=120540&view=rev Log: Support/PathV2: Remove is_valid. It was only added because Path had it, but apparently it is unused. Modified: llvm/trunk/include/llvm/Support/PathV2.h Modified: llvm/trunk/include/llvm/Support/PathV2.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/PathV2.h?rev=120540&r1=120539&r2=120540&view=diff ============================================================================== --- llvm/trunk/include/llvm/Support/PathV2.h (original) +++ llvm/trunk/include/llvm/Support/PathV2.h Tue Nov 30 20:48:43 2010 @@ -218,14 +218,6 @@ // The following are purely lexical. -/// @brief Is the current path valid? -/// -/// @param path Input path. -/// @param result Set to true if the path is valid, false if it is not. -/// @results errc::success if result has been successfully set, otherwise a -/// platform specific error_code. -error_code is_valid(const Twine &path, bool &result); - /// @brief Get root name. /// /// //net/hello => //net From isanbard at gmail.com Tue Nov 30 20:49:04 2010 From: isanbard at gmail.com (Bill Wendling) Date: Wed, 01 Dec 2010 02:49:04 -0000 Subject: [llvm-commits] [llvm] r120541 - /llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp Message-ID: <20101201024904.E879C2A6C12D@llvm.org> Author: void Date: Tue Nov 30 20:49:04 2010 New Revision: 120541 URL: http://llvm.org/viewvc/llvm-project?rev=120541&view=rev Log: Remove "comparison of integers of different signs" warning by making the variable unsigned. Modified: llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp Modified: llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp?rev=120541&r1=120540&r2=120541&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp Tue Nov 30 20:49:04 2010 @@ -134,7 +134,7 @@ uint64_t Value) const { uint32_t Mask = 0; // Fixme: 2 for Thumb - int NumBytes = 4; + unsigned NumBytes = 4; Value = adjustFixupValue(Fixup.getKind(), Value); switch (Fixup.getKind()) { From rafael.espindola at gmail.com Tue Nov 30 20:52:09 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Tue, 30 Nov 2010 21:52:09 -0500 Subject: [llvm-commits] [llvm] r119613 - in /llvm/trunk: include/llvm/MC/MCAsmInfo.h lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/CodeGen/AsmPrinter/DwarfDebug.h lib/MC/MCAsmInfo.cpp lib/Target/CellSPU/SPUMCAsmInfo.cpp test/CodeGen/X86/unknown-location.ll te Message-ID: > You are dropping directory name here and everywhere else. Is it not needed > anymore ? It is not. When using .loc the corresponding .file directives have the full path in it. It should be possible for the assembler (MC) to factor them, but since the gnu assembler doesn't do it, I decided to match its output. > - > Devang Cheers, Rafael From rafael.espindola at gmail.com Tue Nov 30 20:55:38 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Tue, 30 Nov 2010 21:55:38 -0500 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: <20101201024006.7234C2A6C12D@llvm.org> References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: > ============================================================================== > --- llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll (added) > +++ llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll Tue Nov 30 20:40:06 2010 Why a .ll test? Is there something that we cannot parse in the .s file? Cheers, Rafael From rafael.espindola at gmail.com Tue Nov 30 21:02:29 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Tue, 30 Nov 2010 22:02:29 -0500 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: <20101201024006.7234C2A6C12D@llvm.org> References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: > + > +protected: > + ?static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { ... > -static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { It was a global static function before. Why can't you use it as such? Cheers, Rafael From jasonwkim at google.com Tue Nov 30 21:10:47 2010 From: jasonwkim at google.com (Jason Kim) Date: Tue, 30 Nov 2010 19:10:47 -0800 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: On Tue, Nov 30, 2010 at 7:02 PM, Rafael Esp?ndola wrote: >> + >> +protected: >> + ?static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { > > ... > >> -static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { > > > It was a global static function before. Why can't you use it as such? It seemed like a better choice to move it to a canonical place for explicitly sharing between subclasses - that function was too close in the namespace tied to darwin. Thanks! -jason > > Cheers, > Rafael > From jasonwkim at google.com Tue Nov 30 21:14:20 2010 From: jasonwkim at google.com (Jason Kim) Date: Tue, 30 Nov 2010 19:14:20 -0800 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: On Tue, Nov 30, 2010 at 6:55 PM, Rafael Esp?ndola wrote: >> ============================================================================== >> --- llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll (added) >> +++ llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll Tue Nov 30 20:40:06 2010 > > Why a .ll test? Is there something that we cannot parse in the .s file? Simply, it didn't occur to me to test that path, as I was looking at .bc -> .o generation. Thanks! -jason > > Cheers, > Rafael > From rafael.espindola at gmail.com Tue Nov 30 21:17:02 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Tue, 30 Nov 2010 22:17:02 -0500 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: >> It was a global static function before. Why can't you use it as such? > > It seemed like a better choice to move it to a canonical place for > explicitly sharing between subclasses - that function was too close in > the namespace tied to darwin. Can you not just move it before both the Macho and ELF classes? I don't see anything explicit about it in the coding standards, but the example in "Anonymous Namespaces" seems to suggest that using a static global helper would be better. > Thanks! > > -jason Cheers, Rafael From bigcheesegs at gmail.com Tue Nov 30 21:18:17 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 03:18:17 -0000 Subject: [llvm-commits] [llvm] r120546 - in /llvm/trunk: lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201031817.78EDC2A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 21:18:17 2010 New Revision: 120546 URL: http://llvm.org/viewvc/llvm-project?rev=120546&view=rev Log: Support/PathV2: Add filename implementation. Modified: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120546&r1=120545&r2=120546&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Tue Nov 30 21:18:17 2010 @@ -553,6 +553,11 @@ return make_error_code(errc::success); } +error_code filename(const StringRef &path, StringRef &result) { + result = *(--end(path)); + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120546&r1=120545&r2=120546&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Tue Nov 30 21:18:17 2010 @@ -94,6 +94,9 @@ if (error_code ec = sys::path::parent_path(*i, res)) ASSERT_FALSE(ec.message().c_str()); outs() << " parent_path: " << res << '\n'; + if (error_code ec = sys::path::filename(*i, res)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " filename: " << res << '\n'; temp_store = *i; if (error_code ec = sys::path::make_absolute(temp_store)) From bigcheesegs at gmail.com Tue Nov 30 21:18:33 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 03:18:33 -0000 Subject: [llvm-commits] [llvm] r120547 - in /llvm/trunk: lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201031833.938942A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 21:18:33 2010 New Revision: 120547 URL: http://llvm.org/viewvc/llvm-project?rev=120547&view=rev Log: Support/PathV2: Add stem implementation. Modified: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120547&r1=120546&r2=120547&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Tue Nov 30 21:18:33 2010 @@ -558,6 +558,22 @@ return make_error_code(errc::success); } +error_code stem(const StringRef &path, StringRef &result) { + StringRef fname; + if (error_code ec = filename(path, fname)) return ec; + size_t pos = fname.find_last_of('.'); + if (pos == StringRef::npos) + result = fname; + else + if ((fname.size() == 1 && fname == ".") || + (fname.size() == 2 && fname == "..")) + result = fname; + else + result = StringRef(fname.begin(), pos); + + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120547&r1=120546&r2=120547&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Tue Nov 30 21:18:33 2010 @@ -97,6 +97,9 @@ if (error_code ec = sys::path::filename(*i, res)) ASSERT_FALSE(ec.message().c_str()); outs() << " filename: " << res << '\n'; + if (error_code ec = sys::path::stem(*i, res)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " stem: " << res << '\n'; temp_store = *i; if (error_code ec = sys::path::make_absolute(temp_store)) @@ -110,6 +113,10 @@ if (error_code ec = sys::path::replace_extension(temp_store, "ext")) ASSERT_FALSE(ec.message().c_str()); outs() << " replace_extension: " << temp_store << '\n'; + if (error_code ec = sys::path::stem( + StringRef(temp_store.begin(), temp_store.size()), res)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " stem: " << res << '\n'; if (error_code ec = sys::path::native(*i, temp_store)) ASSERT_FALSE(ec.message().c_str()); outs() << " native: " << temp_store << '\n'; From rafael.espindola at gmail.com Tue Nov 30 21:23:20 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Tue, 30 Nov 2010 22:23:20 -0500 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: > Simply, it didn't occur to me to test that path, as I was looking at > .bc -> .o generation. If the assembly parser has the features you need, you should convert the test to a .s -> .o test. The involved code path is a lot smaller. This makes the test stable to codegen changes and makes it clear what is being tested. > Thanks! > > -jason Cheers, Rafael From aggarwa4 at illinois.edu Tue Nov 30 21:25:06 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Wed, 01 Dec 2010 03:25:06 -0000 Subject: [llvm-commits] [poolalloc] r120548 - in /poolalloc/trunk/lib/DSA: BottomUpClosure.cpp EquivClassGraphs.cpp Message-ID: <20101201032506.D16E52A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 21:25:06 2010 New Revision: 120548 URL: http://llvm.org/viewvc/llvm-project?rev=120548&view=rev Log: BU - formatting EQBU - merge information back from globals into the function graphs at the end of merging of graphs. Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp Modified: poolalloc/trunk/lib/DSA/BottomUpClosure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/BottomUpClosure.cpp?rev=120548&r1=120547&r2=120548&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/BottomUpClosure.cpp (original) +++ poolalloc/trunk/lib/DSA/BottomUpClosure.cpp Tue Nov 30 21:25:06 2010 @@ -397,7 +397,7 @@ << F->getName() << "\n"); Stack.pop_back(); DEBUG(errs() << " [BU] Calculating graph for: " << F->getName()<< "\n"); - calculateGraph (Graph); + calculateGraph(Graph); DEBUG(errs() << " [BU] Done inlining: " << F->getName() << " [" << Graph->getGraphSize() << "+" << Graph->getAuxFunctionCalls().size() << "]\n"); @@ -407,7 +407,7 @@ // // Should we revisit the graph? Only do it if there are now new resolvable // callees. - getAllAuxCallees (Graph, CalleeFunctions); + getAllAuxCallees(Graph, CalleeFunctions); if (!CalleeFunctions.empty()) { DEBUG(errs() << "Recalculating " << F->getName() << " due to new knowledge\n"); ValMap.erase(F); Modified: poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp?rev=120548&r1=120547&r2=120548&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp (original) +++ poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp Tue Nov 30 21:25:06 2010 @@ -66,6 +66,15 @@ delete (*i); } + formGlobalECs(); + for (Module::iterator F = M.begin(); F != M.end(); ++F) { + if (!(F->isDeclaration())) { + if (DSGraph * Graph = getOrCreateGraph(F)) { + cloneGlobalsInto (Graph); + } + } + } + DEBUG(verifyMerging()); bool result = runOnModuleInternal(M); From evan.cheng at apple.com Tue Nov 30 21:27:20 2010 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 01 Dec 2010 03:27:20 -0000 Subject: [llvm-commits] [llvm] r120549 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/sibcall-5.ll Message-ID: <20101201032720.BF7752A6C12D@llvm.org> Author: evancheng Date: Tue Nov 30 21:27:20 2010 New Revision: 120549 URL: http://llvm.org/viewvc/llvm-project?rev=120549&view=rev Log: Speculatively disable x86 portion of r120501 to appease the x86_64 buildbot. Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp llvm/trunk/test/CodeGen/X86/sibcall-5.ll Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=120549&r1=120548&r2=120549&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Nov 30 21:27:20 2010 @@ -1339,6 +1339,8 @@ } bool X86TargetLowering::isUsedByReturnOnly(SDNode *N) const { + // Temporarily disabled. + return false; if (N->getNumValues() != 1) return false; if (!N->hasNUsesOfValue(1, 0)) Modified: llvm/trunk/test/CodeGen/X86/sibcall-5.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sibcall-5.ll?rev=120549&r1=120548&r2=120549&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/X86/sibcall-5.ll (original) +++ llvm/trunk/test/CodeGen/X86/sibcall-5.ll Tue Nov 30 21:27:20 2010 @@ -1,4 +1,5 @@ ; RUN: llc < %s -march=x86-64 | FileCheck %s +; XFAIL: * ; Sibcall optimization of expanded libcalls. ; rdar://8707777 From jasonwkim at google.com Tue Nov 30 21:29:23 2010 From: jasonwkim at google.com (Jason Kim) Date: Tue, 30 Nov 2010 19:29:23 -0800 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: On Tue, Nov 30, 2010 at 7:17 PM, Rafael Esp?ndola wrote: >>> It was a global static function before. Why can't you use it as such? >> >> It seemed like a better choice to move it to a canonical place for >> explicitly sharing between subclasses - that function was too close in >> the namespace tied to darwin. > > Can you not just move it before both the Macho and ELF classes? I > don't see anything explicit about it in the coding standards, but the > example in "Anonymous Namespaces" seems to suggest that using a static > global helper would be better. Yes, that could be ok too, but that function will get larger as more relocations are added - helpers are usually considered to be "small", right? Honestly, I think its fine where it is, but if you really think it''s better to be outside the class, I'll move it out. Thanks! -jason > Cheers, > Rafael > From jasonwkim at google.com Tue Nov 30 21:32:07 2010 From: jasonwkim at google.com (Jason Kim) Date: Tue, 30 Nov 2010 19:32:07 -0800 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: On Tue, Nov 30, 2010 at 7:23 PM, Rafael Esp?ndola wrote: >> Simply, it didn't occur to me to test that path, as I was looking at >> .bc -> .o generation. > > If the assembly parser has the features you need, you should convert > the test to a .s -> .o test. The involved code path is a lot smaller. > This makes the test stable to codegen changes and makes it clear what > is being tested. Noted. I'll check on the .s -> .o Thanks! -jason > >> Thanks! >> >> -jason > > Cheers, > Rafael > From rafael.espindola at gmail.com Tue Nov 30 21:34:41 2010 From: rafael.espindola at gmail.com (=?UTF-8?Q?Rafael_Esp=C3=ADndola?=) Date: Tue, 30 Nov 2010 22:34:41 -0500 Subject: [llvm-commits] [llvm] r120534 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp test/CodeGen/ARM/2010-11-30-reloc-movt.ll In-Reply-To: References: <20101201024006.7234C2A6C12D@llvm.org> Message-ID: > Yes, that could be ok too, but that function will get larger as more > relocations are added - > helpers are usually considered to be "small", right? > > Honestly, I think its fine where it is, but if you really think it''s > better to be outside the class, I'll move it out. Having it out fo class does look more consistent with the rest. The problem is not the size of the function (big functions, global or not, should be broken into smaller ones (like you did on the writer :-) ). > Thanks! > -jason Cheers, Rafael From bigcheesegs at gmail.com Tue Nov 30 21:37:41 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 03:37:41 -0000 Subject: [llvm-commits] [llvm] r120550 - in /llvm/trunk: lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201033741.652BC2A6C12D@llvm.org> Author: mspencer Date: Tue Nov 30 21:37:41 2010 New Revision: 120550 URL: http://llvm.org/viewvc/llvm-project?rev=120550&view=rev Log: Support/PathV2: Add extension implementation. Modified: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120550&r1=120549&r2=120550&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Tue Nov 30 21:37:41 2010 @@ -574,6 +574,22 @@ return make_error_code(errc::success); } +error_code extension(const StringRef &path, StringRef &result) { + StringRef fname; + if (error_code ec = filename(path, fname)) return ec; + size_t pos = fname.find_last_of('.'); + if (pos == StringRef::npos) + result = StringRef(); + else + if ((fname.size() == 1 && fname == ".") || + (fname.size() == 2 && fname == "..")) + result = StringRef(); + else + result = StringRef(fname.begin() + pos, fname.size() - pos); + + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120550&r1=120549&r2=120550&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Tue Nov 30 21:37:41 2010 @@ -100,6 +100,9 @@ if (error_code ec = sys::path::stem(*i, res)) ASSERT_FALSE(ec.message().c_str()); outs() << " stem: " << res << '\n'; + if (error_code ec = sys::path::extension(*i, res)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " stem: " << res << '\n'; temp_store = *i; if (error_code ec = sys::path::make_absolute(temp_store)) @@ -113,10 +116,17 @@ if (error_code ec = sys::path::replace_extension(temp_store, "ext")) ASSERT_FALSE(ec.message().c_str()); outs() << " replace_extension: " << temp_store << '\n'; + StringRef stem, ext; if (error_code ec = sys::path::stem( - StringRef(temp_store.begin(), temp_store.size()), res)) + StringRef(temp_store.begin(), temp_store.size()), stem)) ASSERT_FALSE(ec.message().c_str()); - outs() << " stem: " << res << '\n'; + outs() << " stem: " << stem << '\n'; + if (error_code ec = sys::path::extension( + StringRef(temp_store.begin(), temp_store.size()), ext)) + ASSERT_FALSE(ec.message().c_str()); + outs() << " extension: " << ext << '\n'; + EXPECT_EQ(*(--sys::path::end( + StringRef(temp_store.begin(), temp_store.size()))), (stem + ext).str()); if (error_code ec = sys::path::native(*i, temp_store)) ASSERT_FALSE(ec.message().c_str()); outs() << " native: " << temp_store << '\n'; From grosbach at apple.com Tue Nov 30 21:45:07 2010 From: grosbach at apple.com (Jim Grosbach) Date: Wed, 01 Dec 2010 03:45:07 -0000 Subject: [llvm-commits] [llvm] r120551 - in /llvm/trunk/lib/Target/ARM: ARM.h ARMAsmPrinter.cpp ARMAsmPrinter.h ARMMCInstLower.cpp Message-ID: <20101201034507.D5A052A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 21:45:07 2010 New Revision: 120551 URL: http://llvm.org/viewvc/llvm-project?rev=120551&view=rev Log: Move the ARMAsmPrinter class defintiion into a header file. Added: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h Modified: llvm/trunk/lib/Target/ARM/ARM.h llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp Modified: llvm/trunk/lib/Target/ARM/ARM.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARM.h?rev=120551&r1=120550&r2=120551&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARM.h (original) +++ llvm/trunk/lib/Target/ARM/ARM.h Tue Nov 30 21:45:07 2010 @@ -29,7 +29,7 @@ class MCCodeEmitter; class TargetAsmBackend; class MachineInstr; -class AsmPrinter; +class ARMAsmPrinter; class MCInst; MCCodeEmitter *createARMMCCodeEmitter(const Target &, @@ -55,8 +55,8 @@ extern Target TheARMTarget, TheThumbTarget; void LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, - AsmPrinter &AP); - + ARMAsmPrinter &AP); + } // end namespace llvm; #endif Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=120551&r1=120550&r2=120551&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Tue Nov 30 21:45:07 2010 @@ -18,6 +18,7 @@ #include "ARMAddressingModes.h" #include "ARMConstantPoolValue.h" #include "InstPrinter/ARMInstPrinter.h" +#include "ARMAsmPrinter.h" #include "ARMMachineFunctionInfo.h" #include "ARMTargetMachine.h" #include "ARMTargetObjectFile.h" @@ -26,7 +27,6 @@ #include "llvm/Module.h" #include "llvm/Type.h" #include "llvm/Assembly/Writer.h" -#include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineModuleInfoImpls.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" @@ -54,15 +54,6 @@ #include using namespace llvm; -namespace llvm { - namespace ARM { - enum DW_ISA { - DW_ISA_ARM_thumb = 1, - DW_ISA_ARM_arm = 2 - }; - } -} - namespace { // Per section and per symbol attributes are not supported. @@ -144,92 +135,21 @@ } }; - class ARMAsmPrinter : public AsmPrinter { - - /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can - /// make the right decision when printing asm code for different targets. - const ARMSubtarget *Subtarget; - - /// AFI - Keep a pointer to ARMFunctionInfo for the current - /// MachineFunction. - ARMFunctionInfo *AFI; - - /// MCP - Keep a pointer to constantpool entries of the current - /// MachineFunction. - const MachineConstantPool *MCP; - - public: - explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) - : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL) { - Subtarget = &TM.getSubtarget(); - } - - virtual const char *getPassName() const { - return "ARM Assembly Printer"; - } - - void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O, - const char *Modifier = 0); - - virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, - unsigned AsmVariant, const char *ExtraCode, - raw_ostream &O); - virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, - unsigned AsmVariant, - const char *ExtraCode, raw_ostream &O); - - void EmitJumpTable(const MachineInstr *MI); - void EmitJump2Table(const MachineInstr *MI); - virtual void EmitInstruction(const MachineInstr *MI); - bool runOnMachineFunction(MachineFunction &F); - - virtual void EmitConstantPool() {} // we emit constant pools customly! - virtual void EmitFunctionEntryLabel(); - void EmitStartOfAsmFile(Module &M); - void EmitEndOfAsmFile(Module &M); - - private: - // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile() - void emitAttributes(); - - // Helper for ELF .o only - void emitARMAttributeSection(); - - public: - void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); - - MachineLocation getDebugValueLocation(const MachineInstr *MI) const { - MachineLocation Location; - assert(MI->getNumOperands() == 4 && "Invalid no. of machine operands!"); - // Frame address. Currently handles register +- offset only. - if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) - Location.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); - else { - DEBUG(dbgs() << "DBG_VALUE instruction ignored! " << *MI << "\n"); - } - return Location; - } - - virtual unsigned getISAEncoding() { - // ARM/Darwin adds ISA to the DWARF info for each function. - if (!Subtarget->isTargetDarwin()) - return 0; - return Subtarget->isThumb() ? - llvm::ARM::DW_ISA_ARM_thumb : llvm::ARM::DW_ISA_ARM_arm; - } - - MCSymbol *GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, - const MachineBasicBlock *MBB) const; - MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const; - - MCSymbol *GetARMSJLJEHLabel(void) const; - - /// EmitMachineConstantPoolValue - Print a machine constantpool value to - /// the .s file. - virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); - }; } // end of anonymous namespace +MachineLocation ARMAsmPrinter:: +getDebugValueLocation(const MachineInstr *MI) const { + MachineLocation Location; + assert(MI->getNumOperands() == 4 && "Invalid no. of machine operands!"); + // Frame address. Currently handles register +- offset only. + if (MI->getOperand(0).isReg() && MI->getOperand(1).isImm()) + Location.set(MI->getOperand(0).getReg(), MI->getOperand(1).getImm()); + else { + DEBUG(dbgs() << "DBG_VALUE instruction ignored! " << *MI << "\n"); + } + return Location; +} + void ARMAsmPrinter::EmitFunctionEntryLabel() { if (AFI->isThumbFunction()) { OutStreamer.EmitAssemblerFlag(MCAF_Code16); Added: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h?rev=120551&view=auto ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h (added) +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h Tue Nov 30 21:45:07 2010 @@ -0,0 +1,107 @@ +//===-- ARMAsmPrinter.h - Print machine code to an ARM .s file ------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// ARM Assembly printer class. +// +//===----------------------------------------------------------------------===// + +#ifndef ARMASMPRINTER_H +#define ARMASMPRINTER_H + +#include "ARM.h" +#include "ARMTargetMachine.h" +#include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/Support/Compiler.h" + +namespace llvm { + +namespace ARM { + enum DW_ISA { + DW_ISA_ARM_thumb = 1, + DW_ISA_ARM_arm = 2 + }; +} + +class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter { + + /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can + /// make the right decision when printing asm code for different targets. + const ARMSubtarget *Subtarget; + + /// AFI - Keep a pointer to ARMFunctionInfo for the current + /// MachineFunction. + ARMFunctionInfo *AFI; + + /// MCP - Keep a pointer to constantpool entries of the current + /// MachineFunction. + const MachineConstantPool *MCP; + +public: + explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) + : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL) { + Subtarget = &TM.getSubtarget(); + } + + virtual const char *getPassName() const { + return "ARM Assembly Printer"; + } + + void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O, + const char *Modifier = 0); + + virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, + unsigned AsmVariant, const char *ExtraCode, + raw_ostream &O); + virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, + unsigned AsmVariant, + const char *ExtraCode, raw_ostream &O); + + void EmitJumpTable(const MachineInstr *MI); + void EmitJump2Table(const MachineInstr *MI); + virtual void EmitInstruction(const MachineInstr *MI); + bool runOnMachineFunction(MachineFunction &F); + + virtual void EmitConstantPool() {} // we emit constant pools customly! + virtual void EmitFunctionEntryLabel(); + void EmitStartOfAsmFile(Module &M); + void EmitEndOfAsmFile(Module &M); + +private: + // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile() + void emitAttributes(); + + // Helper for ELF .o only + void emitARMAttributeSection(); + +public: + void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); + + MachineLocation getDebugValueLocation(const MachineInstr *MI) const; + + virtual unsigned getISAEncoding() { + // ARM/Darwin adds ISA to the DWARF info for each function. + if (!Subtarget->isTargetDarwin()) + return 0; + return Subtarget->isThumb() ? + llvm::ARM::DW_ISA_ARM_thumb : llvm::ARM::DW_ISA_ARM_arm; + } + + MCSymbol *GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, + const MachineBasicBlock *MBB) const; + MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const; + + MCSymbol *GetARMSJLJEHLabel(void) const; + + /// EmitMachineConstantPoolValue - Print a machine constantpool value to + /// the .s file. + virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); +}; +} // end namespace llvm + +#endif Modified: llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp?rev=120551&r1=120550&r2=120551&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp (original) +++ llvm/trunk/lib/Target/ARM/ARMMCInstLower.cpp Tue Nov 30 21:45:07 2010 @@ -13,7 +13,7 @@ //===----------------------------------------------------------------------===// #include "ARM.h" -#include "llvm/CodeGen/AsmPrinter.h" +#include "ARMAsmPrinter.h" #include "llvm/Constants.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/MC/MCExpr.h" @@ -23,7 +23,7 @@ static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol, - AsmPrinter &Printer) { + ARMAsmPrinter &Printer) { MCContext &Ctx = Printer.OutContext; const MCExpr *Expr; switch (MO.getTargetFlags()) { @@ -51,7 +51,7 @@ } void llvm::LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, - AsmPrinter &AP) { + ARMAsmPrinter &AP) { OutMI.setOpcode(MI->getOpcode()); for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { From grosbach at apple.com Tue Nov 30 22:01:17 2010 From: grosbach at apple.com (Jim Grosbach) Date: Wed, 01 Dec 2010 04:01:17 -0000 Subject: [llvm-commits] [llvm] r120552 - /llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Message-ID: <20101201040117.BCE6B2A6C12D@llvm.org> Author: grosbach Date: Tue Nov 30 22:01:17 2010 New Revision: 120552 URL: http://llvm.org/viewvc/llvm-project?rev=120552&view=rev Log: Elaborate on FIXME. Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=120552&r1=120551&r2=120552&view=diff ============================================================================== --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original) +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Tue Nov 30 22:01:17 2010 @@ -1179,7 +1179,10 @@ // assembler. let neverHasSideEffects = 1, isReMaterializable = 1 in // FIXME: We want one cannonical LEApcrel instruction and to express one or -// both of these as pseudo-instructions that get expanded to it. +// both of these as pseudo-instructions that get expanded to it. In particular, +// the cannonical "adr" pattern should take a single label operand, and the +// JT version should be a pseudo that when lowered to MC, xforms the insn +// to the canonical form referencing the correct symbol. def LEApcrel : AXI1<0, (outs GPR:$Rd), (ins i32imm:$label, pred:$p), MiscFrm, IIC_iALUi, "adr${p}\t$Rd, #$label", []>; From aggarwa4 at illinois.edu Tue Nov 30 23:41:35 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Wed, 01 Dec 2010 05:41:35 -0000 Subject: [llvm-commits] [poolalloc] r120556 - /poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp Message-ID: <20101201054135.2D2E32A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 23:41:35 2010 New Revision: 120556 URL: http://llvm.org/viewvc/llvm-project?rev=120556&view=rev Log: Undoing last change. Causes regression in 255.vortex in poolalloc. Must investigate. Modified: poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp Modified: poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp?rev=120556&r1=120555&r2=120556&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp (original) +++ poolalloc/trunk/lib/DSA/EquivClassGraphs.cpp Tue Nov 30 23:41:35 2010 @@ -67,13 +67,15 @@ } formGlobalECs(); - for (Module::iterator F = M.begin(); F != M.end(); ++F) { + + //FIXME: This causes a regression in 255.vortex while poolallocating + /*for (Module::iterator F = M.begin(); F != M.end(); ++F) { if (!(F->isDeclaration())) { if (DSGraph * Graph = getOrCreateGraph(F)) { cloneGlobalsInto (Graph); } } - } + }*/ DEBUG(verifyMerging()); bool result = runOnModuleInternal(M); From aggarwa4 at illinois.edu Tue Nov 30 23:46:44 2010 From: aggarwa4 at illinois.edu (Arushi Aggarwal) Date: Wed, 01 Dec 2010 05:46:44 -0000 Subject: [llvm-commits] [poolalloc] r120557 - /poolalloc/trunk/lib/DSA/TopDownClosure.cpp Message-ID: <20101201054644.7B06A2A6C12D@llvm.org> Author: aggarwa4 Date: Tue Nov 30 23:46:44 2010 New Revision: 120557 URL: http://llvm.org/viewvc/llvm-project?rev=120557&view=rev Log: replace section by call to cloneIntoGlobals. Modified: poolalloc/trunk/lib/DSA/TopDownClosure.cpp Modified: poolalloc/trunk/lib/DSA/TopDownClosure.cpp URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/lib/DSA/TopDownClosure.cpp?rev=120557&r1=120556&r2=120557&view=diff ============================================================================== --- poolalloc/trunk/lib/DSA/TopDownClosure.cpp (original) +++ poolalloc/trunk/lib/DSA/TopDownClosure.cpp Tue Nov 30 23:46:44 2010 @@ -25,12 +25,7 @@ #include "llvm/ADT/Statistic.h" using namespace llvm; -#if 0 -#define TIME_REGION(VARNAME, DESC) \ - NamedRegionTimer VARNAME(DESC) -#else #define TIME_REGION(VARNAME, DESC) -#endif namespace { RegisterPass // Register the pass @@ -299,7 +294,8 @@ DSG->computeExternalFlags(ExtFlags); DSG->computeIntPtrFlags(); - { + cloneIntoGlobals(DSG); + /*{ DSGraph* GG = DSG->getGlobalsGraph(); ReachabilityCloner RC(GG, DSG, DSGraph::DontCloneCallNodes | @@ -308,7 +304,7 @@ GI = DSG->getScalarMap().global_begin(), E = DSG->getScalarMap().global_end(); GI != E; ++GI) RC.getClonedNH(DSG->getNodeForValue(*GI)); - } + }*/ // // Delete dead nodes. Treat globals that are unreachable as dead also. @@ -323,11 +319,7 @@ // // So, for now, just remove dead nodes but leave the globals alone. // -#if 0 - DSG->removeDeadNodes(DSGraph::RemoveUnreachableGlobals); -#else DSG->removeDeadNodes(0); -#endif // We are done with computing the current TD Graph! Finally, before we can // finish processing this function, we figure out which functions it calls and From bigcheesegs at gmail.com Wed Dec 1 00:03:33 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 06:03:33 -0000 Subject: [llvm-commits] [llvm] r120558 - /llvm/trunk/unittests/Support/Path.cpp Message-ID: <20101201060333.9A03A2A6C12D@llvm.org> Author: mspencer Date: Wed Dec 1 00:03:33 2010 New Revision: 120558 URL: http://llvm.org/viewvc/llvm-project?rev=120558&view=rev Log: unittests/Support/PathV2: Make tests much shorter; although harder to understand. I'm going to replace this all anyway with a proper table and separated tests when done. Modified: llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120558&r1=120557&r2=120558&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Wed Dec 1 00:03:33 2010 @@ -13,6 +13,22 @@ using namespace llvm; +#define TEST_OUT(func, result) outs() << " " #func ": " << result << '\n'; + +#define TEST_PATH_(header, func, funcname, output) \ + header; \ + if (error_code ec = sys::path::func) \ + ASSERT_FALSE(ec.message().c_str()); \ + TEST_OUT(funcname, output) + +#define TEST_PATH(func, ipath, res) TEST_PATH_(, func(ipath, res), func, res); + +#define TEST_PATH_SMALLVEC(func, ipath, inout) \ + TEST_PATH_(inout = ipath, func(inout), func, inout) + +#define TEST_PATH_SMALLVEC_P(func, ipath, inout, param) \ + TEST_PATH_(inout = ipath, func(inout, param), func, inout) + namespace { TEST(Support, Path) { @@ -80,56 +96,26 @@ } outs() << "]\n"; - StringRef res; + StringRef sfres; + TEST_PATH(root_path, *i, sfres); + TEST_PATH(root_name, *i, sfres); + TEST_PATH(root_directory, *i, sfres); + TEST_PATH(parent_path, *i, sfres); + TEST_PATH(filename, *i, sfres); + TEST_PATH(stem, *i, sfres); + TEST_PATH(extension, *i, sfres); + SmallString<16> temp_store; - if (error_code ec = sys::path::root_path(*i, res)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " root_path: " << res << '\n'; - if (error_code ec = sys::path::root_name(*i, res)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " root_name: " << res << '\n'; - if (error_code ec = sys::path::root_directory(*i, res)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " root_directory: " << res << '\n'; - if (error_code ec = sys::path::parent_path(*i, res)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " parent_path: " << res << '\n'; - if (error_code ec = sys::path::filename(*i, res)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " filename: " << res << '\n'; - if (error_code ec = sys::path::stem(*i, res)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " stem: " << res << '\n'; - if (error_code ec = sys::path::extension(*i, res)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " stem: " << res << '\n'; - - temp_store = *i; - if (error_code ec = sys::path::make_absolute(temp_store)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " make_absolute: " << temp_store << '\n'; - temp_store = *i; - if (error_code ec = sys::path::remove_filename(temp_store)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " remove_filename: " << temp_store << '\n'; - temp_store = *i; - if (error_code ec = sys::path::replace_extension(temp_store, "ext")) - ASSERT_FALSE(ec.message().c_str()); - outs() << " replace_extension: " << temp_store << '\n'; - StringRef stem, ext; - if (error_code ec = sys::path::stem( - StringRef(temp_store.begin(), temp_store.size()), stem)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " stem: " << stem << '\n'; - if (error_code ec = sys::path::extension( - StringRef(temp_store.begin(), temp_store.size()), ext)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " extension: " << ext << '\n'; - EXPECT_EQ(*(--sys::path::end( - StringRef(temp_store.begin(), temp_store.size()))), (stem + ext).str()); - if (error_code ec = sys::path::native(*i, temp_store)) - ASSERT_FALSE(ec.message().c_str()); - outs() << " native: " << temp_store << '\n'; + TEST_PATH_SMALLVEC(make_absolute, *i, temp_store); + TEST_PATH_SMALLVEC(remove_filename, *i, temp_store); + + TEST_PATH_SMALLVEC_P(replace_extension, *i, temp_store, "ext"); + StringRef filename(temp_store.begin(), temp_store.size()), stem, ext; + TEST_PATH(stem, filename, stem); + TEST_PATH(extension, filename, ext); + EXPECT_EQ(*(--sys::path::end(filename)), (stem + ext).str()); + + TEST_PATH_(, native(*i, temp_store), native, temp_store); outs().flush(); } From bigcheesegs at gmail.com Wed Dec 1 00:03:51 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 06:03:51 -0000 Subject: [llvm-commits] [llvm] r120559 - in /llvm/trunk: lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201060351.201482A6C12D@llvm.org> Author: mspencer Date: Wed Dec 1 00:03:50 2010 New Revision: 120559 URL: http://llvm.org/viewvc/llvm-project?rev=120559&view=rev Log: Support/PathV2: Add has_{root_path,root_name,root_directory,parent_path,filename,stem,extension} implementation. Modified: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120559&r1=120558&r2=120559&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Wed Dec 1 00:03:50 2010 @@ -370,24 +370,6 @@ return make_error_code(errc::success); } -error_code has_root_name(const Twine &path, bool &result) { - SmallString<128> storage; - StringRef p = path.toStringRef(storage); - - if (error_code ec = root_name(p, p)) return ec; - result = !p.empty(); - return make_error_code(errc::success); -} - -error_code has_root_directory(const Twine &path, bool &result) { - SmallString<128> storage; - StringRef p = path.toStringRef(storage); - - if (error_code ec = root_directory(p, p)) return ec; - result = !p.empty(); - return make_error_code(errc::success); -} - error_code relative_path(const StringRef &path, StringRef &result) { StringRef root; if (error_code ec = root_path(path, root)) return ec; @@ -590,6 +572,76 @@ return make_error_code(errc::success); } +error_code has_root_name(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + if (error_code ec = root_name(p, p)) return ec; + + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code has_root_directory(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + if (error_code ec = root_directory(p, p)) return ec; + + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code has_root_path(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + if (error_code ec = root_path(p, p)) return ec; + + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code has_filename(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + if (error_code ec = filename(p, p)) return ec; + + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code has_parent_path(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + if (error_code ec = parent_path(p, p)) return ec; + + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code has_stem(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + if (error_code ec = stem(p, p)) return ec; + + result = !p.empty(); + return make_error_code(errc::success); +} + +error_code has_extension(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + if (error_code ec = extension(p, p)) return ec; + + result = !p.empty(); + return make_error_code(errc::success); +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120559&r1=120558&r2=120559&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Wed Dec 1 00:03:50 2010 @@ -96,13 +96,21 @@ } outs() << "]\n"; + bool bres; StringRef sfres; + TEST_PATH(has_root_path, *i, bres); TEST_PATH(root_path, *i, sfres); + TEST_PATH(has_root_name, *i, bres); TEST_PATH(root_name, *i, sfres); + TEST_PATH(has_root_directory, *i, bres); TEST_PATH(root_directory, *i, sfres); + TEST_PATH(has_parent_path, *i, bres); TEST_PATH(parent_path, *i, sfres); + TEST_PATH(has_filename, *i, bres); TEST_PATH(filename, *i, sfres); + TEST_PATH(has_stem, *i, bres); TEST_PATH(stem, *i, sfres); + TEST_PATH(has_extension, *i, bres); TEST_PATH(extension, *i, sfres); SmallString<16> temp_store; From bigcheesegs at gmail.com Wed Dec 1 00:21:53 2010 From: bigcheesegs at gmail.com (Michael J. Spencer) Date: Wed, 01 Dec 2010 06:21:53 -0000 Subject: [llvm-commits] [llvm] r120560 - in /llvm/trunk: lib/Support/PathV2.cpp unittests/Support/Path.cpp Message-ID: <20101201062153.D92032A6C12D@llvm.org> Author: mspencer Date: Wed Dec 1 00:21:53 2010 New Revision: 120560 URL: http://llvm.org/viewvc/llvm-project?rev=120560&view=rev Log: Support/PathV2: Add is_{absolute,relative} implementation. Modified: llvm/trunk/lib/Support/PathV2.cpp llvm/trunk/unittests/Support/Path.cpp Modified: llvm/trunk/lib/Support/PathV2.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/PathV2.cpp?rev=120560&r1=120559&r2=120560&view=diff ============================================================================== --- llvm/trunk/lib/Support/PathV2.cpp (original) +++ llvm/trunk/lib/Support/PathV2.cpp Wed Dec 1 00:21:53 2010 @@ -642,6 +642,30 @@ return make_error_code(errc::success); } +error_code is_absolute(const Twine &path, bool &result) { + SmallString<128> path_storage; + StringRef p = path.toStringRef(path_storage); + + bool rootDir = false, + rootName = false; + if (error_code ec = has_root_directory(p, rootDir)) return ec; +#ifdef LLVM_ON_WIN32 + if (error_code ec = has_root_name(p, rootName)) return ec; +#else + rootName = true; +#endif + + result = rootDir && rootName; + return make_error_code(errc::success); +} + +error_code is_relative(const Twine &path, bool &result) { + bool res; + error_code ec = is_absolute(path, res); + result = !res; + return ec; +} + } } } Modified: llvm/trunk/unittests/Support/Path.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=120560&r1=120559&r2=120560&view=diff ============================================================================== --- llvm/trunk/unittests/Support/Path.cpp (original) +++ llvm/trunk/unittests/Support/Path.cpp Wed Dec 1 00:21:53 2010 @@ -112,6 +112,8 @@ TEST_PATH(stem, *i, sfres); TEST_PATH(has_extension, *i, bres); TEST_PATH(extension, *i, sfres); + TEST_PATH(is_absolute, *i, bres); + TEST_PATH(is_relative, *i, bres); SmallString<16> temp_store; TEST_PATH_SMALLVEC(make_absolute, *i, temp_store); From baldrick at free.fr Wed Dec 1 02:09:50 2010 From: baldrick at free.fr (Duncan Sands) Date: Wed, 01 Dec 2010 09:09:50 +0100 Subject: [llvm-commits] [llvm] r120498 - in /llvm/trunk: lib/Transforms/Scalar/DeadStoreElimination.cpp test/Transforms/DeadStoreElimination/PartialStore.ll In-Reply-To: <20101130234323.657052A6C12D@llvm.org> References: <20101130234323.657052A6C12D@llvm.org> Message-ID: <4CF602CE.7090902@free.fr> Hi Chris, > --- llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp (original) > +++ llvm/trunk/lib/Transforms/Scalar/DeadStoreElimination.cpp Tue Nov 30 17:43:23 2010 > @@ -19,6 +19,7 @@ > #include "llvm/Transforms/Scalar.h" > #include "llvm/Constants.h" > #include "llvm/Function.h" > +#include "llvm/GlobalVariable.h" > #include "llvm/Instructions.h" > #include "llvm/IntrinsicInst.h" > #include "llvm/Pass.h" > @@ -255,6 +256,17 @@ > return TD->getTypeAllocSize(PT->getElementType()); > } > > +/// isObjectPointerWithTrustworthySize - Return true if the specified Value* is > +/// pointing to an object with a pointer size we can trust. > +static bool isObjectPointerWithTrustworthySize(const Value *V) { > + if (const AllocaInst *AI = dyn_cast(V)) > + return !AI->isArrayAllocation(); > + if (const GlobalVariable *GV = dyn_cast(V)) > + return !GV->isWeakForLinker(); this should be mayBeOverridden not isWeakForLinker. That way globals with weak ODR linkage will be considered to have a trustworthy size. By the way isWeakForLinker should really be moved somewhere where people can't get at it, like the linker for example. > + if (const Argument *A = dyn_cast(V)) > + return A->hasByValAttr(); > + return false; > +} Ciao, Duncan. From jay.foad at gmail.com Wed Dec 1 02:53:58 2010 From: jay.foad at gmail.com (Jay Foad) Date: Wed, 01 Dec 2010 08:53:58 -0000 Subject: [llvm-commits] [llvm] r120564 - in /llvm/trunk: include/llvm/ADT/APInt.h lib/Analysis/ScalarEvolution.cpp lib/Analysis/ValueTracking.cpp lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp lib/CodeGen/SelectionDAG/SelectionDAG.cpp lib/Support/APInt.cpp lib/Transforms/InstCombine/InstCombineCompares.cpp lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp lib/Transforms/InstCombine/InstCombineVectorOps.cpp unittests/ADT/APIntTest.cpp Message-ID: <20101201085358.825502A6C12F@llvm.org> Author: foad Date: Wed Dec 1 02:53:58 2010 New Revision: 120564 URL: http://llvm.org/viewvc/llvm-project?rev=120564&view=rev Log: PR5207: Rename overloaded APInt methods set(), clear(), flip() to setAllBits(), setBit(unsigned), etc. Modified: llvm/trunk/include/llvm/ADT/APInt.h llvm/trunk/lib/Analysis/ScalarEvolution.cpp llvm/trunk/lib/Analysis/ValueTracking.cpp llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp llvm/trunk/lib/Support/APInt.cpp llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp llvm/trunk/unittests/ADT/APIntTest.cpp Modified: llvm/trunk/include/llvm/ADT/APInt.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/APInt.h?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/include/llvm/ADT/APInt.h (original) +++ llvm/trunk/include/llvm/ADT/APInt.h Wed Dec 1 02:53:58 2010 @@ -380,15 +380,15 @@ /// @brief Gets maximum unsigned value of APInt for specific bit width. static APInt getMaxValue(unsigned numBits) { APInt API(numBits, 0); - API.set(); + API.setAllBits(); return API; } /// @brief Gets maximum signed value of APInt for a specific bit width. static APInt getSignedMaxValue(unsigned numBits) { APInt API(numBits, 0); - API.set(); - API.clear(numBits - 1); + API.setAllBits(); + API.clearBit(numBits - 1); return API; } @@ -400,7 +400,7 @@ /// @brief Gets minimum signed value of APInt for a specific bit width. static APInt getSignedMinValue(unsigned numBits) { APInt API(numBits, 0); - API.set(numBits - 1); + API.setBit(numBits - 1); return API; } @@ -415,7 +415,7 @@ /// @brief Get the all-ones value. static APInt getAllOnesValue(unsigned numBits) { APInt API(numBits, 0); - API.set(); + API.setAllBits(); return API; } @@ -533,7 +533,7 @@ /// @brief Unary bitwise complement operator. APInt operator~() const { APInt Result(*this); - Result.flip(); + Result.flipAllBits(); return Result; } @@ -1044,7 +1044,7 @@ /// @name Bit Manipulation Operators /// @{ /// @brief Set every bit to 1. - void set() { + void setAllBits() { if (isSingleWord()) VAL = -1ULL; else { @@ -1058,10 +1058,10 @@ /// Set the given bit to 1 whose position is given as "bitPosition". /// @brief Set a given bit to 1. - void set(unsigned bitPosition); + void setBit(unsigned bitPosition); /// @brief Set every bit to 0. - void clear() { + void clearAllBits() { if (isSingleWord()) VAL = 0; else @@ -1070,10 +1070,10 @@ /// Set the given bit to 0 whose position is given as "bitPosition". /// @brief Set a given bit to 0. - void clear(unsigned bitPosition); + void clearBit(unsigned bitPosition); /// @brief Toggle every bit to its opposite value. - void flip() { + void flipAllBits() { if (isSingleWord()) VAL ^= -1ULL; else { @@ -1086,7 +1086,7 @@ /// Toggle a given bit to its opposite value whose position is given /// as "bitPosition". /// @brief Toggles a given bit to its opposite value. - void flip(unsigned bitPosition); + void flipBit(unsigned bitPosition); /// @} /// @name Value Characterization Functions Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original) +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Wed Dec 1 02:53:58 2010 @@ -4602,7 +4602,7 @@ // bit width during computations. APInt AD = A.lshr(Mult2).zext(BW + 1); // AD = A / D APInt Mod(BW + 1, 0); - Mod.set(BW - Mult2); // Mod = N / D + Mod.setBit(BW - Mult2); // Mod = N / D APInt I = AD.multiplicativeInverse(Mod); // 4. Compute the minimum unsigned root of the equation: Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original) +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Wed Dec 1 02:53:58 2010 @@ -69,14 +69,14 @@ // Null and aggregate-zero are all-zeros. if (isa(V) || isa(V)) { - KnownOne.clear(); + KnownOne.clearAllBits(); KnownZero = Mask; return; } // Handle a constant vector by taking the intersection of the known bits of // each element. if (ConstantVector *CV = dyn_cast(V)) { - KnownZero.set(); KnownOne.set(); + KnownZero.setAllBits(); KnownOne.setAllBits(); for (unsigned i = 0, e = CV->getNumOperands(); i != e; ++i) { APInt KnownZero2(BitWidth, 0), KnownOne2(BitWidth, 0); ComputeMaskedBits(CV->getOperand(i), Mask, KnownZero2, KnownOne2, @@ -103,15 +103,15 @@ KnownZero = Mask & APInt::getLowBitsSet(BitWidth, CountTrailingZeros_32(Align)); else - KnownZero.clear(); - KnownOne.clear(); + KnownZero.clearAllBits(); + KnownOne.clearAllBits(); return; } // A weak GlobalAlias is totally unknown. A non-weak GlobalAlias has // the bits of its aliasee. if (GlobalAlias *GA = dyn_cast(V)) { if (GA->mayBeOverridden()) { - KnownZero.clear(); KnownOne.clear(); + KnownZero.clearAllBits(); KnownOne.clearAllBits(); } else { ComputeMaskedBits(GA->getAliasee(), Mask, KnownZero, KnownOne, TD, Depth+1); @@ -119,7 +119,7 @@ return; } - KnownZero.clear(); KnownOne.clear(); // Start out not knowing anything. + KnownZero.clearAllBits(); KnownOne.clearAllBits(); // Start out not knowing anything. if (Depth == MaxDepth || Mask == 0) return; // Limit search depth. @@ -185,7 +185,7 @@ // Also compute a conserative estimate for high known-0 bits. // More trickiness is possible, but this is sufficient for the // interesting case of alignment computation. - KnownOne.clear(); + KnownOne.clearAllBits(); unsigned TrailZ = KnownZero.countTrailingOnes() + KnownZero2.countTrailingOnes(); unsigned LeadZ = std::max(KnownZero.countLeadingOnes() + @@ -208,8 +208,8 @@ AllOnes, KnownZero2, KnownOne2, TD, Depth+1); unsigned LeadZ = KnownZero2.countLeadingOnes(); - KnownOne2.clear(); - KnownZero2.clear(); + KnownOne2.clearAllBits(); + KnownZero2.clearAllBits(); ComputeMaskedBits(I->getOperand(1), AllOnes, KnownZero2, KnownOne2, TD, Depth+1); unsigned RHSUnknownLeadingOnes = KnownOne2.countLeadingZeros(); @@ -474,7 +474,7 @@ unsigned Leaders = std::max(KnownZero.countLeadingOnes(), KnownZero2.countLeadingOnes()); - KnownOne.clear(); + KnownOne.clearAllBits(); KnownZero = APInt::getHighBitsSet(BitWidth, Leaders) & Mask; break; } @@ -876,7 +876,7 @@ APInt Op1Int = Op1CI->getValue(); uint64_t BitToSet = Op1Int.getLimitedValue(Op1Int.getBitWidth() - 1); APInt API(Op1Int.getBitWidth(), 0); - API.set(BitToSet); + API.setBit(BitToSet); Op1 = ConstantInt::get(V->getContext(), API); } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp Wed Dec 1 02:53:58 2010 @@ -134,7 +134,7 @@ // Mask = ~(1 << (Size-1)) APInt API = APInt::getAllOnesValue(Size); - API.clear(Size-1); + API.clearBit(Size-1); SDValue Mask = DAG.getConstant(API, NVT); SDValue Op = GetSoftenedFloat(N->getOperand(0)); return DAG.getNode(ISD::AND, N->getDebugLoc(), NVT, Op, Mask); Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp Wed Dec 1 02:53:58 2010 @@ -292,7 +292,7 @@ // value was zero. This can be handled by setting the bit just off // the top of the original type. APInt TopBit(NVT.getSizeInBits(), 0); - TopBit.set(OVT.getSizeInBits()); + TopBit.setBit(OVT.getSizeInBits()); Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, NVT)); return DAG.getNode(ISD::CTTZ, dl, NVT, Op); } Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Dec 1 02:53:58 2010 @@ -1654,7 +1654,7 @@ // Also compute a conserative estimate for high known-0 bits. // More trickiness is possible, but this is sufficient for the // interesting case of alignment computation. - KnownOne.clear(); + KnownOne.clearAllBits(); unsigned TrailZ = KnownZero.countTrailingOnes() + KnownZero2.countTrailingOnes(); unsigned LeadZ = std::max(KnownZero.countLeadingOnes() + @@ -1677,8 +1677,8 @@ AllOnes, KnownZero2, KnownOne2, Depth+1); unsigned LeadZ = KnownZero2.countLeadingOnes(); - KnownOne2.clear(); - KnownZero2.clear(); + KnownOne2.clearAllBits(); + KnownZero2.clearAllBits(); ComputeMaskedBits(Op.getOperand(1), AllOnes, KnownZero2, KnownOne2, Depth+1); unsigned RHSUnknownLeadingOnes = KnownOne2.countLeadingZeros(); @@ -1833,7 +1833,7 @@ case ISD::CTPOP: { unsigned LowBits = Log2_32(BitWidth)+1; KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - LowBits); - KnownOne.clear(); + KnownOne.clearAllBits(); return; } case ISD::LOAD: { @@ -2032,7 +2032,7 @@ uint32_t Leaders = std::max(KnownZero.countLeadingOnes(), KnownZero2.countLeadingOnes()); - KnownOne.clear(); + KnownOne.clearAllBits(); KnownZero = APInt::getHighBitsSet(BitWidth, Leaders) & Mask; return; } Modified: llvm/trunk/lib/Support/APInt.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APInt.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/Support/APInt.cpp (original) +++ llvm/trunk/lib/Support/APInt.cpp Wed Dec 1 02:53:58 2010 @@ -361,7 +361,7 @@ unsigned rhsWords = !rhsBits ? 0 : whichWord(rhsBits - 1) + 1; if (!rhsWords) { // X * 0 ===> 0 - clear(); + clearAllBits(); return *this; } @@ -373,7 +373,7 @@ mul(dest, pVal, lhsWords, RHS.pVal, rhsWords); // Copy result back into *this - clear(); + clearAllBits(); unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords; memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE); @@ -562,12 +562,12 @@ bool rhsNeg = rhs.isNegative(); if (lhsNeg) { // Sign bit is set so perform two's complement to make it positive - lhs.flip(); + lhs.flipAllBits(); lhs++; } if (rhsNeg) { // Sign bit is set so perform two's complement to make it positive - rhs.flip(); + rhs.flipAllBits(); rhs++; } @@ -584,7 +584,7 @@ return lhs.ult(rhs); } -void APInt::set(unsigned bitPosition) { +void APInt::setBit(unsigned bitPosition) { if (isSingleWord()) VAL |= maskBit(bitPosition); else @@ -593,7 +593,7 @@ /// Set the given bit to 0 whose position is given as "bitPosition". /// @brief Set a given bit to 0. -void APInt::clear(unsigned bitPosition) { +void APInt::clearBit(unsigned bitPosition) { if (isSingleWord()) VAL &= ~maskBit(bitPosition); else @@ -605,10 +605,10 @@ /// Toggle a given bit to its opposite value whose position is given /// as "bitPosition". /// @brief Toggles a given bit to its opposite value. -void APInt::flip(unsigned bitPosition) { +void APInt::flipBit(unsigned bitPosition) { assert(bitPosition < BitWidth && "Out of the bit-width range!"); - if ((*this)[bitPosition]) clear(bitPosition); - else set(bitPosition); + if ((*this)[bitPosition]) clearBit(bitPosition); + else setBit(bitPosition); } unsigned APInt::getBitsNeeded(StringRef str, uint8_t radix) { @@ -1871,7 +1871,7 @@ if (!Quotient->isSingleWord()) Quotient->pVal = getClearedMemory(Quotient->getNumWords()); } else - Quotient->clear(); + Quotient->clearAllBits(); // The quotient is in Q. Reconstitute the quotient into Quotient's low // order words. @@ -1902,7 +1902,7 @@ if (!Remainder->isSingleWord()) Remainder->pVal = getClearedMemory(Remainder->getNumWords()); } else - Remainder->clear(); + Remainder->clearAllBits(); // The remainder is in R. Reconstitute the remainder into Remainder's low // order words. @@ -2157,7 +2157,7 @@ // If its negative, put it in two's complement form if (isNeg) { (*this)--; - this->flip(); + this->flipAllBits(); } } @@ -2205,7 +2205,7 @@ // They want to print the signed version and it is a negative value // Flip the bits and add one to turn it into the equivalent positive // value and put a '-' in the result. - Tmp.flip(); + Tmp.flipAllBits(); Tmp++; Str.push_back('-'); } Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCompares.cpp Wed Dec 1 02:53:58 2010 @@ -160,8 +160,8 @@ Max = KnownOne|UnknownBits; if (UnknownBits.isNegative()) { // Sign bit is unknown - Min.set(Min.getBitWidth()-1); - Max.clear(Max.getBitWidth()-1); + Min.setBit(Min.getBitWidth()-1); + Max.clearBit(Max.getBitWidth()-1); } } Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp Wed Dec 1 02:53:58 2010 @@ -121,13 +121,13 @@ } if (isa(V)) { // We know all of the bits for a constant! - KnownOne.clear(); + KnownOne.clearAllBits(); KnownZero = DemandedMask; return 0; } - KnownZero.clear(); - KnownOne.clear(); + KnownZero.clearAllBits(); + KnownOne.clearAllBits(); if (DemandedMask == 0) { // Not demanding any bits from V. if (isa(V)) return 0; @@ -451,7 +451,7 @@ // If any of the sign extended bits are demanded, we know that the sign // bit is demanded. if ((NewBits & DemandedMask) != 0) - InputDemandedBits.set(SrcBitWidth-1); + InputDemandedBits.setBit(SrcBitWidth-1); InputDemandedBits.trunc(SrcBitWidth); KnownZero.trunc(SrcBitWidth); @@ -634,7 +634,7 @@ // If any of the "high bits" are demanded, we should set the sign bit as // demanded. if (DemandedMask.countLeadingZeros() <= ShiftAmt) - DemandedMaskIn.set(BitWidth-1); + DemandedMaskIn.setBit(BitWidth-1); if (SimplifyDemandedBits(I->getOperandUse(0), DemandedMaskIn, KnownZero, KnownOne, Depth+1)) return I; @@ -793,10 +793,10 @@ for (unsigned i = 0; i != VWidth; ++i) if (!DemandedElts[i]) { // If not demanded, set to undef. Elts.push_back(Undef); - UndefElts.set(i); + UndefElts.setBit(i); } else if (isa(CV->getOperand(i))) { // Already undef. Elts.push_back(Undef); - UndefElts.set(i); + UndefElts.setBit(i); } else { // Otherwise, defined. Elts.push_back(CV->getOperand(i)); } @@ -879,13 +879,13 @@ // Otherwise, the element inserted overwrites whatever was there, so the // input demanded set is simpler than the output set. APInt DemandedElts2 = DemandedElts; - DemandedElts2.clear(IdxNo); + DemandedElts2.clearBit(IdxNo); TmpV = SimplifyDemandedVectorElts(I->getOperand(0), DemandedElts2, UndefElts, Depth+1); if (TmpV) { I->setOperand(0, TmpV); MadeChange = true; } // The inserted element is defined. - UndefElts.clear(IdxNo); + UndefElts.clearBit(IdxNo); break; } case Instruction::ShuffleVector: { @@ -900,9 +900,9 @@ assert(MaskVal < LHSVWidth * 2 && "shufflevector mask index out of range!"); if (MaskVal < LHSVWidth) - LeftDemanded.set(MaskVal); + LeftDemanded.setBit(MaskVal); else - RightDemanded.set(MaskVal - LHSVWidth); + RightDemanded.setBit(MaskVal - LHSVWidth); } } } @@ -921,16 +921,16 @@ for (unsigned i = 0; i < VWidth; i++) { unsigned MaskVal = Shuffle->getMaskValue(i); if (MaskVal == -1u) { - UndefElts.set(i); + UndefElts.setBit(i); } else if (MaskVal < LHSVWidth) { if (UndefElts4[MaskVal]) { NewUndefElts = true; - UndefElts.set(i); + UndefElts.setBit(i); } } else { if (UndefElts3[MaskVal - LHSVWidth]) { NewUndefElts = true; - UndefElts.set(i); + UndefElts.setBit(i); } } } @@ -973,7 +973,7 @@ Ratio = VWidth/InVWidth; for (unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx) { if (DemandedElts[OutIdx]) - InputDemandedElts.set(OutIdx/Ratio); + InputDemandedElts.setBit(OutIdx/Ratio); } } else { // Untested so far. @@ -985,7 +985,7 @@ Ratio = InVWidth/VWidth; for (unsigned InIdx = 0; InIdx != InVWidth; ++InIdx) if (DemandedElts[InIdx/Ratio]) - InputDemandedElts.set(InIdx); + InputDemandedElts.setBit(InIdx); } // div/rem demand all inputs, because they don't want divide by zero. @@ -1004,7 +1004,7 @@ // undef. for (unsigned OutIdx = 0; OutIdx != VWidth; ++OutIdx) if (UndefElts2[OutIdx/Ratio]) - UndefElts.set(OutIdx); + UndefElts.setBit(OutIdx); } else if (VWidth < InVWidth) { llvm_unreachable("Unimp"); // If there are more elements in the source than there are in the result, @@ -1013,7 +1013,7 @@ UndefElts = ~0ULL >> (64-VWidth); // Start out all undef. for (unsigned InIdx = 0; InIdx != InVWidth; ++InIdx) if (!UndefElts2[InIdx]) // Not undef? - UndefElts.clear(InIdx/Ratio); // Clear undef bit. + UndefElts.clearBit(InIdx/Ratio); // Clear undef bit. } break; } Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp (original) +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineVectorOps.cpp Wed Dec 1 02:53:58 2010 @@ -160,7 +160,7 @@ if (EI.getOperand(0)->hasOneUse() && VectorWidth != 1) { APInt UndefElts(VectorWidth, 0); APInt DemandedMask(VectorWidth, 0); - DemandedMask.set(IndexVal); + DemandedMask.setBit(IndexVal); if (Value *V = SimplifyDemandedVectorElts(EI.getOperand(0), DemandedMask, UndefElts)) { EI.setOperand(0, V); Modified: llvm/trunk/unittests/ADT/APIntTest.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/APIntTest.cpp?rev=120564&r1=120563&r2=120564&view=diff ============================================================================== --- llvm/trunk/unittests/ADT/APIntTest.cpp (original) +++ llvm/trunk/unittests/ADT/APIntTest.cpp Wed Dec 1 02:53:58 2010 @@ -57,7 +57,7 @@ TEST(APIntTest, i65_Count) { APInt i65minus(65, 0, true); - i65minus.set(64); + i65minus.setBit(64); EXPECT_EQ(0u, i65minus.countLeadingZeros()); EXPECT_EQ(1u, i65minus.countLeadingOnes()); EXPECT_EQ(65u, i65minus.getActiveBits()); From geek4civic at gmail.com Wed Dec 1 04:37:37 2010 From: geek4civic at gmail.com (NAKAMURA Takumi) Date: Wed, 1 Dec 2010 19:37:37 +0900 Subject: [llvm-commits] [Review request] Add the feature "sh" for LLVM::Other/close-stderr.ll, for MSVC In-Reply-To: References: Message-ID: Good evening, Rafael. 2010/11/30 Rafael Esp?ndola : > If no one has a better idea, the patch is fine. Just use a more > descriptive name like "posix_shell" or just "shell" :-) I updated my patches. Simply I took 'shell'. ...Takumi -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-test-Add-the-feature-shell-on-LLVM_ON_UNIX.patch Type: application/octet-stream Size: 712 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101201/300e8014/attachment.obj -------------- next part -------------- A non-text attachment was scrubbed... Name: 0002-test-Other-close-stderr.ll-Require-the-feature-shell.patch Type: application/octet-stream Size: 772 bytes Desc: not available Url : http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20101201/300e8014/attachment-0001.obj From clchiou at gmail.com Wed Dec 1 05:45:53 2010 From: clchiou at gmail.com (Che-Liang Chiou) Date: Wed, 01 Dec 2010 11:45:53 -0000 Subject: [llvm-commits] [llvm] r120571 - /llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Message-ID: <20101201114553.C5F1B2A6C12D@llvm.org> Author: clchiou Date: Wed Dec 1 05:45:53 2010 New Revision: 120571 URL: http://llvm.org/viewvc/llvm-project?rev=120571&view=rev Log: ptx: bug fix: use after free Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp?rev=120571&r1=120570&r2=120571&view=diff ============================================================================== --- llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp (original) +++ llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Wed Dec 1 05:45:53 2010 @@ -130,20 +130,21 @@ } void PTXAsmPrinter::EmitInstruction(const MachineInstr *MI) { - SmallString<128> sstr; - raw_svector_ostream OS(sstr); + std::string str; + str.reserve(64); + + // Write instruction to str + raw_string_ostream OS(str); printInstruction(MI, OS); OS << ';'; + OS.flush(); // Replace "%type" if found - StringRef strref = OS.str(); size_t pos; - if ((pos = strref.find("%type")) != StringRef::npos) { - std::string str = strref; + if ((pos = str.find("%type")) != std::string::npos) str.replace(pos, /*strlen("%type")==*/5, getInstructionTypeName(MI)); - strref = StringRef(str); - } + StringRef strref = StringRef(str); OutStreamer.EmitRawText(strref); } From nunoplopes at sapo.pt Wed Dec 1 06:01:29 2010 From: nunoplopes at sapo.pt (Nuno Lopes) Date: Wed, 01 Dec 2010 12:01:29 -0000 Subject: [llvm-commits] [www-pubs] r120572 - in /www-pubs/trunk: 2006-04-25-GelatoLLVMIntro.pdf 2010-06-ISMM-CETS.html 2010-06-ISMM-SpeculativeParallelization.html index.html pubs.js Message-ID: <20101201120129.B19E02A6C12D@llvm.org> Author: nlopes Date: Wed Dec 1 06:01:29 2010 New Revision: 120572 URL: http://llvm.org/viewvc/llvm-project?rev=120572&view=rev Log: add another ISMM'10 paper Added: www-pubs/trunk/2010-06-ISMM-SpeculativeParallelization.html Modified: www-pubs/trunk/2006-04-25-GelatoLLVMIntro.pdf (props changed) www-pubs/trunk/2010-06-ISMM-CETS.html www-pubs/trunk/index.html (props changed) www-pubs/trunk/pubs.js Propchange: www-pubs/trunk/2006-04-25-GelatoLLVMIntro.pdf ------------------------------------------------------------------------------ --- svn:executable (original) +++ svn:executable (removed) @@ -1 +0,0 @@ -* Modified: www-pubs/trunk/2010-06-ISMM-CETS.html URL: http://llvm.org/viewvc/llvm-project/www-pubs/trunk/2010-06-ISMM-CETS.html?rev=120572&r1=120571&r2=120572&view=diff ============================================================================== --- www-pubs/trunk/2010-06-ISMM-CETS.html (original) +++ www-pubs/trunk/2010-06-ISMM-CETS.html Wed Dec 1 06:01:29 2010 @@ -43,7 +43,7 @@ Santosh Nagarakatte, Jianzhou Zhao, Milo M K Martin and Steve Zdancewic.
    -Proceedings of the International Conference on Memory Management, +Proceedings of the International Symposium on Memory Management, Toronto, Canada, June 2010.

    Download:

    Added: www-pubs/trunk/2010-06-ISMM-SpeculativeParallelization.html URL: http://llvm.org/viewvc/llvm-project/www-pubs/trunk/2010-06-ISMM-SpeculativeParallelization.html?rev=120572&view=auto ============================================================================== --- www-pubs/trunk/2010-06-ISMM-SpeculativeParallelization.html (added) +++ www-pubs/trunk/2010-06-ISMM-SpeculativeParallelization.html Wed Dec 1 06:01:29 2010 @@ -0,0 +1,75 @@ + + + +
  • Treat Compiler Warnings Like Errors