From lattner at cs.uiuc.edu Mon Aug 22 11:11:58 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 11:11:58 -0500 Subject: [llvm-commits] CVS: llvm/docs/CommandLine.html Message-ID: <200508221611.LAA19895@zion.cs.uiuc.edu> Changes in directory llvm/docs: CommandLine.html updated: 1.33 -> 1.34 --- Log message: Make the example a bit easier to understand, suggested by Jim. --- Diffs of the changes: (+3 -2) CommandLine.html | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/docs/CommandLine.html diff -u llvm/docs/CommandLine.html:1.33 llvm/docs/CommandLine.html:1.34 --- llvm/docs/CommandLine.html:1.33 Tue May 10 17:05:27 2005 +++ llvm/docs/CommandLine.html Mon Aug 22 11:11:46 2005 @@ -1714,7 +1714,7 @@ while (1) { switch (*End++) { - case 0: return false; // No error + case 0: break; // No error case 'i': // Ignore the 'i' in KiB if people use that case 'b': case 'B': // Ignore B suffix break; @@ -1728,6 +1728,7 @@ return O.error(": '" + Arg + "' value invalid for file size argument!"); } } + return false; } @@ -1814,7 +1815,7 @@ Chris Lattner
LLVM Compiler Infrastructure
- Last modified: $Date: 2005/05/10 22:05:27 $ + Last modified: $Date: 2005/08/22 16:11:46 $ From lattner at cs.uiuc.edu Mon Aug 22 11:24:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 11:24:37 -0500 Subject: [llvm-commits] CVS: llvm/docs/CommandLine.html Message-ID: <200508221624.LAA20167@zion.cs.uiuc.edu> Changes in directory llvm/docs: CommandLine.html updated: 1.34 -> 1.35 --- Log message: Revert my patch which changed the code to not work. --- Diffs of the changes: (+2 -3) CommandLine.html | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/docs/CommandLine.html diff -u llvm/docs/CommandLine.html:1.34 llvm/docs/CommandLine.html:1.35 --- llvm/docs/CommandLine.html:1.34 Mon Aug 22 11:11:46 2005 +++ llvm/docs/CommandLine.html Mon Aug 22 11:24:25 2005 @@ -1714,7 +1714,7 @@ while (1) { switch (*End++) { - case 0: break; // No error + case 0: return false; // No error case 'i': // Ignore the 'i' in KiB if people use that case 'b': case 'B': // Ignore B suffix break; @@ -1728,7 +1728,6 @@ return O.error(": '" + Arg + "' value invalid for file size argument!"); } } - return false; } @@ -1815,7 +1814,7 @@ Chris Lattner
LLVM Compiler Infrastructure
- Last modified: $Date: 2005/08/22 16:11:46 $ + Last modified: $Date: 2005/08/22 16:24:25 $ From lattner at cs.uiuc.edu Mon Aug 22 11:55:34 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 11:55:34 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegAllocLinearScan.cpp Message-ID: <200508221655.LAA20458@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegAllocLinearScan.cpp updated: 1.108 -> 1.109 --- Log message: Speed up this loop a bit, based on some observations that Nate made, and add some comments. This loop really needs to be reevaluated! --- Diffs of the changes: (+34 -8) RegAllocLinearScan.cpp | 42 ++++++++++++++++++++++++++++++++++-------- 1 files changed, 34 insertions(+), 8 deletions(-) Index: llvm/lib/CodeGen/RegAllocLinearScan.cpp diff -u llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.108 llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.109 --- llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.108 Thu Apr 21 17:33:33 2005 +++ llvm/lib/CodeGen/RegAllocLinearScan.cpp Mon Aug 22 11:55:22 2005 @@ -603,6 +603,8 @@ unsigned RA::getFreePhysReg(LiveInterval* cur) { std::vector inactiveCounts(mri_->getNumRegs(), 0); + unsigned MaxInactiveCount = 0; + for (IntervalPtrs::iterator i = inactive_.begin(), e = inactive_.end(); i != e; ++i) { unsigned reg = i->first->reg; @@ -610,19 +612,43 @@ "Can only allocate virtual registers!"); reg = vrm_->getPhys(reg); ++inactiveCounts[reg]; + MaxInactiveCount = std::max(MaxInactiveCount, inactiveCounts[reg]); } const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg); - unsigned freeReg = 0; - for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_), - e = rc->allocation_order_end(*mf_); i != e; ++i) { - unsigned reg = *i; - if (prt_->isRegAvail(reg) && - (!freeReg || inactiveCounts[freeReg] < inactiveCounts[reg])) - freeReg = reg; + unsigned FreeReg = 0; + unsigned FreeRegInactiveCount = 0; + + // Scan for the first available register. + TargetRegisterClass::iterator I = rc->allocation_order_begin(*mf_); + TargetRegisterClass::iterator E = rc->allocation_order_end(*mf_); + for (; I != E; ++I) + if (prt_->isRegAvail(*I)) { + FreeReg = *I; + FreeRegInactiveCount = inactiveCounts[FreeReg]; + break; + } + + // If there are no free regs, or if this reg has the max inactive count, + // return this register. + if (FreeReg == 0 || FreeRegInactiveCount == MaxInactiveCount) return FreeReg; + + // Continue scanning the registers, looking for the one with the highest + // inactive count. Alkis found that this reduced register pressure very + // slightly on X86 (in rev 1.94 of this file), though this should probably be + // reevaluated now. + for (; I != E; ++I) { + unsigned Reg = *I; + if (prt_->isRegAvail(Reg) && FreeRegInactiveCount < inactiveCounts[Reg]) { + FreeReg = Reg; + FreeRegInactiveCount = inactiveCounts[Reg]; + if (FreeRegInactiveCount == MaxInactiveCount) + break; // We found the one with the max inactive count. + } } - return freeReg; + + return FreeReg; } FunctionPass* llvm::createLinearScanRegisterAllocator() { From lattner at cs.uiuc.edu Mon Aug 22 12:14:28 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 12:14:28 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/IA64/ Message-ID: <200508221714.MAA20610@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/IA64: --- Log message: Directory /var/cvs/llvm/llvm/test/Regression/CodeGen/IA64 added to the repository --- Diffs of the changes: (+0 -0) 0 files changed From lattner at cs.uiuc.edu Mon Aug 22 12:15:52 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 12:15:52 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/IA64/dg.exp Message-ID: <200508221715.MAA20673@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/IA64: dg.exp added (r1.1) --- Log message: Add a long-overdue itanium regression test dir: hint hint Duraid :) --- Diffs of the changes: (+3 -0) dg.exp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/test/Regression/CodeGen/IA64/dg.exp diff -c /dev/null llvm/test/Regression/CodeGen/IA64/dg.exp:1.1 *** /dev/null Mon Aug 22 12:15:51 2005 --- llvm/test/Regression/CodeGen/IA64/dg.exp Mon Aug 22 12:15:41 2005 *************** *** 0 **** --- 1,3 ---- + load_lib llvm-dg.exp + + llvm-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,llx,c,cpp,tr}]] $objdir $srcdir $subdir $target_triplet $llvmgcc $llvmgxx $prcontext From lattner at cs.uiuc.edu Mon Aug 22 12:17:00 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 12:17:00 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/IA64/2005-08-22-LegalizerCrash.ll Message-ID: <200508221717.MAA20733@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/IA64: 2005-08-22-LegalizerCrash.ll added (r1.1) --- Log message: Testcase for a crash in the legalizer on ia64. This is reduced from kc++. --- Diffs of the changes: (+11 -0) 2005-08-22-LegalizerCrash.ll | 11 +++++++++++ 1 files changed, 11 insertions(+) Index: llvm/test/Regression/CodeGen/IA64/2005-08-22-LegalizerCrash.ll diff -c /dev/null llvm/test/Regression/CodeGen/IA64/2005-08-22-LegalizerCrash.ll:1.1 *** /dev/null Mon Aug 22 12:16:59 2005 --- llvm/test/Regression/CodeGen/IA64/2005-08-22-LegalizerCrash.ll Mon Aug 22 12:16:49 2005 *************** *** 0 **** --- 1,11 ---- + ; RUN: llvm-as < %s | llc -march=ia64 + + %_ZN9__gnu_cxx16__stl_prime_listE = external global [28 x uint] ; <[28 x uint]*> [#uses=3] + + implementation ; Functions: + + fastcc uint* %_ZSt11lower_boundIPKmmET_S2_S2_RKT0_(uint %__val.val) { + entry: + %retval = select bool setgt (int shr (int sub (int cast (uint* getelementptr ([28 x uint]* %_ZN9__gnu_cxx16__stl_prime_listE, int 0, int 28) to int), int cast ([28 x uint]* %_ZN9__gnu_cxx16__stl_prime_listE to int)), ubyte 2), int 0), uint* null, uint* getelementptr ([28 x uint]* %_ZN9__gnu_cxx16__stl_prime_listE, int 0, int 0) ; [#uses=1] + ret uint* %retval + } From lattner at cs.uiuc.edu Mon Aug 22 12:28:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 12:28:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200508221728.MAA20838@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.72 -> 1.73 --- Log message: Fix a problem where constant expr shifts would not have their shift amount promoted to the right type. This fixes: IA64/2005-08-22-LegalizerCrash.ll --- Diffs of the changes: (+5 -5) SelectionDAGISel.cpp | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.72 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.73 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.72 Thu Aug 18 12:35:14 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Aug 22 12:28:31 2005 @@ -337,7 +337,7 @@ void visitUnwind(UnwindInst &I) { assert(0 && "TODO"); } // - void visitBinary(User &I, unsigned Opcode); + void visitBinary(User &I, unsigned Opcode, bool isShift = false); void visitAdd(User &I) { visitBinary(I, ISD::ADD); } void visitSub(User &I); void visitMul(User &I) { visitBinary(I, ISD::MUL); } @@ -350,9 +350,9 @@ void visitAnd(User &I) { visitBinary(I, ISD::AND); } void visitOr (User &I) { visitBinary(I, ISD::OR); } void visitXor(User &I) { visitBinary(I, ISD::XOR); } - void visitShl(User &I) { visitBinary(I, ISD::SHL); } + void visitShl(User &I) { visitBinary(I, ISD::SHL, true); } void visitShr(User &I) { - visitBinary(I, I.getType()->isUnsigned() ? ISD::SRL : ISD::SRA); + visitBinary(I, I.getType()->isUnsigned() ? ISD::SRL : ISD::SRA, true); } void visitSetCC(User &I, ISD::CondCode SignedOpc, ISD::CondCode UnsignedOpc); @@ -486,11 +486,11 @@ visitBinary(I, ISD::SUB); } -void SelectionDAGLowering::visitBinary(User &I, unsigned Opcode) { +void SelectionDAGLowering::visitBinary(User &I, unsigned Opcode, bool isShift) { SDOperand Op1 = getValue(I.getOperand(0)); SDOperand Op2 = getValue(I.getOperand(1)); - if (isa(I)) + if (isShift) Op2 = DAG.getNode(ISD::ZERO_EXTEND, TLI.getShiftAmountTy(), Op2); setValue(&I, DAG.getNode(Opcode, Op1.getValueType(), Op1, Op2)); From lattner at cs.uiuc.edu Mon Aug 22 13:28:21 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 13:28:21 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelPattern.cpp Message-ID: <200508221828.NAA21422@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelPattern.cpp updated: 1.58 -> 1.59 --- Log message: Add a pass name for -time-passes output --- Diffs of the changes: (+1 -0) IA64ISelPattern.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Target/IA64/IA64ISelPattern.cpp diff -u llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.58 llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.59 --- llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.58 Sun Aug 21 10:43:53 2005 +++ llvm/lib/Target/IA64/IA64ISelPattern.cpp Mon Aug 22 13:28:09 2005 @@ -441,6 +441,7 @@ // a dag->dag to transform mul-by-constant-int to shifts+adds/subs SDOperand BuildConstmulSequence(SDOperand N); + const char *getPassName() const { return "IA64 Instruction Selector"; } }; } From lattner at cs.uiuc.edu Mon Aug 22 15:20:54 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 15:20:54 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegAllocLinearScan.cpp Message-ID: <200508222020.PAA28316@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegAllocLinearScan.cpp updated: 1.109 -> 1.110 --- Log message: Move some code in the register assignment case that only needs to happen if we spill out of the fast path. The scan of active_ and the calls to updateSpillWeights don't need to happen unless a spill occurs. This reduces debug llc time of kc++ with ppc from 187.3s to 183.2s. --- Diffs of the changes: (+26 -17) RegAllocLinearScan.cpp | 43 ++++++++++++++++++++++++++----------------- 1 files changed, 26 insertions(+), 17 deletions(-) Index: llvm/lib/CodeGen/RegAllocLinearScan.cpp diff -u llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.109 llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.110 --- llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.109 Mon Aug 22 11:55:22 2005 +++ llvm/lib/CodeGen/RegAllocLinearScan.cpp Mon Aug 22 15:20:42 2005 @@ -365,23 +365,11 @@ PhysRegTracker backupPrt = *prt_; - std::vector SpillWeights; - SpillWeights.assign(mri_->getNumRegs(), 0.0); - + std::vector > SpillWeightsToAdd; unsigned StartPosition = cur->beginNumber(); - // for each interval in active, update spill weights. - for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end(); - i != e; ++i) { - unsigned reg = i->first->reg; - assert(MRegisterInfo::isVirtualRegister(reg) && - "Can only allocate virtual registers!"); - reg = vrm_->getPhys(reg); - updateSpillWeights(SpillWeights, reg, i->first->weight, mri_); - } - // for every interval in inactive we overlap with, mark the - // register as not free and update spill weights + // register as not free and update spill weights. for (IntervalPtrs::const_iterator i = inactive_.begin(), e = inactive_.end(); i != e; ++i) { if (cur->overlapsFrom(*i->first, i->second-1)) { @@ -390,7 +378,7 @@ "Can only allocate virtual registers!"); reg = vrm_->getPhys(reg); prt_->addRegUse(reg); - updateSpillWeights(SpillWeights, reg, i->first->weight, mri_); + SpillWeightsToAdd.push_back(std::make_pair(reg, i->first->weight)); } } @@ -407,14 +395,19 @@ if (cur->overlapsFrom(*I, II)) { unsigned reg = I->reg; prt_->addRegUse(reg); - updateSpillWeights(SpillWeights, reg, I->weight, mri_); + SpillWeightsToAdd.push_back(std::make_pair(reg, I->weight)); } } } + // Using the newly updated prt_ object, which includes conflicts in the + // future, see if there are any registers available. unsigned physReg = getFreePhysReg(cur); - // restore the physical register tracker + + // Restore the physical register tracker, removing information about the + // future. *prt_ = backupPrt; + // if we find a free register, we are done: assign this virtual to // the free physical register and add this interval to the active // list. @@ -428,6 +421,22 @@ } DEBUG(std::cerr << "no free registers\n"); + // Compile the spill weights into an array that is better for scanning. + std::vector SpillWeights(mri_->getNumRegs(), 0.0); + for (std::vector >::iterator + I = SpillWeightsToAdd.begin(), E = SpillWeightsToAdd.end(); I != E; ++I) + updateSpillWeights(SpillWeights, I->first, I->second, mri_); + + // for each interval in active, update spill weights. + for (IntervalPtrs::const_iterator i = active_.begin(), e = active_.end(); + i != e; ++i) { + unsigned reg = i->first->reg; + assert(MRegisterInfo::isVirtualRegister(reg) && + "Can only allocate virtual registers!"); + reg = vrm_->getPhys(reg); + updateSpillWeights(SpillWeights, reg, i->first->weight, mri_); + } + DEBUG(std::cerr << "\tassigning stack slot at interval "<< *cur << ":\n"); float minWeight = float(HUGE_VAL); From lattner at cs.uiuc.edu Mon Aug 22 15:59:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 15:59:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegAllocLinearScan.cpp Message-ID: <200508222059.PAA30621@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegAllocLinearScan.cpp updated: 1.110 -> 1.111 --- Log message: Try to avoid scanning the fixed list. On architectures with a non-stupid number of regs (e.g. most riscs), many functions won't need to use callee clobbered registers. Do a speculative check to see if we can get a free register without processing the fixed list (which has all of these). This saves a lot of time on machines with lots of callee clobbered regs (e.g. ppc and itanium, also x86). This reduces ppc llc compile time from 184s -> 172s on kc++. This is probably worth FAR FAR more on itanium though. --- Diffs of the changes: (+55 -20) RegAllocLinearScan.cpp | 75 +++++++++++++++++++++++++++++++++++-------------- 1 files changed, 55 insertions(+), 20 deletions(-) Index: llvm/lib/CodeGen/RegAllocLinearScan.cpp diff -u llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.110 llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.111 --- llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.110 Mon Aug 22 15:20:42 2005 +++ llvm/lib/CodeGen/RegAllocLinearScan.cpp Mon Aug 22 15:59:30 2005 @@ -381,29 +381,64 @@ SpillWeightsToAdd.push_back(std::make_pair(reg, i->first->weight)); } } - - // For every interval in fixed we overlap with, mark the register as not free - // and update spill weights. - for (unsigned i = 0, e = fixed_.size(); i != e; ++i) { - IntervalPtr &IP = fixed_[i]; - LiveInterval *I = IP.first; - if (I->endNumber() > StartPosition) { - LiveInterval::iterator II = I->advanceTo(IP.second, StartPosition); - IP.second = II; - if (II != I->begin() && II->start > StartPosition) - --II; - if (cur->overlapsFrom(*I, II)) { - unsigned reg = I->reg; - prt_->addRegUse(reg); - SpillWeightsToAdd.push_back(std::make_pair(reg, I->weight)); + + // Speculatively check to see if we can get a register right now. If not, + // we know we won't be able to by adding more constraints. If so, we can + // check to see if it is valid. Doing an exhaustive search of the fixed_ list + // is very bad (it contains all callee clobbered registers for any functions + // with a call), so we want to avoid doing that if possible. + unsigned physReg = getFreePhysReg(cur); + if (physReg) { + // We got a register. However, if it's in the fixed_ list, we might + // conflict with it. Check to see if we conflict with it. + bool ConflictsWithFixed = false; + for (unsigned i = 0, e = fixed_.size(); i != e; ++i) { + if (physReg == fixed_[i].first->reg) { + // Okay, this reg is on the fixed list. Check to see if we actually + // conflict. + IntervalPtr &IP = fixed_[i]; + LiveInterval *I = IP.first; + if (I->endNumber() > StartPosition) { + LiveInterval::iterator II = I->advanceTo(IP.second, StartPosition); + IP.second = II; + if (II != I->begin() && II->start > StartPosition) + --II; + if (cur->overlapsFrom(*I, II)) + ConflictsWithFixed = true; + } + + break; } } - } + + // Okay, the register picked by our speculative getFreePhysReg call turned + // out to be in use. Actually add all of the conflicting fixed registers to + // prt so we can do an accurate query. + if (ConflictsWithFixed) { + // For every interval in fixed we overlap with, mark the register as not free + // and update spill weights. + for (unsigned i = 0, e = fixed_.size(); i != e; ++i) { + IntervalPtr &IP = fixed_[i]; + LiveInterval *I = IP.first; + if (I->endNumber() > StartPosition) { + LiveInterval::iterator II = I->advanceTo(IP.second, StartPosition); + IP.second = II; + if (II != I->begin() && II->start > StartPosition) + --II; + if (cur->overlapsFrom(*I, II)) { + unsigned reg = I->reg; + prt_->addRegUse(reg); + SpillWeightsToAdd.push_back(std::make_pair(reg, I->weight)); + } + } + } - // Using the newly updated prt_ object, which includes conflicts in the - // future, see if there are any registers available. - unsigned physReg = getFreePhysReg(cur); - + // Using the newly updated prt_ object, which includes conflicts in the + // future, see if there are any registers available. + physReg = getFreePhysReg(cur); + } + } + // Restore the physical register tracker, removing information about the // future. *prt_ = backupPrt; From lattner at cs.uiuc.edu Mon Aug 22 16:33:23 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 16:33:23 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelPattern.cpp Message-ID: <200508222133.QAA32624@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelPattern.cpp updated: 1.59 -> 1.60 --- Log message: Fix a crash I introduced into the IA64 backend with my copyfromreg change. It used to crash on any function that took float arguments. --- Diffs of the changes: (+3 -1) IA64ISelPattern.cpp | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/lib/Target/IA64/IA64ISelPattern.cpp diff -u llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.59 llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.60 --- llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.59 Mon Aug 22 13:28:09 2005 +++ llvm/lib/Target/IA64/IA64ISelPattern.cpp Mon Aug 22 16:33:11 2005 @@ -202,7 +202,9 @@ argPreg[count] = args_FP[used_FPArgs++]; argOpc[count] = IA64::FMOV; argt = newroot = DAG.getCopyFromReg(DAG.getRoot(), argVreg[count], - getValueType(I->getType())); + MVT::f64); + if (I->getType() == Type::FloatTy) + argt = DAG.getNode(ISD::FP_ROUND, MVT::f32, argt); break; case MVT::i1: // NOTE: as far as C abi stuff goes, // bools are just boring old ints From lattner at cs.uiuc.edu Mon Aug 22 17:00:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 17:00:14 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp PowerPCRegisterInfo.td Message-ID: <200508222200.RAA02851@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCAsmPrinter.cpp updated: 1.87 -> 1.88 PowerPCRegisterInfo.td updated: 1.14 -> 1.15 --- Log message: Nate noticed that 30% of the malloc/frees in llc come from calls to LowercaseString in the asmprinter. This changes the .td files to use lower case register names, avoiding the need to do this call. This speeds up the asmprinter from 1.52s to 1.06s on kc++ in a release build. --- Diffs of the changes: (+44 -44) PowerPCAsmPrinter.cpp | 4 +- PowerPCRegisterInfo.td | 84 ++++++++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 44 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.87 llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.88 --- llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.87 Sun Aug 21 14:09:33 2005 +++ llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp Mon Aug 22 17:00:02 2005 @@ -89,7 +89,7 @@ const MachineOperand &MO = MI->getOperand(OpNo); if (MO.getType() == MachineOperand::MO_MachineRegister) { assert(MRegisterInfo::isPhysicalRegister(MO.getReg())&&"Not physreg??"); - O << LowercaseString(TM.getRegisterInfo()->get(MO.getReg()).Name); + O << TM.getRegisterInfo()->get(MO.getReg()).Name; } else if (MO.isImmediate()) { O << MO.getImmedValue(); } else { @@ -275,7 +275,7 @@ // FALLTHROUGH case MachineOperand::MO_MachineRegister: case MachineOperand::MO_CCRegister: - O << LowercaseString(RI.get(MO.getReg()).Name); + O << RI.get(MO.getReg()).Name; return; case MachineOperand::MO_SignExtendedImmed: Index: llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td:1.14 llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td:1.15 --- llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td:1.14 Mon Sep 13 23:16:24 2004 +++ llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td Mon Aug 22 17:00:02 2005 @@ -37,57 +37,57 @@ } // General-purpose registers -def R0 : GPR< 0, "R0">; def R1 : GPR< 1, "R1">; -def R2 : GPR< 2, "R2">; def R3 : GPR< 3, "R3">; -def R4 : GPR< 4, "R4">; def R5 : GPR< 5, "R5">; -def R6 : GPR< 6, "R6">; def R7 : GPR< 7, "R7">; -def R8 : GPR< 8, "R8">; def R9 : GPR< 9, "R9">; -def R10 : GPR<10, "R10">; def R11 : GPR<11, "R11">; -def R12 : GPR<12, "R12">; def R13 : GPR<13, "R13">; -def R14 : GPR<14, "R14">; def R15 : GPR<15, "R15">; -def R16 : GPR<16, "R16">; def R17 : GPR<17, "R17">; -def R18 : GPR<18, "R18">; def R19 : GPR<19, "R19">; -def R20 : GPR<20, "R20">; def R21 : GPR<21, "R21">; -def R22 : GPR<22, "R22">; def R23 : GPR<23, "R23">; -def R24 : GPR<24, "R24">; def R25 : GPR<25, "R25">; -def R26 : GPR<26, "R26">; def R27 : GPR<27, "R27">; -def R28 : GPR<28, "R28">; def R29 : GPR<29, "R29">; -def R30 : GPR<30, "R30">; def R31 : GPR<31, "R31">; +def R0 : GPR< 0, "r0">; def R1 : GPR< 1, "r1">; +def R2 : GPR< 2, "r2">; def R3 : GPR< 3, "r3">; +def R4 : GPR< 4, "r4">; def R5 : GPR< 5, "r5">; +def R6 : GPR< 6, "r6">; def R7 : GPR< 7, "r7">; +def R8 : GPR< 8, "r8">; def R9 : GPR< 9, "r9">; +def R10 : GPR<10, "r10">; def R11 : GPR<11, "r11">; +def R12 : GPR<12, "r12">; def R13 : GPR<13, "r13">; +def R14 : GPR<14, "r14">; def R15 : GPR<15, "r15">; +def R16 : GPR<16, "r16">; def R17 : GPR<17, "r17">; +def R18 : GPR<18, "r18">; def R19 : GPR<19, "r19">; +def R20 : GPR<20, "r20">; def R21 : GPR<21, "r21">; +def R22 : GPR<22, "r22">; def R23 : GPR<23, "r23">; +def R24 : GPR<24, "r24">; def R25 : GPR<25, "r25">; +def R26 : GPR<26, "r26">; def R27 : GPR<27, "r27">; +def R28 : GPR<28, "r28">; def R29 : GPR<29, "r29">; +def R30 : GPR<30, "r30">; def R31 : GPR<31, "r31">; // Floating-point registers -def F0 : FPR< 0, "F0">; def F1 : FPR< 1, "F1">; -def F2 : FPR< 2, "F2">; def F3 : FPR< 3, "F3">; -def F4 : FPR< 4, "F4">; def F5 : FPR< 5, "F5">; -def F6 : FPR< 6, "F6">; def F7 : FPR< 7, "F7">; -def F8 : FPR< 8, "F8">; def F9 : FPR< 9, "F9">; -def F10 : FPR<10, "F10">; def F11 : FPR<11, "F11">; -def F12 : FPR<12, "F12">; def F13 : FPR<13, "F13">; -def F14 : FPR<14, "F14">; def F15 : FPR<15, "F15">; -def F16 : FPR<16, "F16">; def F17 : FPR<17, "F17">; -def F18 : FPR<18, "F18">; def F19 : FPR<19, "F19">; -def F20 : FPR<20, "F20">; def F21 : FPR<21, "F21">; -def F22 : FPR<22, "F22">; def F23 : FPR<23, "F23">; -def F24 : FPR<24, "F24">; def F25 : FPR<25, "F25">; -def F26 : FPR<26, "F26">; def F27 : FPR<27, "F27">; -def F28 : FPR<28, "F28">; def F29 : FPR<29, "F29">; -def F30 : FPR<30, "F30">; def F31 : FPR<31, "F31">; +def F0 : FPR< 0, "f0">; def F1 : FPR< 1, "f1">; +def F2 : FPR< 2, "f2">; def F3 : FPR< 3, "f3">; +def F4 : FPR< 4, "f4">; def F5 : FPR< 5, "f5">; +def F6 : FPR< 6, "f6">; def F7 : FPR< 7, "f7">; +def F8 : FPR< 8, "f8">; def F9 : FPR< 9, "f9">; +def F10 : FPR<10, "f10">; def F11 : FPR<11, "f11">; +def F12 : FPR<12, "f12">; def F13 : FPR<13, "f13">; +def F14 : FPR<14, "f14">; def F15 : FPR<15, "f15">; +def F16 : FPR<16, "f16">; def F17 : FPR<17, "f17">; +def F18 : FPR<18, "f18">; def F19 : FPR<19, "f19">; +def F20 : FPR<20, "f20">; def F21 : FPR<21, "f21">; +def F22 : FPR<22, "f22">; def F23 : FPR<23, "f23">; +def F24 : FPR<24, "f24">; def F25 : FPR<25, "f25">; +def F26 : FPR<26, "f26">; def F27 : FPR<27, "f27">; +def F28 : FPR<28, "f28">; def F29 : FPR<29, "f29">; +def F30 : FPR<30, "f30">; def F31 : FPR<31, "f31">; // Condition registers -def CR0 : CR<0, "CR0">; def CR1 : CR<1, "CR1">; -def CR2 : CR<2, "CR2">; def CR3 : CR<3, "CR3">; -def CR4 : CR<4, "CR4">; def CR5 : CR<5, "CR5">; -def CR6 : CR<6, "CR6">; def CR7 : CR<7, "CR7">; +def CR0 : CR<0, "cr0">; def CR1 : CR<1, "cr1">; +def CR2 : CR<2, "cr2">; def CR3 : CR<3, "cr3">; +def CR4 : CR<4, "cr4">; def CR5 : CR<5, "cr5">; +def CR6 : CR<6, "cr6">; def CR7 : CR<7, "cr7">; // Floating-point status and control register -def FPSCR : SPR<0, "FPSCR">; +def FPSCR : SPR<0, "fpscr">; // fiXed-point Exception Register? :-) -def XER : SPR<1, "XER">; +def XER : SPR<1, "xer">; // Link register -def LR : SPR<2, "LR">; +def LR : SPR<2, "lr">; // Count register -def CTR : SPR<3, "CTR">; +def CTR : SPR<3, "ctr">; // These are the "time base" registers which are read-only in user mode. -def TBL : SPR<4, "TBL">; -def TBU : SPR<5, "TBU">; +def TBL : SPR<4, "tbl">; +def TBU : SPR<5, "tbu">; From lattner at cs.uiuc.edu Mon Aug 22 17:32:24 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 22 Aug 2005 17:32:24 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td PowerPCRegisterInfo.td Message-ID: <200508222232.RAA05951@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrInfo.td updated: 1.77 -> 1.78 PowerPCRegisterInfo.td updated: 1.15 -> 1.16 --- Log message: Remove some regs that are not used. --- Diffs of the changes: (+1 -8) PowerPCInstrInfo.td | 2 +- PowerPCRegisterInfo.td | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.77 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.78 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.77 Thu Aug 18 18:25:33 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Mon Aug 22 17:32:13 2005 @@ -97,7 +97,7 @@ // All calls clobber the non-callee saved registers... Defs = [R0,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12, F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,F13, - LR,XER,CTR, + LR,CTR, CR0,CR1,CR5,CR6,CR7] in { // Convenient aliases for call instructions def CALLpcrel : IForm<18, 0, 1, (ops target:$func, variable_ops), "bl $func">; Index: llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td:1.15 llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td:1.16 --- llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td:1.15 Mon Aug 22 17:00:02 2005 +++ llvm/lib/Target/PowerPC/PowerPCRegisterInfo.td Mon Aug 22 17:32:13 2005 @@ -79,15 +79,8 @@ def CR4 : CR<4, "cr4">; def CR5 : CR<5, "cr5">; def CR6 : CR<6, "cr6">; def CR7 : CR<7, "cr7">; -// Floating-point status and control register -def FPSCR : SPR<0, "fpscr">; -// fiXed-point Exception Register? :-) -def XER : SPR<1, "xer">; // Link register def LR : SPR<2, "lr">; // Count register def CTR : SPR<3, "ctr">; -// These are the "time base" registers which are read-only in user mode. -def TBL : SPR<4, "tbl">; -def TBU : SPR<5, "tbu">; From natebegeman at mac.com Mon Aug 22 20:16:58 2005 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 22 Aug 2005 20:16:58 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Message-ID: <200508230116.UAA06914@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrInfo.td updated: 1.78 -> 1.79 --- Log message: Remove some instructions we no longer generate --- Diffs of the changes: (+0 -24) PowerPCInstrInfo.td | 24 ------------------------ 1 files changed, 24 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.78 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.79 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.78 Mon Aug 22 17:32:13 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Mon Aug 22 20:16:46 2005 @@ -330,30 +330,6 @@ // XL-Form instructions. condition register logical ops. // -def CRAND : XLForm_1<19, 257, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "crand $Db, $Ab, $Bb">; -def CRANDC : XLForm_1<19, 129, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "crandc $Db, $Ab, $Bb">; -def CREQV : XLForm_1<19, 289, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "creqv $Db, $Ab, $Bb">; -def CRNAND : XLForm_1<19, 225, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "crnand $Db, $Ab, $Bb">; -def CRNOR : XLForm_1<19, 33, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "crnor $Db, $Ab, $Bb">; -def CROR : XLForm_1<19, 449, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "cror $Db, $Ab, $Bb">; -def CRORC : XLForm_1<19, 417, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "crorc $Db, $Ab, $Bb">; -def CRXOR : XLForm_1<19, 193, (ops CRRC:$D, crbit:$Db, - CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb), - "crxor $Db, $Ab, $Bb">; def MCRF : XLForm_3<19, 0, (ops CRRC:$BF, CRRC:$BFA), "mcrf $BF, $BFA">; From natebegeman at mac.com Mon Aug 22 23:29:59 2005 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 22 Aug 2005 23:29:59 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200508230429.XAA07668@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.168 -> 1.169 --- Log message: Teach Legalize how to turn setcc into select_cc --- Diffs of the changes: (+31 -18) LegalizeDAG.cpp | 49 +++++++++++++++++++++++++++++++------------------ 1 files changed, 31 insertions(+), 18 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.168 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.169 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.168 Sun Aug 21 13:03:09 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Aug 22 23:29:48 2005 @@ -1068,7 +1068,7 @@ Tmp2 = LegalizeOp(Node->getOperand(1)); // TrueVal Tmp3 = LegalizeOp(Node->getOperand(2)); // FalseVal - switch (TLI.getOperationAction(Node->getOpcode(), Tmp2.getValueType())) { + switch (TLI.getOperationAction(ISD::SELECT, Tmp2.getValueType())) { default: assert(0 && "This action is not supported yet!"); case TargetLowering::Expand: if (Tmp1.getOpcode() == ISD::SETCC) { @@ -1149,9 +1149,6 @@ case Legal: Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS - if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) - Result = DAG.getNode(ISD::SETCC, Node->getValueType(0), Tmp1, Tmp2, - Node->getOperand(2)); break; case Promote: Tmp1 = PromoteOp(Node->getOperand(0)); // LHS @@ -1190,10 +1187,7 @@ DAG.getValueType(VT)); break; } - } - Result = DAG.getNode(ISD::SETCC, Node->getValueType(0), Tmp1, Tmp2, - Node->getOperand(2)); break; case Expand: SDOperand LHSLo, LHSHi, RHSLo, RHSHi; @@ -1207,17 +1201,14 @@ if (RHSCST->isAllOnesValue()) { // Comparison to -1. Tmp1 = DAG.getNode(ISD::AND, LHSLo.getValueType(), LHSLo, LHSHi); - Result = DAG.getNode(ISD::SETCC, Node->getValueType(0), Tmp1, - RHSLo, Node->getOperand(2)); + Tmp2 = RHSLo; break; } Tmp1 = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSLo, RHSLo); Tmp2 = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSHi, RHSHi); Tmp1 = DAG.getNode(ISD::OR, Tmp1.getValueType(), Tmp1, Tmp2); - Result = DAG.getNode(ISD::SETCC, Node->getValueType(0), Tmp1, - DAG.getConstant(0, Tmp1.getValueType()), - Node->getOperand(2)); + Tmp2 = DAG.getConstant(0, Tmp1.getValueType()); break; default: // If this is a comparison of the sign bit, just look at the top part. @@ -1226,9 +1217,11 @@ if ((cast(Node->getOperand(2))->get() == ISD::SETLT && CST->getValue() == 0) || // X < 0 (cast(Node->getOperand(2))->get() == ISD::SETGT && - (CST->isAllOnesValue()))) // X > -1 - return DAG.getNode(ISD::SETCC, Node->getValueType(0), LHSHi, RHSHi, - Node->getOperand(2)); + (CST->isAllOnesValue()))) { // X > -1 + Tmp1 = LHSHi; + Tmp2 = RHSHi; + break; + } // FIXME: This generated code sucks. ISD::CondCode LowCC; @@ -1254,11 +1247,31 @@ Tmp2 = DAG.getNode(ISD::SETCC, Node->getValueType(0), LHSHi, RHSHi, Node->getOperand(2)); Result = DAG.getSetCC(Node->getValueType(0), LHSHi, RHSHi, ISD::SETEQ); - Result = DAG.getNode(ISD::SELECT, Tmp1.getValueType(), - Result, Tmp1, Tmp2); - break; + Result = LegalizeOp(DAG.getNode(ISD::SELECT, Tmp1.getValueType(), + Result, Tmp1, Tmp2)); + return Result; } } + + switch(TLI.getOperationAction(ISD::SETCC, Node->getOperand(0).getValueType())) { + default: + assert(0 && "Cannot handle this action for SETCC yet!"); + break; + case TargetLowering::Legal: + if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) + Result = DAG.getNode(ISD::SETCC, Node->getValueType(0), Tmp1, Tmp2, + Node->getOperand(2)); + break; + case TargetLowering::Expand: + // Expand a setcc node into a select_cc of the same condition, lhs, and + // rhs that selects between const 1 (true) and const 0 (false). + MVT::ValueType VT = Node->getValueType(0); + Result = DAG.getNode(ISD::SELECT_CC, VT, Tmp1, Tmp2, + DAG.getConstant(1, VT), DAG.getConstant(0, VT), + Node->getOperand(2)); + Result = LegalizeOp(Result); + break; + } break; case ISD::MEMSET: From natebegeman at mac.com Tue Aug 23 00:41:24 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 23 Aug 2005 00:41:24 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508230541.AAA07975@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.156 -> 1.157 --- Log message: Teach the SelectionDAG how to transform select_cc eq, X, 0, 1, 0 into either seteq X, 0 or srl (ctlz X), size(X-1), depending on what's legal for the target. --- Diffs of the changes: (+17 -0) SelectionDAG.cpp | 17 +++++++++++++++++ 1 files changed, 17 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.156 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.157 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.156 Sun Aug 21 17:30:30 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Aug 23 00:41:12 2005 @@ -853,6 +853,23 @@ } } + // Check to see if this is the equivalent of seteq X, 0. + // select_cc seteq X, 0, 1, 0 -> setcc X, 0, seteq -> srl (ctlz X), size(X)-1 + if (N2C && N2C->isNullValue() && N4C && N4C->isNullValue() && + N3C && (N3C->getValue() == 1)) { + MVT::ValueType XType = N1.getValueType(); + if (TLI.getOperationAction(ISD::SETCC, TLI.getSetCCResultTy()) == + TargetLowering::Legal) { + return getSetCC(TLI.getSetCCResultTy(), N1, N2, ISD::SETEQ); + } + if (TLI.getOperationAction(ISD::CTLZ, XType) == TargetLowering::Legal) { + SDOperand Ctlz = getNode(ISD::CTLZ, XType, N1); + return getNode(ISD::SRL, XType, Ctlz, + getConstant(MVT::getSizeInBits(XType)-1, + TLI.getShiftAmountTy())); + } + } + // Check to see if this is an integer abs. select_cc setl[te] X, 0, -X, X -> // Y = sra (X, size(X)-1); xor (add (X, Y), Y) if (N2C && N2C->isNullValue() && (CC == ISD::SETLT || CC == ISD::SETLE) && From natebegeman at mac.com Tue Aug 23 00:42:48 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 23 Aug 2005 00:42:48 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Message-ID: <200508230542.AAA07996@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelLowering.cpp updated: 1.4 -> 1.5 --- Log message: Add an option to make SetCC illegal as a beta option --- Diffs of the changes: (+10 -0) PPC32ISelLowering.cpp | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.4 llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.5 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.4 Tue Aug 16 19:40:22 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Tue Aug 23 00:42:36 2005 @@ -17,9 +17,15 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Function.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; +namespace llvm { + cl::opt SetCCIllegal("-ppc-setcc-is-illegal", cl::Hidden, + cl::desc("Make ISD::SETCC illegal on PowerPC")); +} + PPC32TargetLowering::PPC32TargetLowering(TargetMachine &TM) : TargetLowering(TM) { @@ -78,6 +84,10 @@ setOperationAction(ISD::SINT_TO_FP, MVT::i32, Expand); setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand); + // PowerPC does not have SETCC + if (SetCCIllegal) + setOperationAction(ISD::SETCC, MVT::i32, Expand); + setSetCCResultContents(ZeroOrOneSetCCResult); addLegalFPImmediate(+0.0); // Necessary for FSEL addLegalFPImmediate(-0.0); // From natebegeman at mac.com Tue Aug 23 00:44:48 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 23 Aug 2005 00:44:48 -0500 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200508230544.AAA08015@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.164 -> 1.165 --- Log message: Add new PowerPC beta option --- Diffs of the changes: (+1 -1) Makefile.programs | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.164 llvm-test/Makefile.programs:1.165 --- llvm-test/Makefile.programs:1.164 Thu Aug 18 12:31:40 2005 +++ llvm-test/Makefile.programs Tue Aug 23 00:44:37 2005 @@ -187,7 +187,7 @@ endif#DISABLE_DIFFS ifeq ($(ARCH),PowerPC) -LLCBETAOPTION := +LLCBETAOPTION := -ppc-setcc-is-illegal endif ifeq ($(ARCH),Alpha) LLCBETAOPTION := -enable-alpha-FTOI -enable-lsr-for-alpha From natebegeman at mac.com Tue Aug 23 00:45:22 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 23 Aug 2005 00:45:22 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Message-ID: <200508230545.AAA08033@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelLowering.cpp updated: 1.5 -> 1.6 --- Log message: Ack, typo --- Diffs of the changes: (+1 -1) PPC32ISelLowering.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.5 llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.6 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.5 Tue Aug 23 00:42:36 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Tue Aug 23 00:45:10 2005 @@ -22,7 +22,7 @@ using namespace llvm; namespace llvm { - cl::opt SetCCIllegal("-ppc-setcc-is-illegal", cl::Hidden, + cl::opt SetCCIllegal("ppc-setcc-is-illegal", cl::Hidden, cl::desc("Make ISD::SETCC illegal on PowerPC")); } From lattner at cs.uiuc.edu Tue Aug 23 01:28:11 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 01:28:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/README.txt Message-ID: <200508230628.BAA08254@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: README.txt updated: 1.28 -> 1.29 --- Log message: add a note --- Diffs of the changes: (+20 -0) README.txt | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+) Index: llvm/lib/Target/PowerPC/README.txt diff -u llvm/lib/Target/PowerPC/README.txt:1.28 llvm/lib/Target/PowerPC/README.txt:1.29 --- llvm/lib/Target/PowerPC/README.txt:1.28 Sat Aug 13 20:17:16 2005 +++ llvm/lib/Target/PowerPC/README.txt Tue Aug 23 01:27:59 2005 @@ -51,3 +51,23 @@ b .LBBl42__2E_expand_function_8_674 ; loopentry.24 b .LBBl42__2E_expand_function_8_42 ; NewDefault b .LBBl42__2E_expand_function_8_42 ; NewDefault + +* Codegen this: + + void test2(int X) { + if (X == 0x12345678) bar(); + } + + as: + + xoris r0,r3,0x1234 + cmpwi cr0,r0,0x5678 + beq cr0,L6 + + not: + + lis r2, 4660 + ori r2, r2, 22136 + cmpw cr0, r3, r2 + bne .LBB_test2_2 + From lattner at cs.uiuc.edu Tue Aug 23 15:22:19 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 15:22:19 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/CBackend/2005-08-23-Fmod.ll Message-ID: <200508232022.PAA01790@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/CBackend: 2005-08-23-Fmod.ll added (r1.1) --- Log message: New testcase for PR618: http://llvm.cs.uiuc.edu/PR618 --- Diffs of the changes: (+6 -0) 2005-08-23-Fmod.ll | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/test/Regression/CodeGen/CBackend/2005-08-23-Fmod.ll diff -c /dev/null llvm/test/Regression/CodeGen/CBackend/2005-08-23-Fmod.ll:1.1 *** /dev/null Tue Aug 23 15:22:17 2005 --- llvm/test/Regression/CodeGen/CBackend/2005-08-23-Fmod.ll Tue Aug 23 15:22:07 2005 *************** *** 0 **** --- 1,6 ---- + ; RUN: llvm-as < %s | llc -march=c | grep fmod + + double %test(double %A, double %B) { + %C = rem double %A, %B + ret double %C + } From lattner at cs.uiuc.edu Tue Aug 23 15:23:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 15:23:03 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/CBackend/Writer.cpp Message-ID: <200508232023.PAA01826@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/CBackend: Writer.cpp updated: 1.243 -> 1.244 --- Log message: Fix PR618: http://llvm.cs.uiuc.edu/PR618 and Regression/CodeGen/CBackend/2005-08-23-Fmod.ll by not emitting x%y for 'rem' on fp values. --- Diffs of the changes: (+14 -0) Writer.cpp | 14 ++++++++++++++ 1 files changed, 14 insertions(+) Index: llvm/lib/Target/CBackend/Writer.cpp diff -u llvm/lib/Target/CBackend/Writer.cpp:1.243 llvm/lib/Target/CBackend/Writer.cpp:1.244 --- llvm/lib/Target/CBackend/Writer.cpp:1.243 Wed Aug 17 14:30:44 2005 +++ llvm/lib/Target/CBackend/Writer.cpp Tue Aug 23 15:22:50 2005 @@ -871,6 +871,9 @@ } // Function declarations + Out << "double fmod(double, double);\n"; // Support for FP rem + Out << "float fmodf(float, float);\n"; + if (!M.empty()) { Out << "\n/* Function Declarations */\n"; for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { @@ -1349,6 +1352,17 @@ Out << "-("; writeOperand(BinaryOperator::getNegArgument(cast(&I))); Out << ")"; + } else if (I.getOpcode() == Instruction::Rem && + I.getType()->isFloatingPoint()) { + // Output a call to fmod/fmodf instead of emitting a%b + if (I.getType() == Type::FloatTy) + Out << "fmodf("; + else + Out << "fmod("; + writeOperand(I.getOperand(0)); + Out << ", "; + writeOperand(I.getOperand(1)); + Out << ")"; } else { writeOperand(I.getOperand(0)); From lattner at cs.uiuc.edu Tue Aug 23 16:45:43 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 16:45:43 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/EquivalenceClasses.h Message-ID: <200508232145.QAA02361@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: EquivalenceClasses.h updated: 1.16 -> 1.17 --- Log message: add a method --- Diffs of the changes: (+2 -0) EquivalenceClasses.h | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/include/llvm/ADT/EquivalenceClasses.h diff -u llvm/include/llvm/ADT/EquivalenceClasses.h:1.16 llvm/include/llvm/ADT/EquivalenceClasses.h:1.17 --- llvm/include/llvm/ADT/EquivalenceClasses.h:1.16 Thu Apr 21 15:13:50 2005 +++ llvm/include/llvm/ADT/EquivalenceClasses.h Tue Aug 23 16:45:31 2005 @@ -138,6 +138,8 @@ iterator begin() const { return TheMapping.begin(); } iterator end() const { return TheMapping.end(); } + bool empty() const { return TheMapping.empty(); } + /// member_* Iterate over the members of an equivalence class. /// class member_iterator; From lattner at cs.uiuc.edu Tue Aug 23 17:27:43 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 17:27:43 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegAllocLinearScan.cpp Message-ID: <200508232227.RAA02617@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegAllocLinearScan.cpp updated: 1.111 -> 1.112 --- Log message: Keep track of which registers are related to which other registers. Use this information to avoid doing expensive interval intersections for registers that could not possible be interesting. This speeds up linscan on ia64 compiling kc++ in release mode from taking 7.82s to 4.8s(!), total itanium llc time on this program is 27.3s now. This marginally speeds up PPC and X86, but they appear to be limited by other parts of linscan, not this code. On this program, on itanium, live intervals now takes 41% of llc time. --- Diffs of the changes: (+86 -21) RegAllocLinearScan.cpp | 107 +++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 86 insertions(+), 21 deletions(-) Index: llvm/lib/CodeGen/RegAllocLinearScan.cpp diff -u llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.111 llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.112 --- llvm/lib/CodeGen/RegAllocLinearScan.cpp:1.111 Mon Aug 22 15:59:30 2005 +++ llvm/lib/CodeGen/RegAllocLinearScan.cpp Tue Aug 23 17:27:31 2005 @@ -12,6 +12,9 @@ //===----------------------------------------------------------------------===// #define DEBUG_TYPE "regalloc" +#include "LiveIntervalAnalysis.h" +#include "PhysRegTracker.h" +#include "VirtRegMap.h" #include "llvm/Function.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" @@ -19,12 +22,10 @@ #include "llvm/CodeGen/SSARegMap.h" #include "llvm/Target/MRegisterInfo.h" #include "llvm/Target/TargetMachine.h" -#include "llvm/Support/Debug.h" +#include "llvm/ADT/EquivalenceClasses.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/STLExtras.h" -#include "LiveIntervalAnalysis.h" -#include "PhysRegTracker.h" -#include "VirtRegMap.h" +#include "llvm/Support/Debug.h" #include #include #include @@ -44,6 +45,12 @@ typedef std::pair IntervalPtr; typedef std::vector IntervalPtrs; private: + /// RelatedRegClasses - This structure is built the first time a function is + /// compiled, and keeps track of which register classes have registers that + /// belong to multiple classes or have aliases that are in other classes. + EquivalenceClasses RelatedRegClasses; + std::map OneClassForEachPhysReg; + MachineFunction* mf_; const TargetMachine* tm_; const MRegisterInfo* mri_; @@ -119,6 +126,8 @@ /// stack slot. returns the stack slot int assignVirt2StackSlot(unsigned virtReg); + void ComputeRelatedRegClasses(); + template void printIntervals(const char* const str, ItTy i, ItTy e) const { if (str) std::cerr << str << " intervals:\n"; @@ -134,12 +143,51 @@ }; } +void RA::ComputeRelatedRegClasses() { + const MRegisterInfo &MRI = *mri_; + + // First pass, add all reg classes to the union, and determine at least one + // reg class that each register is in. + bool HasAliases = false; + for (MRegisterInfo::regclass_iterator RCI = MRI.regclass_begin(), + E = MRI.regclass_end(); RCI != E; ++RCI) { + RelatedRegClasses.insert(*RCI); + for (TargetRegisterClass::iterator I = (*RCI)->begin(), E = (*RCI)->end(); + I != E; ++I) { + HasAliases = HasAliases || *MRI.getAliasSet(*I) != 0; + + const TargetRegisterClass *&PRC = OneClassForEachPhysReg[*I]; + if (PRC) { + // Already processed this register. Just make sure we know that + // multiple register classes share a register. + RelatedRegClasses.unionSets(PRC, *RCI); + } else { + PRC = *RCI; + } + } + } + + // Second pass, now that we know conservatively what register classes each reg + // belongs to, add info about aliases. We don't need to do this for targets + // without register aliases. + if (HasAliases) + for (std::map::iterator + I = OneClassForEachPhysReg.begin(), E = OneClassForEachPhysReg.end(); + I != E; ++I) + for (const unsigned *AS = MRI.getAliasSet(I->first); *AS; ++AS) + RelatedRegClasses.unionSets(I->second, OneClassForEachPhysReg[*AS]); +} + bool RA::runOnMachineFunction(MachineFunction &fn) { mf_ = &fn; tm_ = &fn.getTarget(); mri_ = tm_->getRegisterInfo(); li_ = &getAnalysis(); + // If this is the first function compiled, compute the related reg classes. + if (RelatedRegClasses.empty()) + ComputeRelatedRegClasses(); + PhysRegsUsed = new bool[mri_->getNumRegs()]; std::fill(PhysRegsUsed, PhysRegsUsed+mri_->getNumRegs(), false); fn.setUsedPhysRegs(PhysRegsUsed); @@ -367,18 +415,24 @@ std::vector > SpillWeightsToAdd; unsigned StartPosition = cur->beginNumber(); - + const TargetRegisterClass *RC = mf_->getSSARegMap()->getRegClass(cur->reg); + const TargetRegisterClass *RCLeader = RelatedRegClasses.getLeaderValue(RC); + // for every interval in inactive we overlap with, mark the // register as not free and update spill weights. for (IntervalPtrs::const_iterator i = inactive_.begin(), e = inactive_.end(); i != e; ++i) { - if (cur->overlapsFrom(*i->first, i->second-1)) { - unsigned reg = i->first->reg; - assert(MRegisterInfo::isVirtualRegister(reg) && - "Can only allocate virtual registers!"); - reg = vrm_->getPhys(reg); - prt_->addRegUse(reg); - SpillWeightsToAdd.push_back(std::make_pair(reg, i->first->weight)); + unsigned Reg = i->first->reg; + assert(MRegisterInfo::isVirtualRegister(Reg) && + "Can only allocate virtual registers!"); + const TargetRegisterClass *RegRC = mf_->getSSARegMap()->getRegClass(Reg); + // If this is not in a related reg class to the register we're allocating, + // don't check it. + if (RelatedRegClasses.getLeaderValue(RegRC) == RCLeader && + cur->overlapsFrom(*i->first, i->second-1)) { + Reg = vrm_->getPhys(Reg); + prt_->addRegUse(Reg); + SpillWeightsToAdd.push_back(std::make_pair(Reg, i->first->weight)); } } @@ -415,12 +469,15 @@ // out to be in use. Actually add all of the conflicting fixed registers to // prt so we can do an accurate query. if (ConflictsWithFixed) { - // For every interval in fixed we overlap with, mark the register as not free - // and update spill weights. + // For every interval in fixed we overlap with, mark the register as not + // free and update spill weights. for (unsigned i = 0, e = fixed_.size(); i != e; ++i) { IntervalPtr &IP = fixed_[i]; LiveInterval *I = IP.first; - if (I->endNumber() > StartPosition) { + + const TargetRegisterClass *RegRC = OneClassForEachPhysReg[I->reg]; + if (RelatedRegClasses.getLeaderValue(RegRC) == RCLeader && + I->endNumber() > StartPosition) { LiveInterval::iterator II = I->advanceTo(IP.second, StartPosition); IP.second = II; if (II != I->begin() && II->start > StartPosition) @@ -476,9 +533,8 @@ float minWeight = float(HUGE_VAL); unsigned minReg = 0; - const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg); - for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_), - e = rc->allocation_order_end(*mf_); i != e; ++i) { + for (TargetRegisterClass::iterator i = RC->allocation_order_begin(*mf_), + e = RC->allocation_order_end(*mf_); i != e; ++i) { unsigned reg = *i; if (minWeight > SpillWeights[reg]) { minWeight = SpillWeights[reg]; @@ -649,14 +705,23 @@ std::vector inactiveCounts(mri_->getNumRegs(), 0); unsigned MaxInactiveCount = 0; + const TargetRegisterClass *RC = mf_->getSSARegMap()->getRegClass(cur->reg); + const TargetRegisterClass *RCLeader = RelatedRegClasses.getLeaderValue(RC); + for (IntervalPtrs::iterator i = inactive_.begin(), e = inactive_.end(); i != e; ++i) { unsigned reg = i->first->reg; assert(MRegisterInfo::isVirtualRegister(reg) && "Can only allocate virtual registers!"); - reg = vrm_->getPhys(reg); - ++inactiveCounts[reg]; - MaxInactiveCount = std::max(MaxInactiveCount, inactiveCounts[reg]); + + // If this is not in a related reg class to the register we're allocating, + // don't check it. + const TargetRegisterClass *RegRC = mf_->getSSARegMap()->getRegClass(reg); + if (RelatedRegClasses.getLeaderValue(RegRC) == RCLeader) { + reg = vrm_->getPhys(reg); + ++inactiveCounts[reg]; + MaxInactiveCount = std::max(MaxInactiveCount, inactiveCounts[reg]); + } } const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg); From lattner at cs.uiuc.edu Tue Aug 23 17:43:35 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 17:43:35 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/LiveVariables.h Message-ID: <200508232243.RAA02761@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: LiveVariables.h updated: 1.22 -> 1.23 --- Log message: Add RegisterDefIsDead to correspond to KillsRegister, mark both const --- Diffs of the changes: (+14 -2) LiveVariables.h | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) Index: llvm/include/llvm/CodeGen/LiveVariables.h diff -u llvm/include/llvm/CodeGen/LiveVariables.h:1.22 llvm/include/llvm/CodeGen/LiveVariables.h:1.23 --- llvm/include/llvm/CodeGen/LiveVariables.h:1.22 Thu Apr 21 22:45:18 2005 +++ llvm/include/llvm/CodeGen/LiveVariables.h Tue Aug 23 17:43:24 2005 @@ -127,8 +127,9 @@ /// KillsRegister - Return true if the specified instruction kills the /// specified register. - bool KillsRegister(MachineInstr *MI, unsigned Reg) { - std::pair KIP = killed_range(MI); + bool KillsRegister(MachineInstr *MI, unsigned Reg) const { + typedef std::multimap::const_iterator cki; + std::pair KIP = RegistersKilled.equal_range(MI); for (; KIP.first != KIP.second; ++KIP.first) if (KIP.first->second == Reg) return true; @@ -145,6 +146,17 @@ dead_range(MachineInstr *MI) { return RegistersDead.equal_range(MI); } + + /// RegisterDefIsDead - Return true if the specified instruction defines the + /// specified register, but that definition is dead. + bool RegisterDefIsDead(MachineInstr *MI, unsigned Reg) const { + typedef std::multimap::const_iterator cki; + std::pair KIP = RegistersDead.equal_range(MI); + for (; KIP.first != KIP.second; ++KIP.first) + if (KIP.first->second == Reg) + return true; + return false; + } //===--------------------------------------------------------------------===// // API to update live variable information From lattner at cs.uiuc.edu Tue Aug 23 17:50:07 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 17:50:07 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86FloatingPoint.cpp Message-ID: <200508232250.RAA02963@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86FloatingPoint.cpp updated: 1.42 -> 1.43 --- Log message: Simplify this code by using LiveVariables::KillsRegister --- Diffs of the changes: (+11 -35) X86FloatingPoint.cpp | 46 +++++++++++----------------------------------- 1 files changed, 11 insertions(+), 35 deletions(-) Index: llvm/lib/Target/X86/X86FloatingPoint.cpp diff -u llvm/lib/Target/X86/X86FloatingPoint.cpp:1.42 llvm/lib/Target/X86/X86FloatingPoint.cpp:1.43 --- llvm/lib/Target/X86/X86FloatingPoint.cpp:1.42 Thu Apr 21 18:38:14 2005 +++ llvm/lib/Target/X86/X86FloatingPoint.cpp Tue Aug 23 17:49:55 2005 @@ -422,10 +422,7 @@ // Is this the last use of the source register? unsigned Reg = getFPReg(MI->getOperand(MI->getNumOperands()-1)); - bool KillsSrc = false; - for (LiveVariables::killed_iterator KI = LV->killed_begin(MI), - E = LV->killed_end(MI); KI != E; ++KI) - KillsSrc |= KI->second == X86::FP0+Reg; + bool KillsSrc = LV->KillsRegister(MI, X86::FP0+Reg); // FSTP80r and FISTP64r are strange because there are no non-popping versions. // If we have one _and_ we don't want to pop the operand, duplicate the value @@ -463,10 +460,7 @@ // Is this the last use of the source register? unsigned Reg = getFPReg(MI->getOperand(1)); - bool KillsSrc = false; - for (LiveVariables::killed_iterator KI = LV->killed_begin(MI), - E = LV->killed_end(MI); KI != E; ++KI) - KillsSrc |= KI->second == X86::FP0+Reg; + bool KillsSrc = LV->KillsRegister(MI, X86::FP0+Reg); if (KillsSrc) { // If this is the last use of the source register, just make sure it's on @@ -541,13 +535,8 @@ unsigned Dest = getFPReg(MI->getOperand(0)); unsigned Op0 = getFPReg(MI->getOperand(NumOperands-2)); unsigned Op1 = getFPReg(MI->getOperand(NumOperands-1)); - bool KillsOp0 = false, KillsOp1 = false; - - for (LiveVariables::killed_iterator KI = LV->killed_begin(MI), - E = LV->killed_end(MI); KI != E; ++KI) { - KillsOp0 |= (KI->second == X86::FP0+Op0); - KillsOp1 |= (KI->second == X86::FP0+Op1); - } + bool KillsOp0 = LV->KillsRegister(MI, X86::FP0+Op0); + bool KillsOp1 = LV->KillsRegister(MI, X86::FP0+Op1); unsigned TOS = getStackEntry(0); @@ -642,13 +631,8 @@ assert(NumOperands == 2 && "Illegal FUCOM* instruction!"); unsigned Op0 = getFPReg(MI->getOperand(NumOperands-2)); unsigned Op1 = getFPReg(MI->getOperand(NumOperands-1)); - bool KillsOp0 = false, KillsOp1 = false; - - for (LiveVariables::killed_iterator KI = LV->killed_begin(MI), - E = LV->killed_end(MI); KI != E; ++KI) { - KillsOp0 |= (KI->second == X86::FP0+Op0); - KillsOp1 |= (KI->second == X86::FP0+Op1); - } + bool KillsOp0 = LV->KillsRegister(MI, X86::FP0+Op0); + bool KillsOp1 = LV->KillsRegister(MI, X86::FP0+Op1); // Make sure the first operand is on the top of stack, the other one can be // anywhere. @@ -680,14 +664,10 @@ MI->getOperand(0).setReg(getSTReg(Op1)); // If we kill the second operand, make sure to pop it from the stack. - if (Op0 != Op1) - for (LiveVariables::killed_iterator KI = LV->killed_begin(MI), - E = LV->killed_end(MI); KI != E; ++KI) - if (KI->second == X86::FP0+Op1) { - // Get this value off of the register stack. - freeStackSlotAfter(I, Op1); - break; - } + if (Op0 != Op1 && LV->KillsRegister(MI, X86::FP0+Op1)) { + // Get this value off of the register stack. + freeStackSlotAfter(I, Op1); + } } @@ -710,12 +690,8 @@ case X86::FpMOV: { unsigned SrcReg = getFPReg(MI->getOperand(1)); unsigned DestReg = getFPReg(MI->getOperand(0)); - bool KillsSrc = false; - for (LiveVariables::killed_iterator KI = LV->killed_begin(MI), - E = LV->killed_end(MI); KI != E; ++KI) - KillsSrc |= KI->second == X86::FP0+SrcReg; - if (KillsSrc) { + if (LV->KillsRegister(MI, X86::FP0+SrcReg)) { // If the input operand is killed, we can just change the owner of the // incoming stack slot into the result. unsigned Slot = getSlot(SrcReg); From lattner at cs.uiuc.edu Tue Aug 23 17:51:53 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 17:51:53 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp Message-ID: <200508232251.RAA03064@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: LiveIntervalAnalysis.cpp updated: 1.143 -> 1.144 --- Log message: Simplify this code by using higher-level LiveVariables methods --- Diffs of the changes: (+10 -20) LiveIntervalAnalysis.cpp | 30 ++++++++++-------------------- 1 files changed, 10 insertions(+), 20 deletions(-) Index: llvm/lib/CodeGen/LiveIntervalAnalysis.cpp diff -u llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.143 llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.144 --- llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:1.143 Wed Jul 27 18:11:25 2005 +++ llvm/lib/CodeGen/LiveIntervalAnalysis.cpp Tue Aug 23 17:51:41 2005 @@ -431,12 +431,8 @@ // If this redefinition is dead, we need to add a dummy unit live // range covering the def slot. - for (LiveVariables::killed_iterator KI = lv_->dead_begin(mi), - E = lv_->dead_end(mi); KI != E; ++KI) - if (KI->second == interval.reg) { - interval.addRange(LiveRange(RedefIndex, RedefIndex+1, 0)); - break; - } + if (lv_->RegisterDefIsDead(mi, interval.reg)) + interval.addRange(LiveRange(RedefIndex, RedefIndex+1, 0)); DEBUG(std::cerr << "RESULT: " << interval); @@ -496,13 +492,10 @@ // If it is not used after definition, it is considered dead at // the instruction defining it. Hence its interval is: // [defSlot(def), defSlot(def)+1) - for (KillIter ki = lv_->dead_begin(mi), ke = lv_->dead_end(mi); - ki != ke; ++ki) { - if (interval.reg == ki->second) { - DEBUG(std::cerr << " dead"); - end = getDefIndex(start) + 1; - goto exit; - } + if (lv_->RegisterDefIsDead(mi, interval.reg)) { + DEBUG(std::cerr << " dead"); + end = getDefIndex(start) + 1; + goto exit; } // If it is not dead on definition, it must be killed by a @@ -512,13 +505,10 @@ ++mi; assert(mi != MBB->end() && "physreg was not killed in defining block!"); baseIndex += InstrSlots::NUM; - for (KillIter ki = lv_->killed_begin(mi), ke = lv_->killed_end(mi); - ki != ke; ++ki) { - if (interval.reg == ki->second) { - DEBUG(std::cerr << " killed"); - end = getUseIndex(baseIndex) + 1; - goto exit; - } + if (lv_->KillsRegister(mi, interval.reg)) { + DEBUG(std::cerr << " killed"); + end = getUseIndex(baseIndex) + 1; + goto exit; } } From lattner at cs.uiuc.edu Tue Aug 23 18:40:52 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 18:40:52 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/LiveVariables.h Message-ID: <200508232340.SAA03272@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: LiveVariables.h updated: 1.23 -> 1.24 --- Log message: Change live variables from using multimaps to using maps of vectors and rearrange some of the accessors to be more efficient. This makes it much more efficient to iterate over all of the things with the same value. This speeds up liveintervals analysis from 8.63s to 3.79s with a release build of llc on kc++ with -march=ia64. This also speeds up live var from 1.66s -> 0.87s as well, reducing total llc time from 20.1s->15.2s. This also speeds up other targets slightly, e.g. llc time on X86 from 16.84 -> 16.45s, and PPC from 17.64->17.03s. --- Diffs of the changes: (+62 -46) LiveVariables.h | 108 ++++++++++++++++++++++++++++++++------------------------ 1 files changed, 62 insertions(+), 46 deletions(-) Index: llvm/include/llvm/CodeGen/LiveVariables.h diff -u llvm/include/llvm/CodeGen/LiveVariables.h:1.23 llvm/include/llvm/CodeGen/LiveVariables.h:1.24 --- llvm/include/llvm/CodeGen/LiveVariables.h:1.23 Tue Aug 23 17:43:24 2005 +++ llvm/include/llvm/CodeGen/LiveVariables.h Tue Aug 23 18:40:41 2005 @@ -40,7 +40,8 @@ public: struct VarInfo { /// DefInst - The machine instruction that defines this register. - MachineInstr *DefInst; + /// + MachineInstr *DefInst; /// AliveBlocks - Set of blocks of which this value is alive completely /// through. This is a bit set which uses the basic block number as an @@ -76,18 +77,22 @@ /// std::vector VirtRegInfo; - /// RegistersKilled - This multimap keeps track of all of the registers that + /// RegistersKilled - This map keeps track of all of the registers that /// are dead immediately after an instruction reads its operands. If an /// instruction does not have an entry in this map, it kills no registers. /// - std::multimap RegistersKilled; + std::map > RegistersKilled; - /// RegistersDead - This multimap keeps track of all of the registers that are + /// RegistersDead - This map keeps track of all of the registers that are /// dead immediately after an instruction executes, which are not dead after /// the operands are evaluated. In practice, this only contains registers /// which are defined by an instruction, but never used. /// - std::multimap RegistersDead; + std::map > RegistersDead; + + /// Dummy - An always empty vector used for instructions without dead or + /// killed operands. + std::vector Dummy; /// AllocatablePhysicalRegisters - This vector keeps track of which registers /// are actually register allocatable by the target machine. We can not track @@ -110,51 +115,67 @@ /// killed_iterator - Iterate over registers killed by a machine instruction /// - typedef std::multimap::iterator killed_iterator; + typedef std::vector::iterator killed_iterator; + std::vector &getKillsVector(MachineInstr *MI) { + std::map >::iterator I = + RegistersKilled.find(MI); + return I != RegistersKilled.end() ? I->second : Dummy; + } + std::vector &getDeadDefsVector(MachineInstr *MI) { + std::map >::iterator I = + RegistersDead.find(MI); + return I != RegistersDead.end() ? I->second : Dummy; + } + + /// killed_begin/end - Get access to the range of registers killed by a /// machine instruction. killed_iterator killed_begin(MachineInstr *MI) { - return RegistersKilled.lower_bound(MI); + return getKillsVector(MI).begin(); } killed_iterator killed_end(MachineInstr *MI) { - return RegistersKilled.upper_bound(MI); + return getKillsVector(MI).end(); } std::pair killed_range(MachineInstr *MI) { - return RegistersKilled.equal_range(MI); + std::vector &V = getKillsVector(MI); + return std::make_pair(V.begin(), V.end()); } /// KillsRegister - Return true if the specified instruction kills the /// specified register. bool KillsRegister(MachineInstr *MI, unsigned Reg) const { - typedef std::multimap::const_iterator cki; - std::pair KIP = RegistersKilled.equal_range(MI); - for (; KIP.first != KIP.second; ++KIP.first) - if (KIP.first->second == Reg) - return true; + std::map >::const_iterator I = + RegistersKilled.find(MI); + if (I != RegistersKilled.end()) + for (std::vector::const_iterator CI = I->second.begin(), + E = I->second.end(); CI != E; ++CI) + if (*CI == Reg) return true; return false; } killed_iterator dead_begin(MachineInstr *MI) { - return RegistersDead.lower_bound(MI); + return getDeadDefsVector(MI).begin(); } killed_iterator dead_end(MachineInstr *MI) { - return RegistersDead.upper_bound(MI); + return getDeadDefsVector(MI).end(); } std::pair dead_range(MachineInstr *MI) { - return RegistersDead.equal_range(MI); + std::vector &V = getDeadDefsVector(MI); + return std::make_pair(V.begin(), V.end()); } /// RegisterDefIsDead - Return true if the specified instruction defines the /// specified register, but that definition is dead. bool RegisterDefIsDead(MachineInstr *MI, unsigned Reg) const { - typedef std::multimap::const_iterator cki; - std::pair KIP = RegistersDead.equal_range(MI); - for (; KIP.first != KIP.second; ++KIP.first) - if (KIP.first->second == Reg) - return true; + std::map >::const_iterator I = + RegistersDead.find(MI); + if (I != RegistersDead.end()) + for (std::vector::const_iterator CI = I->second.begin(), + E = I->second.end(); CI != E; ++CI) + if (*CI == Reg) return true; return false; } @@ -185,23 +206,20 @@ MachineInstr *MI) { if (!getVarInfo(reg).removeKill(MI)) return false; - for (killed_iterator i = killed_begin(MI), e = killed_end(MI); i != e; ) { - if (i->second == reg) - RegistersKilled.erase(i++); - else - ++i; - } + + std::vector &V = getKillsVector(MI); + for (unsigned i = 0, e = V.size(); i != e; ++i) + if (V[i] == reg) { + V.erase(V.begin()+i); + return true; + } return true; } - /// removeVirtualRegistersKilled - Remove all of the specified killed - /// registers from the live variable information. - void removeVirtualRegistersKilled(killed_iterator B, killed_iterator E) { - for (killed_iterator I = B; I != E; ++I) { // Remove VarInfo entries... - bool removed = getVarInfo(I->second).removeKill(I->first); - assert(removed && "kill not in register's VarInfo?"); - } - RegistersKilled.erase(B, E); + /// removeVirtualRegistersKilled - Remove all killed info for the specified + /// instruction. + void removeVirtualRegistersKilled(MachineInstr *MI) { + RegistersKilled.erase(MI); } /// addVirtualRegisterDead - Add information about the fact that the specified @@ -222,21 +240,19 @@ if (!getVarInfo(reg).removeKill(MI)) return false; - for (killed_iterator i = killed_begin(MI), e = killed_end(MI); i != e; ) { - if (i->second == reg) - RegistersKilled.erase(i++); - else - ++i; - } + std::vector &V = getDeadDefsVector(MI); + for (unsigned i = 0, e = V.size(); i != e; ++i) + if (V[i] == reg) { + V.erase(V.begin()+i); + return true; + } return true; } /// removeVirtualRegistersDead - Remove all of the specified dead /// registers from the live variable information. - void removeVirtualRegistersDead(killed_iterator B, killed_iterator E) { - for (killed_iterator I = B; I != E; ++I) // Remove VarInfo entries... - getVarInfo(I->second).removeKill(I->first); - RegistersDead.erase(B, E); + void removeVirtualRegistersDead(MachineInstr *MI) { + RegistersDead.erase(MI); } virtual void getAnalysisUsage(AnalysisUsage &AU) const { From lattner at cs.uiuc.edu Tue Aug 23 18:41:25 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 18:41:25 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86FloatingPoint.cpp Message-ID: <200508232341.SAA03330@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86FloatingPoint.cpp updated: 1.43 -> 1.44 --- Log message: Adjust to new livevars interface --- Diffs of the changes: (+4 -4) X86FloatingPoint.cpp | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Target/X86/X86FloatingPoint.cpp diff -u llvm/lib/Target/X86/X86FloatingPoint.cpp:1.43 llvm/lib/Target/X86/X86FloatingPoint.cpp:1.44 --- llvm/lib/Target/X86/X86FloatingPoint.cpp:1.43 Tue Aug 23 17:49:55 2005 +++ llvm/lib/Target/X86/X86FloatingPoint.cpp Tue Aug 23 18:41:14 2005 @@ -212,8 +212,8 @@ // Get dead variables list now because the MI pointer may be deleted as part // of processing! - LiveVariables::killed_iterator IB = LV->dead_begin(MI); - LiveVariables::killed_iterator IE = LV->dead_end(MI); + LiveVariables::killed_iterator IB, IE; + tie(IB, IE) = LV->dead_range(MI); DEBUG( const MRegisterInfo *MRI = MF.getTarget().getRegisterInfo(); @@ -222,7 +222,7 @@ if (I != E) { std::cerr << "Killed Operands:"; for (; I != E; ++I) - std::cerr << " %" << MRI->getName(I->second); + std::cerr << " %" << MRI->getName(*I); std::cerr << "\n"; } ); @@ -241,7 +241,7 @@ // Check to see if any of the values defined by this instruction are dead // after definition. If so, pop them. for (; IB != IE; ++IB) { - unsigned Reg = IB->second; + unsigned Reg = *IB; if (Reg >= X86::FP0 && Reg <= X86::FP6) { DEBUG(std::cerr << "Register FP#" << Reg-X86::FP0 << " is dead!\n"); freeStackSlotAfter(I, Reg-X86::FP0); From lattner at cs.uiuc.edu Tue Aug 23 18:42:29 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 18:42:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp PHIElimination.cpp RegAllocLocal.cpp Message-ID: <200508232342.SAA03441@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.50 -> 1.51 PHIElimination.cpp updated: 1.36 -> 1.37 RegAllocLocal.cpp updated: 1.72 -> 1.73 --- Log message: adjust to new live variables interface --- Diffs of the changes: (+32 -35) LiveVariables.cpp | 46 ++++++++++++++++++++++++---------------------- PHIElimination.cpp | 17 ++++++----------- RegAllocLocal.cpp | 4 ++-- 3 files changed, 32 insertions(+), 35 deletions(-) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.50 llvm/lib/CodeGen/LiveVariables.cpp:1.51 --- llvm/lib/CodeGen/LiveVariables.cpp:1.50 Fri May 13 02:08:07 2005 +++ llvm/lib/CodeGen/LiveVariables.cpp Tue Aug 23 18:42:17 2005 @@ -125,9 +125,9 @@ // Does this kill a previous version of this register? if (MachineInstr *LastUse = PhysRegInfo[Reg]) { if (PhysRegUsed[Reg]) - RegistersKilled.insert(std::make_pair(LastUse, Reg)); + RegistersKilled[LastUse].push_back(Reg); else - RegistersDead.insert(std::make_pair(LastUse, Reg)); + RegistersDead[LastUse].push_back(Reg); } PhysRegInfo[Reg] = MI; PhysRegUsed[Reg] = false; @@ -136,9 +136,9 @@ unsigned Alias = *AliasSet; ++AliasSet) { if (MachineInstr *LastUse = PhysRegInfo[Alias]) { if (PhysRegUsed[Alias]) - RegistersKilled.insert(std::make_pair(LastUse, Alias)); + RegistersKilled[LastUse].push_back(Alias); else - RegistersDead.insert(std::make_pair(LastUse, Alias)); + RegistersDead[LastUse].push_back(Alias); } PhysRegInfo[Alias] = MI; PhysRegUsed[Alias] = false; @@ -293,12 +293,12 @@ for (unsigned i = 0, e = VirtRegInfo.size(); i != e; ++i) for (unsigned j = 0, e = VirtRegInfo[i].Kills.size(); j != e; ++j) { if (VirtRegInfo[i].Kills[j] == VirtRegInfo[i].DefInst) - RegistersDead.insert(std::make_pair(VirtRegInfo[i].Kills[j], - i + MRegisterInfo::FirstVirtualRegister)); + RegistersDead[VirtRegInfo[i].Kills[j]].push_back( + i + MRegisterInfo::FirstVirtualRegister); else - RegistersKilled.insert(std::make_pair(VirtRegInfo[i].Kills[j], - i + MRegisterInfo::FirstVirtualRegister)); + RegistersKilled[VirtRegInfo[i].Kills[j]].push_back( + i + MRegisterInfo::FirstVirtualRegister); } // Check to make sure there are no unreachable blocks in the MC CFG for the @@ -342,21 +342,23 @@ // Move the killed information over... killed_iterator I, E; tie(I, E) = killed_range(OldMI); - std::vector Regs; - for (killed_iterator A = I; A != E; ++A) - Regs.push_back(A->second); - RegistersKilled.erase(I, E); - - for (unsigned i = 0, e = Regs.size(); i != e; ++i) - RegistersKilled.insert(std::make_pair(NewMI, Regs[i])); - Regs.clear(); + if (I != E) { + std::vector &V = RegistersKilled[NewMI]; + bool WasEmpty = V.empty(); + V.insert(V.end(), I, E); + if (!WasEmpty) + std::sort(V.begin(), V.end()); // Keep the reg list sorted. + RegistersKilled.erase(OldMI); + } // Move the dead information over... tie(I, E) = dead_range(OldMI); - for (killed_iterator A = I; A != E; ++A) - Regs.push_back(A->second); - RegistersDead.erase(I, E); - - for (unsigned i = 0, e = Regs.size(); i != e; ++i) - RegistersDead.insert(std::make_pair(NewMI, Regs[i])); + if (I != E) { + std::vector &V = RegistersDead[NewMI]; + bool WasEmpty = V.empty(); + V.insert(V.end(), I, E); + if (!WasEmpty) + std::sort(V.begin(), V.end()); // Keep the reg list sorted. + RegistersDead.erase(OldMI); + } } Index: llvm/lib/CodeGen/PHIElimination.cpp diff -u llvm/lib/CodeGen/PHIElimination.cpp:1.36 llvm/lib/CodeGen/PHIElimination.cpp:1.37 --- llvm/lib/CodeGen/PHIElimination.cpp:1.36 Thu May 5 18:45:17 2005 +++ llvm/lib/CodeGen/PHIElimination.cpp Tue Aug 23 18:42:17 2005 @@ -125,19 +125,14 @@ // of any registers, or if the value itself is dead, we need to move this // information over to the new copy we just inserted. // - std::pair - RKs = LV->killed_range(MPhi); - std::vector > Range; - if (RKs.first != RKs.second) // Delete the range. - LV->removeVirtualRegistersKilled(RKs.first, RKs.second); + LV->removeVirtualRegistersKilled(MPhi); - RKs = LV->dead_range(MPhi); + std::pair + RKs = LV->dead_range(MPhi); if (RKs.first != RKs.second) { - // Works as above... - Range.assign(RKs.first, RKs.second); - LV->removeVirtualRegistersDead(RKs.first, RKs.second); - for (unsigned i = 0, e = Range.size(); i != e; ++i) - LV->addVirtualRegisterDead(Range[i].second, PHICopy); + for (LiveVariables::killed_iterator I = RKs.first; I != RKs.second; ++I) + LV->addVirtualRegisterDead(*I, PHICopy); + LV->removeVirtualRegistersDead(MPhi); } } Index: llvm/lib/CodeGen/RegAllocLocal.cpp diff -u llvm/lib/CodeGen/RegAllocLocal.cpp:1.72 llvm/lib/CodeGen/RegAllocLocal.cpp:1.73 --- llvm/lib/CodeGen/RegAllocLocal.cpp:1.72 Thu Apr 21 17:33:33 2005 +++ llvm/lib/CodeGen/RegAllocLocal.cpp Tue Aug 23 18:42:17 2005 @@ -525,7 +525,7 @@ // for (LiveVariables::killed_iterator KI = LV->killed_begin(MI), KE = LV->killed_end(MI); KI != KE; ++KI) { - unsigned VirtReg = KI->second; + unsigned VirtReg = *KI; unsigned PhysReg = VirtReg; if (MRegisterInfo::isVirtualRegister(VirtReg)) { // If the virtual register was never materialized into a register, it @@ -605,7 +605,7 @@ // for (LiveVariables::killed_iterator KI = LV->dead_begin(MI), KE = LV->dead_end(MI); KI != KE; ++KI) { - unsigned VirtReg = KI->second; + unsigned VirtReg = *KI; unsigned PhysReg = VirtReg; if (MRegisterInfo::isVirtualRegister(VirtReg)) { unsigned &PhysRegSlot = getVirt2PhysRegMapSlot(VirtReg); From lattner at cs.uiuc.edu Tue Aug 23 19:09:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 19:09:14 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/LiveVariables.h Message-ID: <200508240009.TAA03698@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: LiveVariables.h updated: 1.24 -> 1.25 --- Log message: Keep the killed/dead sets sorted, so that "KillsRegister" can do a quick binary search to test for membership. This speeds up LLC a bit more on KC++, e.g. on itanium from 16.6974s to 14.8272s, PPC from 11.4926s to 10.7089s and X86 from 10.8128s to 9.7943s, with no difference in generated code (like all of the RA patches). With these changes, isel is the slowest pass for PPC/X86, but linscan+live intervals is still > 50% of the compile time for itanium. More work could be done, but this is the last for now. --- Diffs of the changes: (+26 -22) LiveVariables.h | 48 ++++++++++++++++++++++++++---------------------- 1 files changed, 26 insertions(+), 22 deletions(-) Index: llvm/include/llvm/CodeGen/LiveVariables.h diff -u llvm/include/llvm/CodeGen/LiveVariables.h:1.24 llvm/include/llvm/CodeGen/LiveVariables.h:1.25 --- llvm/include/llvm/CodeGen/LiveVariables.h:1.24 Tue Aug 23 18:40:41 2005 +++ llvm/include/llvm/CodeGen/LiveVariables.h Tue Aug 23 19:09:02 2005 @@ -145,16 +145,8 @@ /// KillsRegister - Return true if the specified instruction kills the /// specified register. - bool KillsRegister(MachineInstr *MI, unsigned Reg) const { - std::map >::const_iterator I = - RegistersKilled.find(MI); - if (I != RegistersKilled.end()) - for (std::vector::const_iterator CI = I->second.begin(), - E = I->second.end(); CI != E; ++CI) - if (*CI == Reg) return true; - return false; - } - + bool KillsRegister(MachineInstr *MI, unsigned Reg) const; + killed_iterator dead_begin(MachineInstr *MI) { return getDeadDefsVector(MI).begin(); } @@ -169,16 +161,8 @@ /// RegisterDefIsDead - Return true if the specified instruction defines the /// specified register, but that definition is dead. - bool RegisterDefIsDead(MachineInstr *MI, unsigned Reg) const { - std::map >::const_iterator I = - RegistersDead.find(MI); - if (I != RegistersDead.end()) - for (std::vector::const_iterator CI = I->second.begin(), - E = I->second.end(); CI != E; ++CI) - if (*CI == Reg) return true; - return false; - } - + bool RegisterDefIsDead(MachineInstr *MI, unsigned Reg) const; + //===--------------------------------------------------------------------===// // API to update live variable information @@ -193,7 +177,17 @@ /// instruction. /// void addVirtualRegisterKilled(unsigned IncomingReg, MachineInstr *MI) { - RegistersKilled.insert(std::make_pair(MI, IncomingReg)); + std::vector &V = RegistersKilled[MI]; + // Insert in a sorted order. + if (V.empty() || IncomingReg > V.back()) { + V.push_back(IncomingReg); + } else { + std::vector::iterator I = V.begin(); + for (; *I < IncomingReg; ++I) + /*empty*/; + if (*I != IncomingReg) // Don't insert duplicates. + V.insert(I, IncomingReg); + } getVarInfo(IncomingReg).Kills.push_back(MI); } @@ -226,7 +220,17 @@ /// register is dead after being used by the specified instruction. /// void addVirtualRegisterDead(unsigned IncomingReg, MachineInstr *MI) { - RegistersDead.insert(std::make_pair(MI, IncomingReg)); + std::vector &V = RegistersDead[MI]; + // Insert in a sorted order. + if (V.empty() || IncomingReg > V.back()) { + V.push_back(IncomingReg); + } else { + std::vector::iterator I = V.begin(); + for (; *I < IncomingReg; ++I) + /*empty*/; + if (*I != IncomingReg) // Don't insert duplicates. + V.insert(I, IncomingReg); + } getVarInfo(IncomingReg).Kills.push_back(MI); } From lattner at cs.uiuc.edu Tue Aug 23 19:09:44 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 19:09:44 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/LiveVariables.cpp Message-ID: <200508240009.TAA03755@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: LiveVariables.cpp updated: 1.51 -> 1.52 --- Log message: Implement LiveVariables.h change --- Diffs of the changes: (+30 -0) LiveVariables.cpp | 30 ++++++++++++++++++++++++++++++ 1 files changed, 30 insertions(+) Index: llvm/lib/CodeGen/LiveVariables.cpp diff -u llvm/lib/CodeGen/LiveVariables.cpp:1.51 llvm/lib/CodeGen/LiveVariables.cpp:1.52 --- llvm/lib/CodeGen/LiveVariables.cpp:1.51 Tue Aug 23 18:42:17 2005 +++ llvm/lib/CodeGen/LiveVariables.cpp Tue Aug 23 19:09:33 2005 @@ -34,6 +34,7 @@ #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Config/alloca.h" +#include using namespace llvm; static RegisterAnalysis X("livevars", "Live Variable Analysis"); @@ -51,6 +52,25 @@ return VirtRegInfo[RegIdx]; } +bool LiveVariables::KillsRegister(MachineInstr *MI, unsigned Reg) const { + std::map >::const_iterator I = + RegistersKilled.find(MI); + if (I == RegistersKilled.end()) return false; + + // Do a binary search, as these lists can grow pretty big, particularly for + // call instructions on targets with lots of call-clobbered registers. + return std::binary_search(I->second.begin(), I->second.end(), Reg); +} + +bool LiveVariables::RegisterDefIsDead(MachineInstr *MI, unsigned Reg) const { + std::map >::const_iterator I = + RegistersDead.find(MI); + if (I == RegistersDead.end()) return false; + + // Do a binary search, as these lists can grow pretty big, particularly for + // call instructions on targets with lots of call-clobbered registers. + return std::binary_search(I->second.begin(), I->second.end(), Reg); +} void LiveVariables::MarkVirtRegAliveInBlock(VarInfo &VRInfo, @@ -301,6 +321,16 @@ i + MRegisterInfo::FirstVirtualRegister); } + // Walk through the RegistersKilled/Dead sets, and sort the registers killed + // or dead. This allows us to use efficient binary search for membership + // testing. + for (std::map >::iterator + I = RegistersKilled.begin(), E = RegistersKilled.end(); I != E; ++I) + std::sort(I->second.begin(), I->second.end()); + for (std::map >::iterator + I = RegistersDead.begin(), E = RegistersDead.end(); I != E; ++I) + std::sort(I->second.begin(), I->second.end()); + // Check to make sure there are no unreachable blocks in the MC CFG for the // function. If so, it is due to a bug in the instruction selector or some // other part of the code generator if this happens. From natebegeman at mac.com Tue Aug 23 19:21:39 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 23 Aug 2005 19:21:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508240021.TAA03820@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.157 -> 1.158 --- Log message: Fix optimization of select_cc seteq X, 0, 1, 0 -> srl (ctlz X), log2 X size --- Diffs of the changes: (+3 -3) SelectionDAG.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.157 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.158 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.157 Tue Aug 23 00:41:12 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Aug 23 19:21:28 2005 @@ -854,9 +854,9 @@ } // Check to see if this is the equivalent of seteq X, 0. - // select_cc seteq X, 0, 1, 0 -> setcc X, 0, seteq -> srl (ctlz X), size(X)-1 + // select_cc eq X, 0, 1, 0 -> setcc X, 0, eq -> srl (ctlz X), log2(size(X)) if (N2C && N2C->isNullValue() && N4C && N4C->isNullValue() && - N3C && (N3C->getValue() == 1)) { + N3C && (N3C->getValue() == 1ULL) && CC == ISD::SETEQ) { MVT::ValueType XType = N1.getValueType(); if (TLI.getOperationAction(ISD::SETCC, TLI.getSetCCResultTy()) == TargetLowering::Legal) { @@ -865,7 +865,7 @@ if (TLI.getOperationAction(ISD::CTLZ, XType) == TargetLowering::Legal) { SDOperand Ctlz = getNode(ISD::CTLZ, XType, N1); return getNode(ISD::SRL, XType, Ctlz, - getConstant(MVT::getSizeInBits(XType)-1, + getConstant(Log2_32(MVT::getSizeInBits(XType)), TLI.getShiftAmountTy())); } } From alkis at cs.uiuc.edu Tue Aug 23 19:25:11 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Tue, 23 Aug 2005 19:25:11 -0500 Subject: [llvm-commits] CVS: llvm-java/lib/ClassFile/ClassFile.cpp Message-ID: <200508240025.TAA03890@zion.cs.uiuc.edu> Changes in directory llvm-java/lib/ClassFile: ClassFile.cpp updated: 1.45 -> 1.46 --- Log message: Changes to make this compile with LLVM current --- Diffs of the changes: (+5 -2) ClassFile.cpp | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) Index: llvm-java/lib/ClassFile/ClassFile.cpp diff -u llvm-java/lib/ClassFile/ClassFile.cpp:1.45 llvm-java/lib/ClassFile/ClassFile.cpp:1.46 --- llvm-java/lib/ClassFile/ClassFile.cpp:1.45 Fri Apr 1 12:42:38 2005 +++ llvm-java/lib/ClassFile/ClassFile.cpp Tue Aug 23 19:24:58 2005 @@ -135,7 +135,10 @@ unsigned b = 0, e = 0; do { e = ClassPath.find(':', b); - if (path.setDirectory(ClassPath.substr(b, e - b))) { + // FIXME: Currently we only support flat class file reading. When + // jar files are supported this chech has to change to not require + // that each CLASSPATH component is a directory. + if (path.set(ClassPath.substr(b, e - b)) && path.isDirectory()) { result.push_back(path); DEBUG(std::cerr << "Adding: " << path.toString() << " to CLASSPATH\n"); } @@ -160,7 +163,7 @@ for (unsigned i = 0, e = classpath.size(); i != e; ++i) { sys::Path filename = classpath[i]; assert(filename.isDirectory() && "CLASSPATH element not a directory!"); - filename.appendFile(clazz); + filename.appendComponent(clazz); DEBUG(std::cerr << "Trying file: " << filename.toString() << '\n'); if (filename.exists()) return filename; From alkis at cs.uiuc.edu Tue Aug 23 19:25:11 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Tue, 23 Aug 2005 19:25:11 -0500 Subject: [llvm-commits] CVS: llvm-java/lib/Compiler/VMMethod.cpp Message-ID: <200508240025.TAA03894@zion.cs.uiuc.edu> Changes in directory llvm-java/lib/Compiler: VMMethod.cpp updated: 1.5 -> 1.6 --- Log message: Changes to make this compile with LLVM current --- Diffs of the changes: (+0 -1) VMMethod.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm-java/lib/Compiler/VMMethod.cpp diff -u llvm-java/lib/Compiler/VMMethod.cpp:1.5 llvm-java/lib/Compiler/VMMethod.cpp:1.6 --- llvm-java/lib/Compiler/VMMethod.cpp:1.5 Fri Apr 22 19:12:14 2005 +++ llvm-java/lib/Compiler/VMMethod.cpp Tue Aug 23 19:24:58 2005 @@ -63,7 +63,6 @@ const Type* paramType = functionType->getParamType(i); const Type* argType = paramType->getVAArgsPromotedType(); Value* arg = new VAArgInst(vaList, argType, "tmp", bb); - vaList = new VANextInst(vaList, argType, "", bb); if (paramType != argType) arg = new CastInst(arg, paramType, "tmp", bb); params.push_back(arg); From alkis at cs.uiuc.edu Tue Aug 23 19:25:10 2005 From: alkis at cs.uiuc.edu (Alkis Evlogimenos) Date: Tue, 23 Aug 2005 19:25:10 -0500 Subject: [llvm-commits] CVS: llvm-java/tools/class2llvm/class2llvm.cpp Message-ID: <200508240025.TAA03886@zion.cs.uiuc.edu> Changes in directory llvm-java/tools/class2llvm: class2llvm.cpp updated: 1.18 -> 1.19 --- Log message: Changes to make this compile with LLVM current --- Diffs of the changes: (+1 -1) class2llvm.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-java/tools/class2llvm/class2llvm.cpp diff -u llvm-java/tools/class2llvm/class2llvm.cpp:1.18 llvm-java/tools/class2llvm/class2llvm.cpp:1.19 --- llvm-java/tools/class2llvm/class2llvm.cpp:1.18 Wed Nov 17 17:53:49 2004 +++ llvm-java/tools/class2llvm/class2llvm.cpp Tue Aug 23 19:24:59 2005 @@ -54,7 +54,7 @@ } catch (std::exception& e) { std::cerr << e.what() << '\n'; - sys::Path(OutputFilename).destroyFile(); + sys::Path(OutputFilename).eraseFromDisk(); return EXIT_FAILURE; } From lattner at cs.uiuc.edu Tue Aug 23 19:34:40 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 19:34:40 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200508240034.TAA04019@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.73 -> 1.74 --- Log message: Make -view-isel-dags show the dag before instruction selecting, in case the target isel crashes due to unimplemented features like calls :) --- Diffs of the changes: (+2 -2) SelectionDAGISel.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.73 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.74 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.73 Mon Aug 22 12:28:31 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Aug 23 19:34:29 2005 @@ -1228,12 +1228,12 @@ DEBUG(std::cerr << "Legalized selection DAG:\n"); DEBUG(DAG.dump()); + if (ViewDAGs) DAG.viewGraph(); + // Third, instruction select all of the operations to machine code, adding the // code to the MachineBasicBlock. InstructionSelectBasicBlock(DAG); - if (ViewDAGs) DAG.viewGraph(); - DEBUG(std::cerr << "Selected machine code:\n"); DEBUG(BB->dump()); From lattner at cs.uiuc.edu Tue Aug 23 19:47:26 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 23 Aug 2005 19:47:26 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508240047.TAA04112@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.20 -> 1.21 --- Log message: Add callseq_begin/end support Call stil not supported yet --- Diffs of the changes: (+10 -0) PPC32ISelDAGToDAG.cpp | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.20 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.21 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.20 Sun Aug 21 20:27:59 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Tue Aug 23 19:47:15 2005 @@ -920,6 +920,16 @@ AddrOp1, AddrOp2, Select(N->getOperand(0))); break; } + + case ISD::CALLSEQ_START: + case ISD::CALLSEQ_END: { + unsigned Amt = cast(N->getOperand(1))->getValue(); + unsigned Opc = N->getOpcode() == ISD::CALLSEQ_START ? + PPC::ADJCALLSTACKDOWN : PPC::ADJCALLSTACKUP; + CurDAG->SelectNodeTo(N, MVT::Other, Opc, Select(N->getOperand(0)), + getI32Imm(Amt)); + break; + } case ISD::RET: { SDOperand Chain = Select(N->getOperand(0)); // Token chain. From natebegeman at mac.com Tue Aug 23 23:58:08 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 23 Aug 2005 23:58:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508240458.XAA07602@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.158 -> 1.159 --- Log message: Teach SelectionDAG how to simplify a few more setcc-equivalent select_cc nodes so that backends don't have to. --- Diffs of the changes: (+21 -6) SelectionDAG.cpp | 27 +++++++++++++++++++++------ 1 files changed, 21 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.158 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.159 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.158 Tue Aug 23 19:21:28 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Aug 23 23:57:57 2005 @@ -853,21 +853,36 @@ } } - // Check to see if this is the equivalent of seteq X, 0. - // select_cc eq X, 0, 1, 0 -> setcc X, 0, eq -> srl (ctlz X), log2(size(X)) - if (N2C && N2C->isNullValue() && N4C && N4C->isNullValue() && - N3C && (N3C->getValue() == 1ULL) && CC == ISD::SETEQ) { + // Check to see if this is the equivalent of setcc X, 0 + if (N4C && N4C->isNullValue() && N3C && (N3C->getValue() == 1ULL)) { MVT::ValueType XType = N1.getValueType(); if (TLI.getOperationAction(ISD::SETCC, TLI.getSetCCResultTy()) == TargetLowering::Legal) { - return getSetCC(TLI.getSetCCResultTy(), N1, N2, ISD::SETEQ); + return getSetCC(TLI.getSetCCResultTy(), N1, N2, CC); } - if (TLI.getOperationAction(ISD::CTLZ, XType) == TargetLowering::Legal) { + // seteq X, 0 -> srl (ctlz X, log2(size(X))) + if (N2C && N2C->isNullValue() && CC == ISD::SETEQ && + TLI.getOperationAction(ISD::CTLZ, XType) == TargetLowering::Legal) { SDOperand Ctlz = getNode(ISD::CTLZ, XType, N1); return getNode(ISD::SRL, XType, Ctlz, getConstant(Log2_32(MVT::getSizeInBits(XType)), TLI.getShiftAmountTy())); } + // setgt X, 0 -> srl (and (-X, ~X), size(X)-1) + if (N2C && N2C->isNullValue() && CC == ISD::SETGT) { + SDOperand NegN1 = getNode(ISD::SUB, XType, getConstant(0, XType), N1); + SDOperand NotN1 = getNode(ISD::XOR, XType, N1, getConstant(~0ULL, XType)); + return getNode(ISD::SRL, XType, getNode(ISD::AND, XType, NegN1, NotN1), + getConstant(MVT::getSizeInBits(XType)-1, + TLI.getShiftAmountTy())); + } + // setgt X, -1 -> xor (srl (X, size(X)-1), 1) + if (N2C && N2C->isAllOnesValue() && CC == ISD::SETGT) { + SDOperand Sign = getNode(ISD::SRL, XType, N1, + getConstant(MVT::getSizeInBits(XType)-1, + TLI.getShiftAmountTy())); + return getNode(ISD::XOR, XType, Sign, getConstant(1, XType)); + } } // Check to see if this is an integer abs. select_cc setl[te] X, 0, -X, X -> From natebegeman at mac.com Tue Aug 23 23:59:33 2005 From: natebegeman at mac.com (Nate Begeman) Date: Tue, 23 Aug 2005 23:59:33 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200508240459.XAA07659@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.159 -> 1.160 --- Log message: Add the "ppc specific" setcc-equivalent select_cc cases Prefer 'neg X' to 'subfic 0, X' since it does not set XER[CA] --- Diffs of the changes: (+25 -4) PPC32ISelPattern.cpp | 29 +++++++++++++++++++++++++---- 1 files changed, 25 insertions(+), 4 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.159 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.160 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.159 Sun Aug 21 19:47:28 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Tue Aug 23 23:59:21 2005 @@ -1052,9 +1052,6 @@ case MVT::i8: BuildMI(BB, PPC::EXTSB, 1, Result).addReg(Tmp1); break; - case MVT::i1: - BuildMI(BB, PPC::SUBFIC, 2, Result).addReg(Tmp1).addSImm(0); - break; } return Result; @@ -1325,7 +1322,10 @@ if (isIntImmediate(N.getOperand(0), Tmp1) && isInt16(Tmp1)) { Tmp1 = Lo16(Tmp1); Tmp2 = SelectExpr(N.getOperand(1)); - BuildMI(BB, PPC::SUBFIC, 2, Result).addReg(Tmp2).addSImm(Tmp1); + if (0 == Tmp1) + BuildMI(BB, PPC::NEG, 1, Result).addReg(Tmp2); + else + BuildMI(BB, PPC::SUBFIC, 2, Result).addReg(Tmp2).addSImm(Tmp1); return Result; } if (SelectIntImmediateExpr(N, Result, PPC::ADDIS, PPC::ADDI, true, true)) @@ -1662,6 +1662,27 @@ assert(0 && "Should never get here"); } + // handle the setcc cases here. select_cc lhs, 0, 1, 0, cc + ConstantSDNode *N1C = dyn_cast(N.getOperand(1)); + ConstantSDNode *N2C = dyn_cast(N.getOperand(2)); + ConstantSDNode *N3C = dyn_cast(N.getOperand(3)); + if (N1C && N2C && N3C && N1C->isNullValue() && N3C->isNullValue() && + N2C->getValue() == 1ULL && (CC == ISD::SETNE || CC == ISD::SETEQ)) { + Tmp1 = SelectExpr(Node->getOperand(0)); + Tmp2 = MakeIntReg(); + if (CC == ISD::SETNE) { + BuildMI(BB, PPC::ADDIC, 2, Tmp2).addReg(Tmp1).addSImm(-1); + BuildMI(BB, PPC::SUBFE, 2, Result).addReg(Tmp2).addReg(Tmp1); + } else { + Tmp3 = MakeIntReg(); + BuildMI(BB, PPC::NEG, 2, Tmp2).addReg(Tmp1); + BuildMI(BB, PPC::ANDC, 2, Tmp3).addReg(Tmp2).addReg(Tmp1); + BuildMI(BB, PPC::RLWINM, 4, Result).addReg(Tmp3).addImm(1).addImm(31) + .addImm(31); + } + return Result; + } + // If the False value only has one use, we can generate better code by // selecting it in the fallthrough basic block rather than here, which // increases register pressure. From natebegeman at mac.com Wed Aug 24 00:03:31 2005 From: natebegeman at mac.com (Nate Begeman) Date: Wed, 24 Aug 2005 00:03:31 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508240503.AAA07731@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.21 -> 1.22 --- Log message: Remove unused statistic Prefer 'neg X' to 'subfic 0, X' since neg does not set XER[CA] --- Diffs of the changes: (+5 -3) PPC32ISelDAGToDAG.cpp | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.21 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.22 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.21 Tue Aug 23 19:47:15 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Wed Aug 24 00:03:20 2005 @@ -28,7 +28,6 @@ using namespace llvm; namespace { - Statistic<> Recorded("ppc-codegen", "Number of recording ops emitted"); Statistic<> FusedFP ("ppc-codegen", "Number of fused fp operations"); Statistic<> FrameOff("ppc-codegen", "Number of frame idx offsets collapsed"); @@ -599,8 +598,11 @@ if (Ty == MVT::i32) { unsigned Imm; if (isIntImmediate(N->getOperand(0), Imm) && isInt16(Imm)) { - CurDAG->SelectNodeTo(N, Ty, PPC::SUBFIC, Select(N->getOperand(1)), - getI32Imm(Lo16(Imm))); + if (0 == Imm) + CurDAG->SelectNodeTo(N, Ty, PPC::NEG, Select(N->getOperand(1))); + else + CurDAG->SelectNodeTo(N, Ty, PPC::SUBFIC, Select(N->getOperand(1)), + getI32Imm(Lo16(Imm))); break; } if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1), From natebegeman at mac.com Wed Aug 24 00:07:00 2005 From: natebegeman at mac.com (Nate Begeman) Date: Wed, 24 Aug 2005 00:07:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200508240507.AAA07753@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.160 -> 1.161 --- Log message: Whoops, fix a thinko. All cases except SETNE are now handled by the target independent code in SelectionDAG.cpp --- Diffs of the changes: (+3 -11) PPC32ISelPattern.cpp | 14 +++----------- 1 files changed, 3 insertions(+), 11 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.160 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.161 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.160 Tue Aug 23 23:59:21 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Wed Aug 24 00:06:48 2005 @@ -1667,19 +1667,11 @@ ConstantSDNode *N2C = dyn_cast(N.getOperand(2)); ConstantSDNode *N3C = dyn_cast(N.getOperand(3)); if (N1C && N2C && N3C && N1C->isNullValue() && N3C->isNullValue() && - N2C->getValue() == 1ULL && (CC == ISD::SETNE || CC == ISD::SETEQ)) { + N2C->getValue() == 1ULL && CC == ISD::SETNE) { Tmp1 = SelectExpr(Node->getOperand(0)); Tmp2 = MakeIntReg(); - if (CC == ISD::SETNE) { - BuildMI(BB, PPC::ADDIC, 2, Tmp2).addReg(Tmp1).addSImm(-1); - BuildMI(BB, PPC::SUBFE, 2, Result).addReg(Tmp2).addReg(Tmp1); - } else { - Tmp3 = MakeIntReg(); - BuildMI(BB, PPC::NEG, 2, Tmp2).addReg(Tmp1); - BuildMI(BB, PPC::ANDC, 2, Tmp3).addReg(Tmp2).addReg(Tmp1); - BuildMI(BB, PPC::RLWINM, 4, Result).addReg(Tmp3).addImm(1).addImm(31) - .addImm(31); - } + BuildMI(BB, PPC::ADDIC, 2, Tmp2).addReg(Tmp1).addSImm(-1); + BuildMI(BB, PPC::SUBFE, 2, Result).addReg(Tmp2).addReg(Tmp1); return Result; } From reid at x10sys.com Wed Aug 24 05:07:35 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:07:35 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Config/config.h.in Message-ID: <200508241007.FAA09263@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Config: config.h.in updated: 1.56 -> 1.57 --- Log message: For PR616: http://llvm.cs.uiuc.edu/PR616 : These patches make threading optional in LLVM. The configuration scripts are now modified to accept a --disable-threads switch. If this is used, the Mutex class will be implemented with all functions as no-op. Furthermore, linking against libpthread will not be done. Finally, the ParallelJIT example needs libpthread so its makefile was changed to always add -lpthread to the link line. --- Diffs of the changes: (+6 -3) config.h.in | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) Index: llvm/include/llvm/Config/config.h.in diff -u llvm/include/llvm/Config/config.h.in:1.56 llvm/include/llvm/Config/config.h.in:1.57 --- llvm/include/llvm/Config/config.h.in:1.56 Wed Jul 27 21:04:44 2005 +++ llvm/include/llvm/Config/config.h.in Wed Aug 24 05:07:21 2005 @@ -11,6 +11,9 @@ /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA +/* Define if threads enabled */ +#undef ENABLE_THREADS + /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA @@ -449,9 +452,9 @@ /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if the `S_IS*' macros in do not work properly. */ From reid at x10sys.com Wed Aug 24 05:07:35 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:07:35 -0500 Subject: [llvm-commits] CVS: llvm/autoconf/configure.ac Message-ID: <200508241007.FAA09267@zion.cs.uiuc.edu> Changes in directory llvm/autoconf: configure.ac updated: 1.193 -> 1.194 --- Log message: For PR616: http://llvm.cs.uiuc.edu/PR616 : These patches make threading optional in LLVM. The configuration scripts are now modified to accept a --disable-threads switch. If this is used, the Mutex class will be implemented with all functions as no-op. Furthermore, linking against libpthread will not be done. Finally, the ParallelJIT example needs libpthread so its makefile was changed to always add -lpthread to the link line. --- Diffs of the changes: (+22 -6) configure.ac | 28 ++++++++++++++++++++++------ 1 files changed, 22 insertions(+), 6 deletions(-) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.193 llvm/autoconf/configure.ac:1.194 --- llvm/autoconf/configure.ac:1.193 Wed Jul 27 16:58:38 2005 +++ llvm/autoconf/configure.ac Wed Aug 24 05:07:21 2005 @@ -230,6 +230,18 @@ *) AC_MSG_ERROR([Invalid setting for --enable-doxygen. Use "yes" or "no"]) ;; esac +dnl Allow disablement of threads +AC_ARG_ENABLE(threads, + AS_HELP_STRING([--enable-threads], + [Use threads if available (default is YES)]),, + enableval=yes) +case "$enableval" in + yes) AC_SUBST(ENABLE_THREADS,[1]) ;; + no) AC_SUBST(ENABLE_THREADS,[0]) ;; + *) AC_MSG_ERROR([Invalid setting for --enable-threads. Use "yes" or "no"]) ;; +esac +AC_DEFINE_UNQUOTED([ENABLE_THREADS],$ENABLE_THREADS,[Define if threads enabled]) + dnl Allow specific targets to be specified for building (or not) TARGETS_TO_BUILD="" AC_ARG_ENABLE([targets],AS_HELP_STRING([--enable-target], @@ -447,10 +459,12 @@ dnl pthread locking functions are optional - but llvm will not be thread-safe dnl without locks. -AC_CHECK_LIB(pthread,pthread_mutex_init) -AC_SEARCH_LIBS(pthread_mutex_lock,pthread, - AC_DEFINE([HAVE_PTHREAD_MUTEX_LOCK],[1], - [Have pthread_mutex_lock])) +if test "$ENABLE_THREADS" -eq 1 ; then + AC_CHECK_LIB(pthread,pthread_mutex_init) + AC_SEARCH_LIBS(pthread_mutex_lock,pthread, + AC_DEFINE([HAVE_PTHREAD_MUTEX_LOCK],[1], + [Have pthread_mutex_lock])) +fi dnl===-----------------------------------------------------------------------=== dnl=== @@ -470,10 +484,12 @@ AC_HEADER_TIME AC_CHECK_HEADERS([dlfcn.h execinfo.h fcntl.h inttypes.h limits.h link.h]) -AC_CHECK_HEADERS([malloc.h pthread.h signal.h stdint.h unistd.h utime.h]) -AC_CHECK_HEADERS([windows.h]) +AC_CHECK_HEADERS([malloc.h signal.h stdint.h unistd.h utime.h windows.h]) AC_CHECK_HEADERS([sys/mman.h sys/param.h sys/resource.h sys/time.h sys/types.h]) AC_CHECK_HEADERS([rw/stdex/hash_map.h rw/stdex/hash_set.h]) +if test "$ENABLE_THREADS" -eq 1 ; then + AC_CHECK_HEADERS(pthread.h) +fi dnl===-----------------------------------------------------------------------=== dnl=== From reid at x10sys.com Wed Aug 24 05:07:34 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:07:34 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Mutex.cpp Message-ID: <200508241007.FAA09255@zion.cs.uiuc.edu> Changes in directory llvm/lib/System: Mutex.cpp updated: 1.5 -> 1.6 --- Log message: For PR616: http://llvm.cs.uiuc.edu/PR616 : These patches make threading optional in LLVM. The configuration scripts are now modified to accept a --disable-threads switch. If this is used, the Mutex class will be implemented with all functions as no-op. Furthermore, linking against libpthread will not be done. Finally, the ParallelJIT example needs libpthread so its makefile was changed to always add -lpthread to the link line. --- Diffs of the changes: (+17 -3) Mutex.cpp | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) Index: llvm/lib/System/Mutex.cpp diff -u llvm/lib/System/Mutex.cpp:1.5 llvm/lib/System/Mutex.cpp:1.6 --- llvm/lib/System/Mutex.cpp:1.5 Tue Aug 2 11:04:59 2005 +++ llvm/lib/System/Mutex.cpp Wed Aug 24 05:07:21 2005 @@ -11,23 +11,36 @@ // //===----------------------------------------------------------------------===// -#include "llvm/System/Mutex.h" #include "llvm/Config/config.h" +#include "llvm/System/Mutex.h" //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system //=== independent code. //===----------------------------------------------------------------------===// -#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK) - +#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0 +// Define all methods as no-ops if threading is explicitly disabled namespace llvm { using namespace sys; +Mutex::Mutex( bool recursive) { } +Mutex::~Mutex() { } +bool Mutex::acquire() { return true; } +bool Mutex::release() { return true; } +bool Mutex::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. @@ -143,3 +156,4 @@ #else #warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in System/Mutex.cpp #endif +#endif From reid at x10sys.com Wed Aug 24 05:07:34 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:07:34 -0500 Subject: [llvm-commits] CVS: llvm/examples/ParallelJIT/Makefile Message-ID: <200508241007.FAA09259@zion.cs.uiuc.edu> Changes in directory llvm/examples/ParallelJIT: Makefile updated: 1.2 -> 1.3 --- Log message: For PR616: http://llvm.cs.uiuc.edu/PR616 : These patches make threading optional in LLVM. The configuration scripts are now modified to accept a --disable-threads switch. If this is used, the Mutex class will be implemented with all functions as no-op. Furthermore, linking against libpthread will not be done. Finally, the ParallelJIT example needs libpthread so its makefile was changed to always add -lpthread to the link line. --- Diffs of the changes: (+2 -0) Makefile | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/examples/ParallelJIT/Makefile diff -u llvm/examples/ParallelJIT/Makefile:1.2 llvm/examples/ParallelJIT/Makefile:1.3 --- llvm/examples/ParallelJIT/Makefile:1.2 Tue Jul 12 17:00:29 2005 +++ llvm/examples/ParallelJIT/Makefile Wed Aug 24 05:07:21 2005 @@ -14,3 +14,5 @@ LLVMLIBS := JIT include $(LEVEL)/Makefile.common + +LIBS += -lpthread From reid at x10sys.com Wed Aug 24 05:07:35 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:07:35 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/System/Mutex.h Message-ID: <200508241007.FAA09275@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/System: Mutex.h updated: 1.4 -> 1.5 --- Log message: For PR616: http://llvm.cs.uiuc.edu/PR616 : These patches make threading optional in LLVM. The configuration scripts are now modified to accept a --disable-threads switch. If this is used, the Mutex class will be implemented with all functions as no-op. Furthermore, linking against libpthread will not be done. Finally, the ParallelJIT example needs libpthread so its makefile was changed to always add -lpthread to the link line. --- Diffs of the changes: (+2 -0) Mutex.h | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/include/llvm/System/Mutex.h diff -u llvm/include/llvm/System/Mutex.h:1.4 llvm/include/llvm/System/Mutex.h:1.5 --- llvm/include/llvm/System/Mutex.h:1.4 Wed Jul 27 00:53:43 2005 +++ llvm/include/llvm/System/Mutex.h Wed Aug 24 05:07:21 2005 @@ -66,7 +66,9 @@ /// @name Platform Dependent Data /// @{ private: +#ifdef ENABLE_THREADS void* data_; ///< We don't know what the data will be +#endif /// @} /// @name Do Not Implement From reid at x10sys.com Wed Aug 24 05:07:35 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:07:35 -0500 Subject: [llvm-commits] CVS: llvm/configure Message-ID: <200508241007.FAA09271@zion.cs.uiuc.edu> Changes in directory llvm: configure updated: 1.197 -> 1.198 --- Log message: For PR616: http://llvm.cs.uiuc.edu/PR616 : These patches make threading optional in LLVM. The configuration scripts are now modified to accept a --disable-threads switch. If this is used, the Mutex class will be implemented with all functions as no-op. Furthermore, linking against libpthread will not be done. Finally, the ParallelJIT example needs libpthread so its makefile was changed to always add -lpthread to the link line. --- Diffs of the changes: (+67 -39) configure | 106 +++++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 67 insertions(+), 39 deletions(-) Index: llvm/configure diff -u llvm/configure:1.197 llvm/configure:1.198 --- llvm/configure:1.197 Wed Jul 27 16:58:38 2005 +++ llvm/configure Wed Aug 24 05:07:21 2005 @@ -475,7 +475,7 @@ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LLVM_COPYRIGHT subdirs build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os OS LLVM_ON_UNIX LLVM_ON_WIN32 ARCH ENDIAN CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT ENABLE_OPTIMIZED JIT ENABLE_DOXYGEN TARGETS_TO_BUILD CPP CXX CXXFLAGS ac_ct_CXX LEX LEXLIB LEX_OUTPUT_ROOT FLEX YACC BISON ifGNUmake LN_S CMP CP DATE FIND GREP MKDIR MV RANLIB ac_ct_RANLIB RM SED TAR GRAPHVIZ GV INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA BZIP2 DOT DOXYGEN ETAGS GROFF GZIP POD2HTML POD2MAN RUNTEST TCLSH ZIP EGREP INSTALL_LTDL_TRUE INSTALL_LTDL_FALSE CONVENIENCE_LTDL_TRUE CONVENIENCE_LTDL_FALSE L! IBADD_DL ECHO AR ac_ct_AR STRIP ac_ct_STRIP CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL ETAGSFLAGS LLVMGCC LLVMGXX ALLOCA MMAP_FILE LLVMCC1 LLVMCC1PLUS LLVMGCCDIR SHLIBEXT LLVM_PREFIX LLVM_BINDIR LLVM_LIBDIR LLVM_DATADIR LLVM_DOCSDIR LLVM_ETCDIR LLVM_INCLUDEDIR LLVM_INFODIR LLVM_MANDIR LLVM_CONFIGTIME LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS LLVM_COPYRIGHT subdirs build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os OS LLVM_ON_UNIX LLVM_ON_WIN32 ARCH ENDIAN CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT ENABLE_OPTIMIZED JIT ENABLE_DOXYGEN ENABLE_THREADS TARGETS_TO_BUILD CPP CXX CXXFLAGS ac_ct_CXX LEX LEXLIB LEX_OUTPUT_ROOT FLEX YACC BISON ifGNUmake LN_S CMP CP DATE FIND GREP MKDIR MV RANLIB ac_ct_RANLIB RM SED TAR GRAPHVIZ GV INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA BZIP2 DOT DOXYGEN ETAGS GROFF GZIP POD2HTML POD2MAN RUNTEST TCLSH ZIP EGREP INSTALL_LTDL_TRUE INSTALL_LTDL_FALSE CONVENIENCE_LTDL_TRUE CONVENIEN! CE_LTDL_FALSE LIBADD_DL ECHO AR ac_ct_AR STRIP ac_ct_STRIP CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL ETAGSFLAGS LLVMGCC LLVMGXX ALLOCA MMAP_FILE LLVMCC1 LLVMCC1PLUS LLVMGCCDIR SHLIBEXT LLVM_PREFIX LLVM_BINDIR LLVM_LIBDIR LLVM_DATADIR LLVM_DOCSDIR LLVM_ETCDIR LLVM_INCLUDEDIR LLVM_INFODIR LLVM_MANDIR LLVM_CONFIGTIME LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -1036,6 +1036,7 @@ --enable-optimized --enable-jit Enable Just In Time Compiling (default is YES) --enable-doxygen Build doxygen documentation (default is NO) + --enable-threads Use threads if available (default is YES) --enable-target Build specific host targets: all,host-only,{target-name} (default=all) --enable-ltdl-install install libltdl @@ -3025,6 +3026,28 @@ { (exit 1); exit 1; }; } ;; esac +# Check whether --enable-threads or --disable-threads was given. +if test "${enable_threads+set}" = set; then + enableval="$enable_threads" + +else + enableval=yes +fi; +case "$enableval" in + yes) ENABLE_THREADS=1 + ;; + no) ENABLE_THREADS=0 + ;; + *) { { echo "$as_me:$LINENO: error: Invalid setting for --enable-threads. Use \"yes\" or \"no\"" >&5 +echo "$as_me: error: Invalid setting for --enable-threads. Use \"yes\" or \"no\"" >&2;} + { (exit 1); exit 1; }; } ;; +esac + +cat >>confdefs.h <<_ACEOF +#define ENABLE_THREADS $ENABLE_THREADS +_ACEOF + + TARGETS_TO_BUILD="" # Check whether --enable-targets or --disable-targets was given. if test "${enable_targets+set}" = set; then @@ -8333,7 +8356,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext + echo '#line 10350 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -10809,7 +10832,7 @@ # Provide some information about the compiler. -echo "$as_me:10812:" \ +echo "$as_me:10835:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 @@ -11866,11 +11889,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11869: $lt_compile\"" >&5) + (eval echo "\"\$as_me:11892: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:11873: \$? = $ac_status" >&5 + echo "$as_me:11896: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12109,11 +12132,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12112: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12135: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12116: \$? = $ac_status" >&5 + echo "$as_me:12139: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -12169,11 +12192,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12172: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12195: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:12176: \$? = $ac_status" >&5 + echo "$as_me:12199: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -14354,7 +14377,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:16671: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16652: \$? = $ac_status" >&5 + echo "$as_me:16675: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -16705,11 +16728,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16708: $lt_compile\"" >&5) + (eval echo "\"\$as_me:16731: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:16712: \$? = $ac_status" >&5 + echo "$as_me:16735: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -18066,7 +18089,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5) + (eval echo "\"\$as_me:19027: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:19008: \$? = $ac_status" >&5 + echo "$as_me:19031: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -19061,11 +19084,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:19064: $lt_compile\"" >&5) + (eval echo "\"\$as_me:19087: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:19068: \$? = $ac_status" >&5 + echo "$as_me:19091: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -21100,11 +21123,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21103: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21126: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21107: \$? = $ac_status" >&5 + echo "$as_me:21130: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21343,11 +21366,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21346: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21369: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:21350: \$? = $ac_status" >&5 + echo "$as_me:21373: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings @@ -21403,11 +21426,11 @@ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:21406: $lt_compile\"" >&5) + (eval echo "\"\$as_me:21429: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:21410: \$? = $ac_status" >&5 + echo "$as_me:21433: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -23588,7 +23611,7 @@ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < conftest.$ac_ext <&5 echo $ECHO_N "checking for pthread_mutex_init in -lpthread... $ECHO_C" >&6 @@ -25413,7 +25437,7 @@ fi -echo "$as_me:$LINENO: checking for library containing pthread_mutex_lock" >&5 + echo "$as_me:$LINENO: checking for library containing pthread_mutex_lock" >&5 echo $ECHO_N "checking for library containing pthread_mutex_lock... $ECHO_C" >&6 if test "${ac_cv_search_pthread_mutex_lock+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -25543,6 +25567,7 @@ fi +fi @@ -26473,7 +26498,7 @@ -for ac_header in malloc.h pthread.h signal.h stdint.h unistd.h utime.h +for ac_header in malloc.h signal.h stdint.h unistd.h utime.h windows.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then @@ -26623,7 +26648,11 @@ done -for ac_header in windows.h + + + + +for ac_header in sys/mman.h sys/param.h sys/resource.h sys/time.h sys/types.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then @@ -26774,10 +26803,7 @@ - - - -for ac_header in sys/mman.h sys/param.h sys/resource.h sys/time.h sys/types.h +for ac_header in rw/stdex/hash_map.h rw/stdex/hash_set.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then @@ -26926,9 +26952,9 @@ done +if test "$ENABLE_THREADS" -eq 1 ; then - -for ac_header in rw/stdex/hash_map.h rw/stdex/hash_set.h +for ac_header in pthread.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then @@ -27077,6 +27103,7 @@ done +fi echo "$as_me:$LINENO: checking for pid_t" >&5 @@ -31322,6 +31349,7 @@ s, at ENABLE_OPTIMIZED@,$ENABLE_OPTIMIZED,;t t s, at JIT@,$JIT,;t t s, at ENABLE_DOXYGEN@,$ENABLE_DOXYGEN,;t t +s, at ENABLE_THREADS@,$ENABLE_THREADS,;t t s, at TARGETS_TO_BUILD@,$TARGETS_TO_BUILD,;t t s, at CPP@,$CPP,;t t s, at CXX@,$CXX,;t t From reid at x10sys.com Wed Aug 24 05:43:22 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:43:22 -0500 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200508241043.FAA09575@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.319 -> 1.320 --- Log message: For PR619: http://llvm.cs.uiuc.edu/PR619 : Make any header files that are automatically generated be preconditions of the compilation. This ensures that if a *.h.in file is changed then its corresponding *.h file gets updated on the next rebuild. Note that this can lead to confusing (but correct) results if the *.h.in file changed unsubstantially so that autoheader doesn't update the *.h file. In that case, manually touch the *.h file in question to restore order. Moral of the story, if you're going to "touch" a *.in file then modify it substantially. --- Diffs of the changes: (+16 -0) Makefile.rules | 16 ++++++++++++++++ 1 files changed, 16 insertions(+) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.319 llvm/Makefile.rules:1.320 --- llvm/Makefile.rules:1.319 Tue Aug 16 21:38:56 2005 +++ llvm/Makefile.rules Wed Aug 24 05:43:10 2005 @@ -28,6 +28,13 @@ UserTargets := $(RecursiveTargets) $(LocalTargets) $(TopLevelTargets) InternalTargets := preconditions distdir dist-hook +FilesToConfig := \ + include/llvm/Config/config.h \ + include/llvm/Support/DataTypes.h \ + include/llvm/ADT/hash_map \ + include/llvm/ADT/hash_set \ + include/llvm/ADT/iterator + ################################################################################ # INITIALIZATION: Basic things the makefile needs ################################################################################ @@ -77,6 +84,9 @@ PreConditions += $(MakefileConfig) endif +FilesToConfigPATH := $(addprefix $(PROJ_OBJ_ROOT)/,$(FilesToConfig)) +PreConditions += $(FilesToConfigPATH) + preconditions : $(PreConditions) #------------------------------------------------------------------------ @@ -134,6 +144,11 @@ $(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \ $(ConfigStatusScript) +.PRECIOUS: $(FilesToConfigPATH) +$(FilesToConfigPATH) : $(PROJ_OBJ_ROOT)/% : $(PROJ_SRC_ROOT)/%.in + $(Echo) Regenerating $* + $(Verb) cd $(PROJ_OBJ_ROOT) && $(ConfigStatusScript) $* + #------------------------------------------------------------------------ # Make sure the configuration makefile is up to date #------------------------------------------------------------------------ @@ -1576,3 +1591,4 @@ $(Echo) "YaccFiles : " '$(YaccFiles)' $(Echo) "LexFiles : " '$(LexFiles)' $(Echo) "Module : " '$(Module)' + $(Echo) "FilesToConfig: " '$(FilesToConfigPATH)' From reid at x10sys.com Wed Aug 24 05:43:22 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:43:22 -0500 Subject: [llvm-commits] CVS: llvm/autoconf/configure.ac Message-ID: <200508241043.FAA09579@zion.cs.uiuc.edu> Changes in directory llvm/autoconf: configure.ac updated: 1.194 -> 1.195 --- Log message: For PR619: http://llvm.cs.uiuc.edu/PR619 : Make any header files that are automatically generated be preconditions of the compilation. This ensures that if a *.h.in file is changed then its corresponding *.h file gets updated on the next rebuild. Note that this can lead to confusing (but correct) results if the *.h.in file changed unsubstantially so that autoheader doesn't update the *.h file. In that case, manually touch the *.h file in question to restore order. Moral of the story, if you're going to "touch" a *.in file then modify it substantially. --- Diffs of the changes: (+4 -0) configure.ac | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.194 llvm/autoconf/configure.ac:1.195 --- llvm/autoconf/configure.ac:1.194 Wed Aug 24 05:07:21 2005 +++ llvm/autoconf/configure.ac Wed Aug 24 05:43:10 2005 @@ -634,6 +634,10 @@ dnl===-----------------------------------------------------------------------=== dnl Configure header files +dnl WARNING: dnl If you add or remove any of the following config headers, then +dnl you MUST also update Makefile.rules so that the variable FilesToConfig +dnl contains the same list of files as AC_CONFIG_HEADERS below. This ensures the +dnl files can be updated automatically when their *.in sources change. AC_CONFIG_HEADERS([include/llvm/Config/config.h]) AC_CONFIG_HEADERS([include/llvm/Support/DataTypes.h]) AC_CONFIG_HEADERS([include/llvm/ADT/hash_map]) From reid at x10sys.com Wed Aug 24 05:55:19 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:55:19 -0500 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200508241055.FAA09627@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.320 -> 1.321 --- Log message: Whoops, don't use PROJ variables, these are all LLVM headers. This allows projects to compile properly. --- Diffs of the changes: (+3 -3) Makefile.rules | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.320 llvm/Makefile.rules:1.321 --- llvm/Makefile.rules:1.320 Wed Aug 24 05:43:10 2005 +++ llvm/Makefile.rules Wed Aug 24 05:55:07 2005 @@ -84,7 +84,7 @@ PreConditions += $(MakefileConfig) endif -FilesToConfigPATH := $(addprefix $(PROJ_OBJ_ROOT)/,$(FilesToConfig)) +FilesToConfigPATH := $(addprefix $(LLVM_OBJ_ROOT)/,$(FilesToConfig)) PreConditions += $(FilesToConfigPATH) preconditions : $(PreConditions) @@ -145,9 +145,9 @@ $(ConfigStatusScript) .PRECIOUS: $(FilesToConfigPATH) -$(FilesToConfigPATH) : $(PROJ_OBJ_ROOT)/% : $(PROJ_SRC_ROOT)/%.in +$(FilesToConfigPATH) : $(LLVM_OBJ_ROOT)/% : $(LLVM_SRC_ROOT)/%.in $(Echo) Regenerating $* - $(Verb) cd $(PROJ_OBJ_ROOT) && $(ConfigStatusScript) $* + $(Verb) cd $(LLVM_OBJ_ROOT) && $(ConfigStatusScript) $* #------------------------------------------------------------------------ # Make sure the configuration makefile is up to date From reid at x10sys.com Wed Aug 24 05:57:41 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 05:57:41 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/hash_set.in Message-ID: <200508241057.FAA09643@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: hash_set.in updated: 1.5 -> 1.6 --- Log message: Remove some tabs. Wrap a line. --- Diffs of the changes: (+5 -4) hash_set.in | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) Index: llvm/include/llvm/ADT/hash_set.in diff -u llvm/include/llvm/ADT/hash_set.in:1.5 llvm/include/llvm/ADT/hash_set.in:1.6 --- llvm/include/llvm/ADT/hash_set.in:1.5 Sat Jan 15 20:58:39 2005 +++ llvm/include/llvm/ADT/hash_set.in Wed Aug 24 05:57:30 2005 @@ -83,10 +83,11 @@ */ template , - class _EqualKey = equal_to, - class _A = allocator > -class hash_set : public rw_hashset { + class _HashFcn = hash, + class _EqualKey = equal_to, + class _A = allocator > +class hash_set : + public rw_hashset { }; } // end HASH_NAMESPACE; From brukman at cs.uiuc.edu Wed Aug 24 09:03:30 2005 From: brukman at cs.uiuc.edu (Misha Brukman) Date: Wed, 24 Aug 2005 09:03:30 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/hash_map.in Message-ID: <200508241403.JAA10717@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: hash_map.in updated: 1.8 -> 1.9 --- Log message: Wrap long lines --- Diffs of the changes: (+4 -2) hash_map.in | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/include/llvm/ADT/hash_map.in diff -u llvm/include/llvm/ADT/hash_map.in:1.8 llvm/include/llvm/ADT/hash_map.in:1.9 --- llvm/include/llvm/ADT/hash_map.in:1.8 Thu May 5 17:30:40 2005 +++ llvm/include/llvm/ADT/hash_map.in Wed Aug 24 09:03:07 2005 @@ -84,7 +84,8 @@ class _HashFcn = hash, class _EqualKey = equal_to, class _A = allocator > -class hash_map : public rw_hashmap { +class hash_map : public rw_hashmap { }; template , class _EqualKey = equal_to, class _A = allocator > -class hash_multimap : public rw_hashmultimap { +class hash_multimap : public rw_hashmultimap { }; } // end HASH_NAMESPACE; From lattner at cs.uiuc.edu Wed Aug 24 11:34:23 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 11:34:23 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200508241634.LAA22896@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.9 -> 1.10 --- Log message: Adjust to new interface --- Diffs of the changes: (+4 -4) TargetLowering.cpp | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.9 llvm/lib/Target/TargetLowering.cpp:1.10 --- llvm/lib/Target/TargetLowering.cpp:1.9 Mon Jul 18 23:52:44 2005 +++ llvm/lib/Target/TargetLowering.cpp Wed Aug 24 11:34:12 2005 @@ -47,7 +47,7 @@ PromoteTo = MVT::f64; else { unsigned LargerReg = VT+1; - while (!TLI.hasNativeSupportFor((MVT::ValueType)LargerReg)) { + while (!TLI.isTypeLegal((MVT::ValueType)LargerReg)) { ++LargerReg; assert(MVT::isInteger((MVT::ValueType)LargerReg) && "Nothing to promote to??"); @@ -96,7 +96,7 @@ if (getNumElements((MVT::ValueType)IntReg) != 1) SetValueTypeAction((MVT::ValueType)IntReg, Expand, *this, TransformToType, ValueTypeActions); - else if (!hasNativeSupportFor((MVT::ValueType)IntReg)) + else if (!isTypeLegal((MVT::ValueType)IntReg)) // Otherwise, if we don't have native support, we must promote to a // larger type. SetValueTypeAction((MVT::ValueType)IntReg, Promote, *this, @@ -105,13 +105,13 @@ TransformToType[(MVT::ValueType)IntReg] = (MVT::ValueType)IntReg; // If the target does not have native support for F32, promote it to F64. - if (!hasNativeSupportFor(MVT::f32)) + if (!isTypeLegal(MVT::f32)) SetValueTypeAction(MVT::f32, Promote, *this, TransformToType, ValueTypeActions); else TransformToType[MVT::f32] = MVT::f32; - assert(hasNativeSupportFor(MVT::f64) && "Target does not support FP?"); + assert(isTypeLegal(MVT::f64) && "Target does not support FP?"); TransformToType[MVT::f64] = MVT::f64; } From lattner at cs.uiuc.edu Wed Aug 24 11:35:10 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 11:35:10 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200508241635.LAA23014@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.18 -> 1.19 --- Log message: rename hasNativeSupportFor* -> is(Operation|Type)Legal. --- Diffs of the changes: (+12 -10) TargetLowering.h | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.18 llvm/include/llvm/Target/TargetLowering.h:1.19 --- llvm/include/llvm/Target/TargetLowering.h:1.18 Wed Jul 27 00:53:43 2005 +++ llvm/include/llvm/Target/TargetLowering.h Wed Aug 24 11:34:59 2005 @@ -99,10 +99,10 @@ return RC; } - /// hasNativeSupportFor - Return true if the target has native support for the + /// isTypeLegal - Return true if the target has native support for the /// specified value type. This means that it has a register that directly /// holds it without promotions or expansions. - bool hasNativeSupportFor(MVT::ValueType VT) const { + bool isTypeLegal(MVT::ValueType VT) const { return RegClassForVT[VT] != 0; } @@ -132,15 +132,17 @@ return LegalFPImmediates.end(); } - /// getOperationAction - Return how this operation should be + /// getOperationAction - Return how this operation should be treated: either + /// it is legal, needs to be promoted to a larger size, needs to be + /// expanded to some other code sequence, or the target has a custom expander + /// for it. LegalizeAction getOperationAction(unsigned Op, MVT::ValueType VT) const { return (LegalizeAction)((OpActions[Op] >> (2*VT)) & 3); } - - /// hasNativeSupportForOperation - Return true if this operation is legal for - /// this type. - /// - bool hasNativeSupportForOperation(unsigned Op, MVT::ValueType VT) const { + + /// isOperationLegal - Return true if the specified operation is legal on this + /// target. + bool isOperationLegal(unsigned Op, MVT::ValueType VT) const { return getOperationAction(Op, VT) == Legal; } @@ -154,8 +156,8 @@ NVT = (MVT::ValueType)(NVT+1); assert(MVT::isInteger(NVT) == MVT::isInteger(VT) && NVT != MVT::isVoid && "Didn't find type to promote to!"); - } while (!hasNativeSupportFor(NVT) || - getOperationAction(Op, NVT) == Promote); + } while (!isTypeLegal(NVT) || + getOperationAction(Op, NVT) == Promote); return NVT; } From lattner at cs.uiuc.edu Wed Aug 24 11:35:39 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 11:35:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200508241635.LAA23047@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.169 -> 1.170 --- Log message: Start using isOperationLegal and isTypeLegal to simplify the code --- Diffs of the changes: (+23 -28) LegalizeDAG.cpp | 51 +++++++++++++++++++++++---------------------------- 1 files changed, 23 insertions(+), 28 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.169 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.170 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.169 Mon Aug 22 23:29:48 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Aug 24 11:35:28 2005 @@ -289,7 +289,7 @@ switch (TLI.getOperationAction(ISD::SINT_TO_FP, NewInTy)) { default: break; case TargetLowering::Legal: - if (!TLI.hasNativeSupportFor(NewInTy)) + if (!TLI.isTypeLegal(NewInTy)) break; // Can't use this datatype. // FALL THROUGH. case TargetLowering::Custom: @@ -303,7 +303,7 @@ switch (TLI.getOperationAction(ISD::UINT_TO_FP, NewInTy)) { default: break; case TargetLowering::Legal: - if (!TLI.hasNativeSupportFor(NewInTy)) + if (!TLI.isTypeLegal(NewInTy)) break; // Can't use this datatype. // FALL THROUGH. case TargetLowering::Custom: @@ -347,7 +347,7 @@ switch (TLI.getOperationAction(ISD::FP_TO_SINT, NewOutTy)) { default: break; case TargetLowering::Legal: - if (!TLI.hasNativeSupportFor(NewOutTy)) + if (!TLI.isTypeLegal(NewOutTy)) break; // Can't use this datatype. // FALL THROUGH. case TargetLowering::Custom: @@ -360,7 +360,7 @@ switch (TLI.getOperationAction(ISD::FP_TO_UINT, NewOutTy)) { default: break; case TargetLowering::Legal: - if (!TLI.hasNativeSupportFor(NewOutTy)) + if (!TLI.isTypeLegal(NewOutTy)) break; // Can't use this datatype. // FALL THROUGH. case TargetLowering::Custom: @@ -396,7 +396,7 @@ } SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { - assert(getTypeAction(Op.getValueType()) == Legal && + assert(isTypeLegal(Op.getValueType()) && "Caller should expand or promote operands that are not legal!"); SDNode *Node = Op.Val; @@ -463,8 +463,7 @@ case ISD::GlobalAddress: case ISD::ExternalSymbol: case ISD::ConstantPool: // Nothing to do. - assert(getTypeAction(Node->getValueType(0)) == Legal && - "This must be legal!"); + assert(isTypeLegal(Node->getValueType(0)) && "This must be legal!"); break; case ISD::CopyFromReg: Tmp1 = LegalizeOp(Node->getOperand(0)); @@ -544,8 +543,7 @@ if (isDouble && CFP->isExactlyValue((float)CFP->getValue()) && // Only do this if the target has a native EXTLOAD instruction from // f32. - TLI.getOperationAction(ISD::EXTLOAD, - MVT::f32) == TargetLowering::Legal) { + TLI.isOperationLegal(ISD::EXTLOAD, MVT::f32)) { LLVMC = cast(ConstantExpr::getCast(LLVMC, Type::FloatTy)); VT = MVT::f32; Extend = true; @@ -702,7 +700,7 @@ case ISD::BR_CC: Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - if (getTypeAction(Node->getOperand(2).getValueType()) == Legal) { + if (isTypeLegal(Node->getOperand(2).getValueType())) { Tmp2 = LegalizeOp(Node->getOperand(2)); // LHS Tmp3 = LegalizeOp(Node->getOperand(3)); // RHS if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(2) || @@ -762,8 +760,7 @@ // If BRTWOWAY_CC is legal for this target, then simply expand this node // to that. Otherwise, skip BRTWOWAY_CC and expand directly to a // BRCOND/BR pair. - if (TLI.getOperationAction(ISD::BRTWOWAY_CC, MVT::Other) == - TargetLowering::Legal) { + if (TLI.isOperationLegal(ISD::BRTWOWAY_CC, MVT::Other)) { if (Tmp2.getOpcode() == ISD::SETCC) { Result = DAG.getBR2Way_CC(Tmp1, Tmp2.getOperand(2), Tmp2.getOperand(0), Tmp2.getOperand(1), @@ -783,7 +780,7 @@ break; case ISD::BRTWOWAY_CC: Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - if (getTypeAction(Node->getOperand(2).getValueType()) == Legal) { + if (isTypeLegal(Node->getOperand(2).getValueType())) { Tmp2 = LegalizeOp(Node->getOperand(2)); // LHS Tmp3 = LegalizeOp(Node->getOperand(3)); // RHS if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(2) || @@ -914,7 +911,7 @@ case ISD::CopyToReg: Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - assert(getTypeAction(Node->getOperand(2).getValueType()) == Legal && + assert(isTypeLegal(Node->getOperand(2).getValueType()) && "Register type must be legal!"); // Legalize the incoming value (must be legal). Tmp2 = LegalizeOp(Node->getOperand(2)); @@ -1115,7 +1112,7 @@ Tmp3 = LegalizeOp(Node->getOperand(2)); // True Tmp4 = LegalizeOp(Node->getOperand(3)); // False - if (getTypeAction(Node->getOperand(0).getValueType()) == Legal) { + if (isTypeLegal(Node->getOperand(0).getValueType())) { Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || @@ -1642,8 +1639,8 @@ DAG.getNode(ISD::SUB, VT, Tmp1, DAG.getConstant(1, VT))); // If ISD::CTLZ is legal and CTPOP isn't, then do that instead - if (TLI.getOperationAction(ISD::CTPOP, VT) != TargetLowering::Legal && - TLI.getOperationAction(ISD::CTLZ, VT) == TargetLowering::Legal) { + if (!TLI.isOperationLegal(ISD::CTPOP, VT) && + TLI.isOperationLegal(ISD::CTLZ, VT)) { Result = LegalizeOp(DAG.getNode(ISD::SUB, VT, DAG.getConstant(getSizeInBits(VT), VT), DAG.getNode(ISD::CTLZ, VT, Tmp3))); @@ -1996,8 +1993,7 @@ break; case ISD::SETCC: - assert(getTypeAction(TLI.getSetCCResultTy()) == Legal && - "SetCC type is not legal??"); + assert(isTypeLegal(TLI.getSetCCResultTy()) && "SetCC type is not legal??"); Result = DAG.getNode(ISD::SETCC, TLI.getSetCCResultTy(),Node->getOperand(0), Node->getOperand(1), Node->getOperand(2)); Result = LegalizeOp(Result); @@ -2113,8 +2109,8 @@ // FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not // legal, such as PowerPC. if (Node->getOpcode() == ISD::FP_TO_UINT && - TargetLowering::Legal != TLI.getOperationAction(ISD::FP_TO_UINT, NVT) && - TargetLowering::Legal == TLI.getOperationAction(ISD::FP_TO_SINT, NVT)) { + !TLI.isOperationLegal(ISD::FP_TO_UINT, NVT) && + TLI.isOperationLegal(ISD::FP_TO_SINT, NVT)) { Result = DAG.getNode(ISD::FP_TO_SINT, NVT, Tmp1); } else { Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1); @@ -2457,8 +2453,7 @@ // If we have an efficient select operation (or if the selects will all fold // away), lower to some complex code, otherwise just emit the libcall. - if (TLI.getOperationAction(ISD::SELECT, NVT) != TargetLowering::Legal && - !isa(Amt)) + if (!TLI.isOperationLegal(ISD::SELECT, NVT) && !isa(Amt)) return false; SDOperand InL, InH; @@ -2700,7 +2695,7 @@ /// destination type is legal. SDOperand SelectionDAGLegalize:: ExpandIntToFP(bool isSigned, MVT::ValueType DestTy, SDOperand Source) { - assert(getTypeAction(DestTy) == Legal && "Destination type is not legal!"); + assert(isTypeLegal(DestTy) && "Destination type is not legal!"); assert(getTypeAction(Source.getValueType()) == Expand && "This is not an expansion!"); assert(Source.getValueType() == MVT::i64 && "Only handle expand from i64!"); @@ -3077,7 +3072,7 @@ break; // If this target supports SHL_PARTS, use it. - if (TLI.getOperationAction(ISD::SHL_PARTS, NVT) == TargetLowering::Legal) { + if (TLI.isOperationLegal(ISD::SHL_PARTS, NVT)) { ExpandShiftParts(ISD::SHL_PARTS, Node->getOperand(0), Node->getOperand(1), Lo, Hi); break; @@ -3093,7 +3088,7 @@ break; // If this target supports SRA_PARTS, use it. - if (TLI.getOperationAction(ISD::SRA_PARTS, NVT) == TargetLowering::Legal) { + if (TLI.isOperationLegal(ISD::SRA_PARTS, NVT)) { ExpandShiftParts(ISD::SRA_PARTS, Node->getOperand(0), Node->getOperand(1), Lo, Hi); break; @@ -3108,7 +3103,7 @@ break; // If this target supports SRL_PARTS, use it. - if (TLI.getOperationAction(ISD::SRL_PARTS, NVT) == TargetLowering::Legal) { + if (TLI.isOperationLegal(ISD::SRL_PARTS, NVT)) { ExpandShiftParts(ISD::SRL_PARTS, Node->getOperand(0), Node->getOperand(1), Lo, Hi); break; @@ -3127,7 +3122,7 @@ Lo, Hi); break; case ISD::MUL: { - if (TLI.getOperationAction(ISD::MULHU, NVT) == TargetLowering::Legal) { + if (TLI.isOperationLegal(ISD::MULHU, NVT)) { SDOperand LL, LH, RL, RH; ExpandOp(Node->getOperand(0), LL, LH); ExpandOp(Node->getOperand(1), RL, RH); From lattner at cs.uiuc.edu Wed Aug 24 11:47:07 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 11:47:07 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508241647.LAA23237@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.159 -> 1.160 --- Log message: teach selection dag mask tracking about the fact that select_cc operates like select. Also teach it that the bit count instructions can only set the low bits of the result, depending on the size of the input. This allows us to compile this: int %eq0(int %a) { %tmp.1 = seteq int %a, 0 ; [#uses=1] %tmp.2 = cast bool %tmp.1 to int ; [#uses=1] ret int %tmp.2 } To this: _eq0: cntlzw r2, r3 srwi r3, r2, 5 blr instead of this: _eq0: cntlzw r2, r3 rlwinm r3, r2, 27, 31, 31 blr when setcc is marked illegal on ppc (which restores parity to non-illegal setcc). Thanks to Nate for pointing this out. --- Diffs of the changes: (+10 -1) SelectionDAG.cpp | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.159 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.160 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.159 Tue Aug 23 23:57:57 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Aug 24 11:46:55 2005 @@ -1026,7 +1026,9 @@ case ISD::SELECT: return MaskedValueIsZero(Op.getOperand(1), Mask, TLI) && MaskedValueIsZero(Op.getOperand(2), Mask, TLI); - + case ISD::SELECT_CC: + return MaskedValueIsZero(Op.getOperand(2), Mask, TLI) && + MaskedValueIsZero(Op.getOperand(3), Mask, TLI); case ISD::SRL: // (ushr X, C1) & C2 == 0 iff X & (C2 << C1) == 0 if (ConstantSDNode *ShAmt = dyn_cast(Op.getOperand(1))) { @@ -1043,6 +1045,13 @@ return MaskedValueIsZero(Op.getOperand(0), NewVal, TLI); } return false; + case ISD::CTTZ: + case ISD::CTLZ: + case ISD::CTPOP: + // Bit counting instructions can not set the high bits of the result + // register. The max number of bits sets depends on the input. + return (Mask & (MVT::getSizeInBits(Op.getValueType())*2-1)) == 0; + // TODO we could handle some SRA cases here. default: break; } From lattner at cs.uiuc.edu Wed Aug 24 11:49:01 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 11:49:01 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/seteq-0.ll Message-ID: <200508241649.LAA23329@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: seteq-0.ll added (r1.1) --- Log message: Make sure this doesn't break when we're improving the isels --- Diffs of the changes: (+7 -0) seteq-0.ll | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/test/Regression/CodeGen/PowerPC/seteq-0.ll diff -c /dev/null llvm/test/Regression/CodeGen/PowerPC/seteq-0.ll:1.1 *** /dev/null Wed Aug 24 11:48:59 2005 --- llvm/test/Regression/CodeGen/PowerPC/seteq-0.ll Wed Aug 24 11:48:49 2005 *************** *** 0 **** --- 1,7 ---- + ; RUN: llvm-as < %s | llc -march=ppc32 | grep 'srwi r., r., 5' + + int %eq0(int %a) { + %tmp.1 = seteq int %a, 0 ; [#uses=1] + %tmp.2 = cast bool %tmp.1 to int ; [#uses=1] + ret int %tmp.2 + } From lattner at cs.uiuc.edu Wed Aug 24 11:59:08 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 11:59:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/BasicAliasAnalysis.cpp Message-ID: <200508241659.LAA23500@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: BasicAliasAnalysis.cpp updated: 1.72 -> 1.73 --- Log message: floor/ceil don't read/write memory. This allows gcse to eliminate 6 calls in mesa. --- Diffs of the changes: (+2 -0) BasicAliasAnalysis.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp diff -u llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.72 llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.73 --- llvm/lib/Analysis/BasicAliasAnalysis.cpp:1.72 Mon Jul 11 15:35:20 2005 +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp Wed Aug 24 11:58:56 2005 @@ -720,6 +720,8 @@ "hypot", "sin", "sinf", "sinl", "tan", "tanf", "tanl", "tanh", "tanhf", "tanhl", + + "floor", "floorf", "floorl", "ceil", "ceilf", "ceill", // ctype.h "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint" From lattner at cs.uiuc.edu Wed Aug 24 12:20:41 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 12:20:41 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/SimplifyLibCalls/floor.ll Pow.ll Message-ID: <200508241720.MAA23897@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/SimplifyLibCalls: floor.ll added (r1.1) Pow.ll updated: 1.2 -> 1.3 --- Log message: new testcase --- Diffs of the changes: (+11 -1) Pow.ll | 1 - floor.ll | 11 +++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) Index: llvm/test/Regression/Transforms/SimplifyLibCalls/floor.ll diff -c /dev/null llvm/test/Regression/Transforms/SimplifyLibCalls/floor.ll:1.1 *** /dev/null Wed Aug 24 12:20:40 2005 --- llvm/test/Regression/Transforms/SimplifyLibCalls/floor.ll Wed Aug 24 12:20:30 2005 *************** *** 0 **** --- 1,11 ---- + ; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis | not grep 'call.*floor(' + + declare double %floor(double) + + float %test(float %C) { + %D = cast float %C to double + %E = call double %floor(double %D) ; --> floorf + %F = cast double %E to float + ret float %F + } + Index: llvm/test/Regression/Transforms/SimplifyLibCalls/Pow.ll diff -u llvm/test/Regression/Transforms/SimplifyLibCalls/Pow.ll:1.2 llvm/test/Regression/Transforms/SimplifyLibCalls/Pow.ll:1.3 --- llvm/test/Regression/Transforms/SimplifyLibCalls/Pow.ll:1.2 Fri Apr 29 05:11:23 2005 +++ llvm/test/Regression/Transforms/SimplifyLibCalls/Pow.ll Wed Aug 24 12:20:30 2005 @@ -1,4 +1,3 @@ -; Test that the StrCatOptimizer works correctly ; RUN: llvm-as < %s | opt -simplify-libcalls | llvm-dis | not grep 'call.*pow' declare double %pow(double,double) From lattner at cs.uiuc.edu Wed Aug 24 12:22:29 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 12:22:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Message-ID: <200508241722.MAA23986@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: SimplifyLibCalls.cpp updated: 1.48 -> 1.49 --- Log message: Transform floor((double)FLT) -> (double)floorf(FLT), implementing Regression/Transforms/SimplifyLibCalls/floor.ll. This triggers 19 times in 177.mesa. --- Diffs of the changes: (+55 -17) SimplifyLibCalls.cpp | 72 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 55 insertions(+), 17 deletions(-) Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.48 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.49 --- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.48 Sun Aug 7 15:02:04 2005 +++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Wed Aug 24 12:22:17 2005 @@ -129,7 +129,8 @@ /// instances to all the call sites in a module, relatively efficiently. The /// purpose of this pass is to provide optimizations for calls to well-known /// functions with well-known semantics, such as those in the c library. The -/// class provides the basic infrastructure for handling runOnModule. Whenever /// this pass finds a function call, it asks the appropriate optimizer to +/// class provides the basic infrastructure for handling runOnModule. Whenever +/// this pass finds a function call, it asks the appropriate optimizer to /// validate the call (ValidateLibraryCall). If it is validated, then /// the OptimizeCall method is also called. /// @brief A ModulePass for optimizing well-known function calls. @@ -306,22 +307,22 @@ } /// @brief Return a Function* for the memcpy libcall - Function* get_memcpy() - { - if (!memcpy_func) - { - // Note: this is for llvm.memcpy intrinsic - std::vector args; - args.push_back(PointerType::get(Type::SByteTy)); - args.push_back(PointerType::get(Type::SByteTy)); - args.push_back(Type::UIntTy); - args.push_back(Type::UIntTy); - FunctionType* memcpy_type = FunctionType::get(Type::VoidTy, args, false); - memcpy_func = M->getOrInsertFunction("llvm.memcpy",memcpy_type); + Function* get_memcpy() { + if (!memcpy_func) { + const Type *SBP = PointerType::get(Type::SByteTy); + memcpy_func = M->getOrInsertFunction("llvm.memcpy", Type::VoidTy,SBP, SBP, + Type::UIntTy, Type::UIntTy, 0); } return memcpy_func; } + Function* get_floorf() { + if (!floorf_func) + floorf_func = M->getOrInsertFunction("floorf", Type::FloatTy, + Type::FloatTy, 0); + return floorf_func; + } + private: /// @brief Reset our cached data for a new Module void reset(Module& mod) @@ -335,6 +336,7 @@ sqrt_func = 0; strcpy_func = 0; strlen_func = 0; + floorf_func = 0; } private: @@ -345,6 +347,7 @@ Function* sqrt_func; ///< Cached sqrt function Function* strcpy_func; ///< Cached strcpy function Function* strlen_func; ///< Cached strlen function + Function* floorf_func; ///< Cached floorf function Module* M; ///< Cached Module TargetData* TD; ///< Cached TargetData }; @@ -1238,7 +1241,7 @@ else if (Op2V == -1.0) { // pow(x,-1.0) -> 1.0/x - BinaryOperator* div_inst= BinaryOperator::create(Instruction::Div, + BinaryOperator* div_inst= BinaryOperator::createDiv( ConstantFP::get(Ty,1.0), base, ci->getName()+".pow", ci); ci->replaceAllUsesWith(div_inst); ci->eraseFromParent(); @@ -1641,7 +1644,7 @@ CastInst* cast = new CastInst(ci->getOperand(1),Type::UIntTy, ci->getOperand(1)->getName()+".uint",ci); - BinaryOperator* sub_inst = BinaryOperator::create(Instruction::Sub,cast, + BinaryOperator* sub_inst = BinaryOperator::createSub(cast, ConstantUInt::get(Type::UIntTy,0x30), ci->getOperand(1)->getName()+".sub",ci); SetCondInst* setcond_inst = new SetCondInst(Instruction::SetLE,sub_inst, @@ -1682,7 +1685,7 @@ { // toascii(c) -> (c & 0x7f) Value* chr = ci->getOperand(1); - BinaryOperator* and_inst = BinaryOperator::create(Instruction::And,chr, + BinaryOperator* and_inst = BinaryOperator::createAnd(chr, ConstantInt::get(chr->getType(),0x7F),ci->getName()+".toascii",ci); ci->replaceAllUsesWith(and_inst); ci->eraseFromParent(); @@ -1753,7 +1756,7 @@ new CallInst(F, ci->getOperand(1), inst_name, ci); if (arg_type != Type::IntTy) call = new CastInst(call, Type::IntTy, inst_name, ci); - BinaryOperator* add = BinaryOperator::create(Instruction::Add, call, + BinaryOperator* add = BinaryOperator::createAdd(call, ConstantSInt::get(Type::IntTy,1), inst_name, ci); SetCondInst* eq = new SetCondInst(Instruction::SetEQ,ci->getOperand(1), ConstantSInt::get(ci->getOperand(1)->getType(),0),inst_name,ci); @@ -1791,6 +1794,41 @@ } FFSLLOptimizer; + +/// This LibCallOptimization will simplify calls to the "floor" library +/// function. +/// @brief Simplify the floor library function. +struct FloorOptimization : public LibCallOptimization { + FloorOptimization() + : LibCallOptimization("floor", "Number of 'floor' calls simplified") {} + + /// @brief Make sure that the "floor" function has the right prototype + virtual bool ValidateCalledFunction(const Function *F, SimplifyLibCalls &SLC){ + return F->arg_size() == 1 && F->arg_begin()->getType() == Type::DoubleTy && + F->getReturnType() == Type::DoubleTy; + } + + virtual bool OptimizeCall(CallInst *CI, SimplifyLibCalls &SLC) { + // If this is a float argument passed in, convert to floorf. + // e.g. floor((double)FLT) -> (double)floorf(FLT). There can be no loss of + // precision due to this. + if (CastInst *Cast = dyn_cast(CI->getOperand(1))) + if (Cast->getOperand(0)->getType() == Type::FloatTy) { + Value *New = new CallInst(SLC.get_floorf(), Cast->getOperand(0), + CI->getName(), CI); + New = new CastInst(New, Type::DoubleTy, CI->getName(), CI); + CI->replaceAllUsesWith(New); + CI->eraseFromParent(); + if (Cast->use_empty()) + Cast->eraseFromParent(); + return true; + } + return false; // opt failed + } +} FloorOptimizer; + + + /// A function to compute the length of a null-terminated constant array of /// integers. This function can't rely on the size of the constant array /// because there could be a null terminator in the middle of the array. From lattner at cs.uiuc.edu Wed Aug 24 12:55:07 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 12:55:07 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/Reassociate/2005-08-24-Crash.ll Message-ID: <200508241755.MAA24549@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/Reassociate: 2005-08-24-Crash.ll added (r1.1) --- Log message: new testcase that crashes -reassociate --- Diffs of the changes: (+12 -0) 2005-08-24-Crash.ll | 12 ++++++++++++ 1 files changed, 12 insertions(+) Index: llvm/test/Regression/Transforms/Reassociate/2005-08-24-Crash.ll diff -c /dev/null llvm/test/Regression/Transforms/Reassociate/2005-08-24-Crash.ll:1.1 *** /dev/null Wed Aug 24 12:55:06 2005 --- llvm/test/Regression/Transforms/Reassociate/2005-08-24-Crash.ll Wed Aug 24 12:54:56 2005 *************** *** 0 **** --- 1,12 ---- + ; RUN: llvm-as < %s | opt -reassociate -disable-output + + void %test(int %a, int %b, int %c, int %d) { + %tmp.2 = xor int %a, %b ; [#uses=1] + %tmp.5 = xor int %c, %d ; [#uses=1] + %tmp.6 = xor int %tmp.2, %tmp.5 ; [#uses=1] + %tmp.9 = xor int %c, %a ; [#uses=1] + %tmp.12 = xor int %b, %d ; [#uses=1] + %tmp.13 = xor int %tmp.9, %tmp.12 ; [#uses=1] + %tmp.16 = xor int %tmp.6, %tmp.13 ; [#uses=0] + ret void + } From lattner at cs.uiuc.edu Wed Aug 24 12:55:43 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 12:55:43 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/Reassociate.cpp Message-ID: <200508241755.MAA24606@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: Reassociate.cpp updated: 1.51 -> 1.52 --- Log message: Fix Regression/Transforms/Reassociate/2005-08-24-Crash.ll --- Diffs of the changes: (+7 -1) Reassociate.cpp | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/lib/Transforms/Scalar/Reassociate.cpp diff -u llvm/lib/Transforms/Scalar/Reassociate.cpp:1.51 llvm/lib/Transforms/Scalar/Reassociate.cpp:1.52 --- llvm/lib/Transforms/Scalar/Reassociate.cpp:1.51 Mon Aug 8 14:11:57 2005 +++ llvm/lib/Transforms/Scalar/Reassociate.cpp Wed Aug 24 12:55:32 2005 @@ -496,9 +496,15 @@ ++NumAnnihil; } else { assert(Opcode == Instruction::Xor); + if (e == 2) { + Ops[0].Op = Constant::getNullValue(Ops[0].Op->getType()); + Ops.erase(Ops.begin()+1, Ops.end()); + ++NumAnnihil; + return; + } // ... X^X -> ... Ops.erase(Ops.begin()+i, Ops.begin()+i+2); - i -= 2; e -= 2; + i -= 1; e -= 2; IterateOptimization = true; ++NumAnnihil; } From lattner at cs.uiuc.edu Wed Aug 24 13:15:35 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 13:15:35 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/README.txt Message-ID: <200508241815.NAA24939@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: README.txt updated: 1.29 -> 1.30 --- Log message: add an idea --- Diffs of the changes: (+30 -0) README.txt | 30 ++++++++++++++++++++++++++++++ 1 files changed, 30 insertions(+) Index: llvm/lib/Target/PowerPC/README.txt diff -u llvm/lib/Target/PowerPC/README.txt:1.29 llvm/lib/Target/PowerPC/README.txt:1.30 --- llvm/lib/Target/PowerPC/README.txt:1.29 Tue Aug 23 01:27:59 2005 +++ llvm/lib/Target/PowerPC/README.txt Wed Aug 24 13:15:24 2005 @@ -52,6 +52,8 @@ b .LBBl42__2E_expand_function_8_42 ; NewDefault b .LBBl42__2E_expand_function_8_42 ; NewDefault +===-------------------------------------------------------------------------=== + * Codegen this: void test2(int X) { @@ -71,3 +73,31 @@ cmpw cr0, r3, r2 bne .LBB_test2_2 +===-------------------------------------------------------------------------=== + +Lump the constant pool for each function into ONE pic object, and reference +pieces of it as offsets from the start. For functions like this (contrived +to have lots of constants obviously): + +double X(double Y) { return (Y*1.23 + 4.512)*2.34 + 14.38; } + +We generate: + +_X: + lis r2, ha16(.CPI_X_0) + lfd f0, lo16(.CPI_X_0)(r2) + lis r2, ha16(.CPI_X_1) + lfd f2, lo16(.CPI_X_1)(r2) + fmadd f0, f1, f0, f2 + lis r2, ha16(.CPI_X_2) + lfd f1, lo16(.CPI_X_2)(r2) + lis r2, ha16(.CPI_X_3) + lfd f2, lo16(.CPI_X_3)(r2) + fmadd f1, f0, f1, f2 + blr + +It would be better to materialize .CPI_X into a register, then use immediates +off of the register to avoid the lis's. This is even more important in PIC +mode. + +===-------------------------------------------------------------------------=== From lattner at cs.uiuc.edu Wed Aug 24 13:30:12 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 13:30:12 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp Message-ID: <200508241830.NAA25308@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGPrinter.cpp updated: 1.22 -> 1.23 --- Log message: Fix pasto that prevented VT ndoes from showing up in -view-isel-dags correctly --- Diffs of the changes: (+1 -1) SelectionDAGPrinter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.22 llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.23 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.22 Fri Aug 19 16:21:16 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp Wed Aug 24 13:30:00 2005 @@ -89,7 +89,7 @@ else Op += "getOffset()) + ">"; } else if (const VTSDNode *N = dyn_cast(Node)) { - std::cerr << ":" << getValueTypeString(N->getVT()); + Op = Op + " VT=" + getValueTypeString(N->getVT()); } return Op; } From lattner at cs.uiuc.edu Wed Aug 24 17:02:53 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 17:02:53 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Message-ID: <200508242202.RAA03682@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.12 -> 1.13 --- Log message: Add support for external symbols, and support for variable arity instructions --- Diffs of the changes: (+12 -5) ScheduleDAG.cpp | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.12 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.13 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.12 Sun Aug 21 20:04:32 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Wed Aug 24 17:02:41 2005 @@ -82,16 +82,20 @@ unsigned NumResults = Op.Val->getNumValues(); if (NumResults && Op.Val->getValueType(NumResults-1) == MVT::Other) --NumResults; + + unsigned NodeOperands = Op.getNumOperands(); + if (NodeOperands && // Ignore chain if it exists. + Op.getOperand(NodeOperands-1).getValueType() == MVT::Other) + --NodeOperands; + + unsigned NumMIOperands = NodeOperands+NumResults; #ifndef _NDEBUG - unsigned Operands = Op.getNumOperands(); - if (Operands && Op.getOperand(Operands-1).getValueType() == MVT::Other) - --Operands; - assert(unsigned(II.numOperands) == Operands+NumResults && + assert((unsigned(II.numOperands) == NumMIOperands || II.numOperands == -1)&& "#operands for dag node doesn't match .td file!"); #endif // Create the new machine instruction. - MachineInstr *MI = new MachineInstr(Opc, II.numOperands, true, true); + MachineInstr *MI = new MachineInstr(Opc, NumMIOperands, true, true); // Add result register values for things that are defined by this // instruction. @@ -136,6 +140,9 @@ } else if (ConstantPoolSDNode *CP = dyn_cast(Op.getOperand(i))) { MI->addConstantPoolIndexOperand(CP->getIndex()); + } else if (ExternalSymbolSDNode *ES = + dyn_cast(Op.getOperand(i))) { + MI->addExternalSymbolOperand(ES->getSymbol(), false); } else { unsigned R = Emit(Op.getOperand(i)); // Add an operand, unless this corresponds to a chain node. From lattner at cs.uiuc.edu Wed Aug 24 17:21:58 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 17:21:58 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200508242221.RAA13262@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.161 -> 1.162 --- Log message: Remove some dead cases. Emit the indcall sequence as: mtctr inreg mr R12, inreg btctr If inreg and R12 aren't coallesced, this reduces the odds of having the mtctr and btctr in the same dispatch group. :) --- Diffs of the changes: (+1 -7) PPC32ISelPattern.cpp | 8 +------- 1 files changed, 1 insertion(+), 7 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.161 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.162 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.161 Wed Aug 24 00:06:48 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Wed Aug 24 17:21:47 2005 @@ -980,8 +980,8 @@ true); } else { Tmp1 = SelectExpr(N.getOperand(1)); + BuildMI(BB, PPC::MTCTR, 1).addReg(Tmp1); BuildMI(BB, PPC::OR, 2, PPC::R12).addReg(Tmp1).addReg(Tmp1); - BuildMI(BB, PPC::MTCTR, 1).addReg(PPC::R12); CallMI = BuildMI(PPC::CALLindirect, 3).addImm(20).addImm(0) .addReg(PPC::R12); } @@ -995,9 +995,6 @@ for(int i = 0, e = ArgVR.size(); i < e; ++i) { switch(N.getOperand(i+2).getValueType()) { default: Node->dump(); assert(0 && "Unknown value type for call"); - case MVT::i1: - case MVT::i8: - case MVT::i16: case MVT::i32: assert(GPR_idx < 8 && "Too many int args"); if (N.getOperand(i+2).getOpcode() != ISD::UNDEF) { @@ -1022,9 +1019,6 @@ switch (Node->getValueType(0)) { default: assert(0 && "Unknown value type for call result!"); case MVT::Other: return 1; - case MVT::i1: - case MVT::i8: - case MVT::i16: case MVT::i32: if (Node->getValueType(1) == MVT::i32) { BuildMI(BB, PPC::OR, 2, Result+1).addReg(PPC::R3).addReg(PPC::R3); From lattner at cs.uiuc.edu Wed Aug 24 17:44:04 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 17:44:04 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200508242244.RAA20596@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.47 -> 1.48 --- Log message: add two new methods --- Diffs of the changes: (+5 -0) SelectionDAG.h | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.47 llvm/include/llvm/CodeGen/SelectionDAG.h:1.48 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.47 Sun Aug 21 17:30:42 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Wed Aug 24 17:43:53 2005 @@ -260,11 +260,16 @@ SDOperand Op4, SDOperand Op5) { return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3, Op4, Op5); } + SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT, + std::vector &Ops) { + return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Ops); + } /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. /// This can cause recursive merging of nodes in the DAG. /// void ReplaceAllUsesWith(SDNode *From, SDNode *To); + void ReplaceAllUsesWith(SDNode *From, const std::vector &To); void dump() const; From lattner at cs.uiuc.edu Wed Aug 24 17:44:50 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 17:44:50 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508242244.RAA20834@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.160 -> 1.161 --- Log message: Add ReplaceAllUsesWith that can take a vector of replacement values. Add some foldings to hopefully help the illegal setcc issue, and move some code around. --- Diffs of the changes: (+90 -15) SelectionDAG.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 90 insertions(+), 15 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.160 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.161 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.160 Wed Aug 24 11:46:55 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Aug 24 17:44:39 2005 @@ -534,8 +534,7 @@ case ISD::SETGE: return getConstant((int64_t)C1 >= (int64_t)C2, VT); } } else { - // If the LHS is a ZERO_EXTEND and if this is an ==/!= comparison, perform - // the comparison on the input. + // If the LHS is a ZERO_EXTEND, perform the comparison on the input. if (N1.getOpcode() == ISD::ZERO_EXTEND) { unsigned InSize = MVT::getSizeInBits(N1.getOperand(0).getValueType()); @@ -577,6 +576,25 @@ default: break; // todo, be more careful with signed comparisons } + } else if (N1.getOpcode() == ISD::SIGN_EXTEND_INREG && + (Cond == ISD::SETEQ || Cond == ISD::SETNE)) { + MVT::ValueType ExtSrcTy = cast(N1.getOperand(1))->getVT(); + unsigned ExtSrcTyBits = MVT::getSizeInBits(ExtSrcTy); + MVT::ValueType ExtDstTy = N1.getValueType(); + unsigned ExtDstTyBits = MVT::getSizeInBits(ExtDstTy); + + // If the extended part has any inconsistent bits, it cannot ever + // compare equal. In other words, they have to be all ones or all + // zeros. + uint64_t ExtBits = + (~0ULL >> 64-ExtSrcTyBits) & (~0ULL << (ExtDstTyBits-1)); + if ((C2 & ExtBits) != 0 && (C2 & ExtBits) != ExtBits) + return getConstant(Cond == ISD::SETNE, VT); + + // Otherwise, make this a use of a zext. + return getSetCC(VT, getZeroExtendInReg(N1.getOperand(0), ExtSrcTy), + getConstant(C2 & (~0ULL >> 64-ExtSrcTyBits), ExtDstTy), + Cond); } uint64_t MinVal, MaxVal; @@ -1689,18 +1707,6 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4, SDOperand N5) { - if (ISD::SELECT_CC == Opcode) { - assert(N1.getValueType() == N2.getValueType() && - "LHS and RHS of condition must have same type!"); - assert(N3.getValueType() == N4.getValueType() && - "True and False arms of SelectCC must have same type!"); - assert(N3.getValueType() == VT && - "select_cc node must be of same type as true and false value!"); - SDOperand Simp = SimplifySelectCC(N1, N2, N3, N4, - cast(N5)->get()); - if (Simp.Val) return Simp; - } - std::vector Ops; Ops.reserve(5); Ops.push_back(N1); @@ -1768,6 +1774,40 @@ "Can't do FP-INT conversion!"); break; } + case ISD::SELECT_CC: { + assert(Ops.size() == 5 && "TRUNCSTORE takes 5 operands!"); + assert(Ops[0].getValueType() == Ops[1].getValueType() && + "LHS and RHS of condition must have same type!"); + assert(Ops[2].getValueType() == Ops[3].getValueType() && + "True and False arms of SelectCC must have same type!"); + assert(Ops[2].getValueType() == VT && + "select_cc node must be of same type as true and false value!"); + SDOperand Simp = SimplifySelectCC(Ops[0], Ops[1], Ops[2], Ops[3], + cast(Ops[4])->get()); + if (Simp.Val) return Simp; + break; + } + case ISD::BR_CC: { + assert(Ops.size() == 5 && "TRUNCSTORE takes 5 operands!"); + assert(Ops[2].getValueType() == Ops[3].getValueType() && + "LHS/RHS of comparison should match types!"); + // Use SimplifySetCC to simplify SETCC's. + SDOperand Simp = SimplifySetCC(MVT::i1, Ops[2], Ops[3], + cast(Ops[1])->get()); + if (Simp.Val) { + if (ConstantSDNode *C = dyn_cast(Simp)) { + if (C->getValue() & 1) // Unconditional branch + return getNode(ISD::BR, MVT::Other, Ops[0], Ops[4]); + else + return Ops[0]; // Unconditional Fall through + } else if (Simp.Val->getOpcode() == ISD::SETCC) { + Ops[2] = Simp.getOperand(0); + Ops[3] = Simp.getOperand(1); + Ops[1] = Simp.getOperand(2); + } + } + break; + } } // Memoize nodes. @@ -1915,7 +1955,7 @@ for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) if (U->getOperand(i).Val == From) { - assert(From->getValueType(U->getOperand(i).ResNo) == + assert(U->getOperand(i).getValueType() == To->getValueType(U->getOperand(i).ResNo)); From->removeUser(U); U->Operands[i].Val = To; @@ -1930,6 +1970,41 @@ } } +void SelectionDAG::ReplaceAllUsesWith(SDNode *From, + const std::vector &To) { + assert(From->getNumValues() == To.size() && + "Incorrect number of values to replace with!"); + if (To.size() == 1 && To[0].ResNo == 0) { + // Degenerate case handled above. + ReplaceAllUsesWith(From, To[0].Val); + return; + } + + while (!From->use_empty()) { + // Process users until they are all gone. + SDNode *U = *From->use_begin(); + + // This node is about to morph, remove its old self from the CSE maps. + RemoveNodeFromCSEMaps(U); + + for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) + if (U->getOperand(i).Val == From) { + const SDOperand &ToOp = To[U->getOperand(i).ResNo]; + assert(U->getOperand(i).getValueType() == ToOp.getValueType()); + From->removeUser(U); + U->Operands[i] = ToOp; + ToOp.Val->addUser(U); + } + + // Now that we have modified U, add it back to the CSE maps. If it already + // exists there, recursively merge the results together. + if (SDNode *Existing = AddNonLeafNodeToCSEMaps(U)) + ReplaceAllUsesWith(U, Existing); + // U is now dead. + } +} + + //===----------------------------------------------------------------------===// // SDNode Class //===----------------------------------------------------------------------===// From lattner at cs.uiuc.edu Wed Aug 24 17:45:29 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 17:45:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508242245.RAA20922@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.22 -> 1.23 --- Log message: implement support for calls --- Diffs of the changes: (+99 -3) PPC32ISelDAGToDAG.cpp | 102 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 99 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.22 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.23 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.22 Wed Aug 24 00:03:20 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Wed Aug 24 17:45:17 2005 @@ -917,7 +917,7 @@ case MVT::i16: Opc = isIdx ? PPC::STHX : PPC::STH; break; } } - + CurDAG->SelectNodeTo(N, MVT::Other, Opc, Select(N->getOperand(1)), AddrOp1, AddrOp2, Select(N->getOperand(0))); break; @@ -928,10 +928,106 @@ unsigned Amt = cast(N->getOperand(1))->getValue(); unsigned Opc = N->getOpcode() == ISD::CALLSEQ_START ? PPC::ADJCALLSTACKDOWN : PPC::ADJCALLSTACKUP; - CurDAG->SelectNodeTo(N, MVT::Other, Opc, Select(N->getOperand(0)), - getI32Imm(Amt)); + CurDAG->SelectNodeTo(N, MVT::Other, Opc, + getI32Imm(Amt), Select(N->getOperand(0))); break; } + case ISD::CALL: + case ISD::TAILCALL: { + SDOperand Chain = Select(N->getOperand(0)); + + unsigned CallOpcode; + std::vector CallOperands; + + if (GlobalAddressSDNode *GASD = + dyn_cast(N->getOperand(1))) { + CallOpcode = PPC::CALLpcrel; + CallOperands.push_back(CurDAG->getTargetGlobalAddress(GASD->getGlobal(), + MVT::i32)); + } else if (ExternalSymbolSDNode *ESSDN = + dyn_cast(N->getOperand(1))) { + CallOpcode = PPC::CALLpcrel; + CallOperands.push_back(N->getOperand(1)); + } else { + // Copy the callee address into the CTR register. + SDOperand Callee = Select(N->getOperand(1)); + Chain = CurDAG->getTargetNode(PPC::MTCTR, MVT::Other, Callee, Chain); + + // Copy the callee address into R12 on darwin. + SDOperand R12 = CurDAG->getRegister(PPC::R12, MVT::i32); + Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, R12, Callee, Chain); + + CallOperands.push_back(getI32Imm(20)); // Information to encode indcall + CallOperands.push_back(getI32Imm(0)); // Information to encode indcall + CallOperands.push_back(R12); + CallOpcode = PPC::CALLindirect; + } + + unsigned GPR_idx = 0, FPR_idx = 0; + static const unsigned GPR[] = { + PPC::R3, PPC::R4, PPC::R5, PPC::R6, + PPC::R7, PPC::R8, PPC::R9, PPC::R10, + }; + static const unsigned FPR[] = { + PPC::F1, PPC::F2, PPC::F3, PPC::F4, PPC::F5, PPC::F6, PPC::F7, + PPC::F8, PPC::F9, PPC::F10, PPC::F11, PPC::F12, PPC::F13 + }; + + for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) + if (N->getOperand(i).getOpcode() != ISD::UNDEF) { + unsigned DestReg = 0; + MVT::ValueType RegTy; + if (N->getOperand(i).getValueType() == MVT::i32) { + assert(GPR_idx < 8 && "Too many int args"); + DestReg = GPR[GPR_idx++]; + RegTy = MVT::i32; + } else { + assert(MVT::isFloatingPoint(Op.getValueType()) && + "Unpromoted integer arg?"); + assert(FPR_idx < 13 && "Too many fp args"); + DestReg = FPR[FPR_idx++]; + RegTy = MVT::f64; // Even if this is really f32! + } + + SDOperand Reg = CurDAG->getRegister(DestReg, RegTy); + Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, Reg, + Select(N->getOperand(i))); + CallOperands.push_back(Reg); + } + + // Finally, once everything is in registers to pass to the call, emit the + // call itself. + CallOperands.push_back(Chain); + Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, CallOperands); + + std::vector CallResults; + + // If the call has results, copy the values out of the ret val registers. + switch (N->getValueType(0)) { + default: assert(0 && "Unexpected ret value!"); + case MVT::Other: break; + case MVT::i32: + if (N->getValueType(1) == MVT::i32) { + Chain = CurDAG->getCopyFromReg(Chain, PPC::R4, MVT::i32).getValue(1); + CallResults.push_back(Chain.getValue(0)); + Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32).getValue(1); + CallResults.push_back(Chain.getValue(0)); + } else { + Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32).getValue(1); + CallResults.push_back(Chain.getValue(0)); + } + break; + case MVT::f32: + case MVT::f64: + Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, MVT::f64).getValue(1); + CallResults.push_back(Chain.getValue(0)); + break; + } + + CallResults.push_back(Chain); + CurDAG->ReplaceAllUsesWith(N, CallResults); + return CallResults[Op.ResNo]; + } case ISD::RET: { SDOperand Chain = Select(N->getOperand(0)); // Token chain. From lattner at cs.uiuc.edu Wed Aug 24 18:00:16 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 18:00:16 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508242300.SAA25287@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.161 -> 1.162 --- Log message: add a method --- Diffs of the changes: (+6 -0) SelectionDAG.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.161 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.162 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.161 Wed Aug 24 17:44:39 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Aug 24 18:00:05 2005 @@ -1882,6 +1882,12 @@ /// operands. Note that target opcodes are stored as /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field. void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, + unsigned TargetOpc) { + RemoveNodeFromCSEMaps(N); + N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); + N->setValueTypes(VT); +} +void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, SDOperand Op1) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); From lattner at cs.uiuc.edu Wed Aug 24 18:00:41 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 18:00:41 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200508242300.SAA25693@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.48 -> 1.49 --- Log message: add a method --- Diffs of the changes: (+1 -0) SelectionDAG.h | 1 + 1 files changed, 1 insertion(+) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.48 llvm/include/llvm/CodeGen/SelectionDAG.h:1.49 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.48 Wed Aug 24 17:43:53 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Wed Aug 24 18:00:29 2005 @@ -221,6 +221,7 @@ /// specified node to have the specified return type, Target opcode, and /// operands. Note that target opcodes are stored as /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field. + void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc); void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, SDOperand Op1); void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, From lattner at cs.uiuc.edu Wed Aug 24 18:08:27 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 18:08:27 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp PPC32ISelDAGToDAG.cpp PPC32ISelPattern.cpp PowerPCBranchSelector.cpp PowerPCInstrInfo.td Message-ID: <200508242308.SAA28810@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32CodeEmitter.cpp updated: 1.33 -> 1.34 PPC32ISelDAGToDAG.cpp updated: 1.23 -> 1.24 PPC32ISelPattern.cpp updated: 1.162 -> 1.163 PowerPCBranchSelector.cpp updated: 1.12 -> 1.13 PowerPCInstrInfo.td updated: 1.79 -> 1.80 --- Log message: Split IMPLICIT_DEF into IMPLICIT_DEF_GPR and IMPLICIT_DEF_FP, so that the instructions take a consistent reg class. Implement ISD::UNDEF in the dag->dag selector to generate this, fixing UnitTests/2003-07-06-IntOverflow. --- Diffs of the changes: (+21 -7) PPC32CodeEmitter.cpp | 3 ++- PPC32ISelDAGToDAG.cpp | 7 ++++++- PPC32ISelPattern.cpp | 12 +++++++++--- PowerPCBranchSelector.cpp | 3 ++- PowerPCInstrInfo.td | 3 ++- 5 files changed, 21 insertions(+), 7 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp diff -u llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.33 llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.34 --- llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp:1.33 Wed Jul 27 01:12:33 2005 +++ llvm/lib/Target/PowerPC/PPC32CodeEmitter.cpp Wed Aug 24 18:08:16 2005 @@ -124,7 +124,8 @@ default: emitWord(getBinaryCodeForInstr(*I)); break; - case PPC::IMPLICIT_DEF: + case PPC::IMPLICIT_DEF_GPR: + case PPC::IMPLICIT_DEF_FP: break; // pseudo opcode, no side effects case PPC::MovePCtoLR: assert(0 && "CodeEmitter does not support MovePCtoLR instruction"); Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.23 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.24 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.23 Wed Aug 24 17:45:17 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Wed Aug 24 18:08:16 2005 @@ -469,7 +469,6 @@ std::cerr << "\n"; abort(); case ISD::EntryToken: // These leaves remain the same. - case ISD::UNDEF: return Op; case ISD::TokenFactor: { SDOperand New; @@ -525,6 +524,12 @@ } break; } + case ISD::UNDEF: + if (N->getValueType(0) == MVT::i32) + CurDAG->SelectNodeTo(N, MVT::i32, PPC::IMPLICIT_DEF_GPR); + else + CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::IMPLICIT_DEF_FP); + break; case ISD::GlobalAddress: { GlobalValue *GV = cast(N)->getGlobal(); SDOperand Tmp; Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.162 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.163 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.162 Wed Aug 24 17:21:47 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Wed Aug 24 18:08:16 2005 @@ -830,7 +830,10 @@ Node->dump(); std::cerr << '\n'; assert(0 && "Node not handled!\n"); case ISD::UNDEF: - BuildMI(BB, PPC::IMPLICIT_DEF, 0, Result); + if (Node->getValueType(0) == MVT::i32) + BuildMI(BB, PPC::IMPLICIT_DEF_GPR, 0, Result); + else + BuildMI(BB, PPC::IMPLICIT_DEF_FP, 0, Result); return Result; case ISD::DYNAMIC_STACKALLOC: // Generate both result values. FIXME: Need a better commment here? @@ -1872,8 +1875,11 @@ return; case ISD::ImplicitDef: Select(N.getOperand(0)); - BuildMI(BB, PPC::IMPLICIT_DEF, 0, - cast(N.getOperand(1))->getReg()); + Tmp1 = cast(N.getOperand(1))->getReg(); + if (N.getOperand(1).getValueType() == MVT::i32) + BuildMI(BB, PPC::IMPLICIT_DEF_GPR, 0, Tmp1); + else + BuildMI(BB, PPC::IMPLICIT_DEF_FP, 0, Tmp1); return; case ISD::RET: switch (N.getNumOperands()) { Index: llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp diff -u llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp:1.12 llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp:1.13 --- llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp:1.12 Wed Jul 27 01:12:33 2005 +++ llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp Wed Aug 24 18:08:16 2005 @@ -40,7 +40,8 @@ // minor pessimization that saves us from having to worry about // keeping the offsets up to date later when we emit long branch glue. return 12; - case PPC::IMPLICIT_DEF: // no asm emitted + case PPC::IMPLICIT_DEF_GPR: // no asm emitted + case PPC::IMPLICIT_DEF_FP: // no asm emitted return 0; default: break; Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.79 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.80 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.79 Mon Aug 22 20:16:46 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Wed Aug 24 18:08:16 2005 @@ -64,7 +64,8 @@ def ADJCALLSTACKDOWN : Pseudo<(ops u16imm), "; ADJCALLSTACKDOWN">; def ADJCALLSTACKUP : Pseudo<(ops u16imm), "; ADJCALLSTACKUP">; } -def IMPLICIT_DEF : Pseudo<(ops variable_ops), "; IMPLICIT_DEF">; +def IMPLICIT_DEF_GPR : Pseudo<(ops GPRC:$rD), "; $rD = IMPLICIT_DEF_GPRC">; +def IMPLICIT_DEF_FP : Pseudo<(ops FPRC:$rD), "; %rD = IMPLICIT_DEF_FP">; let Defs = [LR] in def MovePCtoLR : Pseudo<(ops piclabel:$label), "bl $label">; From lattner at cs.uiuc.edu Wed Aug 24 19:00:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:00:37 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp MSScheduleSB.cpp Message-ID: <200508250000.TAA30700@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV9/ModuloScheduling: MSSchedule.cpp updated: 1.18 -> 1.19 MSScheduleSB.cpp updated: 1.3 -> 1.4 --- Log message: Fix some warnings --- Diffs of the changes: (+2 -0) MSSchedule.cpp | 1 + MSScheduleSB.cpp | 1 + 2 files changed, 2 insertions(+) Index: llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp diff -u llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp:1.18 llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp:1.19 --- llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp:1.18 Wed Jul 27 01:12:34 2005 +++ llvm/lib/Target/SparcV9/ModuloScheduling/MSSchedule.cpp Wed Aug 24 19:00:26 2005 @@ -288,6 +288,7 @@ } assert(0 && "We should always have found the def in our kernel\n"); + abort(); } Index: llvm/lib/Target/SparcV9/ModuloScheduling/MSScheduleSB.cpp diff -u llvm/lib/Target/SparcV9/ModuloScheduling/MSScheduleSB.cpp:1.3 llvm/lib/Target/SparcV9/ModuloScheduling/MSScheduleSB.cpp:1.4 --- llvm/lib/Target/SparcV9/ModuloScheduling/MSScheduleSB.cpp:1.3 Wed Jul 27 01:12:34 2005 +++ llvm/lib/Target/SparcV9/ModuloScheduling/MSScheduleSB.cpp Wed Aug 24 19:00:26 2005 @@ -295,6 +295,7 @@ } assert(0 && "We should always have found the def in our kernel\n"); + abort(); } From lattner at cs.uiuc.edu Wed Aug 24 19:03:32 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:03:32 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelPattern.cpp Message-ID: <200508250003.TAA30744@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelPattern.cpp updated: 1.60 -> 1.61 --- Log message: fix a warning in optimized build --- Diffs of the changes: (+1 -1) IA64ISelPattern.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/IA64/IA64ISelPattern.cpp diff -u llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.60 llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.61 --- llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.60 Mon Aug 22 16:33:11 2005 +++ llvm/lib/Target/IA64/IA64ISelPattern.cpp Wed Aug 24 19:03:21 2005 @@ -569,7 +569,7 @@ } std::string t, u; - int c; + int c = 0; bool f; std::map w; From lattner at cs.uiuc.edu Wed Aug 24 19:05:26 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:05:26 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp Message-ID: <200508250005.TAA30781@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelPattern.cpp updated: 1.172 -> 1.173 --- Log message: Fix a warning --- Diffs of the changes: (+1 -0) X86ISelPattern.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.172 llvm/lib/Target/X86/X86ISelPattern.cpp:1.173 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.172 Thu Aug 18 19:31:37 2005 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Wed Aug 24 19:05:15 2005 @@ -3984,6 +3984,7 @@ SelectionDAG &DAG) { MVT::ValueType StoreVT; switch (Chain.getOpcode()) { + default: assert(0 && "Unexpected node!"); case ISD::CALLSEQ_START: // If we found the start of the call sequence, we're done. We actually // strip off the CALLSEQ_START node, to avoid generating the From lattner at cs.uiuc.edu Wed Aug 24 19:19:23 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:19:23 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508250019.TAA30861@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.24 -> 1.25 --- Log message: Fix a broken assertion --- Diffs of the changes: (+1 -1) PPC32ISelDAGToDAG.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.24 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.25 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.24 Wed Aug 24 18:08:16 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Wed Aug 24 19:19:12 2005 @@ -987,7 +987,7 @@ DestReg = GPR[GPR_idx++]; RegTy = MVT::i32; } else { - assert(MVT::isFloatingPoint(Op.getValueType()) && + assert(MVT::isFloatingPoint(N->getOperand(i).getValueType()) && "Unpromoted integer arg?"); assert(FPR_idx < 13 && "Too many fp args"); DestReg = FPR[FPR_idx++]; From lattner at cs.uiuc.edu Wed Aug 24 19:26:34 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:26:34 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Message-ID: <200508250026.TAA30932@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrInfo.td updated: 1.80 -> 1.81 --- Log message: LFS/STFS load and store FP values, not integer ones. This change allows us to codegen this: float foo() { return 1.245; } into this: _foo: lis r2, ha16(.CPI_foo_0) lfs f1, lo16(.CPI_foo_0)(r2) blr instead of this: _foo: lis r2, ha16(.CPI_foo_0) lfs r2, lo16(.CPI_foo_0)(r2) <-- ouch or f1, r2, r2 <-- ouch blr with the dag isel. --- Diffs of the changes: (+4 -4) PowerPCInstrInfo.td | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.80 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.81 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.80 Wed Aug 24 18:08:16 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Wed Aug 24 19:26:22 2005 @@ -179,15 +179,15 @@ def CMPLDI : DForm_6_ext<10, (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), "cmpldi $dst, $src1, $src2">, isPPC64; let isLoad = 1 in { -def LFS : DForm_8<48, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), +def LFS : DForm_8<48, (ops FPRC:$rD, symbolLo:$disp, GPRC:$rA), "lfs $rD, $disp($rA)">; -def LFD : DForm_8<50, (ops GPRC:$rD, symbolLo:$disp, GPRC:$rA), +def LFD : DForm_8<50, (ops FPRC:$rD, symbolLo:$disp, GPRC:$rA), "lfd $rD, $disp($rA)">; } let isStore = 1 in { -def STFS : DForm_9<52, (ops GPRC:$rS, symbolLo:$disp, GPRC:$rA), +def STFS : DForm_9<52, (ops FPRC:$rS, symbolLo:$disp, GPRC:$rA), "stfs $rS, $disp($rA)">; -def STFD : DForm_9<54, (ops GPRC:$rS, symbolLo:$disp, GPRC:$rA), +def STFD : DForm_9<54, (ops FPRC:$rS, symbolLo:$disp, GPRC:$rA), "stfd $rS, $disp($rA)">; } From lattner at cs.uiuc.edu Wed Aug 24 19:30:10 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:30:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508250030.TAA30998@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.25 -> 1.26 --- Log message: implement unconditional branches, fixing UnitTests/2003-05-02-DependentPHI.c --- Diffs of the changes: (+4 -1) PPC32ISelDAGToDAG.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.25 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.26 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.25 Wed Aug 24 19:19:12 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Wed Aug 24 19:29:58 2005 @@ -1062,7 +1062,10 @@ CurDAG->SelectNodeTo(N, MVT::Other, PPC::BLR, Chain); break; } - + case ISD::BR: + CurDAG->SelectNodeTo(N, MVT::Other, PPC::B, N->getOperand(1), + Select(N->getOperand(0))); + break; case ISD::BR_CC: case ISD::BRTWOWAY_CC: { SDOperand Chain = Select(N->getOperand(0)); From lattner at cs.uiuc.edu Wed Aug 24 19:42:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:42:20 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h SelectionDAGNodes.h Message-ID: <200508250042.TAA31072@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.49 -> 1.50 SelectionDAGNodes.h updated: 1.60 -> 1.61 --- Log message: add a new TargetFrameIndex node --- Diffs of the changes: (+7 -4) SelectionDAG.h | 3 ++- SelectionDAGNodes.h | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.49 llvm/include/llvm/CodeGen/SelectionDAG.h:1.50 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.49 Wed Aug 24 18:00:29 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Wed Aug 24 19:42:08 2005 @@ -99,6 +99,7 @@ SDOperand getGlobalAddress(const GlobalValue *GV, MVT::ValueType VT); SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT); SDOperand getFrameIndex(int FI, MVT::ValueType VT); + SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT); SDOperand getConstantPool(unsigned CPIdx, MVT::ValueType VT); SDOperand getBasicBlock(MachineBasicBlock *MBB); SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT); @@ -307,7 +308,7 @@ std::map, SDNode*> Constants; std::map, SDNode*> TargetConstants; std::map, SDNode*> ConstantFPs; - std::map FrameIndices; + std::map FrameIndices, TargetFrameIndices; std::map ConstantPoolIndices; std::map BBNodes; std::vector ValueTypeNodes; Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.60 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.61 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.60 Sun Aug 21 13:49:58 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Wed Aug 24 19:42:08 2005 @@ -65,6 +65,7 @@ // anything else with this node, and this is valid in the target-specific // dag, turning into a GlobalAddress operand. TargetGlobalAddress, + TargetFrameIndex, // CopyToReg - This node has three operands: a chain, a register number to // set to this value, and a value. @@ -812,15 +813,16 @@ int FI; protected: friend class SelectionDAG; - FrameIndexSDNode(int fi, MVT::ValueType VT) - : SDNode(ISD::FrameIndex, VT), FI(fi) {} + FrameIndexSDNode(int fi, MVT::ValueType VT, bool isTarg) + : SDNode(isTarg ? ISD::TargetFrameIndex : ISD::FrameIndex, VT), FI(fi) {} public: int getIndex() const { return FI; } static bool classof(const FrameIndexSDNode *) { return true; } static bool classof(const SDNode *N) { - return N->getOpcode() == ISD::FrameIndex; + return N->getOpcode() == ISD::FrameIndex || + N->getOpcode() == ISD::TargetFrameIndex; } }; From lattner at cs.uiuc.edu Wed Aug 24 19:43:12 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:43:12 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508250043.TAA31132@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.162 -> 1.163 --- Log message: add a new TargetFrameIndex node --- Diffs of the changes: (+13 -1) SelectionDAG.cpp | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.162 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.163 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.162 Wed Aug 24 18:00:05 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Aug 24 19:43:01 2005 @@ -261,6 +261,9 @@ case ISD::FrameIndex: FrameIndices.erase(cast(N)->getIndex()); break; + case ISD::TargetFrameIndex: + TargetFrameIndices.erase(cast(N)->getIndex()); + break; case ISD::ConstantPool: ConstantPoolIndices.erase(cast(N)->getIndex()); break; @@ -433,7 +436,15 @@ SDOperand SelectionDAG::getFrameIndex(int FI, MVT::ValueType VT) { SDNode *&N = FrameIndices[FI]; if (N) return SDOperand(N, 0); - N = new FrameIndexSDNode(FI, VT); + N = new FrameIndexSDNode(FI, VT, false); + AllNodes.push_back(N); + return SDOperand(N, 0); +} + +SDOperand SelectionDAG::getTargetFrameIndex(int FI, MVT::ValueType VT) { + SDNode *&N = TargetFrameIndices[FI]; + if (N) return SDOperand(N, 0); + N = new FrameIndexSDNode(FI, VT, true); AllNodes.push_back(N); return SDOperand(N, 0); } @@ -2071,6 +2082,7 @@ case ISD::GlobalAddress: return "GlobalAddress"; case ISD::TargetGlobalAddress: return "TargetGlobalAddress"; case ISD::FrameIndex: return "FrameIndex"; + case ISD::TargetFrameIndex: return "TargetFrameIndex"; case ISD::BasicBlock: return "BasicBlock"; case ISD::Register: return "Register"; case ISD::ExternalSymbol: return "ExternalSymbol"; From lattner at cs.uiuc.edu Wed Aug 24 19:45:55 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 19:45:55 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508250045.TAA31171@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.26 -> 1.27 --- Log message: Fully implement frame index, so that we can pass the address of alloca's around to functions and stuff --- Diffs of the changes: (+12 -4) PPC32ISelDAGToDAG.cpp | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.26 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.27 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.26 Wed Aug 24 19:29:58 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Wed Aug 24 19:45:43 2005 @@ -369,9 +369,10 @@ if (Addr.getOpcode() == ISD::ADD) { if (isIntImmediate(Addr.getOperand(1), imm) && isInt16(imm)) { Op1 = getI32Imm(Lo16(imm)); - if (isa(Addr.getOperand(0))) { + if (FrameIndexSDNode *FI = + dyn_cast(Addr.getOperand(0))) { ++FrameOff; - Op2 = Addr.getOperand(0); + Op2 = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); } else { Op2 = Select(Addr.getOperand(0)); } @@ -396,9 +397,9 @@ Op2 = CurDAG->getTargetNode(PPC::LIS, MVT::i32, Op1); return false; } - } else if (isa(Addr)) { + } else if (FrameIndexSDNode *FI = dyn_cast(Addr)) { Op1 = getI32Imm(0); - Op2 = Addr; + Op2 = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); return false; } else if (ConstantPoolSDNode *CP = dyn_cast(Addr)) { Op1 = Addr; @@ -530,6 +531,13 @@ else CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::IMPLICIT_DEF_FP); break; + case ISD::FrameIndex: { + int FI = cast(N)->getIndex(); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::ADDI, + CurDAG->getTargetFrameIndex(FI, MVT::i32), + getI32Imm(0)); + break; + } case ISD::GlobalAddress: { GlobalValue *GV = cast(N)->getGlobal(); SDOperand Tmp; From reid at x10sys.com Wed Aug 24 23:44:30 2005 From: reid at x10sys.com (Reid Spencer) Date: Wed, 24 Aug 2005 23:44:30 -0500 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200508250444.XAA30713@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.321 -> 1.322 --- Log message: Don't attempt to update LLVM configured header files from a build in a project. Thanks to Chris for pointing out this deficiency. --- Diffs of the changes: (+5 -0) Makefile.rules | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.321 llvm/Makefile.rules:1.322 --- llvm/Makefile.rules:1.321 Wed Aug 24 05:55:07 2005 +++ llvm/Makefile.rules Wed Aug 24 23:44:18 2005 @@ -144,10 +144,15 @@ $(ConfigStatusScript) --recheck $(ConfigureScriptFLAGS) && \ $(ConfigStatusScript) +#------------------------------------------------------------------------ +# If we're buildilng LLVM, then make sure the generated headers are Up2Dt +#------------------------------------------------------------------------ +ifeq ($(LLVM_OBJ_ROOT),$(PROJ_OBJ_ROOT)) .PRECIOUS: $(FilesToConfigPATH) $(FilesToConfigPATH) : $(LLVM_OBJ_ROOT)/% : $(LLVM_SRC_ROOT)/%.in $(Echo) Regenerating $* $(Verb) cd $(LLVM_OBJ_ROOT) && $(ConfigStatusScript) $* +endif #------------------------------------------------------------------------ # Make sure the configuration makefile is up to date From lattner at cs.uiuc.edu Wed Aug 24 23:47:30 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 24 Aug 2005 23:47:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508250447.XAA30763@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.27 -> 1.28 --- Log message: Add support for FP constants, fixing UnitTests/2004-02-02-NegativeZero --- Diffs of the changes: (+25 -6) PPC32ISelDAGToDAG.cpp | 31 +++++++++++++++++++++++++------ 1 files changed, 25 insertions(+), 6 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.27 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.28 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.27 Wed Aug 24 19:45:43 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Wed Aug 24 23:47:18 2005 @@ -15,6 +15,7 @@ #include "PowerPC.h" #include "PPC32TargetMachine.h" #include "PPC32ISelLowering.h" +#include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SSARegMap.h" @@ -22,6 +23,7 @@ #include "llvm/CodeGen/SelectionDAGISel.h" #include "llvm/Target/TargetOptions.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Constants.h" #include "llvm/GlobalValue.h" #include "llvm/Support/Debug.h" #include "llvm/Support/MathExtras.h" @@ -141,12 +143,15 @@ // look for the first zero bit after the run of ones ME = CountLeadingZeros_32((Val - 1) ^ Val); return true; - } else if (isShiftedMask_32(Val = ~Val)) { // invert mask - // effectively look for the first zero bit - ME = CountLeadingZeros_32(Val) - 1; - // effectively look for the first one bit after the run of zeros - MB = CountLeadingZeros_32((Val - 1) ^ Val) + 1; - return true; + } else { + Val = ~Val; // invert mask + if (isShiftedMask_32(Val)) { + // effectively look for the first zero bit + ME = CountLeadingZeros_32(Val) - 1; + // effectively look for the first one bit after the run of zeros + MB = CountLeadingZeros_32((Val - 1) ^ Val) + 1; + return true; + } } // no run present return false; @@ -525,6 +530,20 @@ } break; } + case ISD::ConstantFP: { // FIXME: this should get sucked into the legalizer + MachineConstantPool *CP = CurDAG->getMachineFunction().getConstantPool(); + Constant *CFP = ConstantFP::get(Type::FloatTy, + cast(N)->getValue()); + SDOperand CPN = CurDAG->getConstantPool(CP->getConstantPoolIndex(CFP), + MVT::i32); + SDOperand Tmp; + if (PICEnabled) + Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPN); + else + Tmp = CurDAG->getTargetNode(PPC::LIS, MVT::i32, CPN); + CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::LFS, CPN, Tmp); + break; + } case ISD::UNDEF: if (N->getValueType(0) == MVT::i32) CurDAG->SelectNodeTo(N, MVT::i32, PPC::IMPLICIT_DEF_GPR); From reid at x10sys.com Thu Aug 25 00:00:00 2005 From: reid at x10sys.com (Reid Spencer) Date: Thu, 25 Aug 2005 00:00:00 -0500 Subject: [llvm-commits] CVS: llvm/Makefile.rules Makefile Message-ID: <200508250500.AAA03049@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.322 -> 1.323 Makefile updated: 1.50 -> 1.51 --- Log message: For PR614: http://llvm.cs.uiuc.edu/PR614 : Move the implementation of the fix from Makefile.rules to Makefile. This ensures that it is only checked on a top-level rebuild, and not in every single subdirectory. This removes some annoying messages from the build and numerous executions of config.status if the .in file changes but not substantively enough to cause the .h file to be modified by config.status. --- Diffs of the changes: (+19 -21) Makefile | 18 ++++++++++++++++++ Makefile.rules | 22 +--------------------- 2 files changed, 19 insertions(+), 21 deletions(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.322 llvm/Makefile.rules:1.323 --- llvm/Makefile.rules:1.322 Wed Aug 24 23:44:18 2005 +++ llvm/Makefile.rules Wed Aug 24 23:59:49 2005 @@ -28,13 +28,6 @@ UserTargets := $(RecursiveTargets) $(LocalTargets) $(TopLevelTargets) InternalTargets := preconditions distdir dist-hook -FilesToConfig := \ - include/llvm/Config/config.h \ - include/llvm/Support/DataTypes.h \ - include/llvm/ADT/hash_map \ - include/llvm/ADT/hash_set \ - include/llvm/ADT/iterator - ################################################################################ # INITIALIZATION: Basic things the makefile needs ################################################################################ @@ -84,10 +77,7 @@ PreConditions += $(MakefileConfig) endif -FilesToConfigPATH := $(addprefix $(LLVM_OBJ_ROOT)/,$(FilesToConfig)) -PreConditions += $(FilesToConfigPATH) - -preconditions : $(PreConditions) +preconditions: $(PreConditions) #------------------------------------------------------------------------ # Make sure the BUILT_SOURCES are built first @@ -145,16 +135,6 @@ $(ConfigStatusScript) #------------------------------------------------------------------------ -# If we're buildilng LLVM, then make sure the generated headers are Up2Dt -#------------------------------------------------------------------------ -ifeq ($(LLVM_OBJ_ROOT),$(PROJ_OBJ_ROOT)) -.PRECIOUS: $(FilesToConfigPATH) -$(FilesToConfigPATH) : $(LLVM_OBJ_ROOT)/% : $(LLVM_SRC_ROOT)/%.in - $(Echo) Regenerating $* - $(Verb) cd $(LLVM_OBJ_ROOT) && $(ConfigStatusScript) $* -endif - -#------------------------------------------------------------------------ # Make sure the configuration makefile is up to date #------------------------------------------------------------------------ ifneq ($(MakefileConfigIn),) Index: llvm/Makefile diff -u llvm/Makefile:1.50 llvm/Makefile:1.51 --- llvm/Makefile:1.50 Sat May 28 19:49:24 2005 +++ llvm/Makefile Wed Aug 24 23:59:49 2005 @@ -51,3 +51,21 @@ tools-only: all libs-only: all + +#------------------------------------------------------------------------ +# Make sure the generated headers are up-to-date. This must be kept in +# sync with the AC_CONFIG_HEADER invocations in autoconf/configure.ac +#------------------------------------------------------------------------ +FilesToConfig := \ + include/llvm/Config/config.h \ + include/llvm/Support/DataTypes.h \ + include/llvm/ADT/hash_map \ + include/llvm/ADT/hash_set \ + include/llvm/ADT/iterator +FilesToConfigPATH := $(addprefix $(LLVM_OBJ_ROOT)/,$(FilesToConfig)) + +all-local:: $(FilesToConfigPATH) +$(FilesToConfigPATH) : $(LLVM_OBJ_ROOT)/% : $(LLVM_SRC_ROOT)/%.in + $(Echo) Regenerating $* + $(Verb) cd $(LLVM_OBJ_ROOT) && $(ConfigStatusScript) $* +.PRECIOUS: $(FilesToConfigPATH) From lattner at cs.uiuc.edu Thu Aug 25 00:02:52 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 00:02:52 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h SelectionDAGNodes.h Message-ID: <200508250502.AAA12538@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.50 -> 1.51 SelectionDAGNodes.h updated: 1.61 -> 1.62 --- Log message: Add support for TargetConstantPool node --- Diffs of the changes: (+8 -4) SelectionDAG.h | 3 ++- SelectionDAGNodes.h | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.50 llvm/include/llvm/CodeGen/SelectionDAG.h:1.51 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.50 Wed Aug 24 19:42:08 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Thu Aug 25 00:02:41 2005 @@ -101,6 +101,7 @@ SDOperand getFrameIndex(int FI, MVT::ValueType VT); SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT); SDOperand getConstantPool(unsigned CPIdx, MVT::ValueType VT); + SDOperand getTargetConstantPool(unsigned CPIdx, MVT::ValueType VT); SDOperand getBasicBlock(MachineBasicBlock *MBB); SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT); SDOperand getValueType(MVT::ValueType); @@ -309,7 +310,7 @@ std::map, SDNode*> TargetConstants; std::map, SDNode*> ConstantFPs; std::map FrameIndices, TargetFrameIndices; - std::map ConstantPoolIndices; + std::map ConstantPoolIndices, TargetConstantPoolIndices; std::map BBNodes; std::vector ValueTypeNodes; std::map ExternalSymbols; Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.61 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.62 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.61 Wed Aug 24 19:42:08 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Thu Aug 25 00:02:41 2005 @@ -66,6 +66,7 @@ // dag, turning into a GlobalAddress operand. TargetGlobalAddress, TargetFrameIndex, + TargetConstantPool, // CopyToReg - This node has three operands: a chain, a register number to // set to this value, and a value. @@ -830,15 +831,17 @@ unsigned CPI; protected: friend class SelectionDAG; - ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT) - : SDNode(ISD::ConstantPool, VT), CPI(cpi) {} + ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT, bool isTarget) + : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT), + CPI(cpi) {} public: unsigned getIndex() const { return CPI; } static bool classof(const ConstantPoolSDNode *) { return true; } static bool classof(const SDNode *N) { - return N->getOpcode() == ISD::ConstantPool; + return N->getOpcode() == ISD::ConstantPool || + N->getOpcode() == ISD::TargetConstantPool; } }; From lattner at cs.uiuc.edu Thu Aug 25 00:03:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 00:03:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508250503.AAA12552@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.163 -> 1.164 --- Log message: ADd support for TargetConstantPool nodes --- Diffs of the changes: (+14 -1) SelectionDAG.cpp | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.163 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.164 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.163 Wed Aug 24 19:43:01 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Aug 25 00:03:06 2005 @@ -267,6 +267,9 @@ case ISD::ConstantPool: ConstantPoolIndices.erase(cast(N)->getIndex()); break; + case ISD::TargetConstantPool: + TargetConstantPoolIndices.erase(cast(N)->getIndex()); + break; case ISD::BasicBlock: BBNodes.erase(cast(N)->getBasicBlock()); break; @@ -452,7 +455,16 @@ SDOperand SelectionDAG::getConstantPool(unsigned CPIdx, MVT::ValueType VT) { SDNode *N = ConstantPoolIndices[CPIdx]; if (N) return SDOperand(N, 0); - N = new ConstantPoolSDNode(CPIdx, VT); + N = new ConstantPoolSDNode(CPIdx, VT, false); + AllNodes.push_back(N); + return SDOperand(N, 0); +} + +SDOperand SelectionDAG::getTargetConstantPool(unsigned CPIdx, + MVT::ValueType VT) { + SDNode *N = TargetConstantPoolIndices[CPIdx]; + if (N) return SDOperand(N, 0); + N = new ConstantPoolSDNode(CPIdx, VT, true); AllNodes.push_back(N); return SDOperand(N, 0); } @@ -2087,6 +2099,7 @@ case ISD::Register: return "Register"; case ISD::ExternalSymbol: return "ExternalSymbol"; case ISD::ConstantPool: return "ConstantPoolIndex"; + case ISD::TargetConstantPool: return "TargetConstantPoolIndex"; case ISD::CopyToReg: return "CopyToReg"; case ISD::CopyFromReg: return "CopyFromReg"; case ISD::ImplicitDef: return "ImplicitDef"; From lattner at cs.uiuc.edu Thu Aug 25 00:04:22 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 00:04:22 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508250504.AAA12568@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.28 -> 1.29 --- Log message: Implement support for taking the address of constant pool indices, which is used by the int -> FP code among other things. This gets 2005-05-12-Int64ToFP past that failure, to dying on lack of support for add_parts --- Diffs of the changes: (+10 -0) PPC32ISelDAGToDAG.cpp | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.28 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.29 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.28 Wed Aug 24 23:47:18 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 00:04:11 2005 @@ -557,6 +557,16 @@ getI32Imm(0)); break; } + case ISD::ConstantPool: { + unsigned CPIIdx = cast(N)->getIndex(); + SDOperand Tmp, CPI = CurDAG->getTargetConstantPool(CPIIdx, MVT::i32); + if (PICEnabled) + Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPI); + else + Tmp = CurDAG->getTargetNode(PPC::LIS, MVT::i32, CPI); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::LA, Tmp, CPI); + break; + } case ISD::GlobalAddress: { GlobalValue *GV = cast(N)->getGlobal(); SDOperand Tmp; From lattner at cs.uiuc.edu Thu Aug 25 00:45:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 00:45:42 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/LiveVariables.h Message-ID: <200508250545.AAA21004@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: LiveVariables.h updated: 1.25 -> 1.26 --- Log message: Fix a problem Duraid noticed, where we weren't removing values from the kills list when doing two-address and phi node lowering during register allocation. --- Diffs of the changes: (+20 -2) LiveVariables.h | 22 ++++++++++++++++++++-- 1 files changed, 20 insertions(+), 2 deletions(-) Index: llvm/include/llvm/CodeGen/LiveVariables.h diff -u llvm/include/llvm/CodeGen/LiveVariables.h:1.25 llvm/include/llvm/CodeGen/LiveVariables.h:1.26 --- llvm/include/llvm/CodeGen/LiveVariables.h:1.25 Tue Aug 23 19:09:02 2005 +++ llvm/include/llvm/CodeGen/LiveVariables.h Thu Aug 25 00:45:31 2005 @@ -213,7 +213,16 @@ /// removeVirtualRegistersKilled - Remove all killed info for the specified /// instruction. void removeVirtualRegistersKilled(MachineInstr *MI) { - RegistersKilled.erase(MI); + std::map >::iterator I = + RegistersKilled.find(MI); + if (I != RegistersKilled.end()) { + std::vector &Regs = I->second; + for (unsigned i = 0, e = Regs.size(); i != e; ++i) { + bool removed = getVarInfo(Regs[i]).removeKill(MI); + assert(removed && "kill not in register's VarInfo?"); + } + RegistersKilled.erase(I); + } } /// addVirtualRegisterDead - Add information about the fact that the specified @@ -256,7 +265,16 @@ /// removeVirtualRegistersDead - Remove all of the specified dead /// registers from the live variable information. void removeVirtualRegistersDead(MachineInstr *MI) { - RegistersDead.erase(MI); + std::map >::iterator I = + RegistersDead.find(MI); + if (I != RegistersDead.end()) { + std::vector &Regs = I->second; + for (unsigned i = 0, e = Regs.size(); i != e; ++i) { + bool removed = getVarInfo(Regs[i]).removeKill(MI); + assert(removed && "kill not in register's VarInfo?"); + } + RegistersDead.erase(I); + } } virtual void getAnalysisUsage(AnalysisUsage &AU) const { From jlaskey at apple.com Thu Aug 25 08:32:37 2005 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 25 Aug 2005 08:32:37 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/Search.h Message-ID: <200508251332.IAA30616@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: Search.h added (r1.1) --- Log message: Added support for generic linear/binary search. --- Diffs of the changes: (+78 -0) Search.h | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 78 insertions(+) Index: llvm/include/llvm/Support/Search.h diff -c /dev/null llvm/include/llvm/Support/Search.h:1.1 *** /dev/null Thu Aug 25 08:32:35 2005 --- llvm/include/llvm/Support/Search.h Thu Aug 25 08:32:25 2005 *************** *** 0 **** --- 1,78 ---- + //===- llvm/Support/Search.h - Support for searching algorithms -*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // These templates impliment various generic search algorithms. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_SUPPORT_SEARCH_H + #define LLVM_SUPPORT_SEARCH_H + + namespace llvm { + // SearchString - generalized string compare method container. Used for + // search templates. + struct SearchString { + static inline int Compare(const char *A, const char *B) { + return strcmp(A, B); + } + }; + + // LinearSearch - search an array of items for a match using linear search + // algorithm. Return find index or -1 if not found. + // ItemType - type of elements in array. + // CompareClass - container for compare method in form of + // static int Compare(ItemType A, ItemType B) + // returns < 0 for A < B + // > 0 for A > B + // == 0 for A == B + // Match - item to match in array. + // Array - an array of items to be searched. + // Size - size of array in bytes. + // + // Eg. LinearSearch("key", List, sizeof(List)); + // + template + inline int LinearSearch(ItemType Match, ItemType Array[], size_t Size) { + unsigned N = Size / sizeof(ItemType); + for (unsigned Index = 0; Index < N; Index++) { + if (!CompareClass::Compare(Match, Array[Index])) return Index; + } + return -1; + } + + // BinarySearch - search an array of items for a match using binary search + // algorithm. Return find index or -1 if not found. + // ItemType - type of elements in array. + // CompareClass - container for compare method in form of + // static int Compare(ItemType A, ItemType B) + // returns < 0 for A < B + // > 0 for A > B + // == 0 for A == B + // Match - item to match in array. + // Array - a sorted array of items to be searched. + // Size - size of array in bytes. + // + // Eg. BinarySearch("key", List, sizeof(List)); + // + template + inline int BinarySearch(ItemType Match, ItemType Array[], size_t Size) { + int Lo = 0, Hi = Size / sizeof(ItemType); + while (Lo <= Hi) { + unsigned Mid = (Lo + Hi) >> 1; + int Result = CompareClass::Compare(Match, Array[Mid]); + if (Result < 0) Hi = Mid - 1; + else if (Result > 0) Lo = Mid + 1; + else return Mid; + } + return -1; + } + } + + #endif + From jlaskey at apple.com Thu Aug 25 08:42:15 2005 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 25 Aug 2005 08:42:15 -0500 Subject: [llvm-commits] CVS: llvm/Xcode/LLVM.xcodeproj/project.pbxproj Message-ID: <200508251342.IAA30786@zion.cs.uiuc.edu> Changes in directory llvm/Xcode/LLVM.xcodeproj: project.pbxproj updated: 1.4 -> 1.5 --- Log message: Added Support/Search.h to project. --- Diffs of the changes: (+4 -66) project.pbxproj | 70 +++----------------------------------------------------- 1 files changed, 4 insertions(+), 66 deletions(-) Index: llvm/Xcode/LLVM.xcodeproj/project.pbxproj diff -u llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.4 llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.5 --- llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.4 Thu Aug 18 14:52:06 2005 +++ llvm/Xcode/LLVM.xcodeproj/project.pbxproj Thu Aug 25 08:42:04 2005 @@ -33,6 +33,7 @@ /* End PBXBuildStyle section */ /* Begin PBXFileReference section */ + CFB4CABE08BE01F50035DBBF /* Search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Search.h; sourceTree = ""; }; DE66EC5B08ABE86900323D32 /* AsmWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AsmWriter.cpp; path = ../lib/VMCore/AsmWriter.cpp; sourceTree = SOURCE_ROOT; }; DE66EC5C08ABE86A00323D32 /* BasicBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = BasicBlock.cpp; path = ../lib/VMCore/BasicBlock.cpp; sourceTree = SOURCE_ROOT; }; DE66EC5D08ABE86A00323D32 /* ConstantFolding.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ConstantFolding.cpp; path = ../lib/VMCore/ConstantFolding.cpp; sourceTree = SOURCE_ROOT; }; @@ -238,7 +239,6 @@ DE66EEA508ABEE5E00323D32 /* AlphaInstrInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AlphaInstrInfo.h; sourceTree = ""; }; DE66EEA608ABEE5E00323D32 /* AlphaInstrInfo.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = AlphaInstrInfo.td; sourceTree = ""; }; DE66EEA708ABEE5E00323D32 /* AlphaISelPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AlphaISelPattern.cpp; sourceTree = ""; }; - DE66EEA808ABEE5E00323D32 /* AlphaISelPattern.cpp.orig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = AlphaISelPattern.cpp.orig; sourceTree = ""; }; DE66EEA908ABEE5E00323D32 /* AlphaJITInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AlphaJITInfo.cpp; sourceTree = ""; }; DE66EEAA08ABEE5E00323D32 /* AlphaJITInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AlphaJITInfo.h; sourceTree = ""; }; DE66EEAB08ABEE5E00323D32 /* AlphaRegisterInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AlphaRegisterInfo.cpp; sourceTree = ""; }; @@ -266,7 +266,6 @@ DE66EF0C08ABEE5E00323D32 /* IA64TargetMachine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = IA64TargetMachine.h; sourceTree = ""; }; DE66EF0E08ABEE5E00323D32 /* README */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = README; sourceTree = ""; }; DE66EF1008ABEE5E00323D32 /* MRegisterInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = MRegisterInfo.cpp; sourceTree = ""; }; - DE66EF1208ABEE5E00323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66EF3D08ABEE5F00323D32 /* LICENSE.TXT */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = LICENSE.TXT; sourceTree = ""; }; DE66EF3F08ABEE5F00323D32 /* PowerPC.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PowerPC.h; sourceTree = ""; }; DE66EF4008ABEE5F00323D32 /* PowerPC.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = PowerPC.td; sourceTree = ""; }; @@ -288,7 +287,6 @@ DE66EF5708ABEE5F00323D32 /* PPC32InstrInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC32InstrInfo.cpp; sourceTree = ""; }; DE66EF5808ABEE5F00323D32 /* PPC32InstrInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC32InstrInfo.h; sourceTree = ""; }; DE66EF5908ABEE5F00323D32 /* PPC32ISelPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC32ISelPattern.cpp; sourceTree = ""; }; - DE66EF5A08ABEE5F00323D32 /* PPC32ISelSimple.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC32ISelSimple.cpp; sourceTree = ""; }; DE66EF5B08ABEE5F00323D32 /* PPC32JITInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC32JITInfo.cpp; sourceTree = ""; }; DE66EF5C08ABEE5F00323D32 /* PPC32JITInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC32JITInfo.h; sourceTree = ""; }; DE66EF5D08ABEE5F00323D32 /* PPC32RegisterInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC32RegisterInfo.cpp; sourceTree = ""; }; @@ -297,17 +295,8 @@ DE66EF6008ABEE5F00323D32 /* PPC32Relocations.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC32Relocations.h; sourceTree = ""; }; DE66EF6108ABEE5F00323D32 /* PPC32TargetMachine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC32TargetMachine.h; sourceTree = ""; }; DE66EF6208ABEE5F00323D32 /* PPC64.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = PPC64.td; sourceTree = ""; }; - DE66EF6308ABEE5F00323D32 /* PPC64CodeEmitter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC64CodeEmitter.cpp; sourceTree = ""; }; - DE66EF6708ABEE5F00323D32 /* PPC64InstrInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC64InstrInfo.cpp; sourceTree = ""; }; - DE66EF6808ABEE5F00323D32 /* PPC64InstrInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC64InstrInfo.h; sourceTree = ""; }; - DE66EF6908ABEE5F00323D32 /* PPC64ISelPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC64ISelPattern.cpp; sourceTree = ""; }; - DE66EF6A08ABEE5F00323D32 /* PPC64JITInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC64JITInfo.h; sourceTree = ""; }; - DE66EF6B08ABEE5F00323D32 /* PPC64RegisterInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PPC64RegisterInfo.cpp; sourceTree = ""; }; - DE66EF6C08ABEE5F00323D32 /* PPC64RegisterInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC64RegisterInfo.h; sourceTree = ""; }; DE66EF6D08ABEE5F00323D32 /* PPC64RegisterInfo.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = PPC64RegisterInfo.td; sourceTree = ""; }; - DE66EF6E08ABEE5F00323D32 /* PPC64TargetMachine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPC64TargetMachine.h; sourceTree = ""; }; DE66EF6F08ABEE5F00323D32 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = README.txt; sourceTree = ""; }; - DE66EF7108ABEE5F00323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66EF8208ABEE5F00323D32 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = README.txt; sourceTree = ""; }; DE66EF8308ABEE5F00323D32 /* Skeleton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Skeleton.h; sourceTree = ""; }; DE66EF8408ABEE5F00323D32 /* Skeleton.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = Skeleton.td; sourceTree = ""; }; @@ -340,7 +329,6 @@ DE66EFC608ABEE5F00323D32 /* SparcV8RegisterInfo.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV8RegisterInfo.td; sourceTree = ""; }; DE66EFC708ABEE5F00323D32 /* SparcV8TargetMachine.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV8TargetMachine.cpp; sourceTree = ""; }; DE66EFC808ABEE5F00323D32 /* SparcV8TargetMachine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SparcV8TargetMachine.h; sourceTree = ""; }; - DE66EFCA08ABEE5F00323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66EFFA08ABEE6000323D32 /* DecomposeMultiDimRefs.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DecomposeMultiDimRefs.cpp; sourceTree = ""; }; DE66EFFB08ABEE6000323D32 /* EmitBytecodeToAssembly.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = EmitBytecodeToAssembly.cpp; sourceTree = ""; }; DE66F00708ABEE6000323D32 /* InstrScheduling.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = InstrScheduling.cpp; sourceTree = ""; }; @@ -391,9 +379,6 @@ DE66F06008ABEE6000323D32 /* RegClass.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = RegClass.cpp; sourceTree = ""; }; DE66F06108ABEE6000323D32 /* RegClass.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = RegClass.h; sourceTree = ""; }; DE66F06208ABEE6000323D32 /* SparcV9.burg.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV9.burg.in; sourceTree = ""; }; - DE66F06308ABEE6000323D32 /* SparcV9.burg.in1 */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV9.burg.in1; sourceTree = ""; }; - DE66F06408ABEE6000323D32 /* SparcV9.burm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV9.burm; sourceTree = ""; }; - DE66F06508ABEE6000323D32 /* SparcV9.burm.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SparcV9.burm.cpp; sourceTree = ""; }; DE66F06608ABEE6000323D32 /* SparcV9.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV9.td; sourceTree = ""; }; DE66F06708ABEE6000323D32 /* SparcV9_F2.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV9_F2.td; sourceTree = ""; }; DE66F06808ABEE6000323D32 /* SparcV9_F3.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SparcV9_F3.td; sourceTree = ""; }; @@ -438,7 +423,6 @@ DE66F09008ABEE6000323D32 /* TargetMachineRegistry.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TargetMachineRegistry.cpp; sourceTree = ""; }; DE66F09108ABEE6000323D32 /* TargetSchedInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TargetSchedInfo.cpp; sourceTree = ""; }; DE66F09208ABEE6000323D32 /* TargetSubtarget.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TargetSubtarget.cpp; sourceTree = ""; }; - DE66F09408ABEE6000323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66F0BC08ABEE6000323D32 /* X86.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = X86.h; sourceTree = ""; }; DE66F0BD08ABEE6000323D32 /* X86.td */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = X86.td; sourceTree = ""; }; DE66F0BE08ABEE6000323D32 /* X86AsmPrinter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = X86AsmPrinter.cpp; sourceTree = ""; }; @@ -455,8 +439,6 @@ DE66F0D008ABEE6100323D32 /* X86IntelAsmPrinter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = X86IntelAsmPrinter.cpp; sourceTree = ""; }; DE66F0D108ABEE6100323D32 /* X86IntelAsmPrinter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = X86IntelAsmPrinter.h; sourceTree = ""; }; DE66F0D208ABEE6100323D32 /* X86ISelPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = X86ISelPattern.cpp; sourceTree = ""; }; - DE66F0D308ABEE6100323D32 /* X86ISelPattern.cpp.orig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = X86ISelPattern.cpp.orig; sourceTree = ""; }; - DE66F0D408ABEE6100323D32 /* X86ISelSimple.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = X86ISelSimple.cpp; sourceTree = ""; }; DE66F0D508ABEE6100323D32 /* X86JITInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = X86JITInfo.cpp; sourceTree = ""; }; DE66F0D608ABEE6100323D32 /* X86JITInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = X86JITInfo.h; sourceTree = ""; }; DE66F0D708ABEE6100323D32 /* X86PeepholeOpt.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = X86PeepholeOpt.cpp; sourceTree = ""; }; @@ -551,19 +533,15 @@ DE66F1E708ABEFB400323D32 /* ValueMapper.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ValueMapper.cpp; sourceTree = ""; }; DE66F1E808ABEFB400323D32 /* ValueMapper.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ValueMapper.h; sourceTree = ""; }; DE66F1EA08ABF03100323D32 /* AbstractTypeUser.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AbstractTypeUser.h; sourceTree = ""; }; - DE66F1EC08ABF03100323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66F1ED08ABF03100323D32 /* BitSetVector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = BitSetVector.h; sourceTree = ""; }; DE66F1EE08ABF03100323D32 /* DenseMap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DenseMap.h; sourceTree = ""; }; DE66F1EF08ABF03100323D32 /* DepthFirstIterator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DepthFirstIterator.h; sourceTree = ""; }; DE66F1F008ABF03100323D32 /* EquivalenceClasses.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = EquivalenceClasses.h; sourceTree = ""; }; DE66F1F108ABF03100323D32 /* GraphTraits.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GraphTraits.h; sourceTree = ""; }; - DE66F1F208ABF03100323D32 /* hash_map */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = hash_map; sourceTree = ""; }; DE66F1F308ABF03100323D32 /* hash_map.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = hash_map.in; sourceTree = ""; }; - DE66F1F408ABF03100323D32 /* hash_set */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = hash_set; sourceTree = ""; }; DE66F1F508ABF03100323D32 /* hash_set.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = hash_set.in; sourceTree = ""; }; DE66F1F608ABF03100323D32 /* HashExtras.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = HashExtras.h; sourceTree = ""; }; DE66F1F708ABF03100323D32 /* ilist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = ilist; sourceTree = ""; }; - DE66F1F808ABF03100323D32 /* iterator */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = iterator; sourceTree = ""; }; DE66F1F908ABF03100323D32 /* iterator.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = iterator.in; sourceTree = ""; }; DE66F1FA08ABF03100323D32 /* PostOrderIterator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PostOrderIterator.h; sourceTree = ""; }; DE66F1FB08ABF03100323D32 /* SCCIterator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SCCIterator.h; sourceTree = ""; }; @@ -642,9 +620,7 @@ DE66F24908ABF03100323D32 /* SSARegMap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SSARegMap.h; sourceTree = ""; }; DE66F24A08ABF03100323D32 /* ValueSet.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ValueSet.h; sourceTree = ""; }; DE66F24B08ABF03100323D32 /* ValueTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ValueTypes.h; sourceTree = ""; }; - DE66F24D08ABF03100323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66F24E08ABF03100323D32 /* alloca.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = alloca.h; sourceTree = ""; }; - DE66F24F08ABF03100323D32 /* config.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; DE66F25008ABF03100323D32 /* config.h.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = config.h.in; sourceTree = ""; }; DE66F25108ABF03100323D32 /* Constant.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Constant.h; sourceTree = ""; }; DE66F25208ABF03100323D32 /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = ""; }; @@ -673,7 +649,6 @@ DE66F26B08ABF03200323D32 /* PassAnalysisSupport.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PassAnalysisSupport.h; sourceTree = ""; }; DE66F26C08ABF03200323D32 /* PassManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PassManager.h; sourceTree = ""; }; DE66F26D08ABF03200323D32 /* PassSupport.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PassSupport.h; sourceTree = ""; }; - DE66F26F08ABF03200323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66F27008ABF03200323D32 /* AIXDataTypesFix.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AIXDataTypesFix.h; sourceTree = ""; }; DE66F27108ABF03200323D32 /* Annotation.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Annotation.h; sourceTree = ""; }; DE66F27208ABF03200323D32 /* CallSite.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CallSite.h; sourceTree = ""; }; @@ -682,7 +657,6 @@ DE66F27508ABF03200323D32 /* CommandLine.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CommandLine.h; sourceTree = ""; }; DE66F27608ABF03200323D32 /* Compressor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Compressor.h; sourceTree = ""; }; DE66F27708ABF03200323D32 /* ConstantRange.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ConstantRange.h; sourceTree = ""; }; - DE66F27808ABF03200323D32 /* DataTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DataTypes.h; sourceTree = ""; }; DE66F27908ABF03200323D32 /* DataTypes.h.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = DataTypes.h.in; sourceTree = ""; }; DE66F27A08ABF03200323D32 /* Debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Debug.h; sourceTree = ""; }; DE66F27B08ABF03200323D32 /* DOTGraphTraits.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DOTGraphTraits.h; sourceTree = ""; }; @@ -703,7 +677,6 @@ DE66F28A08ABF03200323D32 /* SlowOperationInformer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SlowOperationInformer.h; sourceTree = ""; }; DE66F28B08ABF03200323D32 /* StableBasicBlockNumbering.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = StableBasicBlockNumbering.h; sourceTree = ""; }; DE66F28C08ABF03200323D32 /* SystemUtils.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SystemUtils.h; sourceTree = ""; }; - DE66F28D08ABF03200323D32 /* ThreadSupport.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ThreadSupport.h; sourceTree = ""; }; DE66F28E08ABF03200323D32 /* Timer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = ""; }; DE66F28F08ABF03200323D32 /* ToolRunner.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ToolRunner.h; sourceTree = ""; }; DE66F29008ABF03200323D32 /* type_traits.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = type_traits.h; sourceTree = ""; }; @@ -783,7 +756,6 @@ DE66F36908ABF14500323D32 /* c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = c; sourceTree = ""; }; DE66F36A08ABF14500323D32 /* CompilerDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CompilerDriver.cpp; sourceTree = ""; }; DE66F36B08ABF14500323D32 /* CompilerDriver.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CompilerDriver.h; sourceTree = ""; }; - DE66F36C08ABF14500323D32 /* ConfigLexer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ConfigLexer.cpp; sourceTree = ""; }; DE66F36D08ABF14500323D32 /* ConfigLexer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ConfigLexer.h; sourceTree = ""; }; DE66F36E08ABF14500323D32 /* ConfigLexer.l */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.lex; path = ConfigLexer.l; sourceTree = ""; }; DE66F36F08ABF14500323D32 /* Configuration.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Configuration.cpp; sourceTree = ""; }; @@ -793,14 +765,12 @@ DE66F37E08ABF14500323D32 /* llvmc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llvmc.cpp; sourceTree = ""; }; DE66F38708ABF14500323D32 /* opt.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = opt.cpp; path = opt/opt.cpp; sourceTree = ""; }; DE66F38C08ABF35300323D32 /* CREDITS.TXT */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = CREDITS.TXT; path = ../CREDITS.TXT; sourceTree = SOURCE_ROOT; }; - DE66F38E08ABF35C00323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66F38F08ABF35C00323D32 /* AliasAnalysis.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = AliasAnalysis.html; sourceTree = ""; }; DE66F39008ABF35C00323D32 /* Bugpoint.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = Bugpoint.html; sourceTree = ""; }; DE66F39108ABF35C00323D32 /* BytecodeFormat.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = BytecodeFormat.html; sourceTree = ""; }; DE66F39208ABF35C00323D32 /* CFEBuildInstrs.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = CFEBuildInstrs.html; sourceTree = ""; }; DE66F39308ABF35C00323D32 /* CodeGenerator.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = CodeGenerator.html; sourceTree = ""; }; DE66F39408ABF35C00323D32 /* CodingStandards.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = CodingStandards.html; sourceTree = ""; }; - DE66F39608ABF35C00323D32 /* .cvsignore */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .cvsignore; sourceTree = ""; }; DE66F39708ABF35C00323D32 /* analyze.pod */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = analyze.pod; sourceTree = ""; }; DE66F39808ABF35C00323D32 /* bugpoint.pod */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = bugpoint.pod; sourceTree = ""; }; DE66F39908ABF35C00323D32 /* gccas.pod */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = gccas.pod; sourceTree = ""; }; @@ -829,7 +799,6 @@ DE66F3B908ABF35D00323D32 /* CommandLine.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = CommandLine.html; sourceTree = ""; }; DE66F3BA08ABF35D00323D32 /* CompilerDriver.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = CompilerDriver.html; sourceTree = ""; }; DE66F3BB08ABF35D00323D32 /* CompilerWriterInfo.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = CompilerWriterInfo.html; sourceTree = ""; }; - DE66F3BC08ABF35D00323D32 /* doxygen.cfg */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = doxygen.cfg; sourceTree = ""; }; DE66F3BD08ABF35D00323D32 /* doxygen.cfg.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = doxygen.cfg.in; sourceTree = ""; }; DE66F3BE08ABF35D00323D32 /* doxygen.css */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = doxygen.css; sourceTree = ""; }; DE66F3BF08ABF35D00323D32 /* doxygen.footer */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = doxygen.footer; sourceTree = ""; }; @@ -1307,7 +1276,6 @@ DE66EEA508ABEE5E00323D32 /* AlphaInstrInfo.h */, DE66EEA608ABEE5E00323D32 /* AlphaInstrInfo.td */, DE66EEA708ABEE5E00323D32 /* AlphaISelPattern.cpp */, - DE66EEA808ABEE5E00323D32 /* AlphaISelPattern.cpp.orig */, DE66EEA908ABEE5E00323D32 /* AlphaJITInfo.cpp */, DE66EEAA08ABEE5E00323D32 /* AlphaJITInfo.h */, DE66EEAB08ABEE5E00323D32 /* AlphaRegisterInfo.cpp */, @@ -1355,7 +1323,6 @@ DE66EF1108ABEE5E00323D32 /* PowerPC */ = { isa = PBXGroup; children = ( - DE66EF1208ABEE5E00323D32 /* .cvsignore */, DE66EF3D08ABEE5F00323D32 /* LICENSE.TXT */, DE66EF3F08ABEE5F00323D32 /* PowerPC.h */, DE66EF4008ABEE5F00323D32 /* PowerPC.td */, @@ -1377,7 +1344,6 @@ DE66EF5708ABEE5F00323D32 /* PPC32InstrInfo.cpp */, DE66EF5808ABEE5F00323D32 /* PPC32InstrInfo.h */, DE66EF5908ABEE5F00323D32 /* PPC32ISelPattern.cpp */, - DE66EF5A08ABEE5F00323D32 /* PPC32ISelSimple.cpp */, DE66EF5B08ABEE5F00323D32 /* PPC32JITInfo.cpp */, DE66EF5C08ABEE5F00323D32 /* PPC32JITInfo.h */, DE66EF5D08ABEE5F00323D32 /* PPC32RegisterInfo.cpp */, @@ -1386,15 +1352,7 @@ DE66EF6008ABEE5F00323D32 /* PPC32Relocations.h */, DE66EF6108ABEE5F00323D32 /* PPC32TargetMachine.h */, DE66EF6208ABEE5F00323D32 /* PPC64.td */, - DE66EF6308ABEE5F00323D32 /* PPC64CodeEmitter.cpp */, - DE66EF6708ABEE5F00323D32 /* PPC64InstrInfo.cpp */, - DE66EF6808ABEE5F00323D32 /* PPC64InstrInfo.h */, - DE66EF6908ABEE5F00323D32 /* PPC64ISelPattern.cpp */, - DE66EF6A08ABEE5F00323D32 /* PPC64JITInfo.h */, - DE66EF6B08ABEE5F00323D32 /* PPC64RegisterInfo.cpp */, - DE66EF6C08ABEE5F00323D32 /* PPC64RegisterInfo.h */, DE66EF6D08ABEE5F00323D32 /* PPC64RegisterInfo.td */, - DE66EF6E08ABEE5F00323D32 /* PPC64TargetMachine.h */, DE66EF6F08ABEE5F00323D32 /* README.txt */, ); path = PowerPC; @@ -1403,7 +1361,6 @@ DE66EF7008ABEE5F00323D32 /* Skeleton */ = { isa = PBXGroup; children = ( - DE66EF7108ABEE5F00323D32 /* .cvsignore */, DE66EF8208ABEE5F00323D32 /* README.txt */, DE66EF8308ABEE5F00323D32 /* Skeleton.h */, DE66EF8408ABEE5F00323D32 /* Skeleton.td */, @@ -1454,7 +1411,6 @@ DE66F00F08ABEE6000323D32 /* LiveVar */, DE66F02608ABEE6000323D32 /* ModuloScheduling */, DE66F04608ABEE6000323D32 /* RegAlloc */, - DE66EFCA08ABEE5F00323D32 /* .cvsignore */, DE66EFFA08ABEE6000323D32 /* DecomposeMultiDimRefs.cpp */, DE66EFFB08ABEE6000323D32 /* EmitBytecodeToAssembly.cpp */, DE66F00E08ABEE6000323D32 /* InternalGlobalMapper.cpp */, @@ -1466,9 +1422,6 @@ DE66F02408ABEE6000323D32 /* MappingInfo.cpp */, DE66F02508ABEE6000323D32 /* MappingInfo.h */, DE66F06208ABEE6000323D32 /* SparcV9.burg.in */, - DE66F06308ABEE6000323D32 /* SparcV9.burg.in1 */, - DE66F06408ABEE6000323D32 /* SparcV9.burm */, - DE66F06508ABEE6000323D32 /* SparcV9.burm.cpp */, DE66F06608ABEE6000323D32 /* SparcV9.td */, DE66F06708ABEE6000323D32 /* SparcV9_F2.td */, DE66F06808ABEE6000323D32 /* SparcV9_F3.td */, @@ -1578,7 +1531,6 @@ DE66F09308ABEE6000323D32 /* X86 */ = { isa = PBXGroup; children = ( - DE66F09408ABEE6000323D32 /* .cvsignore */, DE66F0BC08ABEE6000323D32 /* X86.h */, DE66F0BD08ABEE6000323D32 /* X86.td */, DE66F0BE08ABEE6000323D32 /* X86AsmPrinter.cpp */, @@ -1595,8 +1547,6 @@ DE66F0D008ABEE6100323D32 /* X86IntelAsmPrinter.cpp */, DE66F0D108ABEE6100323D32 /* X86IntelAsmPrinter.h */, DE66F0D208ABEE6100323D32 /* X86ISelPattern.cpp */, - DE66F0D308ABEE6100323D32 /* X86ISelPattern.cpp.orig */, - DE66F0D408ABEE6100323D32 /* X86ISelSimple.cpp */, DE66F0D508ABEE6100323D32 /* X86JITInfo.cpp */, DE66F0D608ABEE6100323D32 /* X86JITInfo.h */, DE66F0D708ABEE6100323D32 /* X86PeepholeOpt.cpp */, @@ -1795,19 +1745,15 @@ DE66F1EB08ABF03100323D32 /* ADT */ = { isa = PBXGroup; children = ( - DE66F1EC08ABF03100323D32 /* .cvsignore */, DE66F1ED08ABF03100323D32 /* BitSetVector.h */, DE66F1EE08ABF03100323D32 /* DenseMap.h */, DE66F1EF08ABF03100323D32 /* DepthFirstIterator.h */, DE66F1F008ABF03100323D32 /* EquivalenceClasses.h */, DE66F1F108ABF03100323D32 /* GraphTraits.h */, - DE66F1F208ABF03100323D32 /* hash_map */, DE66F1F308ABF03100323D32 /* hash_map.in */, - DE66F1F408ABF03100323D32 /* hash_set */, DE66F1F508ABF03100323D32 /* hash_set.in */, DE66F1F608ABF03100323D32 /* HashExtras.h */, DE66F1F708ABF03100323D32 /* ilist */, - DE66F1F808ABF03100323D32 /* iterator */, DE66F1F908ABF03100323D32 /* iterator.in */, DE66F1FA08ABF03100323D32 /* PostOrderIterator.h */, DE66F1FB08ABF03100323D32 /* SCCIterator.h */, @@ -1925,9 +1871,7 @@ DE66F24C08ABF03100323D32 /* Config */ = { isa = PBXGroup; children = ( - DE66F24D08ABF03100323D32 /* .cvsignore */, DE66F24E08ABF03100323D32 /* alloca.h */, - DE66F24F08ABF03100323D32 /* config.h */, DE66F25008ABF03100323D32 /* config.h.in */, ); path = Config; @@ -1958,7 +1902,6 @@ DE66F26E08ABF03200323D32 /* Support */ = { isa = PBXGroup; children = ( - DE66F26F08ABF03200323D32 /* .cvsignore */, DE66F27008ABF03200323D32 /* AIXDataTypesFix.h */, DE66F27108ABF03200323D32 /* Annotation.h */, DE66F27208ABF03200323D32 /* CallSite.h */, @@ -1967,7 +1910,6 @@ DE66F27508ABF03200323D32 /* CommandLine.h */, DE66F27608ABF03200323D32 /* Compressor.h */, DE66F27708ABF03200323D32 /* ConstantRange.h */, - DE66F27808ABF03200323D32 /* DataTypes.h */, DE66F27908ABF03200323D32 /* DataTypes.h.in */, DE66F27A08ABF03200323D32 /* Debug.h */, DE66F27B08ABF03200323D32 /* DOTGraphTraits.h */, @@ -1985,10 +1927,10 @@ DE66F28708ABF03200323D32 /* PassNameParser.h */, DE66F28808ABF03200323D32 /* PatternMatch.h */, DE66F28908ABF03200323D32 /* PluginLoader.h */, + CFB4CABE08BE01F50035DBBF /* Search.h */, DE66F28A08ABF03200323D32 /* SlowOperationInformer.h */, DE66F28B08ABF03200323D32 /* StableBasicBlockNumbering.h */, DE66F28C08ABF03200323D32 /* SystemUtils.h */, - DE66F28D08ABF03200323D32 /* ThreadSupport.h */, DE66F28E08ABF03200323D32 /* Timer.h */, DE66F28F08ABF03200323D32 /* ToolRunner.h */, DE66F29008ABF03200323D32 /* type_traits.h */, @@ -2148,7 +2090,6 @@ DE66F36908ABF14500323D32 /* c */, DE66F36A08ABF14500323D32 /* CompilerDriver.cpp */, DE66F36B08ABF14500323D32 /* CompilerDriver.h */, - DE66F36C08ABF14500323D32 /* ConfigLexer.cpp */, DE66F36D08ABF14500323D32 /* ConfigLexer.h */, DE66F36E08ABF14500323D32 /* ConfigLexer.l */, DE66F36F08ABF14500323D32 /* Configuration.cpp */, @@ -2163,7 +2104,6 @@ DE66F38D08ABF35C00323D32 /* docs */ = { isa = PBXGroup; children = ( - DE66F38E08ABF35C00323D32 /* .cvsignore */, DE66F38F08ABF35C00323D32 /* AliasAnalysis.html */, DE66F39008ABF35C00323D32 /* Bugpoint.html */, DE66F39108ABF35C00323D32 /* BytecodeFormat.html */, @@ -2174,7 +2114,6 @@ DE66F3B908ABF35D00323D32 /* CommandLine.html */, DE66F3BA08ABF35D00323D32 /* CompilerDriver.html */, DE66F3BB08ABF35D00323D32 /* CompilerWriterInfo.html */, - DE66F3BC08ABF35D00323D32 /* doxygen.cfg */, DE66F3BD08ABF35D00323D32 /* doxygen.cfg.in */, DE66F3BE08ABF35D00323D32 /* doxygen.css */, DE66F3BF08ABF35D00323D32 /* doxygen.footer */, @@ -2212,7 +2151,6 @@ DE66F39508ABF35C00323D32 /* CommandGuide */ = { isa = PBXGroup; children = ( - DE66F39608ABF35C00323D32 /* .cvsignore */, DE66F39708ABF35C00323D32 /* analyze.pod */, DE66F39808ABF35C00323D32 /* bugpoint.pod */, DE66F39908ABF35C00323D32 /* gccas.pod */, @@ -2282,11 +2220,11 @@ PRODUCT_NAME = LLVM; }; buildToolPath = /usr/bin/make; - buildWorkingDirectory = ..; + buildWorkingDirectory = /llvm/obj; dependencies = ( ); name = LLVM; - passBuildSettingsInEnvironment = 1; + passBuildSettingsInEnvironment = 0; productName = LLVM; }; /* End PBXLegacyTarget section */ From llvm at cs.uiuc.edu Thu Aug 25 11:22:08 2005 From: llvm at cs.uiuc.edu (LLVM) Date: Thu, 25 Aug 2005 11:22:08 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/Search.h Message-ID: <200508251622.LAA07134@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: Search.h (r1.1) removed --- Log message: Recommended to use std::algorithms instead. --- Diffs of the changes: (+0 -0) 0 files changed From jlaskey at apple.com Thu Aug 25 11:44:25 2005 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 25 Aug 2005 11:44:25 -0500 Subject: [llvm-commits] CVS: llvm/Xcode/LLVM.xcodeproj/project.pbxproj Message-ID: <200508251644.LAA07189@zion.cs.uiuc.edu> Changes in directory llvm/Xcode/LLVM.xcodeproj: project.pbxproj updated: 1.5 -> 1.6 --- Log message: Remove Support/Search.h entry --- Diffs of the changes: (+1 -3) project.pbxproj | 4 +--- 1 files changed, 1 insertion(+), 3 deletions(-) Index: llvm/Xcode/LLVM.xcodeproj/project.pbxproj diff -u llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.5 llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.6 --- llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.5 Thu Aug 25 08:42:04 2005 +++ llvm/Xcode/LLVM.xcodeproj/project.pbxproj Thu Aug 25 11:44:13 2005 @@ -33,7 +33,6 @@ /* End PBXBuildStyle section */ /* Begin PBXFileReference section */ - CFB4CABE08BE01F50035DBBF /* Search.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Search.h; sourceTree = ""; }; DE66EC5B08ABE86900323D32 /* AsmWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AsmWriter.cpp; path = ../lib/VMCore/AsmWriter.cpp; sourceTree = SOURCE_ROOT; }; DE66EC5C08ABE86A00323D32 /* BasicBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = BasicBlock.cpp; path = ../lib/VMCore/BasicBlock.cpp; sourceTree = SOURCE_ROOT; }; DE66EC5D08ABE86A00323D32 /* ConstantFolding.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ConstantFolding.cpp; path = ../lib/VMCore/ConstantFolding.cpp; sourceTree = SOURCE_ROOT; }; @@ -1927,7 +1926,6 @@ DE66F28708ABF03200323D32 /* PassNameParser.h */, DE66F28808ABF03200323D32 /* PatternMatch.h */, DE66F28908ABF03200323D32 /* PluginLoader.h */, - CFB4CABE08BE01F50035DBBF /* Search.h */, DE66F28A08ABF03200323D32 /* SlowOperationInformer.h */, DE66F28B08ABF03200323D32 /* StableBasicBlockNumbering.h */, DE66F28C08ABF03200323D32 /* SystemUtils.h */, @@ -2210,7 +2208,7 @@ /* Begin PBXLegacyTarget section */ D28A88AD04BDD90700651E21 /* LLVM */ = { isa = PBXLegacyTarget; - buildArgumentsString = "$(ACTION)"; + buildArgumentsString = "$(ACTION) -j 4"; buildConfigurationList = DE66EC4C08ABE78900323D32 /* Build configuration list for PBXLegacyTarget "LLVM" */; buildPhases = ( ); From lattner at cs.uiuc.edu Thu Aug 25 12:06:45 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:06:45 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/ValueTypes.h Message-ID: <200508251706.MAA07399@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: ValueTypes.h updated: 1.11 -> 1.12 --- Log message: add an enum value --- Diffs of the changes: (+2 -1) ValueTypes.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/ValueTypes.h diff -u llvm/include/llvm/CodeGen/ValueTypes.h:1.11 llvm/include/llvm/CodeGen/ValueTypes.h:1.12 --- llvm/include/llvm/CodeGen/ValueTypes.h:1.11 Thu Apr 21 15:38:00 2005 +++ llvm/include/llvm/CodeGen/ValueTypes.h Thu Aug 25 12:06:34 2005 @@ -40,8 +40,9 @@ f64 = 8, // This is a 64 bit floating point value f80 = 9, // This is a 80 bit floating point value f128 = 10, // This is a 128 bit floating point value + Flag = 11, // This is a condition code or machine flag. - isVoid = 11, // This has no value + isVoid = 12, // This has no value LAST_VALUETYPE, // This always remains at the end of the list. }; From lattner at cs.uiuc.edu Thu Aug 25 12:07:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:07:20 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Target.td Message-ID: <200508251707.MAA07458@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: Target.td updated: 1.46 -> 1.47 --- Log message: add an enum value --- Diffs of the changes: (+3 -2) Target.td | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/Target/Target.td diff -u llvm/lib/Target/Target.td:1.46 llvm/lib/Target/Target.td:1.47 --- llvm/lib/Target/Target.td:1.46 Fri Aug 19 14:13:20 2005 +++ llvm/lib/Target/Target.td Thu Aug 25 12:07:09 2005 @@ -35,8 +35,9 @@ def f32 : ValueType<32 , 7>; // 32-bit floating point value def f64 : ValueType<64 , 8>; // 64-bit floating point value def f80 : ValueType<80 , 9>; // 80-bit floating point value -def f128 : ValueType<128, 9>; // 128-bit floating point value -def isVoid : ValueType<0 , 11>; // Produces no value +def f128 : ValueType<128, 10>; // 128-bit floating point value +def FlagVT : ValueType<0 , 11>; // Condition code or machine flag +def isVoid : ValueType<0 , 12>; // Produces no value //===----------------------------------------------------------------------===// // Register file description - These classes are used to fill in the target From lattner at cs.uiuc.edu Thu Aug 25 12:24:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:24:20 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200508251724.MAA07631@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.51 -> 1.52 --- Log message: add a method --- Diffs of the changes: (+10 -0) SelectionDAG.h | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.51 llvm/include/llvm/CodeGen/SelectionDAG.h:1.52 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.51 Thu Aug 25 00:02:41 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Thu Aug 25 12:24:09 2005 @@ -249,6 +249,16 @@ SDOperand Op1, SDOperand Op2) { return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2); } + SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1, + MVT::ValueType VT2, SDOperand Op1, SDOperand Op2) { + std::vector ResultTys; + ResultTys.push_back(VT1); + ResultTys.push_back(VT2); + std::vector Ops; + Ops.push_back(Op1); + Ops.push_back(Op2); + return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops); + } SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT, SDOperand Op1, SDOperand Op2, SDOperand Op3) { return getNode(ISD::BUILTIN_OP_END+Opcode, VT, Op1, Op2, Op3); From lattner at cs.uiuc.edu Thu Aug 25 12:49:05 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:49:05 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Message-ID: <200508251749.MAA11429@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.13 -> 1.14 --- Log message: Add support for flag operands --- Diffs of the changes: (+18 -8) ScheduleDAG.cpp | 26 ++++++++++++++++++-------- 1 files changed, 18 insertions(+), 8 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.13 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.14 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.13 Wed Aug 24 17:02:41 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Thu Aug 25 12:48:54 2005 @@ -76,14 +76,22 @@ unsigned Opc = Op.getTargetOpcode(); const TargetInstrDescriptor &II = TII.get(Opc); - // Target nodes have any register or immediate operands before any chain - // nodes. Check that the DAG matches the TD files's expectation of # - // operands. + // The results of target nodes have register or immediate operands first, + // then an optional chain, and optional flag operands (which do not go into + // the machine instrs). unsigned NumResults = Op.Val->getNumValues(); - if (NumResults && Op.Val->getValueType(NumResults-1) == MVT::Other) + while (NumResults && Op.Val->getValueType(NumResults-1) == MVT::Flag) --NumResults; + if (NumResults && Op.Val->getValueType(NumResults-1) == MVT::Other) + --NumResults; // Skip over chain result. + // The inputs to target nodes have any actual inputs first, followed by an + // optional chain operand, then flag operands. Compute the number of actual + // operands that will go into the machine instr. unsigned NodeOperands = Op.getNumOperands(); + while (NodeOperands && + Op.getOperand(NodeOperands-1).getValueType() == MVT::Flag) + --NodeOperands; if (NodeOperands && // Ignore chain if it exists. Op.getOperand(NodeOperands-1).getValueType() == MVT::Other) --NodeOperands; @@ -120,8 +128,9 @@ // include it because it is the most common and it makes the logic // simpler here. unsigned R = Emit(Op.getOperand(i)); - // Add an operand, unless this corresponds to a chain node. - if (Op.getOperand(i).getValueType() != MVT::Other) + // Add an operand, unless this corresponds to a chain or flag node. + MVT::ValueType VT = Op.getOperand(i).getValueType(); + if (VT != MVT::Other && VT != MVT::Flag) MI->addRegOperand(R, MachineOperand::Use); } else if (ConstantSDNode *C = dyn_cast(Op.getOperand(i))) { @@ -145,8 +154,9 @@ MI->addExternalSymbolOperand(ES->getSymbol(), false); } else { unsigned R = Emit(Op.getOperand(i)); - // Add an operand, unless this corresponds to a chain node. - if (Op.getOperand(i).getValueType() != MVT::Other) + // Add an operand, unless this corresponds to a chain or flag node. + MVT::ValueType VT = Op.getOperand(i).getValueType(); + if (VT != MVT::Other && VT != MVT::Flag) MI->addRegOperand(R, MachineOperand::Use); } } From lattner at cs.uiuc.edu Thu Aug 25 12:49:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:49:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200508251749.MAA11490@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.163 -> 1.164 --- Log message: fit in 80 cols --- Diffs of the changes: (+1 -1) PPC32ISelPattern.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.163 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.164 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.163 Wed Aug 24 18:08:16 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Thu Aug 25 12:49:31 2005 @@ -1522,7 +1522,7 @@ if (Tmp3 == 0) { Tmp1 = SelectExpr(Node->getOperand(0)); switch (CC) { - default: Node->dump(); assert(0 && "Unhandled SetCC condition"); abort(); + default: Node->dump(); assert(0 && "Unhandled SetCC condition");abort(); case ISD::SETEQ: Tmp2 = MakeIntReg(); BuildMI(BB, PPC::CNTLZW, 1, Tmp2).addReg(Tmp1); From lattner at cs.uiuc.edu Thu Aug 25 12:50:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:50:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508251750.MAA11528@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.29 -> 1.30 --- Log message: Add support for sdiv by 2^k and -2^k. Producing code like: _test: srawi r2, r3, 2 addze r3, r2 blr --- Diffs of the changes: (+27 -1) PPC32ISelDAGToDAG.cpp | 28 +++++++++++++++++++++++++++- 1 files changed, 27 insertions(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.29 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.30 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.29 Thu Aug 25 00:04:11 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 12:50:06 2005 @@ -695,10 +695,36 @@ case MVT::f32: Opc = PPC::FMULS; break; case MVT::f64: Opc = PPC::FMUL; break; } - CurDAG->SelectNodeTo(N, N->getValueType(0), Opc, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, MVT::i32, Opc, Select(N->getOperand(0)), Select(N->getOperand(1))); break; } + case ISD::SDIV: { + unsigned Imm; + if (isIntImmediate(N->getOperand(1), Imm)) { + if ((signed)Imm > 0 && isPowerOf2_32(Imm)) { + SDOperand Op = + CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag, + Select(N->getOperand(0)), + getI32Imm(Log2_32(Imm))); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::ADDZE, + Op.getValue(0), Op.getValue(1)); + break; + } else if ((signed)Imm < 0 && isPowerOf2_32(-Imm)) { + SDOperand Op = + CurDAG->getTargetNode(PPC::SRAWI, MVT::Flag, MVT::i32, + Select(N->getOperand(0)), + getI32Imm(Log2_32(-Imm))); + SDOperand PT = + CurDAG->getTargetNode(PPC::ADDZE, MVT::i32, Op.getValue(1), + Op.getValue(0)); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::NEG, PT); + break; + } + } + assert(0 && "SDIV not implemented yet!"); + abort(); + } case ISD::MULHS: assert(N->getValueType(0) == MVT::i32); CurDAG->SelectNodeTo(N, MVT::i32, PPC::MULHW, Select(N->getOperand(0)), From lattner at cs.uiuc.edu Thu Aug 25 12:55:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:55:09 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508251755.MAA11574@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.164 -> 1.165 --- Log message: simplify the code a bit using isOperationLegal --- Diffs of the changes: (+3 -4) SelectionDAG.cpp | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.164 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.165 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.164 Thu Aug 25 00:03:06 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Aug 25 12:54:58 2005 @@ -897,13 +897,12 @@ // Check to see if this is the equivalent of setcc X, 0 if (N4C && N4C->isNullValue() && N3C && (N3C->getValue() == 1ULL)) { MVT::ValueType XType = N1.getValueType(); - if (TLI.getOperationAction(ISD::SETCC, TLI.getSetCCResultTy()) == - TargetLowering::Legal) { + if (TLI.isOperationLegal(ISD::SETCC, TLI.getSetCCResultTy())) return getSetCC(TLI.getSetCCResultTy(), N1, N2, CC); - } + // seteq X, 0 -> srl (ctlz X, log2(size(X))) if (N2C && N2C->isNullValue() && CC == ISD::SETEQ && - TLI.getOperationAction(ISD::CTLZ, XType) == TargetLowering::Legal) { + TLI.isOperationLegal(ISD::CTLZ, XType)) { SDOperand Ctlz = getNode(ISD::CTLZ, XType, N1); return getNode(ISD::SRL, XType, Ctlz, getConstant(Log2_32(MVT::getSizeInBits(XType)), From lattner at cs.uiuc.edu Thu Aug 25 12:59:35 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 12:59:35 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/ValueTypes.cpp Message-ID: <200508251759.MAA11609@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: ValueTypes.cpp updated: 1.3 -> 1.4 --- Log message: add printer support for flag operands --- Diffs of the changes: (+1 -0) ValueTypes.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/CodeGen/ValueTypes.cpp diff -u llvm/lib/CodeGen/ValueTypes.cpp:1.3 llvm/lib/CodeGen/ValueTypes.cpp:1.4 --- llvm/lib/CodeGen/ValueTypes.cpp:1.3 Thu Apr 21 17:33:33 2005 +++ llvm/lib/CodeGen/ValueTypes.cpp Thu Aug 25 12:59:23 2005 @@ -32,6 +32,7 @@ case MVT::f128: return "f128"; case MVT::isVoid:return "isVoid"; case MVT::Other: return "ch"; + case MVT::Flag: return "flag"; } } From lattner at cs.uiuc.edu Thu Aug 25 14:12:22 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 14:12:22 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508251912.OAA24872@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.165 -> 1.166 --- Log message: Don't auto-cse nodes that return flags --- Diffs of the changes: (+38 -17) SelectionDAG.cpp | 55 ++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 38 insertions(+), 17 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.165 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.166 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.165 Thu Aug 25 12:54:58 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Aug 25 14:12:10 2005 @@ -1021,9 +1021,14 @@ break; } - SDNode *&N = UnaryOps[std::make_pair(Opcode, std::make_pair(Operand, VT))]; - if (N) return SDOperand(N, 0); - N = new SDNode(Opcode, Operand); + SDNode *N; + if (VT != MVT::Flag) { // Don't CSE flag producing nodes + SDNode *&E = UnaryOps[std::make_pair(Opcode, std::make_pair(Operand, VT))]; + if (E) return SDOperand(N, 0); + E = N = new SDNode(Opcode, Operand); + } else { + N = new SDNode(Opcode, Operand); + } N->setValueTypes(VT); AllNodes.push_back(N); return SDOperand(N, 0); @@ -1582,7 +1587,8 @@ // Memoize this node if possible. SDNode *N; - if (Opcode != ISD::CALLSEQ_START && Opcode != ISD::CALLSEQ_END) { + if (Opcode != ISD::CALLSEQ_START && Opcode != ISD::CALLSEQ_END && + VT != MVT::Flag) { SDNode *&BON = BinaryOps[std::make_pair(Opcode, std::make_pair(N1, N2))]; if (BON) return SDOperand(BON, 0); @@ -1704,11 +1710,15 @@ Ops.push_back(N2); Ops.push_back(N3); - // Memoize nodes. - SDNode *&N = OneResultNodes[std::make_pair(Opcode, std::make_pair(VT, Ops))]; - if (N) return SDOperand(N, 0); - - N = new SDNode(Opcode, N1, N2, N3); + // Memoize node if it doesn't produce a flag. + SDNode *N; + if (VT != MVT::Flag) { + SDNode *&E = OneResultNodes[std::make_pair(Opcode,std::make_pair(VT, Ops))]; + if (E) return SDOperand(E, 0); + E = N = new SDNode(Opcode, N1, N2, N3); + } else { + N = new SDNode(Opcode, N1, N2, N3); + } N->setValueTypes(VT); AllNodes.push_back(N); return SDOperand(N, 0); @@ -1833,9 +1843,15 @@ } // Memoize nodes. - SDNode *&N = OneResultNodes[std::make_pair(Opcode, std::make_pair(VT, Ops))]; - if (N) return SDOperand(N, 0); - N = new SDNode(Opcode, Ops); + SDNode *N; + if (VT != MVT::Flag) { + SDNode *&E = + OneResultNodes[std::make_pair(Opcode, std::make_pair(VT, Ops))]; + if (E) return SDOperand(E, 0); + E = N = new SDNode(Opcode, Ops); + } else { + N = new SDNode(Opcode, Ops); + } N->setValueTypes(VT); AllNodes.push_back(N); return SDOperand(N, 0); @@ -1888,11 +1904,16 @@ #endif } - // Memoize the node. - SDNode *&N = ArbitraryNodes[std::make_pair(Opcode, std::make_pair(ResultTys, - Ops))]; - if (N) return SDOperand(N, 0); - N = new SDNode(Opcode, Ops); + // Memoize the node unless it returns a flag. + SDNode *N; + if (ResultTys.back() != MVT::Flag) { + SDNode *&E = + ArbitraryNodes[std::make_pair(Opcode, std::make_pair(ResultTys, Ops))]; + if (E) return SDOperand(E, 0); + E = N = new SDNode(Opcode, Ops); + } else { + N = new SDNode(Opcode, Ops); + } N->setValueTypes(ResultTys); AllNodes.push_back(N); return SDOperand(N, 0); From natebegeman at mac.com Thu Aug 25 15:01:21 2005 From: natebegeman at mac.com (Nate Begeman) Date: Thu, 25 Aug 2005 15:01:21 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Message-ID: <200508252001.PAA31775@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelLowering.cpp updated: 1.6 -> 1.7 --- Log message: Remove option to make SetCC illegal on PowerPC after long discussion with Chris. This will be accomplished through correctly modeling CR's and subregs. --- Diffs of the changes: (+0 -11) PPC32ISelLowering.cpp | 11 ----------- 1 files changed, 11 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.6 llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.7 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.6 Tue Aug 23 00:45:10 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Thu Aug 25 15:01:10 2005 @@ -17,15 +17,8 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Function.h" -#include "llvm/Support/CommandLine.h" - using namespace llvm; -namespace llvm { - cl::opt SetCCIllegal("ppc-setcc-is-illegal", cl::Hidden, - cl::desc("Make ISD::SETCC illegal on PowerPC")); -} - PPC32TargetLowering::PPC32TargetLowering(TargetMachine &TM) : TargetLowering(TM) { @@ -84,10 +77,6 @@ setOperationAction(ISD::SINT_TO_FP, MVT::i32, Expand); setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand); - // PowerPC does not have SETCC - if (SetCCIllegal) - setOperationAction(ISD::SETCC, MVT::i32, Expand); - setSetCCResultContents(ZeroOrOneSetCCResult); addLegalFPImmediate(+0.0); // Necessary for FSEL addLegalFPImmediate(-0.0); // From natebegeman at mac.com Thu Aug 25 15:02:25 2005 From: natebegeman at mac.com (Nate Begeman) Date: Thu, 25 Aug 2005 15:02:25 -0500 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200508252002.PAA31821@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.165 -> 1.166 --- Log message: Turn off LLCBETA for PPC --- Diffs of the changes: (+1 -1) Makefile.programs | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.165 llvm-test/Makefile.programs:1.166 --- llvm-test/Makefile.programs:1.165 Tue Aug 23 00:44:37 2005 +++ llvm-test/Makefile.programs Thu Aug 25 15:02:14 2005 @@ -187,7 +187,7 @@ endif#DISABLE_DIFFS ifeq ($(ARCH),PowerPC) -LLCBETAOPTION := -ppc-setcc-is-illegal +LLCBETAOPTION := endif ifeq ($(ARCH),Alpha) LLCBETAOPTION := -enable-alpha-FTOI -enable-lsr-for-alpha From natebegeman at mac.com Thu Aug 25 15:04:49 2005 From: natebegeman at mac.com (Nate Begeman) Date: Thu, 25 Aug 2005 15:04:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508252004.PAA31838@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.166 -> 1.167 --- Log message: New fold for SELECT_CC --- Diffs of the changes: (+19 -1) SelectionDAG.cpp | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.166 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.167 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.166 Thu Aug 25 14:12:10 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Aug 25 15:04:38 2005 @@ -843,6 +843,7 @@ SDOperand N3, SDOperand N4, ISD::CondCode CC) { MVT::ValueType VT = N3.getValueType(); + ConstantSDNode *N1C = dyn_cast(N1.Val); ConstantSDNode *N2C = dyn_cast(N2.Val); ConstantSDNode *N3C = dyn_cast(N3.Val); ConstantSDNode *N4C = dyn_cast(N4.Val); @@ -865,6 +866,23 @@ } } + // check to see if we're select_cc'ing a select_cc. + // this allows us to turn: + // select_cc set[eq,ne] (select_cc cc, lhs, rhs, 1, 0), 0, true, false -> + // select_cc cc, lhs, rhs, true, false + if ((N1C && N1C->isNullValue() && N2.getOpcode() == ISD::SELECT_CC) || + (N2C && N2C->isNullValue() && N1.getOpcode() == ISD::SELECT_CC) && + (CC == ISD::SETEQ || CC == ISD::SETNE)) { + SDOperand SCC = N1C ? N2 : N1; + ConstantSDNode *SCCT = dyn_cast(SCC.getOperand(2)); + ConstantSDNode *SCCF = dyn_cast(SCC.getOperand(3)); + if (SCCT && SCCF && SCCF->isNullValue() && SCCT->getValue() == 1ULL) { + if (CC == ISD::SETEQ) std::swap(N3, N4); + return getNode(ISD::SELECT_CC, N3.getValueType(), SCC.getOperand(0), + SCC.getOperand(1), N3, N4, SCC.getOperand(4)); + } + } + // Check to see if we can perform the "gzip trick", transforming // select_cc setlt X, 0, A, 0 -> and (sra X, size(X)-1), A if (N2C && N2C->isNullValue() && N4C && N4C->isNullValue() && @@ -894,7 +912,7 @@ } } - // Check to see if this is the equivalent of setcc X, 0 + // Check to see if this is the equivalent of setcc if (N4C && N4C->isNullValue() && N3C && (N3C->getValue() == 1ULL)) { MVT::ValueType XType = N1.getValueType(); if (TLI.isOperationLegal(ISD::SETCC, TLI.getSetCCResultTy())) From lattner at cs.uiuc.edu Thu Aug 25 15:08:30 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 15:08:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508252008.PAA31911@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.30 -> 1.31 --- Log message: implement setcc on the G5. We're still missing the non-g5 specific bits, but they will come later. --- Diffs of the changes: (+121 -0) PPC32ISelDAGToDAG.cpp | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 121 insertions(+) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.30 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.31 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.30 Thu Aug 25 12:50:06 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 15:08:18 2005 @@ -460,6 +460,25 @@ return 0; } +/// getCRIdxForSetCC - Return the index of the condition register field +/// associated with the SetCC condition, and whether or not the field is +/// treated as inverted. That is, lt = 0; ge = 0 inverted. +static unsigned getCRIdxForSetCC(ISD::CondCode CC, bool& Inv) { + switch (CC) { + default: assert(0 && "Unknown condition!"); abort(); + case ISD::SETULT: + case ISD::SETLT: Inv = false; return 0; + case ISD::SETUGE: + case ISD::SETGE: Inv = true; return 0; + case ISD::SETUGT: + case ISD::SETGT: Inv = false; return 1; + case ISD::SETULE: + case ISD::SETLE: Inv = true; return 1; + case ISD::SETEQ: Inv = false; return 2; + case ISD::SETNE: Inv = true; return 2; + } + return 0; +} // Select - Convert the specified operand from a target-independent to a // target-specific node if it hasn't already been changed. @@ -990,6 +1009,108 @@ AddrOp1, AddrOp2, Select(N->getOperand(0))); break; } + + case ISD::SETCC: { + unsigned Imm; + ISD::CondCode CC = cast(N->getOperand(2))->get(); + if (isIntImmediate(N->getOperand(1), Imm)) { + // We can codegen setcc op, imm very efficiently compared to a brcond. + // Check for those cases here. + // setcc op, 0 + if (Imm == 0) { + SDOperand Op = Select(N->getOperand(0)); + switch (CC) { + default: assert(0 && "Unhandled SetCC condition"); abort(); + case ISD::SETEQ: + Op = CurDAG->getTargetNode(PPC::CNTLZW, MVT::i32, Op); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Op, getI32Imm(27), + getI32Imm(5), getI32Imm(31)); + break; + case ISD::SETNE: { + SDOperand AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, + Op, getI32Imm(~0U)); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::SUBFE, AD, Op, AD.getValue(1)); + break; + } + case ISD::SETLT: + CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Op, getI32Imm(1), + getI32Imm(31), getI32Imm(31)); + break; + case ISD::SETGT: { + SDOperand T = CurDAG->getTargetNode(PPC::NEG, MVT::i32, Op); + T = CurDAG->getTargetNode(PPC::ANDC, MVT::i32, T, Op);; + CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, T, getI32Imm(1), + getI32Imm(31), getI32Imm(31)); + break; + } + } + break; + } else if (Imm == ~0U) { // setcc op, -1 + SDOperand Op = Select(N->getOperand(0)); + switch (CC) { + default: assert(0 && "Unhandled SetCC condition"); abort(); + case ISD::SETEQ: + Op = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, + Op, getI32Imm(1)); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::ADDZE, + CurDAG->getTargetNode(PPC::LI, MVT::i32, + getI32Imm(0)), + Op.getValue(1)); + break; + case ISD::SETNE: { + Op = CurDAG->getTargetNode(PPC::NOR, MVT::i32, Op, Op); + SDOperand AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, Op, + getI32Imm(~0U)); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::SUBFE, AD, Op, AD.getValue(1)); + break; + } + case ISD::SETLT: { + SDOperand AD = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, Op, + getI32Imm(1)); + SDOperand AN = CurDAG->getTargetNode(PPC::AND, MVT::i32, AD, Op); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, AN, getI32Imm(1), + getI32Imm(31), getI32Imm(31)); + break; + } + case ISD::SETGT: + Op = CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, Op, getI32Imm(1), + getI32Imm(31), getI32Imm(31)); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::XORI, Op, getI32Imm(1)); + break; + } + break; + } + } + + bool Inv; + unsigned Idx = getCRIdxForSetCC(CC, Inv); + SDOperand CCReg = + SelectCC(Select(N->getOperand(0)), Select(N->getOperand(1)), CC); + SDOperand IntCR; + if (TLI.getTargetMachine().getSubtarget().isGigaProcessor()) { + IntCR = CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CCReg); + } else { + assert(0 && "Not imp yet!"); + // FIXME: HOW DO WE DO THIS?? +#if 0 + //SDOperand CR7Op = CurDAG->getCopyToReg(); + BuildMI(BB, PPC::MCRF, 1, PPC::CR7).addReg(CCReg); + BuildMI(BB, PPC::MFCR, 0, IntCR); +#endif + } + + if (!Inv) { + CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, IntCR, + getI32Imm(32-(3-Idx)), getI32Imm(31), getI32Imm(31)); + } else { + SDOperand Tmp = + CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, IntCR, + getI32Imm(32-(3-Idx)), getI32Imm(31),getI32Imm(31)); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::XORI, Tmp, getI32Imm(1)); + } + + break; + } case ISD::CALLSEQ_START: case ISD::CALLSEQ_END: { From lattner at cs.uiuc.edu Thu Aug 25 16:39:53 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 16:39:53 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508252139.QAA11070@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.31 -> 1.32 --- Log message: Implement setcc correctly for G5 and non-G5 systems --- Diffs of the changes: (+17 -11) PPC32ISelDAGToDAG.cpp | 28 +++++++++++++++++----------- 1 files changed, 17 insertions(+), 11 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.31 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.32 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.31 Thu Aug 25 15:08:18 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 16:39:42 2005 @@ -1087,17 +1087,23 @@ SDOperand CCReg = SelectCC(Select(N->getOperand(0)), Select(N->getOperand(1)), CC); SDOperand IntCR; - if (TLI.getTargetMachine().getSubtarget().isGigaProcessor()) { - IntCR = CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CCReg); - } else { - assert(0 && "Not imp yet!"); - // FIXME: HOW DO WE DO THIS?? -#if 0 - //SDOperand CR7Op = CurDAG->getCopyToReg(); - BuildMI(BB, PPC::MCRF, 1, PPC::CR7).addReg(CCReg); - BuildMI(BB, PPC::MFCR, 0, IntCR); -#endif - } + + // Force the ccreg into CR7. + SDOperand CR7Reg = CurDAG->getRegister(PPC::CR7, MVT::i32); + + std::vector VTs; + VTs.push_back(MVT::Other); + VTs.push_back(MVT::Flag); // NONSTANDARD CopyToReg node: defines a flag + std::vector Ops; + Ops.push_back(CurDAG->getEntryNode()); + Ops.push_back(CR7Reg); + Ops.push_back(CCReg); + CCReg = CurDAG->getNode(ISD::CopyToReg, VTs, Ops).getValue(1); + + if (TLI.getTargetMachine().getSubtarget().isGigaProcessor()) + IntCR = CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CR7Reg, CCReg); + else + IntCR = CurDAG->getTargetNode(PPC::MFCR, MVT::i32, CCReg); if (!Inv) { CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, IntCR, From lattner at cs.uiuc.edu Thu Aug 25 17:04:01 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 17:04:01 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200508252204.RAA12701@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.164 -> 1.165 --- Log message: Simplify some code. It's not clear why the UDIV expanded sequence doesn't work for large uint constants, but we'll keep the current behavior --- Diffs of the changes: (+7 -13) PPC32ISelPattern.cpp | 20 +++++++------------- 1 files changed, 7 insertions(+), 13 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.164 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.165 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.164 Thu Aug 25 12:49:31 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Thu Aug 25 17:03:50 2005 @@ -1375,29 +1375,23 @@ BuildMI(BB, PPC::ADDZE, 1, Tmp4).addReg(Tmp1); BuildMI(BB, PPC::NEG, 1, Result).addReg(Tmp4); return Result; + } else if (Tmp3) { + ExprMap.erase(N); + return SelectExpr(BuildSDIVSequence(N)); } } // fall thru case ISD::UDIV: // If this is a divide by constant, we can emit code using some magic // constants to implement it as a multiply instead. - if (isIntImmediate(N.getOperand(1), Tmp3)) { - if (opcode == ISD::SDIV) { - if ((signed)Tmp3 < -1 || (signed)Tmp3 > 1) { - ExprMap.erase(N); - return SelectExpr(BuildSDIVSequence(N)); - } - } else { - if ((signed)Tmp3 > 1) { - ExprMap.erase(N); - return SelectExpr(BuildUDIVSequence(N)); - } - } + if (isIntImmediate(N.getOperand(1), Tmp3) && (signed)Tmp3 > 1) { + ExprMap.erase(N); + return SelectExpr(BuildUDIVSequence(N)); } Tmp1 = SelectExpr(N.getOperand(0)); Tmp2 = SelectExpr(N.getOperand(1)); switch (DestType) { - default: assert(0 && "Unknown type to ISD::SDIV"); break; + default: assert(0 && "Unknown type to ISD::DIV"); break; case MVT::i32: Opc = (ISD::UDIV == opcode) ? PPC::DIVWU : PPC::DIVW; break; case MVT::f32: Opc = PPC::FDIVS; break; case MVT::f64: Opc = PPC::FDIV; break; From lattner at cs.uiuc.edu Thu Aug 25 17:04:41 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 17:04:41 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508252204.RAA12765@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.32 -> 1.33 --- Log message: Finish implementing SDIV/UDIV by copying over the majik constant code from ISelPattern --- Diffs of the changes: (+180 -3) PPC32ISelDAGToDAG.cpp | 183 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 180 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.32 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.33 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.32 Thu Aug 25 16:39:42 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 17:04:30 2005 @@ -79,6 +79,9 @@ /// operation. bool SelectAddr(SDOperand Addr, SDOperand &Op1, SDOperand &Op2); + SDOperand BuildSDIVSequence(SDNode *N); + SDOperand BuildUDIVSequence(SDNode *N); + /// InstructionSelectBasicBlock - This callback is invoked by /// SelectionDAGISel when it has created a SelectionDAG for us to codegen. virtual void InstructionSelectBasicBlock(SelectionDAG &DAG) { @@ -480,6 +483,149 @@ return 0; } +// Structure used to return the necessary information to codegen an SDIV as +// a multiply. +struct ms { + int m; // magic number + int s; // shift amount +}; + +struct mu { + unsigned int m; // magic number + int a; // add indicator + int s; // shift amount +}; + +/// magic - calculate the magic numbers required to codegen an integer sdiv as +/// a sequence of multiply and shifts. Requires that the divisor not be 0, 1, +/// or -1. +static struct ms magic(int d) { + int p; + unsigned int ad, anc, delta, q1, r1, q2, r2, t; + const unsigned int two31 = 0x80000000U; + struct ms mag; + + ad = abs(d); + t = two31 + ((unsigned int)d >> 31); + anc = t - 1 - t%ad; // absolute value of nc + p = 31; // initialize p + q1 = two31/anc; // initialize q1 = 2p/abs(nc) + r1 = two31 - q1*anc; // initialize r1 = rem(2p,abs(nc)) + q2 = two31/ad; // initialize q2 = 2p/abs(d) + r2 = two31 - q2*ad; // initialize r2 = rem(2p,abs(d)) + do { + p = p + 1; + q1 = 2*q1; // update q1 = 2p/abs(nc) + r1 = 2*r1; // update r1 = rem(2p/abs(nc)) + if (r1 >= anc) { // must be unsigned comparison + q1 = q1 + 1; + r1 = r1 - anc; + } + q2 = 2*q2; // update q2 = 2p/abs(d) + r2 = 2*r2; // update r2 = rem(2p/abs(d)) + if (r2 >= ad) { // must be unsigned comparison + q2 = q2 + 1; + r2 = r2 - ad; + } + delta = ad - r2; + } while (q1 < delta || (q1 == delta && r1 == 0)); + + mag.m = q2 + 1; + if (d < 0) mag.m = -mag.m; // resulting magic number + mag.s = p - 32; // resulting shift + return mag; +} + +/// magicu - calculate the magic numbers required to codegen an integer udiv as +/// a sequence of multiply, add and shifts. Requires that the divisor not be 0. +static struct mu magicu(unsigned d) +{ + int p; + unsigned int nc, delta, q1, r1, q2, r2; + struct mu magu; + magu.a = 0; // initialize "add" indicator + nc = - 1 - (-d)%d; + p = 31; // initialize p + q1 = 0x80000000/nc; // initialize q1 = 2p/nc + r1 = 0x80000000 - q1*nc; // initialize r1 = rem(2p,nc) + q2 = 0x7FFFFFFF/d; // initialize q2 = (2p-1)/d + r2 = 0x7FFFFFFF - q2*d; // initialize r2 = rem((2p-1),d) + do { + p = p + 1; + if (r1 >= nc - r1 ) { + q1 = 2*q1 + 1; // update q1 + r1 = 2*r1 - nc; // update r1 + } + else { + q1 = 2*q1; // update q1 + r1 = 2*r1; // update r1 + } + if (r2 + 1 >= d - r2) { + if (q2 >= 0x7FFFFFFF) magu.a = 1; + q2 = 2*q2 + 1; // update q2 + r2 = 2*r2 + 1 - d; // update r2 + } + else { + if (q2 >= 0x80000000) magu.a = 1; + q2 = 2*q2; // update q2 + r2 = 2*r2 + 1; // update r2 + } + delta = d - 1 - r2; + } while (p < 64 && (q1 < delta || (q1 == delta && r1 == 0))); + magu.m = q2 + 1; // resulting magic number + magu.s = p - 32; // resulting shift + return magu; +} + +/// BuildSDIVSequence - Given an ISD::SDIV node expressing a divide by constant, +/// return a DAG expression to select that will generate the same value by +/// multiplying by a magic number. See: +/// +SDOperand PPC32DAGToDAGISel::BuildSDIVSequence(SDNode *N) { + int d = (int)cast(N->getOperand(1))->getValue(); + ms magics = magic(d); + // Multiply the numerator (operand 0) by the magic value + SDOperand Q = CurDAG->getNode(ISD::MULHS, MVT::i32, N->getOperand(0), + CurDAG->getConstant(magics.m, MVT::i32)); + // If d > 0 and m < 0, add the numerator + if (d > 0 && magics.m < 0) + Q = CurDAG->getNode(ISD::ADD, MVT::i32, Q, N->getOperand(0)); + // If d < 0 and m > 0, subtract the numerator. + if (d < 0 && magics.m > 0) + Q = CurDAG->getNode(ISD::SUB, MVT::i32, Q, N->getOperand(0)); + // Shift right algebraic if shift value is nonzero + if (magics.s > 0) + Q = CurDAG->getNode(ISD::SRA, MVT::i32, Q, + CurDAG->getConstant(magics.s, MVT::i32)); + // Extract the sign bit and add it to the quotient + SDOperand T = + CurDAG->getNode(ISD::SRL, MVT::i32, Q, CurDAG->getConstant(31, MVT::i32)); + return CurDAG->getNode(ISD::ADD, MVT::i32, Q, T); +} + +/// BuildUDIVSequence - Given an ISD::UDIV node expressing a divide by constant, +/// return a DAG expression to select that will generate the same value by +/// multiplying by a magic number. See: +/// +SDOperand PPC32DAGToDAGISel::BuildUDIVSequence(SDNode *N) { + unsigned d = (unsigned)cast(N->getOperand(1))->getValue(); + mu magics = magicu(d); + // Multiply the numerator (operand 0) by the magic value + SDOperand Q = CurDAG->getNode(ISD::MULHU, MVT::i32, N->getOperand(0), + CurDAG->getConstant(magics.m, MVT::i32)); + if (magics.a == 0) { + return CurDAG->getNode(ISD::SRL, MVT::i32, Q, + CurDAG->getConstant(magics.s, MVT::i32)); + } else { + SDOperand NPQ = CurDAG->getNode(ISD::SUB, MVT::i32, N->getOperand(0), Q); + NPQ = CurDAG->getNode(ISD::SRL, MVT::i32, NPQ, + CurDAG->getConstant(1, MVT::i32)); + NPQ = CurDAG->getNode(ISD::ADD, MVT::i32, NPQ, Q); + return CurDAG->getNode(ISD::SRL, MVT::i32, NPQ, + CurDAG->getConstant(magics.s-1, MVT::i32)); + } +} + // Select - Convert the specified operand from a target-independent to a // target-specific node if it hasn't already been changed. SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { @@ -739,11 +885,42 @@ Op.getValue(0)); CurDAG->SelectNodeTo(N, MVT::i32, PPC::NEG, PT); break; + } else if (Imm) { + SDOperand Result = Select(BuildSDIVSequence(N)); + assert(Result.ResNo == 0); + CurDAG->ReplaceAllUsesWith(N, Result.Val); + N = Result.Val; + break; } } - assert(0 && "SDIV not implemented yet!"); - abort(); - } + + unsigned Opc; + switch (N->getValueType(0)) { + default: assert(0 && "Unknown type to ISD::SDIV"); break; + case MVT::i32: Opc = PPC::DIVW; break; + case MVT::f32: Opc = PPC::FDIVS; break; + case MVT::f64: Opc = PPC::FDIV; break; + } + CurDAG->SelectNodeTo(N, N->getValueType(0), Opc, Select(N->getOperand(0)), + Select(N->getOperand(1))); + break; + } + case ISD::UDIV: { + // If this is a divide by constant, we can emit code using some magic + // constants to implement it as a multiply instead. + unsigned Imm; + if (isIntImmediate(N->getOperand(1), Imm) && (signed)Imm > 1) { + SDOperand Result = Select(BuildUDIVSequence(N)); + assert(Result.ResNo == 0); + CurDAG->ReplaceAllUsesWith(N, Result.Val); + N = Result.Val; + break; + } + + CurDAG->SelectNodeTo(N, MVT::i32, PPC::DIVWU, Select(N->getOperand(0)), + Select(N->getOperand(1))); + break; + } case ISD::MULHS: assert(N->getValueType(0) == MVT::i32); CurDAG->SelectNodeTo(N, MVT::i32, PPC::MULHW, Select(N->getOperand(0)), From jlaskey at apple.com Thu Aug 25 17:52:55 2005 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 25 Aug 2005 17:52:55 -0500 Subject: [llvm-commits] CVS: llvm/docs/CommandLine.html Message-ID: <200508252252.RAA18818@zion.cs.uiuc.edu> Changes in directory llvm/docs: CommandLine.html updated: 1.35 -> 1.36 --- Log message: Documentation updated to include upcoming support for bit vector support (flags.) --- Diffs of the changes: (+87 -1) CommandLine.html | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 87 insertions(+), 1 deletion(-) Index: llvm/docs/CommandLine.html diff -u llvm/docs/CommandLine.html:1.35 llvm/docs/CommandLine.html:1.36 --- llvm/docs/CommandLine.html:1.35 Mon Aug 22 11:24:25 2005 +++ llvm/docs/CommandLine.html Thu Aug 25 17:52:43 2005 @@ -23,6 +23,7 @@ set of possibilities
  • Named alternatives
  • Parsing a list of options
  • +
  • Collecting options as a set of flags
  • Adding freeform text to help output
  • @@ -61,6 +62,7 @@ cl::ParseEnvironmentOptions function
  • The cl::opt class
  • The cl::list class
  • +
  • The cl::bits class
  • The cl::alias class
  • The cl::extrahelp class
  • @@ -693,6 +695,65 @@ + +
    + +

    Instead of collecting sets of options in a list, it is also possible to +gather information for enum values in a bit vector. The represention used by +the cl::bits class is an unsigned long +integer. An enum value is represented by a 0/1 in the enum's ordinal value bit +position. 1 indicating that the enum was specified, 0 otherwise. As each +specified value is parsed, the resulting enum's bit is set in the option's bit +vector:

    + +
    +  bits |= 1 << (unsigned)enum;
    +
    + +

    An option specified more than once is redundant as far as the result is +concerned. The argument position information is however updated.

    + +

    Reworking the above list example, we could replace +cl::list with cl::bits:

    + +
    +cl::bits<Opts> OptimizationBits(cl::desc("Available Optimizations:"),
    +  cl::values(
    +    clEnumVal(dce               , "Dead Code Elimination"),
    +    clEnumVal(constprop         , "Constant Propagation"),
    +   clEnumValN(inlining, "inline", "Procedure Integration"),
    +    clEnumVal(strip             , "Strip Symbols"),
    +  clEnumValEnd));
    +
    + +

    To test to see if constprop was specified, we can use the +cl:bits::isSet function:

    + +
    +  if (OptimizationBits.isSet(constprop)) {
    +    ...
    +  }
    +
    + +

    It's also possible to get the raw bit vector using the +cl::bits::getBits function:

    + +
    +  unsigned long bits = OptimizationBits.getBits();
    +
    + +

    Finally, if external storage is used, then the location specified must be of +type unsigned long. In all other ways a cl::bits option is morally equivalent to a cl::list option

    + +
    + + + + @@ -1508,6 +1569,31 @@ + +
    + +

    The cl::bits class is the class used to represent a list of command +line options in the form of a bit vector. It is also a templated class which +can take up to three arguments:

    + +
    +namespace cl {
    +  template <class DataType, class Storage = bool,
    +            class ParserClass = parser<DataType> >
    +  class bits;
    +}
    +
    + +

    This class works the exact same as the cl::lists class, except that the second argument +must be of type unsigned long if external storage is used.

    + +
    + + + @@ -1814,7 +1900,7 @@ Chris Lattner
    LLVM Compiler Infrastructure
    - Last modified: $Date: 2005/08/22 16:24:25 $ + Last modified: $Date: 2005/08/25 22:52:43 $ From jlaskey at apple.com Thu Aug 25 18:01:38 2005 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 25 Aug 2005 18:01:38 -0500 Subject: [llvm-commits] CVS: llvm/docs/CommandLine.html Message-ID: <200508252301.SAA18937@zion.cs.uiuc.edu> Changes in directory llvm/docs: CommandLine.html updated: 1.36 -> 1.37 --- Log message: Tweak of multiple occurance paragraph. --- Diffs of the changes: (+3 -3) CommandLine.html | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/docs/CommandLine.html diff -u llvm/docs/CommandLine.html:1.36 llvm/docs/CommandLine.html:1.37 --- llvm/docs/CommandLine.html:1.36 Thu Aug 25 17:52:43 2005 +++ llvm/docs/CommandLine.html Thu Aug 25 18:01:25 2005 @@ -712,8 +712,8 @@ bits |= 1 << (unsigned)enum; -

    An option specified more than once is redundant as far as the result is -concerned. The argument position information is however updated.

    +

    Options that are specified multiple times are redundant. Any instances after +the first are discarded.

    Reworking the above list example, we could replace cl::list with cl::bits:

    @@ -1900,7 +1900,7 @@ Chris Lattner
    LLVM Compiler Infrastructure
    - Last modified: $Date: 2005/08/25 22:52:43 $ + Last modified: $Date: 2005/08/25 23:01:25 $ From lattner at cs.uiuc.edu Thu Aug 25 18:20:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 18:20:09 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200508252320.SAA23431@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.165 -> 1.166 --- Log message: simplify the add/sub_parts code --- Diffs of the changes: (+24 -16) PPC32ISelPattern.cpp | 40 ++++++++++++++++++++++++---------------- 1 files changed, 24 insertions(+), 16 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.165 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.166 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.165 Thu Aug 25 17:03:50 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Thu Aug 25 18:19:58 2005 @@ -1384,7 +1384,7 @@ case ISD::UDIV: // If this is a divide by constant, we can emit code using some magic // constants to implement it as a multiply instead. - if (isIntImmediate(N.getOperand(1), Tmp3) && (signed)Tmp3 > 1) { + if (isIntImmediate(N.getOperand(1), Tmp3) && Tmp3) { ExprMap.erase(N); return SelectExpr(BuildUDIVSequence(N)); } @@ -1404,33 +1404,41 @@ assert(N.getNumOperands() == 4 && N.getValueType() == MVT::i32 && "Not an i64 add/sub!"); unsigned Tmp4 = 0; - bool ME = isIntImmediate(N.getOperand(3),Tmp3) && ((signed)Tmp3 == -1); - bool ZE = isIntImmediate(N.getOperand(3),Tmp3) && (Tmp3 == 0); - bool IM = isIntImmediate(N.getOperand(2),Tmp3) && ((signed)Tmp3 >= -32768 || - (signed)Tmp3 < 32768); Tmp1 = SelectExpr(N.getOperand(0)); Tmp2 = SelectExpr(N.getOperand(1)); - if (!IM || N.getOpcode() == ISD::SUB_PARTS) - Tmp3 = SelectExpr(N.getOperand(2)); - if ((!ME && !ZE) || N.getOpcode() == ISD::SUB_PARTS) - Tmp4 = SelectExpr(N.getOperand(3)); if (N.getOpcode() == ISD::ADD_PARTS) { - // Codegen the low 32 bits of the add. Interestingly, there is no shifted - // form of add immediate carrying. - if (IM) + bool ME, ZE; + if (isIntImmediate(N.getOperand(3), Tmp3)) { + ME = (signed)Tmp3 == -1; + ZE = Tmp3 == 0; + } + + if (!ZE && !ME) + Tmp4 = SelectExpr(N.getOperand(3)); + + if (isIntImmediate(N.getOperand(2), Tmp3) && + ((signed)Tmp3 >= -32768 || (signed)Tmp3 < 32768)) { + // Codegen the low 32 bits of the add. Interestingly, there is no + // shifted form of add immediate carrying. BuildMI(BB, PPC::ADDIC, 2, Result).addReg(Tmp1).addSImm(Tmp3); - else + } else { + Tmp3 = SelectExpr(N.getOperand(2)); BuildMI(BB, PPC::ADDC, 2, Result).addReg(Tmp1).addReg(Tmp3); + } + // Codegen the high 32 bits, adding zero, minus one, or the full value // along with the carry flag produced by addc/addic to tmp2. - if (ZE) + if (ZE) { BuildMI(BB, PPC::ADDZE, 1, Result+1).addReg(Tmp2); - else if (ME) + } else if (ME) { BuildMI(BB, PPC::ADDME, 1, Result+1).addReg(Tmp2); - else + } else { BuildMI(BB, PPC::ADDE, 2, Result+1).addReg(Tmp2).addReg(Tmp4); + } } else { + Tmp3 = SelectExpr(N.getOperand(2)); + Tmp4 = SelectExpr(N.getOperand(3)); BuildMI(BB, PPC::SUBFC, 2, Result).addReg(Tmp3).addReg(Tmp1); BuildMI(BB, PPC::SUBFE, 2, Result+1).addReg(Tmp4).addReg(Tmp2); } From lattner at cs.uiuc.edu Thu Aug 25 18:21:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 18:21:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508252321.SAA23474@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.33 -> 1.34 --- Log message: implement support for 64-bit add/sub, fix a broken assertion for 64-bit return. Allow the udiv breaker-upper to work with any non-zero constant operand. --- Diffs of the changes: (+58 -2) PPC32ISelDAGToDAG.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 58 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.33 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.34 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.33 Thu Aug 25 17:04:30 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 18:21:06 2005 @@ -909,7 +909,7 @@ // If this is a divide by constant, we can emit code using some magic // constants to implement it as a multiply instead. unsigned Imm; - if (isIntImmediate(N->getOperand(1), Imm) && (signed)Imm > 1) { + if (isIntImmediate(N->getOperand(1), Imm) && Imm) { SDOperand Result = Select(BuildUDIVSequence(N)); assert(Result.ResNo == 0); CurDAG->ReplaceAllUsesWith(N, Result.Val); @@ -1129,6 +1129,62 @@ Select(N->getOperand(0))); break; } + + case ISD::ADD_PARTS: { + SDOperand LHSL = Select(N->getOperand(0)); + SDOperand LHSH = Select(N->getOperand(1)); + + unsigned Imm; + bool ME, ZE; + if (isIntImmediate(N->getOperand(3), Imm)) { + ME = (signed)Imm == -1; + ZE = Imm == 0; + } + + std::vector Result; + SDOperand CarryFromLo; + if (isIntImmediate(N->getOperand(2), Imm) && + ((signed)Imm >= -32768 || (signed)Imm < 32768)) { + // Codegen the low 32 bits of the add. Interestingly, there is no + // shifted form of add immediate carrying. + CarryFromLo = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, + LHSL, getI32Imm(Imm)); + } else { + CarryFromLo = CurDAG->getTargetNode(PPC::ADDC, MVT::i32, MVT::Flag, + LHSL, Select(N->getOperand(2))); + } + Result.push_back(CarryFromLo); + CarryFromLo = CarryFromLo.getValue(1); + + // Codegen the high 32 bits, adding zero, minus one, or the full value + // along with the carry flag produced by addc/addic. + SDOperand ResultHi; + if (ZE) + ResultHi = CurDAG->getTargetNode(PPC::ADDZE, MVT::i32, LHSH, CarryFromLo); + else if (ME) + ResultHi = CurDAG->getTargetNode(PPC::ADDME, MVT::i32, LHSH, CarryFromLo); + else + ResultHi = CurDAG->getTargetNode(PPC::ADDE, MVT::i32, LHSH, + Select(N->getOperand(3)), CarryFromLo); + Result.push_back(ResultHi); + CurDAG->ReplaceAllUsesWith(N, Result); + return Result[Op.ResNo]; + } + case ISD::SUB_PARTS: { + SDOperand LHSL = Select(N->getOperand(0)); + SDOperand LHSH = Select(N->getOperand(1)); + SDOperand RHSL = Select(N->getOperand(2)); + SDOperand RHSH = Select(N->getOperand(3)); + + std::vector Result; + Result.push_back(CurDAG->getTargetNode(PPC::SUBFC, MVT::i32, MVT::Flag, + RHSL, LHSL)); + Result.push_back(CurDAG->getTargetNode(PPC::SUBFE, MVT::i32, RHSH, LHSH, + Result[0].getValue(1))); + CurDAG->ReplaceAllUsesWith(N, Result); + return Result[Op.ResNo]; + } + case ISD::LOAD: case ISD::EXTLOAD: case ISD::ZEXTLOAD: @@ -1419,7 +1475,7 @@ if (N->getNumOperands() > 2) { assert(N->getOperand(1).getValueType() == MVT::i32 && N->getOperand(2).getValueType() == MVT::i32 && - N->getNumOperands() == 2 && "Unknown two-register ret value!"); + N->getNumOperands() == 3 && "Unknown two-register ret value!"); Val = Select(N->getOperand(2)); Chain = CurDAG->getCopyToReg(Chain, PPC::R4, Val); } From jlaskey at apple.com Thu Aug 25 18:31:56 2005 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 25 Aug 2005 18:31:56 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/CommandLine.h Message-ID: <200508252331.SAA26964@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: CommandLine.h updated: 1.46 -> 1.47 --- Log message: Added cl::bits option type (bit vectors). See "Collecting options as a set of flags" in the Command Line doc. --- Diffs of the changes: (+182 -0) CommandLine.h | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 182 insertions(+) Index: llvm/include/llvm/Support/CommandLine.h diff -u llvm/include/llvm/Support/CommandLine.h:1.46 llvm/include/llvm/Support/CommandLine.h:1.47 --- llvm/include/llvm/Support/CommandLine.h:1.46 Wed Jul 27 00:53:43 2005 +++ llvm/include/llvm/Support/CommandLine.h Thu Aug 25 18:31:45 2005 @@ -984,6 +984,188 @@ }; //===----------------------------------------------------------------------===// +// bits_storage class + +// Default storage class definition: external storage. This implementation +// assumes the user will specify a variable to store the data into with the +// cl::location(x) modifier. +// +template +class bits_storage { + unsigned long *Location; // Where to store the bits... + + template + static unsigned Bit(const T &V) { + unsigned BitPos = (unsigned)V; + assert(BitPos < sizeof(unsigned long) * 8 && + "enum exceeds width of bit vector!"); + return 1 << BitPos; + } + +public: + bits_storage() : Location(0) {} + + bool setLocation(Option &O, unsigned long &L) { + if (Location) + return O.error(": cl::location(x) specified more than once!"); + Location = &L; + return false; + } + + template + void addValue(const T &V) { + assert(Location != 0 && "cl::location(...) not specified for a command " + "line option with external storage!"); + *Location |= Bit(V); + } + + unsigned long getBits() { return *Location; } + + template + bool isSet(const T &V) { + return (*Location & Bit(V)) != 0; + } +}; + + +// Define how to hold bits. Since we can inherit from a class, we do so. +// This makes us exactly compatible with the bits in all cases that it is used. +// +template +class bits_storage { + unsigned long Bits; // Where to store the bits... + + template + static unsigned Bit(const T &V) { + unsigned BitPos = (unsigned)V; + assert(BitPos < sizeof(unsigned long) * 8 && + "enum exceeds width of bit vector!"); + return 1 << BitPos; + } + +public: + template + void addValue(const T &V) { + Bits |= Bit(V); + } + + unsigned long getBits() { return Bits; } + + template + bool isSet(const T &V) { + return (Bits & Bit(V)) != 0; + } +}; + + +//===----------------------------------------------------------------------===// +// bits - A bit vector of command options. +// +template > +class bits : public Option, public bits_storage { + std::vector Positions; + ParserClass Parser; + + virtual enum NumOccurrences getNumOccurrencesFlagDefault() const { + return ZeroOrMore; + } + virtual enum ValueExpected getValueExpectedFlagDefault() const { + return Parser.getValueExpectedFlagDefault(); + } + + virtual bool handleOccurrence(unsigned pos, const char *ArgName, + const std::string &Arg) { + typename ParserClass::parser_data_type Val = + typename ParserClass::parser_data_type(); + if (Parser.parse(*this, ArgName, Arg, Val)) + return true; // Parse Error! + addValue(Val); + setPosition(pos); + Positions.push_back(pos); + return false; + } + + // Forward printing stuff to the parser... + virtual unsigned getOptionWidth() const {return Parser.getOptionWidth(*this);} + virtual void printOptionInfo(unsigned GlobalWidth) const { + Parser.printOptionInfo(*this, GlobalWidth); + } + + void done() { + addArgument(ArgStr); + Parser.initialize(*this); + } +public: + ParserClass &getParser() { return Parser; } + + unsigned getPosition(unsigned optnum) const { + assert(optnum < this->size() && "Invalid option index"); + return Positions[optnum]; + } + + // One option... + template + bits(const M0t &M0) { + apply(M0, this); + done(); + } + // Two options... + template + bits(const M0t &M0, const M1t &M1) { + apply(M0, this); apply(M1, this); + done(); + } + // Three options... + template + bits(const M0t &M0, const M1t &M1, const M2t &M2) { + apply(M0, this); apply(M1, this); apply(M2, this); + done(); + } + // Four options... + template + bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) { + apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); + done(); + } + // Five options... + template + bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, + const M4t &M4) { + apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); + apply(M4, this); + done(); + } + // Six options... + template + bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, + const M4t &M4, const M5t &M5) { + apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); + apply(M4, this); apply(M5, this); + done(); + } + // Seven options... + template + bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, + const M4t &M4, const M5t &M5, const M6t &M6) { + apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); + apply(M4, this); apply(M5, this); apply(M6, this); + done(); + } + // Eight options... + template + bits(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3, + const M4t &M4, const M5t &M5, const M6t &M6, const M7t &M7) { + apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this); + apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this); + done(); + } +}; + +//===----------------------------------------------------------------------===// // Aliased command line option (alias this name to a preexisting name) // From lattner at cs.uiuc.edu Thu Aug 25 18:37:00 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 18:37:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508252337.SAA28449@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.34 -> 1.35 --- Log message: Emit the lo/hi parts in the right order :) --- Diffs of the changes: (+1 -1) PPC32ISelDAGToDAG.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.34 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.35 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.34 Thu Aug 25 18:21:06 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 18:36:49 2005 @@ -1153,7 +1153,6 @@ CarryFromLo = CurDAG->getTargetNode(PPC::ADDC, MVT::i32, MVT::Flag, LHSL, Select(N->getOperand(2))); } - Result.push_back(CarryFromLo); CarryFromLo = CarryFromLo.getValue(1); // Codegen the high 32 bits, adding zero, minus one, or the full value @@ -1167,6 +1166,7 @@ ResultHi = CurDAG->getTargetNode(PPC::ADDE, MVT::i32, LHSH, Select(N->getOperand(3)), CarryFromLo); Result.push_back(ResultHi); + Result.push_back(CarryFromLo.getValue(0)); CurDAG->ReplaceAllUsesWith(N, Result); return Result[Op.ResNo]; } From lattner at cs.uiuc.edu Thu Aug 25 19:13:23 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 19:13:23 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508260013.TAA05122@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.167 -> 1.168 --- Log message: Fix a nasty bug from a previous patch of mine --- Diffs of the changes: (+1 -1) SelectionDAG.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.167 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.168 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.167 Thu Aug 25 15:04:38 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Aug 25 19:13:12 2005 @@ -1042,7 +1042,7 @@ SDNode *N; if (VT != MVT::Flag) { // Don't CSE flag producing nodes SDNode *&E = UnaryOps[std::make_pair(Opcode, std::make_pair(Operand, VT))]; - if (E) return SDOperand(N, 0); + if (E) return SDOperand(E, 0); E = N = new SDNode(Opcode, Operand); } else { N = new SDNode(Opcode, Operand); From lattner at cs.uiuc.edu Thu Aug 25 19:14:27 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 19:14:27 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200508260014.TAA06655@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.170 -> 1.171 --- Log message: Allow LowerOperation to return a null SDOperand in case it wants to lower some things given to it, but not all. --- Diffs of the changes: (+39 -21) LegalizeDAG.cpp | 60 ++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 39 insertions(+), 21 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.170 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.171 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.170 Wed Aug 24 11:35:28 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Aug 25 19:14:16 2005 @@ -1320,6 +1320,16 @@ switch (TLI.getOperationAction(Node->getOpcode(), MVT::Other)) { default: assert(0 && "This action not implemented for this operation!"); + case TargetLowering::Custom: { + SDOperand Tmp = + TLI.LowerOperation(DAG.getNode(Node->getOpcode(), MVT::Other, Tmp1, + Tmp2, Tmp3, Tmp4, Tmp5), DAG); + if (Tmp.Val) { + Result = LegalizeOp(Tmp); + break; + } + // FALLTHROUGH if the target thinks it is legal. + } case TargetLowering::Legal: if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || Tmp3 != Node->getOperand(2) || Tmp4 != Node->getOperand(3) || @@ -1363,14 +1373,6 @@ NeedsAnotherIteration = true; break; } - case TargetLowering::Custom: - std::vector Ops; - Ops.push_back(Tmp1); Ops.push_back(Tmp2); Ops.push_back(Tmp3); - Ops.push_back(Tmp4); Ops.push_back(Tmp5); - Result = DAG.getNode(Node->getOpcode(), MVT::Other, Ops); - Result = TLI.LowerOperation(Result, DAG); - Result = LegalizeOp(Result); - break; } break; } @@ -1817,14 +1819,21 @@ Node->getOpcode() == ISD::FP_TO_SINT); AddLegalizedOperand(Op, Result); return Result; + case TargetLowering::Custom: { + SDOperand Tmp = + DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1); + Tmp = TLI.LowerOperation(Tmp, DAG); + if (Tmp.Val) { + AddLegalizedOperand(Op, Tmp); + NeedsAnotherIteration = true; + return Result; + } else { + // The target thinks this is legal afterall. + break; + } + } case TargetLowering::Legal: break; - case TargetLowering::Custom: - Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1); - Result = TLI.LowerOperation(Result, DAG); - AddLegalizedOperand(Op, Result); - NeedsAnotherIteration = true; - return Result; } if (Tmp1 != Node->getOperand(0)) @@ -2746,9 +2755,13 @@ case TargetLowering::Legal: case TargetLowering::Expand: break; // This case is handled below. - case TargetLowering::Custom: - Source = DAG.getNode(ISD::SINT_TO_FP, DestTy, Source); - return LegalizeOp(TLI.LowerOperation(Source, DAG)); + case TargetLowering::Custom: { + SDOperand NV = TLI.LowerOperation(DAG.getNode(ISD::SINT_TO_FP, DestTy, + Source), DAG); + if (NV.Val) + return LegalizeOp(NV); + break; // The target decided this was legal after all + } } // Expand the source, then glue it back together for the call. We must expand @@ -3040,8 +3053,10 @@ // Now that the custom expander is done, expand the result, which is still // VT. - ExpandOp(Op, Lo, Hi); - break; + if (Op.Val) { + ExpandOp(Op, Lo, Hi); + break; + } } if (Node->getOperand(0).getValueType() == MVT::f32) @@ -3056,8 +3071,11 @@ LegalizeOp(Node->getOperand(0))); // Now that the custom expander is done, expand the result, which is still // VT. - ExpandOp(TLI.LowerOperation(Op, DAG), Lo, Hi); - break; + Op = TLI.LowerOperation(Op, DAG); + if (Op.Val) { + ExpandOp(Op, Lo, Hi); + break; + } } if (Node->getOperand(0).getValueType() == MVT::f32) From lattner at cs.uiuc.edu Thu Aug 25 19:24:10 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 19:24:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200508260024.TAA06737@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.171 -> 1.172 --- Log message: Add support for targets that want to custom expand select_cc in some cases. --- Diffs of the changes: (+24 -6) LegalizeDAG.cpp | 30 ++++++++++++++++++++++++------ 1 files changed, 24 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.171 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.172 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.171 Thu Aug 25 19:14:16 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Aug 25 19:23:59 2005 @@ -1113,12 +1113,30 @@ Tmp4 = LegalizeOp(Node->getOperand(3)); // False if (isTypeLegal(Node->getOperand(0).getValueType())) { - Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS - Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS - if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || - Tmp3 != Node->getOperand(2) || Tmp4 != Node->getOperand(3)) { - Result = DAG.getNode(ISD::SELECT_CC, Node->getValueType(0), Tmp1, Tmp2, - Tmp3, Tmp4, Node->getOperand(4)); + // Everything is legal, see if we should expand this op or something. + switch (TLI.getOperationAction(ISD::SELECT_CC, + Node->getOperand(0).getValueType())) { + default: assert(0 && "This action is not supported yet!"); + case TargetLowering::Custom: { + SDOperand Tmp = + TLI.LowerOperation(DAG.getNode(ISD::SELECT_CC, Node->getValueType(0), + Node->getOperand(0), + Node->getOperand(1), Tmp3, Tmp4, + Node->getOperand(5)), DAG); + if (Tmp.Val) { + Result = LegalizeOp(Tmp); + break; + } + } // FALLTHROUGH if the target can't lower this operation after all. + case TargetLowering::Legal: + Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS + Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS + if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || + Tmp3 != Node->getOperand(2) || Tmp4 != Node->getOperand(3)) { + Result = DAG.getNode(ISD::SELECT_CC, Node->getValueType(0), Tmp1, Tmp2, + Tmp3, Tmp4, Node->getOperand(4)); + } + break; } break; } else { From natebegeman at mac.com Thu Aug 25 19:28:12 2005 From: natebegeman at mac.com (Nate Begeman) Date: Thu, 25 Aug 2005 19:28:12 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508260028.TAA06762@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.35 -> 1.36 --- Log message: Implement SHL_PARTS and SRL_PARTS --- Diffs of the changes: (+38 -0) PPC32ISelDAGToDAG.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 38 insertions(+) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.35 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.36 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.35 Thu Aug 25 18:36:49 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 19:28:00 2005 @@ -1184,6 +1184,44 @@ CurDAG->ReplaceAllUsesWith(N, Result); return Result[Op.ResNo]; } + case ISD::SHL_PARTS: { + SDOperand HI = Select(N->getOperand(0)); + SDOperand LO = Select(N->getOperand(1)); + SDOperand SH = Select(N->getOperand(2)); + SDOperand SH_LO_R = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, SH, + getI32Imm(32)); + SDOperand SH_LO_L = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, SH, + getI32Imm((unsigned)-32)); + SDOperand HI_SHL = CurDAG->getTargetNode(PPC::SLW, MVT::i32, HI, SH); + SDOperand HI_LOR = CurDAG->getTargetNode(PPC::SRW, MVT::i32, LO, SH_LO_R); + SDOperand HI_LOL = CurDAG->getTargetNode(PPC::SLW, MVT::i32, LO, SH_LO_L); + SDOperand HI_OR = CurDAG->getTargetNode(PPC::OR, MVT::i32, HI_SHL, HI_LOR); + + std::vector Result; + Result.push_back(CurDAG->getTargetNode(PPC::SLW, MVT::i32, LO, SH)); + Result.push_back(CurDAG->getTargetNode(PPC::OR, MVT::i32, HI_OR, HI_LOL)); + CurDAG->ReplaceAllUsesWith(N, Result); + return Result[Op.ResNo]; + } + case ISD::SRL_PARTS: { + SDOperand HI = Select(N->getOperand(0)); + SDOperand LO = Select(N->getOperand(1)); + SDOperand SH = Select(N->getOperand(2)); + SDOperand SH_HI_L = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, SH, + getI32Imm(32)); + SDOperand SH_HI_R = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, SH, + getI32Imm((unsigned)-32)); + SDOperand LO_SHR = CurDAG->getTargetNode(PPC::SRW, MVT::i32, LO, SH); + SDOperand LO_HIL = CurDAG->getTargetNode(PPC::SLW, MVT::i32, HI, SH_HI_L); + SDOperand LO_HIR = CurDAG->getTargetNode(PPC::SRW, MVT::i32, HI, SH_HI_R); + SDOperand LO_OR = CurDAG->getTargetNode(PPC::OR, MVT::i32, LO_SHR, LO_HIL); + + std::vector Result; + Result.push_back(CurDAG->getTargetNode(PPC::OR, MVT::i32, LO_OR, LO_HIR)); + Result.push_back(CurDAG->getTargetNode(PPC::SRW, MVT::i32, HI, SH)); + CurDAG->ReplaceAllUsesWith(N, Result); + return Result[Op.ResNo]; + } case ISD::LOAD: case ISD::EXTLOAD: From natebegeman at mac.com Thu Aug 25 19:34:17 2005 From: natebegeman at mac.com (Nate Begeman) Date: Thu, 25 Aug 2005 19:34:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508260034.TAA06795@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.36 -> 1.37 --- Log message: SUBFIC produces two results, not one. --- Diffs of the changes: (+4 -4) PPC32ISelDAGToDAG.cpp | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.36 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.37 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.36 Thu Aug 25 19:28:00 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 25 19:34:06 2005 @@ -1188,8 +1188,8 @@ SDOperand HI = Select(N->getOperand(0)); SDOperand LO = Select(N->getOperand(1)); SDOperand SH = Select(N->getOperand(2)); - SDOperand SH_LO_R = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, SH, - getI32Imm(32)); + SDOperand SH_LO_R = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, MVT::Flag, + SH, getI32Imm(32)); SDOperand SH_LO_L = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, SH, getI32Imm((unsigned)-32)); SDOperand HI_SHL = CurDAG->getTargetNode(PPC::SLW, MVT::i32, HI, SH); @@ -1207,8 +1207,8 @@ SDOperand HI = Select(N->getOperand(0)); SDOperand LO = Select(N->getOperand(1)); SDOperand SH = Select(N->getOperand(2)); - SDOperand SH_HI_L = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, SH, - getI32Imm(32)); + SDOperand SH_HI_L = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, MVT::Flag, + SH, getI32Imm(32)); SDOperand SH_HI_R = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, SH, getI32Imm((unsigned)-32)); SDOperand LO_SHR = CurDAG->getTargetNode(PPC::SRW, MVT::i32, LO, SH); From lattner at cs.uiuc.edu Thu Aug 25 19:43:58 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 19:43:58 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200508260043.TAA06957@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.172 -> 1.173 --- Log message: the 5th operand is the 4th number --- Diffs of the changes: (+1 -1) LegalizeDAG.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.172 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.173 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.172 Thu Aug 25 19:23:59 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Aug 25 19:43:46 2005 @@ -1122,7 +1122,7 @@ TLI.LowerOperation(DAG.getNode(ISD::SELECT_CC, Node->getValueType(0), Node->getOperand(0), Node->getOperand(1), Tmp3, Tmp4, - Node->getOperand(5)), DAG); + Node->getOperand(4)), DAG); if (Tmp.Val) { Result = LegalizeOp(Tmp); break; From lattner at cs.uiuc.edu Thu Aug 25 19:52:57 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 25 Aug 2005 19:52:57 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp PPC32ISelLowering.h PPC32ISelPattern.cpp Message-ID: <200508260052.TAA09803@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelLowering.cpp updated: 1.7 -> 1.8 PPC32ISelLowering.h updated: 1.1 -> 1.2 PPC32ISelPattern.cpp updated: 1.166 -> 1.167 --- Log message: add initial support for converting select_cc -> fsel in the legalizer instead of in the backend. This currently handles fsel cases with registers, but doesn't have the 0.0 and -0.0 optimization enabled yet. Once this is finished, special hack for fp immediates can go away. --- Diffs of the changes: (+67 -2) PPC32ISelLowering.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++-- PPC32ISelLowering.h | 4 +++ PPC32ISelPattern.cpp | 6 +++++ 3 files changed, 67 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.7 llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.8 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.7 Thu Aug 25 15:01:10 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Thu Aug 25 19:52:45 2005 @@ -17,8 +17,15 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Function.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; +namespace llvm { + cl::opt FSELTMP("ppc-fsel-custom-legalizer", cl::Hidden, + cl::desc("Use a custom expander for fsel on ppc")); +} + + PPC32TargetLowering::PPC32TargetLowering(TargetMachine &TM) : TargetLowering(TM) { @@ -65,6 +72,12 @@ setOperationAction(ISD::SELECT, MVT::i32, Expand); setOperationAction(ISD::SELECT, MVT::f32, Expand); setOperationAction(ISD::SELECT, MVT::f64, Expand); + + // PowerPC wants to turn select_cc of FP into fsel. + if (FSELTMP) { + setOperationAction(ISD::SELECT_CC, MVT::f32, Custom); + setOperationAction(ISD::SELECT_CC, MVT::f64, Custom); + } // PowerPC does not have BRCOND* which requires SetCC setOperationAction(ISD::BRCOND, MVT::Other, Expand); @@ -78,12 +91,54 @@ setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand); setSetCCResultContents(ZeroOrOneSetCCResult); - addLegalFPImmediate(+0.0); // Necessary for FSEL - addLegalFPImmediate(-0.0); // + if (!FSELTMP) { + addLegalFPImmediate(+0.0); // Necessary for FSEL + addLegalFPImmediate(-0.0); // + } computeRegisterProperties(); } +/// LowerOperation - Provide custom lowering hooks for some operations. +/// +SDOperand PPC32TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { + switch (Op.getOpcode()) { + default: assert(0 && "Wasn't expecting to be able to lower this!"); + case ISD::SELECT_CC: + // Turn FP only select_cc's into fsel instructions. + if (MVT::isFloatingPoint(Op.getOperand(0).getValueType()) && + MVT::isFloatingPoint(Op.getOperand(2).getValueType())) { + ISD::CondCode CC = cast(Op.getOperand(4))->get(); + MVT::ValueType ResVT = Op.getValueType(); + MVT::ValueType CmpVT = Op.getOperand(0).getValueType(); + SDOperand LHS = Op.getOperand(0), RHS = Op.getOperand(1); + SDOperand TV = Op.getOperand(2), FV = Op.getOperand(3); + + switch (CC) { + default: assert(0 && "Invalid FSEL condition"); abort(); + case ISD::SETULT: + case ISD::SETLT: + return DAG.getTargetNode(PPC::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), FV,TV); + case ISD::SETUGE: + case ISD::SETGE: + return DAG.getTargetNode(PPC::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), TV,FV); + case ISD::SETUGT: + case ISD::SETGT: + return DAG.getTargetNode(PPC::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), FV,TV); + case ISD::SETULE: + case ISD::SETLE: + return DAG.getTargetNode(PPC::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), TV,FV); + } + } + break; + } + return SDOperand(); +} + std::vector PPC32TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { // Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.h diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.1 llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.2 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.1 Tue Aug 16 12:14:42 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.h Thu Aug 25 19:52:45 2005 @@ -24,6 +24,10 @@ public: PPC32TargetLowering(TargetMachine &TM); + /// LowerOperation - Provide custom lowering hooks for some operations. + /// + virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); + /// LowerArguments - This hook must be implemented to indicate how we should /// lower the arguments for the specified function, into the specified DAG. virtual std::vector Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.166 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.167 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.166 Thu Aug 25 18:19:58 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Thu Aug 25 19:52:45 2005 @@ -829,6 +829,12 @@ default: Node->dump(); std::cerr << '\n'; assert(0 && "Node not handled!\n"); + case ISD::BUILTIN_OP_END+PPC::FSEL: + Tmp1 = SelectExpr(N.getOperand(0)); + Tmp2 = SelectExpr(N.getOperand(1)); + Tmp3 = SelectExpr(N.getOperand(2)); + BuildMI(BB, PPC::FSEL, 3, Result).addReg(Tmp1).addReg(Tmp2).addReg(Tmp3); + return Result; case ISD::UNDEF: if (Node->getValueType(0) == MVT::i32) BuildMI(BB, PPC::IMPLICIT_DEF_GPR, 0, Result); From natebegeman at mac.com Thu Aug 25 23:11:53 2005 From: natebegeman at mac.com (Nate Begeman) Date: Thu, 25 Aug 2005 23:11:53 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td PowerPCInstrFormats.td Message-ID: <200508260411.XAA30429@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrInfo.td updated: 1.81 -> 1.82 PowerPCInstrFormats.td updated: 1.44 -> 1.45 --- Log message: Fix JIT encoding of conditional branches --- Diffs of the changes: (+19 -27) PowerPCInstrFormats.td | 22 +++++++--------------- PowerPCInstrInfo.td | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 27 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.81 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.82 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.81 Wed Aug 24 19:26:22 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Thu Aug 25 23:11:42 2005 @@ -80,18 +80,18 @@ // FIXME: 4*CR# needs to be added to the BI field! // This will only work for CR0 as it stands now - def BLT : BForm_ext<16, 0, 0, 12, 0, (ops CRRC:$crS, target:$block), - "blt $block">; - def BLE : BForm_ext<16, 0, 0, 4, 1, (ops CRRC:$crS, target:$block), - "ble $block">; - def BEQ : BForm_ext<16, 0, 0, 12, 2, (ops CRRC:$crS, target:$block), - "beq $block">; - def BGE : BForm_ext<16, 0, 0, 4, 0, (ops CRRC:$crS, target:$block), - "bge $block">; - def BGT : BForm_ext<16, 0, 0, 12, 1, (ops CRRC:$crS, target:$block), - "bgt $block">; - def BNE : BForm_ext<16, 0, 0, 4, 2, (ops CRRC:$crS, target:$block), - "bne $block">; + def BLT : BForm<16, 0, 0, 12, 0, (ops CRRC:$crS, target:$block), + "blt $block">; + def BLE : BForm<16, 0, 0, 4, 1, (ops CRRC:$crS, target:$block), + "ble $block">; + def BEQ : BForm<16, 0, 0, 12, 2, (ops CRRC:$crS, target:$block), + "beq $block">; + def BGE : BForm<16, 0, 0, 4, 0, (ops CRRC:$crS, target:$block), + "bge $block">; + def BGT : BForm<16, 0, 0, 12, 1, (ops CRRC:$crS, target:$block), + "bgt $block">; + def BNE : BForm<16, 0, 0, 4, 2, (ops CRRC:$crS, target:$block), + "bne $block">; } let isCall = 1, Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.44 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.45 --- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.44 Mon Aug 8 15:04:51 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td Thu Aug 25 23:11:42 2005 @@ -66,28 +66,20 @@ } // 1.7.2 B-Form -class BForm opcode, bit aa, bit lk, dag OL, string asmstr> - : I { - bits<5> BO; - bits<3> CRNum; - bits<2> BICode; +class BForm opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL, + string asmstr> + : I { + bits<3> CR; bits<14> BD; - let Inst{6-10} = BO; - let Inst{11-13} = CRNum; - let Inst{14-15} = BICode; + let Inst{6-10} = bo; + let Inst{11-13} = CR; + let Inst{14-15} = bicode; let Inst{16-29} = BD; let Inst{30} = aa; let Inst{31} = lk; } -class BForm_ext opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, - dag OL, string asmstr> - : BForm { - let BO = bo; - let BICode = bicode; -} - // 1.7.4 D-Form class DForm_base opcode, dag OL, string asmstr> : I{ bits<5> A; From jlaskey at apple.com Fri Aug 26 04:24:59 2005 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 26 Aug 2005 04:24:59 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/CommandLine.h Message-ID: <200508260924.EAA08570@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: CommandLine.h updated: 1.47 -> 1.48 --- Log message: Change unsigned lng to unsigned. --- Diffs of the changes: (+7 -7) CommandLine.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) Index: llvm/include/llvm/Support/CommandLine.h diff -u llvm/include/llvm/Support/CommandLine.h:1.47 llvm/include/llvm/Support/CommandLine.h:1.48 --- llvm/include/llvm/Support/CommandLine.h:1.47 Thu Aug 25 18:31:45 2005 +++ llvm/include/llvm/Support/CommandLine.h Fri Aug 26 04:24:46 2005 @@ -992,12 +992,12 @@ // template class bits_storage { - unsigned long *Location; // Where to store the bits... + unsigned *Location; // Where to store the bits... template static unsigned Bit(const T &V) { unsigned BitPos = (unsigned)V; - assert(BitPos < sizeof(unsigned long) * 8 && + assert(BitPos < sizeof(unsigned) * 8 && "enum exceeds width of bit vector!"); return 1 << BitPos; } @@ -1005,7 +1005,7 @@ public: bits_storage() : Location(0) {} - bool setLocation(Option &O, unsigned long &L) { + bool setLocation(Option &O, unsigned &L) { if (Location) return O.error(": cl::location(x) specified more than once!"); Location = &L; @@ -1019,7 +1019,7 @@ *Location |= Bit(V); } - unsigned long getBits() { return *Location; } + unsigned getBits() { return *Location; } template bool isSet(const T &V) { @@ -1033,12 +1033,12 @@ // template class bits_storage { - unsigned long Bits; // Where to store the bits... + unsigned Bits; // Where to store the bits... template static unsigned Bit(const T &V) { unsigned BitPos = (unsigned)V; - assert(BitPos < sizeof(unsigned long) * 8 && + assert(BitPos < sizeof(unsigned) * 8 && "enum exceeds width of bit vector!"); return 1 << BitPos; } @@ -1049,7 +1049,7 @@ Bits |= Bit(V); } - unsigned long getBits() { return Bits; } + unsigned getBits() { return Bits; } template bool isSet(const T &V) { From jlaskey at apple.com Fri Aug 26 04:26:06 2005 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 26 Aug 2005 04:26:06 -0500 Subject: [llvm-commits] CVS: llvm/docs/CommandLine.html Message-ID: <200508260926.EAA08596@zion.cs.uiuc.edu> Changes in directory llvm/docs: CommandLine.html updated: 1.37 -> 1.38 --- Log message: Changed unsigned long to unsigned. --- Diffs of the changes: (+7 -7) CommandLine.html | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) Index: llvm/docs/CommandLine.html diff -u llvm/docs/CommandLine.html:1.37 llvm/docs/CommandLine.html:1.38 --- llvm/docs/CommandLine.html:1.37 Thu Aug 25 18:01:25 2005 +++ llvm/docs/CommandLine.html Fri Aug 26 04:25:54 2005 @@ -701,8 +701,8 @@

    Instead of collecting sets of options in a list, it is also possible to -gather information for enum values in a bit vector. The represention used by -the cl::bits class is an unsigned long +gather information for enum values in a bit vector. The represention used by +the cl::bits class is an unsigned integer. An enum value is represented by a 0/1 in the enum's ordinal value bit position. 1 indicating that the enum was specified, 0 otherwise. As each specified value is parsed, the resulting enum's bit is set in the option's bit @@ -741,13 +741,13 @@ cl::bits::getBits function:

    -  unsigned long bits = OptimizationBits.getBits();
    +  unsigned bits = OptimizationBits.getBits();
     

    Finally, if external storage is used, then the location specified must be of -type unsigned long. In all other ways a type unsigned. In all other ways a cl::bits option is morally equivalent to a cl::list option

    +href="#list"> cl::list option.

    @@ -1588,7 +1588,7 @@

    This class works the exact same as the cl::lists class, except that the second argument -must be of type unsigned long if external storage is used.

    +must be of type unsigned if external storage is used.

    @@ -1900,7 +1900,7 @@ Chris Lattner
    LLVM Compiler Infrastructure
    - Last modified: $Date: 2005/08/25 23:01:25 $ + Last modified: $Date: 2005/08/26 09:25:54 $ From lattner at cs.uiuc.edu Fri Aug 26 11:35:48 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 11:35:48 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200508261635.LAA10137@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.52 -> 1.53 --- Log message: Fix a huge annoyance: SelectNodeTo took types before the opcode unlike every other SD API. Fix it to take the opcode before the types. --- Diffs of the changes: (+10 -10) SelectionDAG.h | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.52 llvm/include/llvm/CodeGen/SelectionDAG.h:1.53 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.52 Thu Aug 25 12:24:09 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Fri Aug 26 11:35:36 2005 @@ -223,22 +223,22 @@ /// specified node to have the specified return type, Target opcode, and /// operands. Note that target opcodes are stored as /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field. - void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc); - void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT); + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, SDOperand Op1); - void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, SDOperand Op1, SDOperand Op2); - void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, SDOperand Op1, SDOperand Op2, SDOperand Op3); - void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, SDOperand Op1, SDOperand Op2, SDOperand Op3, SDOperand Op4); - void SelectNodeTo(SDNode *N, MVT::ValueType VT, unsigned TargetOpc, + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT, SDOperand Op1, SDOperand Op2, SDOperand Op3, SDOperand Op4, SDOperand Op5); - void SelectNodeTo(SDNode *N, MVT::ValueType VT1, MVT::ValueType VT2, - unsigned TargetOpc, SDOperand Op1, SDOperand Op2); - void SelectNodeTo(SDNode *N, MVT::ValueType VT1, MVT::ValueType VT2, - unsigned TargetOpc, SDOperand Op1, SDOperand Op2, + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1, + MVT::ValueType VT2, SDOperand Op1, SDOperand Op2); + void SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1, + MVT::ValueType VT2, SDOperand Op1, SDOperand Op2, SDOperand Op3); SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT, From lattner at cs.uiuc.edu Fri Aug 26 11:36:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 11:36:37 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508261636.LAA10204@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.37 -> 1.38 --- Log message: Fix a huge annoyance: SelectNodeTo took types before the opcode unlike every other SD API. Fix it to take the opcode before the types. --- Diffs of the changes: (+75 -75) PPC32ISelDAGToDAG.cpp | 150 +++++++++++++++++++++++++------------------------- 1 files changed, 75 insertions(+), 75 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.37 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.38 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.37 Thu Aug 25 19:34:06 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 11:36:26 2005 @@ -687,11 +687,11 @@ if (Hi && Lo) { SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32, getI32Imm(v >> 16)); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORI, Top, getI32Imm(v & 0xFFFF)); + CurDAG->SelectNodeTo(N, PPC::ORI, MVT::i32, Top, getI32Imm(v & 0xFFFF)); } else if (Lo) { - CurDAG->SelectNodeTo(N, MVT::i32, PPC::LI, getI32Imm(v)); + CurDAG->SelectNodeTo(N, PPC::LI, MVT::i32, getI32Imm(v)); } else { - CurDAG->SelectNodeTo(N, MVT::i32, PPC::LIS, getI32Imm(v >> 16)); + CurDAG->SelectNodeTo(N, PPC::LIS, MVT::i32, getI32Imm(v >> 16)); } break; } @@ -706,18 +706,18 @@ Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPN); else Tmp = CurDAG->getTargetNode(PPC::LIS, MVT::i32, CPN); - CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::LFS, CPN, Tmp); + CurDAG->SelectNodeTo(N, PPC::LFS, N->getValueType(0), CPN, Tmp); break; } case ISD::UNDEF: if (N->getValueType(0) == MVT::i32) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::IMPLICIT_DEF_GPR); + CurDAG->SelectNodeTo(N, PPC::IMPLICIT_DEF_GPR, MVT::i32); else - CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::IMPLICIT_DEF_FP); + CurDAG->SelectNodeTo(N, PPC::IMPLICIT_DEF_FP, N->getValueType(0)); break; case ISD::FrameIndex: { int FI = cast(N)->getIndex(); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ADDI, + CurDAG->SelectNodeTo(N, PPC::ADDI, MVT::i32, CurDAG->getTargetFrameIndex(FI, MVT::i32), getI32Imm(0)); break; @@ -729,7 +729,7 @@ Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPI); else Tmp = CurDAG->getTargetNode(PPC::LIS, MVT::i32, CPI); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::LA, Tmp, CPI); + CurDAG->SelectNodeTo(N, PPC::LA, MVT::i32, Tmp, CPI); break; } case ISD::GlobalAddress: { @@ -742,25 +742,25 @@ Tmp = CurDAG->getTargetNode(PPC::LIS, MVT::i32, GA); if (GV->hasWeakLinkage() || GV->isExternal()) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::LWZ, GA, Tmp); + CurDAG->SelectNodeTo(N, PPC::LWZ, MVT::i32, GA, Tmp); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::LA, Tmp, GA); + CurDAG->SelectNodeTo(N, PPC::LA, MVT::i32, Tmp, GA); break; } case ISD::SIGN_EXTEND_INREG: switch(cast(N->getOperand(1))->getVT()) { default: assert(0 && "Illegal type in SIGN_EXTEND_INREG"); break; case MVT::i16: - CurDAG->SelectNodeTo(N, MVT::i32, PPC::EXTSH, Select(N->getOperand(0))); + CurDAG->SelectNodeTo(N, PPC::EXTSH, MVT::i32, Select(N->getOperand(0))); break; case MVT::i8: - CurDAG->SelectNodeTo(N, MVT::i32, PPC::EXTSB, Select(N->getOperand(0))); + CurDAG->SelectNodeTo(N, PPC::EXTSB, MVT::i32, Select(N->getOperand(0))); break; } break; case ISD::CTLZ: assert(N->getValueType(0) == MVT::i32); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::CNTLZW, Select(N->getOperand(0))); + CurDAG->SelectNodeTo(N, PPC::CNTLZW, MVT::i32, Select(N->getOperand(0))); break; case ISD::ADD: { MVT::ValueType Ty = N->getValueType(0); @@ -770,7 +770,7 @@ CurDAG->ReplaceAllUsesWith(N, I); N = I; } else { - CurDAG->SelectNodeTo(N, Ty, PPC::ADD, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::ADD, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); } break; @@ -780,7 +780,7 @@ if (N->getOperand(0).getOpcode() == ISD::MUL && N->getOperand(0).Val->hasOneUse()) { ++FusedFP; // Statistic - CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS, + CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS, Ty, Select(N->getOperand(0).getOperand(0)), Select(N->getOperand(0).getOperand(1)), Select(N->getOperand(1))); @@ -788,7 +788,7 @@ } else if (N->getOperand(1).getOpcode() == ISD::MUL && N->getOperand(1).hasOneUse()) { ++FusedFP; // Statistic - CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS, + CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FMADD : PPC::FMADDS, Ty, Select(N->getOperand(1).getOperand(0)), Select(N->getOperand(1).getOperand(1)), Select(N->getOperand(0))); @@ -796,7 +796,7 @@ } } - CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FADD : PPC::FADDS, + CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FADD : PPC::FADDS, Ty, Select(N->getOperand(0)), Select(N->getOperand(1))); break; } @@ -806,9 +806,9 @@ unsigned Imm; if (isIntImmediate(N->getOperand(0), Imm) && isInt16(Imm)) { if (0 == Imm) - CurDAG->SelectNodeTo(N, Ty, PPC::NEG, Select(N->getOperand(1))); + CurDAG->SelectNodeTo(N, PPC::NEG, Ty, Select(N->getOperand(1))); else - CurDAG->SelectNodeTo(N, Ty, PPC::SUBFIC, Select(N->getOperand(1)), + CurDAG->SelectNodeTo(N, PPC::SUBFIC, Ty, Select(N->getOperand(1)), getI32Imm(Lo16(Imm))); break; } @@ -817,7 +817,7 @@ CurDAG->ReplaceAllUsesWith(N, I); N = I; } else { - CurDAG->SelectNodeTo(N, Ty, PPC::SUBF, Select(N->getOperand(1)), + CurDAG->SelectNodeTo(N, PPC::SUBF, Ty, Select(N->getOperand(1)), Select(N->getOperand(0))); } break; @@ -827,7 +827,7 @@ if (N->getOperand(0).getOpcode() == ISD::MUL && N->getOperand(0).Val->hasOneUse()) { ++FusedFP; // Statistic - CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FMSUB : PPC::FMSUBS, + CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FMSUB : PPC::FMSUBS, Ty, Select(N->getOperand(0).getOperand(0)), Select(N->getOperand(0).getOperand(1)), Select(N->getOperand(1))); @@ -835,14 +835,14 @@ } else if (N->getOperand(1).getOpcode() == ISD::MUL && N->getOperand(1).Val->hasOneUse()) { ++FusedFP; // Statistic - CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FNMSUB : PPC::FNMSUBS, + CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FNMSUB : PPC::FNMSUBS, Ty, Select(N->getOperand(1).getOperand(0)), Select(N->getOperand(1).getOperand(1)), Select(N->getOperand(0))); break; } } - CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FSUB : PPC::FSUBS, + CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FSUB : PPC::FSUBS, Ty, Select(N->getOperand(0)), Select(N->getOperand(1))); break; @@ -850,7 +850,7 @@ case ISD::MUL: { unsigned Imm, Opc; if (isIntImmediate(N->getOperand(1), Imm) && isInt16(Imm)) { - CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::MULLI, + CurDAG->SelectNodeTo(N, PPC::MULLI, MVT::i32, Select(N->getOperand(0)), getI32Imm(Lo16(Imm))); break; } @@ -860,7 +860,7 @@ case MVT::f32: Opc = PPC::FMULS; break; case MVT::f64: Opc = PPC::FMUL; break; } - CurDAG->SelectNodeTo(N, MVT::i32, Opc, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, Opc, N->getValueType(0), Select(N->getOperand(0)), Select(N->getOperand(1))); break; } @@ -872,7 +872,7 @@ CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag, Select(N->getOperand(0)), getI32Imm(Log2_32(Imm))); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ADDZE, + CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32, Op.getValue(0), Op.getValue(1)); break; } else if ((signed)Imm < 0 && isPowerOf2_32(-Imm)) { @@ -883,7 +883,7 @@ SDOperand PT = CurDAG->getTargetNode(PPC::ADDZE, MVT::i32, Op.getValue(1), Op.getValue(0)); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::NEG, PT); + CurDAG->SelectNodeTo(N, PPC::NEG, MVT::i32, PT); break; } else if (Imm) { SDOperand Result = Select(BuildSDIVSequence(N)); @@ -901,7 +901,7 @@ case MVT::f32: Opc = PPC::FDIVS; break; case MVT::f64: Opc = PPC::FDIV; break; } - CurDAG->SelectNodeTo(N, N->getValueType(0), Opc, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, Opc, N->getValueType(0), Select(N->getOperand(0)), Select(N->getOperand(1))); break; } @@ -917,18 +917,18 @@ break; } - CurDAG->SelectNodeTo(N, MVT::i32, PPC::DIVWU, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::DIVWU, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; } case ISD::MULHS: assert(N->getValueType(0) == MVT::i32); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::MULHW, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::MULHW, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; case ISD::MULHU: assert(N->getValueType(0) == MVT::i32); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::MULHWU, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::MULHWU, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; case ISD::AND: { @@ -946,7 +946,7 @@ isRunOfOnes(Imm, MB, ME); SH = 0; } - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Val, getI32Imm(SH), + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Val, getI32Imm(SH), getI32Imm(MB), getI32Imm(ME)); break; } @@ -962,13 +962,13 @@ // Finally, check for the case where we are being asked to select // and (not(a), b) or and (a, not(b)) which can be selected as andc. if (isOprNot(N->getOperand(0).Val)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ANDC, Select(N->getOperand(1)), + CurDAG->SelectNodeTo(N, PPC::ANDC, MVT::i32, Select(N->getOperand(1)), Select(N->getOperand(0).getOperand(0))); else if (isOprNot(N->getOperand(1).Val)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ANDC, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::ANDC, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1).getOperand(0))); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::AND, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::AND, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; } @@ -988,13 +988,13 @@ // Finally, check for the case where we are being asked to select // 'or (not(a), b)' or 'or (a, not(b))' which can be selected as orc. if (isOprNot(N->getOperand(0).Val)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORC, Select(N->getOperand(1)), + CurDAG->SelectNodeTo(N, PPC::ORC, MVT::i32, Select(N->getOperand(1)), Select(N->getOperand(0).getOperand(0))); else if (isOprNot(N->getOperand(1).Val)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORC, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::ORC, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1).getOperand(0))); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::OR, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::OR, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; case ISD::XOR: @@ -1011,10 +1011,10 @@ case PPC::XOR: Opc = PPC::EQV; break; } if (Opc) - CurDAG->SelectNodeTo(N, MVT::i32, Opc, Val.getOperand(0), + CurDAG->SelectNodeTo(N, Opc, MVT::i32, Val.getOperand(0), Val.getOperand(1)); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::NOR, Val, Val); + CurDAG->SelectNodeTo(N, PPC::NOR, MVT::i32, Val, Val); break; } // If this is a xor with an immediate other than -1, then codegen it as high @@ -1029,25 +1029,25 @@ // Finally, check for the case where we are being asked to select // xor (not(a), b) which is equivalent to not(xor a, b), which is eqv if (isOprNot(N->getOperand(0).Val)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::EQV, + CurDAG->SelectNodeTo(N, PPC::EQV, MVT::i32, Select(N->getOperand(0).getOperand(0)), Select(N->getOperand(1))); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::XOR, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::XOR, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; case ISD::SHL: { unsigned Imm, SH, MB, ME; if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) && isRotateAndMask(N, Imm, true, SH, MB, ME)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Select(N->getOperand(0).getOperand(0)), getI32Imm(SH), getI32Imm(MB), getI32Imm(ME)); else if (isIntImmediate(N->getOperand(1), Imm)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Select(N->getOperand(0)), getI32Imm(Imm), getI32Imm(0), getI32Imm(31-Imm)); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::SLW, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::SLW, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; } @@ -1055,14 +1055,14 @@ unsigned Imm, SH, MB, ME; if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) && isRotateAndMask(N, Imm, true, SH, MB, ME)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Select(N->getOperand(0).getOperand(0)), getI32Imm(SH), getI32Imm(MB), getI32Imm(ME)); else if (isIntImmediate(N->getOperand(1), Imm)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Select(N->getOperand(0)), getI32Imm(32-Imm), getI32Imm(Imm), getI32Imm(31)); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::SRW, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::SRW, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; } @@ -1070,30 +1070,30 @@ unsigned Imm, SH, MB, ME; if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) && isRotateAndMask(N, Imm, true, SH, MB, ME)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Select(N->getOperand(0).getOperand(0)), getI32Imm(SH), getI32Imm(MB), getI32Imm(ME)); else if (isIntImmediate(N->getOperand(1), Imm)) - CurDAG->SelectNodeTo(N, MVT::i32, PPC::SRAWI, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::SRAWI, MVT::i32, Select(N->getOperand(0)), getI32Imm(Imm)); else - CurDAG->SelectNodeTo(N, MVT::i32, PPC::SRAW, Select(N->getOperand(0)), + CurDAG->SelectNodeTo(N, PPC::SRAW, MVT::i32, Select(N->getOperand(0)), Select(N->getOperand(1))); break; } case ISD::FABS: - CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::FABS, + CurDAG->SelectNodeTo(N, PPC::FABS, N->getValueType(0), Select(N->getOperand(0))); break; case ISD::FP_EXTEND: assert(MVT::f64 == N->getValueType(0) && MVT::f32 == N->getOperand(0).getValueType() && "Illegal FP_EXTEND"); - CurDAG->SelectNodeTo(N, MVT::f64, PPC::FMR, Select(N->getOperand(0))); + CurDAG->SelectNodeTo(N, PPC::FMR, MVT::f64, Select(N->getOperand(0))); break; case ISD::FP_ROUND: assert(MVT::f32 == N->getValueType(0) && MVT::f64 == N->getOperand(0).getValueType() && "Illegal FP_ROUND"); - CurDAG->SelectNodeTo(N, MVT::f32, PPC::FRSP, Select(N->getOperand(0))); + CurDAG->SelectNodeTo(N, PPC::FRSP, MVT::f32, Select(N->getOperand(0))); break; case ISD::FNEG: { SDOperand Val = Select(N->getOperand(0)); @@ -1113,19 +1113,19 @@ // fall through and generate a fneg instruction. if (Opc) { if (PPC::FNABS == Opc) - CurDAG->SelectNodeTo(N, Ty, Opc, Val.getOperand(0)); + CurDAG->SelectNodeTo(N, Opc, Ty, Val.getOperand(0)); else - CurDAG->SelectNodeTo(N, Ty, Opc, Val.getOperand(0), + CurDAG->SelectNodeTo(N, Opc, Ty, Val.getOperand(0), Val.getOperand(1), Val.getOperand(2)); break; } } - CurDAG->SelectNodeTo(N, Ty, PPC::FNEG, Val); + CurDAG->SelectNodeTo(N, PPC::FNEG, Ty, Val); break; } case ISD::FSQRT: { MVT::ValueType Ty = N->getValueType(0); - CurDAG->SelectNodeTo(N, Ty, Ty == MVT::f64 ? PPC::FSQRT : PPC::FSQRTS, + CurDAG->SelectNodeTo(N, Ty == MVT::f64 ? PPC::FSQRT : PPC::FSQRTS, Ty, Select(N->getOperand(0))); break; } @@ -1249,7 +1249,7 @@ case MVT::f64: Opc = isIdx ? PPC::LFDX : PPC::LFD; break; } - CurDAG->SelectNodeTo(N, N->getValueType(0), MVT::Other, Opc, + CurDAG->SelectNodeTo(N, Opc, N->getValueType(0), MVT::Other, Op1, Op2, Select(N->getOperand(0))); break; } @@ -1276,7 +1276,7 @@ } } - CurDAG->SelectNodeTo(N, MVT::Other, Opc, Select(N->getOperand(1)), + CurDAG->SelectNodeTo(N, Opc, MVT::Other, Select(N->getOperand(1)), AddrOp1, AddrOp2, Select(N->getOperand(0))); break; } @@ -1294,23 +1294,23 @@ default: assert(0 && "Unhandled SetCC condition"); abort(); case ISD::SETEQ: Op = CurDAG->getTargetNode(PPC::CNTLZW, MVT::i32, Op); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Op, getI32Imm(27), + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Op, getI32Imm(27), getI32Imm(5), getI32Imm(31)); break; case ISD::SETNE: { SDOperand AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, Op, getI32Imm(~0U)); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::SUBFE, AD, Op, AD.getValue(1)); + CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, AD, Op, AD.getValue(1)); break; } case ISD::SETLT: - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, Op, getI32Imm(1), + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Op, getI32Imm(1), getI32Imm(31), getI32Imm(31)); break; case ISD::SETGT: { SDOperand T = CurDAG->getTargetNode(PPC::NEG, MVT::i32, Op); T = CurDAG->getTargetNode(PPC::ANDC, MVT::i32, T, Op);; - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, T, getI32Imm(1), + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, T, getI32Imm(1), getI32Imm(31), getI32Imm(31)); break; } @@ -1323,7 +1323,7 @@ case ISD::SETEQ: Op = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, Op, getI32Imm(1)); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ADDZE, + CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32, CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)), Op.getValue(1)); @@ -1332,21 +1332,21 @@ Op = CurDAG->getTargetNode(PPC::NOR, MVT::i32, Op, Op); SDOperand AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, Op, getI32Imm(~0U)); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::SUBFE, AD, Op, AD.getValue(1)); + CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, AD, Op, AD.getValue(1)); break; } case ISD::SETLT: { SDOperand AD = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, Op, getI32Imm(1)); SDOperand AN = CurDAG->getTargetNode(PPC::AND, MVT::i32, AD, Op); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, AN, getI32Imm(1), + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, AN, getI32Imm(1), getI32Imm(31), getI32Imm(31)); break; } case ISD::SETGT: Op = CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, Op, getI32Imm(1), getI32Imm(31), getI32Imm(31)); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::XORI, Op, getI32Imm(1)); + CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Op, getI32Imm(1)); break; } break; @@ -1377,13 +1377,13 @@ IntCR = CurDAG->getTargetNode(PPC::MFCR, MVT::i32, CCReg); if (!Inv) { - CurDAG->SelectNodeTo(N, MVT::i32, PPC::RLWINM, IntCR, + CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, IntCR, getI32Imm(32-(3-Idx)), getI32Imm(31), getI32Imm(31)); } else { SDOperand Tmp = CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, IntCR, getI32Imm(32-(3-Idx)), getI32Imm(31),getI32Imm(31)); - CurDAG->SelectNodeTo(N, MVT::i32, PPC::XORI, Tmp, getI32Imm(1)); + CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Tmp, getI32Imm(1)); } break; @@ -1394,7 +1394,7 @@ unsigned Amt = cast(N->getOperand(1))->getValue(); unsigned Opc = N->getOpcode() == ISD::CALLSEQ_START ? PPC::ADJCALLSTACKDOWN : PPC::ADJCALLSTACKUP; - CurDAG->SelectNodeTo(N, MVT::Other, Opc, + CurDAG->SelectNodeTo(N, Opc, MVT::Other, getI32Imm(Amt), Select(N->getOperand(0))); break; } @@ -1520,11 +1520,11 @@ } // Finally, select this to a blr (return) instruction. - CurDAG->SelectNodeTo(N, MVT::Other, PPC::BLR, Chain); + CurDAG->SelectNodeTo(N, PPC::BLR, MVT::Other, Chain); break; } case ISD::BR: - CurDAG->SelectNodeTo(N, MVT::Other, PPC::B, N->getOperand(1), + CurDAG->SelectNodeTo(N, PPC::B, MVT::Other, N->getOperand(1), Select(N->getOperand(0))); break; case ISD::BR_CC: @@ -1547,7 +1547,7 @@ CondCode, getI32Imm(Opc), N->getOperand(4), N->getOperand(5), Chain); - CurDAG->SelectNodeTo(N, MVT::Other, PPC::B, N->getOperand(5), CB); + CurDAG->SelectNodeTo(N, PPC::B, MVT::Other, N->getOperand(5), CB); } else { // Iterate to the next basic block ilist::iterator It = BB; @@ -1558,7 +1558,7 @@ // we have nothing better to set it to, and leaving it alone will cause // the PowerPC Branch Selection pass to crash. if (It == BB->getParent()->end()) It = Dest; - CurDAG->SelectNodeTo(N, MVT::Other, PPC::COND_BRANCH, CondCode, + CurDAG->SelectNodeTo(N, PPC::COND_BRANCH, MVT::Other, CondCode, getI32Imm(Opc), N->getOperand(4), CurDAG->getBasicBlock(It), Chain); } From lattner at cs.uiuc.edu Fri Aug 26 11:36:37 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 11:36:37 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508261636.LAA10200@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.168 -> 1.169 --- Log message: Fix a huge annoyance: SelectNodeTo took types before the opcode unlike every other SD API. Fix it to take the opcode before the types. --- Diffs of the changes: (+17 -19) SelectionDAG.cpp | 36 +++++++++++++++++------------------- 1 files changed, 17 insertions(+), 19 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.168 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.169 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.168 Thu Aug 25 19:13:12 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Aug 26 11:36:26 2005 @@ -1942,64 +1942,62 @@ /// specified node to have the specified return type, Target opcode, and /// operands. Note that target opcodes are stored as /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field. -void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, - unsigned TargetOpc) { +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, + MVT::ValueType VT) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); N->setValueTypes(VT); } -void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, - unsigned TargetOpc, SDOperand Op1) { +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, + MVT::ValueType VT, SDOperand Op1) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); N->setValueTypes(VT); N->setOperands(Op1); } -void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, - unsigned TargetOpc, SDOperand Op1, +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, + MVT::ValueType VT, SDOperand Op1, SDOperand Op2) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); N->setValueTypes(VT); N->setOperands(Op1, Op2); } -void SelectionDAG::SelectNodeTo(SDNode *N, +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, MVT::ValueType VT1, MVT::ValueType VT2, - unsigned TargetOpc, SDOperand Op1, - SDOperand Op2) { + SDOperand Op1, SDOperand Op2) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); N->setValueTypes(VT1, VT2); N->setOperands(Op1, Op2); } -void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, - unsigned TargetOpc, SDOperand Op1, +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, + MVT::ValueType VT, SDOperand Op1, SDOperand Op2, SDOperand Op3) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); N->setValueTypes(VT); N->setOperands(Op1, Op2, Op3); } -void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT1, - MVT::ValueType VT2, - unsigned TargetOpc, SDOperand Op1, - SDOperand Op2, SDOperand Op3) { +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, + MVT::ValueType VT1, MVT::ValueType VT2, + SDOperand Op1, SDOperand Op2, SDOperand Op3) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); N->setValueTypes(VT1, VT2); N->setOperands(Op1, Op2, Op3); } -void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, - unsigned TargetOpc, SDOperand Op1, +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, + MVT::ValueType VT, SDOperand Op1, SDOperand Op2, SDOperand Op3, SDOperand Op4) { RemoveNodeFromCSEMaps(N); N->MorphNodeTo(ISD::BUILTIN_OP_END+TargetOpc); N->setValueTypes(VT); N->setOperands(Op1, Op2, Op3, Op4); } -void SelectionDAG::SelectNodeTo(SDNode *N, MVT::ValueType VT, - unsigned TargetOpc, SDOperand Op1, +void SelectionDAG::SelectNodeTo(SDNode *N, unsigned TargetOpc, + MVT::ValueType VT, SDOperand Op1, SDOperand Op2, SDOperand Op3, SDOperand Op4, SDOperand Op5) { RemoveNodeFromCSEMaps(N); From lattner at cs.uiuc.edu Fri Aug 26 11:39:02 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 11:39:02 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp PPC32ISelPattern.cpp Message-ID: <200508261639.LAA10268@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.38 -> 1.39 PPC32ISelPattern.cpp updated: 1.167 -> 1.168 --- Log message: Fix some warnings in an optimized build --- Diffs of the changes: (+3 -3) PPC32ISelDAGToDAG.cpp | 4 ++-- PPC32ISelPattern.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.38 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.39 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.38 Fri Aug 26 11:36:26 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 11:38:51 2005 @@ -896,7 +896,7 @@ unsigned Opc; switch (N->getValueType(0)) { - default: assert(0 && "Unknown type to ISD::SDIV"); break; + default: assert(0 && "Unknown type to ISD::SDIV"); case MVT::i32: Opc = PPC::DIVW; break; case MVT::f32: Opc = PPC::FDIVS; break; case MVT::f64: Opc = PPC::FDIV; break; @@ -1135,7 +1135,7 @@ SDOperand LHSH = Select(N->getOperand(1)); unsigned Imm; - bool ME, ZE; + bool ME = false, ZE = false; if (isIntImmediate(N->getOperand(3), Imm)) { ME = (signed)Imm == -1; ZE = Imm == 0; Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.167 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.168 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.167 Thu Aug 25 19:52:45 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Fri Aug 26 11:38:51 2005 @@ -1414,7 +1414,7 @@ Tmp2 = SelectExpr(N.getOperand(1)); if (N.getOpcode() == ISD::ADD_PARTS) { - bool ME, ZE; + bool ME = false, ZE = false; if (isIntImmediate(N.getOperand(3), Tmp3)) { ME = (signed)Tmp3 == -1; ZE = Tmp3 == 0; From lattner at cs.uiuc.edu Fri Aug 26 12:14:38 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:14:38 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h SelectionDAGNodes.h Message-ID: <200508261714.MAA10816@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.53 -> 1.54 SelectionDAGNodes.h updated: 1.62 -> 1.63 --- Log message: Change ConstantPoolSDNode to actually hold the Constant itself instead of putting it into the constant pool. This allows the isel machinery to create constants that it will end up deciding are not needed, without them ending up in the resultant function constant pool. --- Diffs of the changes: (+8 -7) SelectionDAG.h | 7 ++++--- SelectionDAGNodes.h | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.53 llvm/include/llvm/CodeGen/SelectionDAG.h:1.54 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.53 Fri Aug 26 11:35:36 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Fri Aug 26 12:14:27 2005 @@ -100,8 +100,8 @@ SDOperand getTargetGlobalAddress(const GlobalValue *GV, MVT::ValueType VT); SDOperand getFrameIndex(int FI, MVT::ValueType VT); SDOperand getTargetFrameIndex(int FI, MVT::ValueType VT); - SDOperand getConstantPool(unsigned CPIdx, MVT::ValueType VT); - SDOperand getTargetConstantPool(unsigned CPIdx, MVT::ValueType VT); + SDOperand getConstantPool(Constant *C, MVT::ValueType VT); + SDOperand getTargetConstantPool(Constant *C, MVT::ValueType VT); SDOperand getBasicBlock(MachineBasicBlock *MBB); SDOperand getExternalSymbol(const char *Sym, MVT::ValueType VT); SDOperand getValueType(MVT::ValueType); @@ -320,7 +320,8 @@ std::map, SDNode*> TargetConstants; std::map, SDNode*> ConstantFPs; std::map FrameIndices, TargetFrameIndices; - std::map ConstantPoolIndices, TargetConstantPoolIndices; + std::map ConstantPoolIndices; + std::map TargetConstantPoolIndices; std::map BBNodes; std::vector ValueTypeNodes; std::map ExternalSymbols; Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.62 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.63 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.62 Thu Aug 25 00:02:41 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Fri Aug 26 12:14:27 2005 @@ -828,15 +828,15 @@ }; class ConstantPoolSDNode : public SDNode { - unsigned CPI; + Constant *C; protected: friend class SelectionDAG; - ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT, bool isTarget) + ConstantPoolSDNode(Constant *c, MVT::ValueType VT, bool isTarget) : SDNode(isTarget ? ISD::TargetConstantPool : ISD::ConstantPool, VT), - CPI(cpi) {} + C(c) {} public: - unsigned getIndex() const { return CPI; } + Constant *get() const { return C; } static bool classof(const ConstantPoolSDNode *) { return true; } static bool classof(const SDNode *N) { From lattner at cs.uiuc.edu Fri Aug 26 12:15:10 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:15:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp ScheduleDAG.cpp SelectionDAG.cpp SelectionDAGPrinter.cpp Message-ID: <200508261715.MAA10885@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.173 -> 1.174 ScheduleDAG.cpp updated: 1.14 -> 1.15 SelectionDAG.cpp updated: 1.169 -> 1.170 SelectionDAGPrinter.cpp updated: 1.23 -> 1.24 --- Log message: Change ConstantPoolSDNode to actually hold the Constant itself instead of putting it into the constant pool. This allows the isel machinery to create constants that it will end up deciding are not needed, without them ending up in the resultant function constant pool. --- Diffs of the changes: (+24 -27) LegalizeDAG.cpp | 14 +++----------- ScheduleDAG.cpp | 8 ++++++-- SelectionDAG.cpp | 23 +++++++++++------------ SelectionDAGPrinter.cpp | 6 ++++-- 4 files changed, 24 insertions(+), 27 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.173 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.174 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.173 Thu Aug 25 19:43:46 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Aug 26 12:14:58 2005 @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/SelectionDAG.h" -#include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/Support/MathExtras.h" @@ -248,9 +247,7 @@ if (TLI.isLittleEndian()) FF <<= 32; static Constant *FudgeFactor = ConstantUInt::get(Type::ULongTy, FF); - MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool(); - SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(FudgeFactor), - TLI.getPointerTy()); + SDOperand CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset); SDOperand FudgeInReg; if (DestVT == MVT::f32) @@ -529,8 +526,6 @@ if (!isLegal) { // Otherwise we need to spill the constant to memory. - MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool(); - bool Extend = false; // If a FP immediate is precise when represented as a float, we put it @@ -549,8 +544,7 @@ Extend = true; } - SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(LLVMC), - TLI.getPointerTy()); + SDOperand CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy()); if (Extend) { Result = DAG.getExtLoad(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(), CPIdx, DAG.getSrcValue(NULL), MVT::f32); @@ -2751,9 +2745,7 @@ if (TLI.isLittleEndian()) FF <<= 32; static Constant *FudgeFactor = ConstantUInt::get(Type::ULongTy, FF); - MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool(); - SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(FudgeFactor), - TLI.getPointerTy()); + SDOperand CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset); SDOperand FudgeInReg; if (DestTy == MVT::f32) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.14 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.15 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.14 Thu Aug 25 12:48:54 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Fri Aug 26 12:14:58 2005 @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #define DEBUG_TYPE "sched" +#include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SelectionDAGISel.h" #include "llvm/CodeGen/SelectionDAG.h" @@ -38,12 +39,14 @@ const TargetInstrInfo &TII; const MRegisterInfo &MRI; SSARegMap *RegMap; + MachineConstantPool *ConstPool; std::map EmittedOps; public: SimpleSched(SelectionDAG &D, MachineBasicBlock *bb) : DAG(D), BB(bb), TM(D.getTarget()), TII(*TM.getInstrInfo()), - MRI(*TM.getRegisterInfo()), RegMap(BB->getParent()->getSSARegMap()) { + MRI(*TM.getRegisterInfo()), RegMap(BB->getParent()->getSSARegMap()), + ConstPool(BB->getParent()->getConstantPool()) { assert(&TII && "Target doesn't provide instr info?"); assert(&MRI && "Target doesn't provide register info?"); } @@ -148,7 +151,8 @@ MI->addFrameIndexOperand(FI->getIndex()); } else if (ConstantPoolSDNode *CP = dyn_cast(Op.getOperand(i))) { - MI->addConstantPoolIndexOperand(CP->getIndex()); + unsigned Idx = ConstPool->getConstantPoolIndex(CP->get()); + MI->addConstantPoolIndexOperand(Idx); } else if (ExternalSymbolSDNode *ES = dyn_cast(Op.getOperand(i))) { MI->addExternalSymbolOperand(ES->getSymbol(), false); Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.169 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.170 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.169 Fri Aug 26 11:36:26 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Aug 26 12:14:58 2005 @@ -265,10 +265,10 @@ TargetFrameIndices.erase(cast(N)->getIndex()); break; case ISD::ConstantPool: - ConstantPoolIndices.erase(cast(N)->getIndex()); + ConstantPoolIndices.erase(cast(N)->get()); break; case ISD::TargetConstantPool: - TargetConstantPoolIndices.erase(cast(N)->getIndex()); + TargetConstantPoolIndices.erase(cast(N)->get()); break; case ISD::BasicBlock: BBNodes.erase(cast(N)->getBasicBlock()); @@ -452,19 +452,18 @@ return SDOperand(N, 0); } -SDOperand SelectionDAG::getConstantPool(unsigned CPIdx, MVT::ValueType VT) { - SDNode *N = ConstantPoolIndices[CPIdx]; +SDOperand SelectionDAG::getConstantPool(Constant *C, MVT::ValueType VT) { + SDNode *&N = ConstantPoolIndices[C]; if (N) return SDOperand(N, 0); - N = new ConstantPoolSDNode(CPIdx, VT, false); + N = new ConstantPoolSDNode(C, VT, false); AllNodes.push_back(N); return SDOperand(N, 0); } -SDOperand SelectionDAG::getTargetConstantPool(unsigned CPIdx, - MVT::ValueType VT) { - SDNode *N = TargetConstantPoolIndices[CPIdx]; +SDOperand SelectionDAG::getTargetConstantPool(Constant *C, MVT::ValueType VT) { + SDNode *&N = TargetConstantPoolIndices[C]; if (N) return SDOperand(N, 0); - N = new ConstantPoolSDNode(CPIdx, VT, true); + N = new ConstantPoolSDNode(C, VT, true); AllNodes.push_back(N); return SDOperand(N, 0); } @@ -2134,8 +2133,8 @@ case ISD::BasicBlock: return "BasicBlock"; case ISD::Register: return "Register"; case ISD::ExternalSymbol: return "ExternalSymbol"; - case ISD::ConstantPool: return "ConstantPoolIndex"; - case ISD::TargetConstantPool: return "TargetConstantPoolIndex"; + case ISD::ConstantPool: return "ConstantPool"; + case ISD::TargetConstantPool: return "TargetConstantPool"; case ISD::CopyToReg: return "CopyToReg"; case ISD::CopyFromReg: return "CopyFromReg"; case ISD::ImplicitDef: return "ImplicitDef"; @@ -2287,7 +2286,7 @@ } else if (const FrameIndexSDNode *FIDN = dyn_cast(this)) { std::cerr << "<" << FIDN->getIndex() << ">"; } else if (const ConstantPoolSDNode *CP = dyn_cast(this)){ - std::cerr << "<" << CP->getIndex() << ">"; + std::cerr << "<" << *CP->get() << ">"; } else if (const BasicBlockSDNode *BBDN = dyn_cast(this)) { std::cerr << "<"; const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock(); Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.23 llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.24 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp:1.23 Wed Aug 24 13:30:00 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp Fri Aug 26 12:14:58 2005 @@ -11,11 +11,12 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Constants.h" +#include "llvm/Function.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/Target/MRegisterInfo.h" #include "llvm/Target/TargetMachine.h" -#include "llvm/Function.h" #include "llvm/Support/GraphWriter.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Config/config.h" @@ -67,7 +68,8 @@ } else if (const FrameIndexSDNode *FIDN = dyn_cast(Node)) { Op += " " + itostr(FIDN->getIndex()); } else if (const ConstantPoolSDNode *CP = dyn_cast(Node)){ - Op += "<" + utostr(CP->getIndex()) + ">"; + if (ConstantFP *CFP = dyn_cast(CP->get())) + Op += "<" + ftostr(CFP->getValue()) + ">"; } else if (const BasicBlockSDNode *BBDN = dyn_cast(Node)) { Op = "BB: "; const Value *LBB = (const Value*)BBDN->getBasicBlock()->getBasicBlock(); From lattner at cs.uiuc.edu Fri Aug 26 12:15:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:15:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelPattern.cpp Message-ID: <200508261715.MAA10958@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelPattern.cpp updated: 1.165 -> 1.166 --- Log message: Change ConstantPoolSDNode to actually hold the Constant itself instead of putting it into the constant pool. This allows the isel machinery to create constants that it will end up deciding are not needed, without them ending up in the resultant function constant pool. --- Diffs of the changes: (+6 -3) AlphaISelPattern.cpp | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelPattern.cpp diff -u llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.165 llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.166 --- llvm/lib/Target/Alpha/AlphaISelPattern.cpp:1.165 Wed Aug 17 12:08:24 2005 +++ llvm/lib/Target/Alpha/AlphaISelPattern.cpp Fri Aug 26 12:15:30 2005 @@ -1216,7 +1216,8 @@ return Result; case ISD::ConstantPool: - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); AlphaLowering.restoreGP(BB); Tmp2 = MakeReg(MVT::i64); BuildMI(BB, Alpha::LDAHr, 2, Tmp2).addConstantPoolIndex(Tmp1) @@ -1285,16 +1286,18 @@ .addGlobalAddress(GASD->getGlobal()).addReg(Tmp1); } else if (ConstantPoolSDNode *CP = dyn_cast(Address)) { + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(CP->get()); AlphaLowering.restoreGP(BB); has_sym = true; Tmp1 = MakeReg(MVT::i64); - BuildMI(BB, Alpha::LDAHr, 2, Tmp1).addConstantPoolIndex(CP->getIndex()) + BuildMI(BB, Alpha::LDAHr, 2, Tmp1).addConstantPoolIndex(CPIdx) .addReg(Alpha::R29); if (EnableAlphaLSMark) BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k) .addImm(getUID()); BuildMI(BB, GetRelVersion(Opc), 2, Result) - .addConstantPoolIndex(CP->getIndex()).addReg(Tmp1); + .addConstantPoolIndex(CPIdx).addReg(Tmp1); } else if(Address.getOpcode() == ISD::FrameIndex) { if (EnableAlphaLSMark) BuildMI(BB, Alpha::MEMLABEL, 4).addImm(i).addImm(j).addImm(k) From lattner at cs.uiuc.edu Fri Aug 26 12:15:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:15:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp PPC32ISelPattern.cpp Message-ID: <200508261715.MAA10964@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.39 -> 1.40 PPC32ISelPattern.cpp updated: 1.168 -> 1.169 --- Log message: Change ConstantPoolSDNode to actually hold the Constant itself instead of putting it into the constant pool. This allows the isel machinery to create constants that it will end up deciding are not needed, without them ending up in the resultant function constant pool. --- Diffs of the changes: (+7 -8) PPC32ISelDAGToDAG.cpp | 9 +++------ PPC32ISelPattern.cpp | 6 ++++-- 2 files changed, 7 insertions(+), 8 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.39 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.40 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.39 Fri Aug 26 11:38:51 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 12:15:30 2005 @@ -15,7 +15,6 @@ #include "PowerPC.h" #include "PPC32TargetMachine.h" #include "PPC32ISelLowering.h" -#include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SSARegMap.h" @@ -696,11 +695,9 @@ break; } case ISD::ConstantFP: { // FIXME: this should get sucked into the legalizer - MachineConstantPool *CP = CurDAG->getMachineFunction().getConstantPool(); Constant *CFP = ConstantFP::get(Type::FloatTy, cast(N)->getValue()); - SDOperand CPN = CurDAG->getConstantPool(CP->getConstantPoolIndex(CFP), - MVT::i32); + SDOperand CPN = CurDAG->getConstantPool(CFP, MVT::i32); SDOperand Tmp; if (PICEnabled) Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPN); @@ -723,8 +720,8 @@ break; } case ISD::ConstantPool: { - unsigned CPIIdx = cast(N)->getIndex(); - SDOperand Tmp, CPI = CurDAG->getTargetConstantPool(CPIIdx, MVT::i32); + Constant *C = cast(N)->get(); + SDOperand Tmp, CPI = CurDAG->getTargetConstantPool(C, MVT::i32); if (PICEnabled) Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPI); else Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.168 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.169 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.168 Fri Aug 26 11:38:51 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Fri Aug 26 12:15:30 2005 @@ -866,7 +866,8 @@ return Result; case ISD::ConstantPool: - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); Tmp2 = MakeIntReg(); if (PICEnabled) BuildMI(BB, PPC::ADDIS, 2, Tmp2).addReg(getGlobalBaseReg()) @@ -927,7 +928,8 @@ if (ConstantPoolSDNode *CP = dyn_cast(Address)) { Tmp1 = MakeIntReg(); - int CPI = CP->getIndex(); + unsigned CPI = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(CP->get()); if (PICEnabled) BuildMI(BB, PPC::ADDIS, 2, Tmp1).addReg(getGlobalBaseReg()) .addConstantPoolIndex(CPI); From lattner at cs.uiuc.edu Fri Aug 26 12:15:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:15:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp Message-ID: <200508261715.MAA10972@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelPattern.cpp updated: 1.173 -> 1.174 --- Log message: Change ConstantPoolSDNode to actually hold the Constant itself instead of putting it into the constant pool. This allows the isel machinery to create constants that it will end up deciding are not needed, without them ending up in the resultant function constant pool. --- Diffs of the changes: (+9 -4) X86ISelPattern.cpp | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.173 llvm/lib/Target/X86/X86ISelPattern.cpp:1.174 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.173 Wed Aug 24 19:05:15 2005 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Fri Aug 26 12:15:30 2005 @@ -2329,7 +2329,8 @@ addFrameReference(BuildMI(BB, X86::LEA32r, 4, Result), (int)Tmp1); return Result; case ISD::ConstantPool: - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); addConstantPoolReference(BuildMI(BB, X86::LEA32r, 4, Result), Tmp1); return Result; case ISD::ConstantFP: @@ -3317,8 +3318,10 @@ } if (ConstantPoolSDNode *CP = dyn_cast(N.getOperand(1))){ + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(CP->get()); Select(N.getOperand(0)); - addConstantPoolReference(BuildMI(BB, Opc, 4, Result), CP->getIndex()); + addConstantPoolReference(BuildMI(BB, Opc, 4, Result), CPIdx); } else { X86AddressMode AM; @@ -3370,8 +3373,10 @@ if (Node->getValueType(0) == MVT::f64) { assert(cast(Node->getOperand(3))->getVT() == MVT::f32 && "Bad EXTLOAD!"); - addConstantPoolReference(BuildMI(BB, X86::FLD32m, 4, Result), - CP->getIndex()); + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); + + addConstantPoolReference(BuildMI(BB, X86::FLD32m, 4, Result), CPIdx); return Result; } From lattner at cs.uiuc.edu Fri Aug 26 12:15:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:15:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelPattern.cpp Message-ID: <200508261715.MAA10968@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelPattern.cpp updated: 1.61 -> 1.62 --- Log message: Change ConstantPoolSDNode to actually hold the Constant itself instead of putting it into the constant pool. This allows the isel machinery to create constants that it will end up deciding are not needed, without them ending up in the resultant function constant pool. --- Diffs of the changes: (+5 -2) IA64ISelPattern.cpp | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelPattern.cpp diff -u llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.61 llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.62 --- llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.61 Wed Aug 24 19:03:21 2005 +++ llvm/lib/Target/IA64/IA64ISelPattern.cpp Fri Aug 26 12:15:30 2005 @@ -956,7 +956,8 @@ } case ISD::ConstantPool: { - Tmp1 = cast(N)->getIndex(); + Tmp1 = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); IA64Lowering.restoreGP(BB); // FIXME: do i really need this? BuildMI(BB, IA64::ADD, 2, Result).addConstantPoolIndex(Tmp1) .addReg(IA64::r1); @@ -1974,10 +1975,12 @@ BuildMI(BB, IA64::CMPNE, 2, Result).addReg(dummy3).addReg(IA64::r0); } } else if(ConstantPoolSDNode *CP = dyn_cast(Address)) { + unsigned CPIdx = BB->getParent()->getConstantPool()-> + getConstantPoolIndex(cast(N)->get()); Select(Chain); IA64Lowering.restoreGP(BB); unsigned dummy = MakeReg(MVT::i64); - BuildMI(BB, IA64::ADD, 2, dummy).addConstantPoolIndex(CP->getIndex()) + BuildMI(BB, IA64::ADD, 2, dummy).addConstantPoolIndex(CPIdx) .addReg(IA64::r1); // CPI+GP if(!isBool) BuildMI(BB, Opc, 1, Result).addReg(dummy); From lattner at cs.uiuc.edu Fri Aug 26 12:18:00 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:18:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp Message-ID: <200508261718.MAA11006@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelPattern.cpp updated: 1.174 -> 1.175 --- Log message: Fix a bug in my previous checkin --- Diffs of the changes: (+1 -1) X86ISelPattern.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.174 llvm/lib/Target/X86/X86ISelPattern.cpp:1.175 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.174 Fri Aug 26 12:15:30 2005 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Fri Aug 26 12:17:49 2005 @@ -3374,7 +3374,7 @@ assert(cast(Node->getOperand(3))->getVT() == MVT::f32 && "Bad EXTLOAD!"); unsigned CPIdx = BB->getParent()->getConstantPool()-> - getConstantPoolIndex(cast(N)->get()); + getConstantPoolIndex(CP->get()); addConstantPoolReference(BuildMI(BB, X86::FLD32m, 4, Result), CPIdx); return Result; From lattner at cs.uiuc.edu Fri Aug 26 12:18:55 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:18:55 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelPattern.cpp Message-ID: <200508261718.MAA11042@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelPattern.cpp updated: 1.62 -> 1.63 --- Log message: Fix a bug in my previous checkin --- Diffs of the changes: (+1 -1) IA64ISelPattern.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/IA64/IA64ISelPattern.cpp diff -u llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.62 llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.63 --- llvm/lib/Target/IA64/IA64ISelPattern.cpp:1.62 Fri Aug 26 12:15:30 2005 +++ llvm/lib/Target/IA64/IA64ISelPattern.cpp Fri Aug 26 12:18:44 2005 @@ -1976,7 +1976,7 @@ } } else if(ConstantPoolSDNode *CP = dyn_cast(Address)) { unsigned CPIdx = BB->getParent()->getConstantPool()-> - getConstantPoolIndex(cast(N)->get()); + getConstantPoolIndex(CP->get()); Select(Chain); IA64Lowering.restoreGP(BB); unsigned dummy = MakeReg(MVT::i64); From lattner at cs.uiuc.edu Fri Aug 26 12:37:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:37:03 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Message-ID: <200508261737.MAA11266@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelLowering.cpp updated: 1.8 -> 1.9 --- Log message: implement the other half of the select_cc -> fsel lowering, which handles when the RHS of the comparison is 0.0. Turn this on by default. --- Diffs of the changes: (+37 -16) PPC32ISelLowering.cpp | 53 ++++++++++++++++++++++++++++++++++---------------- 1 files changed, 37 insertions(+), 16 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.8 llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.9 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.8 Thu Aug 25 19:52:45 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Fri Aug 26 12:36:52 2005 @@ -16,16 +16,10 @@ #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SelectionDAG.h" +#include "llvm/Constants.h" #include "llvm/Function.h" -#include "llvm/Support/CommandLine.h" using namespace llvm; -namespace llvm { - cl::opt FSELTMP("ppc-fsel-custom-legalizer", cl::Hidden, - cl::desc("Use a custom expander for fsel on ppc")); -} - - PPC32TargetLowering::PPC32TargetLowering(TargetMachine &TM) : TargetLowering(TM) { @@ -73,11 +67,9 @@ setOperationAction(ISD::SELECT, MVT::f32, Expand); setOperationAction(ISD::SELECT, MVT::f64, Expand); - // PowerPC wants to turn select_cc of FP into fsel. - if (FSELTMP) { - setOperationAction(ISD::SELECT_CC, MVT::f32, Custom); - setOperationAction(ISD::SELECT_CC, MVT::f64, Custom); - } + // PowerPC wants to turn select_cc of FP into fsel when possible. + setOperationAction(ISD::SELECT_CC, MVT::f32, Custom); + setOperationAction(ISD::SELECT_CC, MVT::f64, Custom); // PowerPC does not have BRCOND* which requires SetCC setOperationAction(ISD::BRCOND, MVT::Other, Expand); @@ -91,14 +83,23 @@ setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand); setSetCCResultContents(ZeroOrOneSetCCResult); - if (!FSELTMP) { - addLegalFPImmediate(+0.0); // Necessary for FSEL - addLegalFPImmediate(-0.0); // - } computeRegisterProperties(); } +/// isFloatingPointZero - Return true if this is 0.0 or -0.0. +static bool isFloatingPointZero(SDOperand Op) { + if (ConstantFPSDNode *CFP = dyn_cast(Op)) + return CFP->isExactlyValue(-0.0) || CFP->isExactlyValue(0.0); + else if (Op.getOpcode() == ISD::EXTLOAD || Op.getOpcode() == ISD::LOAD) { + // Maybe this has already been legalized into the constant pool? + if (ConstantPoolSDNode *CP = dyn_cast(Op.getOperand(1))) + if (ConstantFP *CFP = dyn_cast(CP->get())) + return CFP->isExactlyValue(-0.0) || CFP->isExactlyValue(0.0); + } + return false; +} + /// LowerOperation - Provide custom lowering hooks for some operations. /// SDOperand PPC32TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { @@ -114,6 +115,26 @@ SDOperand LHS = Op.getOperand(0), RHS = Op.getOperand(1); SDOperand TV = Op.getOperand(2), FV = Op.getOperand(3); + // If the RHS of the comparison is a 0.0, we don't need to do the + // subtraction at all. + if (isFloatingPointZero(RHS)) + switch (CC) { + default: assert(0 && "Invalid FSEL condition"); abort(); + case ISD::SETULT: + case ISD::SETLT: + std::swap(TV, FV); // fsel is natively setge, swap operands for setlt + case ISD::SETUGE: + case ISD::SETGE: + return DAG.getTargetNode(PPC::FSEL, ResVT, LHS, TV, FV); + case ISD::SETUGT: + case ISD::SETGT: + std::swap(TV, FV); // fsel is natively setge, swap operands for setlt + case ISD::SETULE: + case ISD::SETLE: + return DAG.getTargetNode(PPC::FSEL, ResVT, + DAG.getNode(ISD::FNEG, ResVT, LHS), TV, FV); + } + switch (CC) { default: assert(0 && "Invalid FSEL condition"); abort(); case ISD::SETULT: From lattner at cs.uiuc.edu Fri Aug 26 12:40:51 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 12:40:51 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp PPC32ISelPattern.cpp Message-ID: <200508261740.MAA11335@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.40 -> 1.41 PPC32ISelPattern.cpp updated: 1.169 -> 1.170 --- Log message: now that fsel is formed during legalization, this code is dead --- Diffs of the changes: (+0 -102) PPC32ISelDAGToDAG.cpp | 12 ------ PPC32ISelPattern.cpp | 90 -------------------------------------------------- 2 files changed, 102 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.40 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.41 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.40 Fri Aug 26 12:15:30 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 12:40:39 2005 @@ -694,18 +694,6 @@ } break; } - case ISD::ConstantFP: { // FIXME: this should get sucked into the legalizer - Constant *CFP = ConstantFP::get(Type::FloatTy, - cast(N)->getValue()); - SDOperand CPN = CurDAG->getConstantPool(CFP, MVT::i32); - SDOperand Tmp; - if (PICEnabled) - Tmp = CurDAG->getTargetNode(PPC::ADDIS, MVT::i32, getGlobalBaseReg(),CPN); - else - Tmp = CurDAG->getTargetNode(PPC::LIS, MVT::i32, CPN); - CurDAG->SelectNodeTo(N, PPC::LFS, N->getValueType(0), CPN, Tmp); - break; - } case ISD::UNDEF: if (N->getValueType(0) == MVT::i32) CurDAG->SelectNodeTo(N, PPC::IMPLICIT_DEF_GPR, MVT::i32); Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.169 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.170 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.169 Fri Aug 26 12:15:30 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Fri Aug 26 12:40:39 2005 @@ -97,7 +97,6 @@ SDOperand BuildUDIVSequence(SDOperand N); unsigned getGlobalBaseReg(); - unsigned getConstDouble(double floatVal, unsigned Result); void MoveCRtoGPR(unsigned CCReg, ISD::CondCode CC, unsigned Result); bool SelectBitfieldInsert(SDOperand OR, unsigned Result); unsigned FoldIfWideZeroExtend(SDOperand N); @@ -443,23 +442,6 @@ return GlobalBaseReg; } -/// getConstDouble - Loads a floating point value into a register, via the -/// Constant Pool. Optionally takes a register in which to load the value. -unsigned ISel::getConstDouble(double doubleVal, unsigned Result=0) { - unsigned Tmp1 = MakeIntReg(); - if (0 == Result) Result = MakeFPReg(); - MachineConstantPool *CP = BB->getParent()->getConstantPool(); - ConstantFP *CFP = ConstantFP::get(Type::DoubleTy, doubleVal); - unsigned CPI = CP->getConstantPoolIndex(CFP); - if (PICEnabled) - BuildMI(BB, PPC::ADDIS, 2, Tmp1).addReg(getGlobalBaseReg()) - .addConstantPoolIndex(CPI); - else - BuildMI(BB, PPC::LIS, 1, Tmp1).addConstantPoolIndex(CPI); - BuildMI(BB, PPC::LFD, 2, Result).addConstantPoolIndex(CPI).addReg(Tmp1); - return Result; -} - /// MoveCRtoGPR - Move CCReg[Idx] to the least significant bit of Result. If /// Inv is true, then invert the result. void ISel::MoveCRtoGPR(unsigned CCReg, ISD::CondCode CC, unsigned Result){ @@ -1602,72 +1584,6 @@ case ISD::SELECT_CC: { ISD::CondCode CC = cast(N.getOperand(4))->get(); - if (!MVT::isInteger(N.getOperand(0).getValueType()) && - !MVT::isInteger(N.getOperand(2).getValueType()) && - CC != ISD::SETEQ && CC != ISD::SETNE) { - MVT::ValueType VT = N.getOperand(0).getValueType(); - unsigned TV = SelectExpr(N.getOperand(2)); // Use if TRUE - unsigned FV = SelectExpr(N.getOperand(3)); // Use if FALSE - - ConstantFPSDNode *CN = dyn_cast(N.getOperand(1)); - if (CN && (CN->isExactlyValue(-0.0) || CN->isExactlyValue(0.0))) { - switch(CC) { - default: assert(0 && "Invalid FSEL condition"); abort(); - case ISD::SETULT: - case ISD::SETLT: - std::swap(TV, FV); // fsel is natively setge, swap operands for setlt - case ISD::SETUGE: - case ISD::SETGE: - Tmp1 = SelectExpr(N.getOperand(0)); // Val to compare against - BuildMI(BB, PPC::FSEL, 3, Result).addReg(Tmp1).addReg(TV).addReg(FV); - return Result; - case ISD::SETUGT: - case ISD::SETGT: - std::swap(TV, FV); // fsel is natively setge, swap operands for setlt - case ISD::SETULE: - case ISD::SETLE: { - if (N.getOperand(0).getOpcode() == ISD::FNEG) { - Tmp2 = SelectExpr(N.getOperand(0).getOperand(0)); - } else { - Tmp2 = MakeReg(VT); - Tmp1 = SelectExpr(N.getOperand(0)); // Val to compare against - BuildMI(BB, PPC::FNEG, 1, Tmp2).addReg(Tmp1); - } - BuildMI(BB, PPC::FSEL, 3, Result).addReg(Tmp2).addReg(TV).addReg(FV); - return Result; - } - } - } else { - Opc = (MVT::f64 == VT) ? PPC::FSUB : PPC::FSUBS; - Tmp1 = SelectExpr(N.getOperand(0)); // Val to compare against - Tmp2 = SelectExpr(N.getOperand(1)); - Tmp3 = MakeReg(VT); - switch(CC) { - default: assert(0 && "Invalid FSEL condition"); abort(); - case ISD::SETULT: - case ISD::SETLT: - BuildMI(BB, Opc, 2, Tmp3).addReg(Tmp1).addReg(Tmp2); - BuildMI(BB, PPC::FSEL, 3, Result).addReg(Tmp3).addReg(FV).addReg(TV); - return Result; - case ISD::SETUGE: - case ISD::SETGE: - BuildMI(BB, Opc, 2, Tmp3).addReg(Tmp1).addReg(Tmp2); - BuildMI(BB, PPC::FSEL, 3, Result).addReg(Tmp3).addReg(TV).addReg(FV); - return Result; - case ISD::SETUGT: - case ISD::SETGT: - BuildMI(BB, Opc, 2, Tmp3).addReg(Tmp2).addReg(Tmp1); - BuildMI(BB, PPC::FSEL, 3, Result).addReg(Tmp3).addReg(FV).addReg(TV); - return Result; - case ISD::SETULE: - case ISD::SETLE: - BuildMI(BB, Opc, 2, Tmp3).addReg(Tmp2).addReg(Tmp1); - BuildMI(BB, PPC::FSEL, 3, Result).addReg(Tmp3).addReg(TV).addReg(FV); - return Result; - } - } - assert(0 && "Should never get here"); - } // handle the setcc cases here. select_cc lhs, 0, 1, 0, cc ConstantSDNode *N1C = dyn_cast(N.getOperand(1)); @@ -1765,12 +1681,6 @@ return Result; } - case ISD::ConstantFP: { - ConstantFPSDNode *CN = cast(N); - Result = getConstDouble(CN->getValue(), Result); - return Result; - } - case ISD::FNEG: if (!NoExcessFPPrecision && ISD::ADD == N.getOperand(0).getOpcode() && From natebegeman at mac.com Fri Aug 26 12:45:17 2005 From: natebegeman at mac.com (Nate Begeman) Date: Fri, 26 Aug 2005 12:45:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Message-ID: <200508261745.MAA11358@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelPattern.cpp updated: 1.170 -> 1.171 --- Log message: Remove some code made dead by the fsel patch --- Diffs of the changes: (+0 -1) PPC32ISelPattern.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.170 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.171 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.170 Fri Aug 26 12:40:39 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Fri Aug 26 12:45:06 2005 @@ -1608,7 +1608,6 @@ // block. if (N.getOperand(3).Val->hasOneUse() && (isa(N.getOperand(3)) || - isa(N.getOperand(3)) || isa(N.getOperand(3)))) FalseValue = 0; else From lattner at cs.uiuc.edu Fri Aug 26 13:36:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 13:36:09 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200508261836.NAA11621@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.54 -> 1.55 --- Log message: Add a new version of ReplaceAllUsesWith, make the comments more useful. --- Diffs of the changes: (+4 -1) SelectionDAG.h | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.54 llvm/include/llvm/CodeGen/SelectionDAG.h:1.55 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.54 Fri Aug 26 12:14:27 2005 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Fri Aug 26 13:35:58 2005 @@ -279,8 +279,11 @@ } /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. - /// This can cause recursive merging of nodes in the DAG. + /// This can cause recursive merging of nodes in the DAG. Use the first + /// version if 'From' is known to have a single result, use the second + /// if you have two nodes with identical results, use the third otherwise. /// + void ReplaceAllUsesWith(SDOperand From, SDOperand Op); void ReplaceAllUsesWith(SDNode *From, SDNode *To); void ReplaceAllUsesWith(SDNode *From, const std::vector &To); From lattner at cs.uiuc.edu Fri Aug 26 13:36:40 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 13:36:40 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508261836.NAA11703@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.170 -> 1.171 --- Log message: Revampt ReplaceAllUsesWith to be more efficient and easier to use. --- Diffs of the changes: (+53 -5) SelectionDAG.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 53 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.170 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.171 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.170 Fri Aug 26 12:14:58 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Aug 26 13:36:28 2005 @@ -2008,8 +2008,53 @@ /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. /// This can cause recursive merging of nodes in the DAG. /// +/// This version assumes From/To have a single result value. +/// +void SelectionDAG::ReplaceAllUsesWith(SDOperand FromN, SDOperand ToN) { + SDNode *From = FromN.Val, *To = ToN.Val; + assert(From->getNumValues() == 1 && To->getNumValues() == 1 && + "Cannot replace with this method!"); + assert(From != To && "Cannot replace uses of with self"); + assert(From->getValueType(0) == To->getValueType(0) && + "Replacing with different values"); + + while (!From->use_empty()) { + // Process users until they are all gone. + SDNode *U = *From->use_begin(); + + // This node is about to morph, remove its old self from the CSE maps. + RemoveNodeFromCSEMaps(U); + + for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) + if (U->getOperand(i).Val == From) { + From->removeUser(U); + U->Operands[i].Val = To; + To->addUser(U); + } + + // Now that we have modified U, add it back to the CSE maps. If it already + // exists there, recursively merge the results together. + if (SDNode *Existing = AddNonLeafNodeToCSEMaps(U)) + ReplaceAllUsesWith(U, Existing); + // U is now dead. + } +} + +/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. +/// This can cause recursive merging of nodes in the DAG. +/// +/// This version assumes From/To have matching types and numbers of result +/// values. +/// void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To) { assert(From != To && "Cannot replace uses of with self"); + assert(From->getNumValues() == To->getNumValues() && + "Cannot use this version of ReplaceAllUsesWith!"); + if (From->getNumValues() == 1) { // If possible, use the faster version. + ReplaceAllUsesWith(SDOperand(From, 0), SDOperand(To, 0)); + return; + } + while (!From->use_empty()) { // Process users until they are all gone. SDNode *U = *From->use_begin(); @@ -2019,8 +2064,6 @@ for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) if (U->getOperand(i).Val == From) { - assert(U->getOperand(i).getValueType() == - To->getValueType(U->getOperand(i).ResNo)); From->removeUser(U); U->Operands[i].Val = To; To->addUser(U); @@ -2030,17 +2073,22 @@ // exists there, recursively merge the results together. if (SDNode *Existing = AddNonLeafNodeToCSEMaps(U)) ReplaceAllUsesWith(U, Existing); - // U is now dead. + // U is now dead. } } +/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead. +/// This can cause recursive merging of nodes in the DAG. +/// +/// This version can replace From with any result values. To must match the +/// number and types of values returned by From. void SelectionDAG::ReplaceAllUsesWith(SDNode *From, const std::vector &To) { assert(From->getNumValues() == To.size() && "Incorrect number of values to replace with!"); - if (To.size() == 1 && To[0].ResNo == 0) { + if (To.size() == 1) { // Degenerate case handled above. - ReplaceAllUsesWith(From, To[0].Val); + ReplaceAllUsesWith(SDOperand(From, 0), To[0]); return; } From lattner at cs.uiuc.edu Fri Aug 26 13:37:34 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 13:37:34 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508261837.NAA11740@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.41 -> 1.42 --- Log message: Changes to adjust to new ReplaceAllUsesWith syntax. Change FP_EXTEND to just return its input, instead of emitting an explicit copy. --- Diffs of the changes: (+15 -13) PPC32ISelDAGToDAG.cpp | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.41 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.42 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.41 Fri Aug 26 12:40:39 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 13:37:23 2005 @@ -654,7 +654,7 @@ } if (New.Val != N) { - CurDAG->ReplaceAllUsesWith(N, New.Val); + CurDAG->ReplaceAllUsesWith(Op, New); N = New.Val; } break; @@ -673,7 +673,7 @@ if (Chain != N->getOperand(0) || Val != N->getOperand(2)) { SDOperand New = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, Reg, Val); - CurDAG->ReplaceAllUsesWith(N, New.Val); + CurDAG->ReplaceAllUsesWith(Op, New); N = New.Val; } break; @@ -752,7 +752,7 @@ if (Ty == MVT::i32) { if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1), PPC::ADDIS, PPC::ADDI, true)) { - CurDAG->ReplaceAllUsesWith(N, I); + CurDAG->ReplaceAllUsesWith(Op, SDOperand(I, 0)); N = I; } else { CurDAG->SelectNodeTo(N, PPC::ADD, MVT::i32, Select(N->getOperand(0)), @@ -799,7 +799,7 @@ } if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1), PPC::ADDIS, PPC::ADDI, true, true)) { - CurDAG->ReplaceAllUsesWith(N, I); + CurDAG->ReplaceAllUsesWith(Op, SDOperand(I, 0)); N = I; } else { CurDAG->SelectNodeTo(N, PPC::SUBF, Ty, Select(N->getOperand(1)), @@ -873,7 +873,7 @@ } else if (Imm) { SDOperand Result = Select(BuildSDIVSequence(N)); assert(Result.ResNo == 0); - CurDAG->ReplaceAllUsesWith(N, Result.Val); + CurDAG->ReplaceAllUsesWith(Op, Result); N = Result.Val; break; } @@ -897,7 +897,7 @@ if (isIntImmediate(N->getOperand(1), Imm) && Imm) { SDOperand Result = Select(BuildUDIVSequence(N)); assert(Result.ResNo == 0); - CurDAG->ReplaceAllUsesWith(N, Result.Val); + CurDAG->ReplaceAllUsesWith(Op, Result); N = Result.Val; break; } @@ -940,7 +940,7 @@ if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1), PPC::ANDISo, PPC::ANDIo)) { - CurDAG->ReplaceAllUsesWith(N, I); + CurDAG->ReplaceAllUsesWith(Op, SDOperand(I, 0)); N = I; break; } @@ -959,14 +959,14 @@ } case ISD::OR: if (SDNode *I = SelectBitfieldInsert(N)) { - CurDAG->ReplaceAllUsesWith(N, I); + CurDAG->ReplaceAllUsesWith(Op, SDOperand(I, 0)); N = I; break; } if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1), PPC::ORIS, PPC::ORI)) { - CurDAG->ReplaceAllUsesWith(N, I); + CurDAG->ReplaceAllUsesWith(Op, SDOperand(I, 0)); N = I; break; } @@ -1007,7 +1007,7 @@ if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), N->getOperand(1), PPC::XORIS, PPC::XORI)) { - CurDAG->ReplaceAllUsesWith(N, I); + CurDAG->ReplaceAllUsesWith(Op, SDOperand(I, 0)); N = I; break; } @@ -1070,11 +1070,13 @@ CurDAG->SelectNodeTo(N, PPC::FABS, N->getValueType(0), Select(N->getOperand(0))); break; - case ISD::FP_EXTEND: + case ISD::FP_EXTEND: { assert(MVT::f64 == N->getValueType(0) && MVT::f32 == N->getOperand(0).getValueType() && "Illegal FP_EXTEND"); - CurDAG->SelectNodeTo(N, PPC::FMR, MVT::f64, Select(N->getOperand(0))); - break; + SDOperand Tmp = Select(N->getOperand(0)); + CurDAG->ReplaceAllUsesWith(Op, Tmp); // Just use the operand as the result. + return Tmp; + } case ISD::FP_ROUND: assert(MVT::f32 == N->getValueType(0) && MVT::f64 == N->getOperand(0).getValueType() && "Illegal FP_ROUND"); From lattner at cs.uiuc.edu Fri Aug 26 13:47:01 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 13:47:01 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <200508261847.NAA11907@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.42 -> 1.43 --- Log message: implement the fold for: bool %test(int %X, int %Y) { %C = setne int %X, 0 ret bool %C } to: _test: addic r2, r3, -1 subfe r3, r2, r3 blr --- Diffs of the changes: (+21 -0) PPC32ISelDAGToDAG.cpp | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.42 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.43 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.42 Fri Aug 26 13:37:23 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 13:46:49 2005 @@ -1376,6 +1376,27 @@ break; } + case ISD::SELECT_CC: { + ISD::CondCode CC = cast(N->getOperand(4))->get(); + + // handle the setcc cases here. select_cc lhs, 0, 1, 0, cc + if (ConstantSDNode *N1C = dyn_cast(N->getOperand(1))) + if (ConstantSDNode *N2C = dyn_cast(N->getOperand(2))) + if (ConstantSDNode *N3C = dyn_cast(N->getOperand(3))) + if (N1C->isNullValue() && N3C->isNullValue() && + N2C->getValue() == 1ULL && CC == ISD::SETNE) { + SDOperand LHS = Select(N->getOperand(0)); + SDOperand Tmp = + CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, + LHS, getI32Imm(~0U)); + CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, Tmp, LHS, + Tmp.getValue(1)); + break; + } + + assert(0 && "Select_cc not implemented yet!"); + } + case ISD::CALLSEQ_START: case ISD::CALLSEQ_END: { unsigned Amt = cast(N->getOperand(1))->getValue(); From lattner at cs.uiuc.edu Fri Aug 26 15:17:11 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:17:11 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/InstrInfoEmitter.cpp Message-ID: <200508262017.PAA12782@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: InstrInfoEmitter.cpp updated: 1.25 -> 1.26 --- Log message: add a marker at the end of the instruction enum list --- Diffs of the changes: (+1 -0) InstrInfoEmitter.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/utils/TableGen/InstrInfoEmitter.cpp diff -u llvm/utils/TableGen/InstrInfoEmitter.cpp:1.25 llvm/utils/TableGen/InstrInfoEmitter.cpp:1.26 --- llvm/utils/TableGen/InstrInfoEmitter.cpp:1.25 Fri Aug 19 15:29:14 2005 +++ llvm/utils/TableGen/InstrInfoEmitter.cpp Fri Aug 26 15:17:00 2005 @@ -40,6 +40,7 @@ OS << " " << NumberedInstructions[i]->TheDef->getName() << ", \t// " << i << "\n"; } + OS << " INSTRUCTION_LIST_END\n"; OS << " };\n"; if (!Namespace.empty()) OS << "}\n"; From lattner at cs.uiuc.edu Fri Aug 26 15:25:14 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:25:14 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp PPC32ISelLowering.cpp PPC32ISelLowering.h PPC32ISelPattern.cpp Message-ID: <200508262025.PAA12885@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.43 -> 1.44 PPC32ISelLowering.cpp updated: 1.9 -> 1.10 PPC32ISelLowering.h updated: 1.2 -> 1.3 PPC32ISelPattern.cpp updated: 1.171 -> 1.172 --- Log message: Make fsel emission work with both the pattern and dag-dag selectors, by giving it a non-instruction opcode. The dag->dag selector used to not select the operands of the fsel, because it thought that whole tree was already selected. --- Diffs of the changes: (+34 -14) PPC32ISelDAGToDAG.cpp | 9 ++++++++- PPC32ISelLowering.cpp | 22 +++++++++++----------- PPC32ISelLowering.h | 15 ++++++++++++++- PPC32ISelPattern.cpp | 2 +- 4 files changed, 34 insertions(+), 14 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.43 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.44 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.43 Fri Aug 26 13:46:49 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 15:25:03 2005 @@ -629,7 +629,8 @@ // target-specific node if it hasn't already been changed. SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { SDNode *N = Op.Val; - if (N->getOpcode() >= ISD::BUILTIN_OP_END) + if (N->getOpcode() >= ISD::BUILTIN_OP_END && + N->getOpcode() < PPCISD::FIRST_NUMBER) return Op; // Already selected. switch (N->getOpcode()) { @@ -747,6 +748,12 @@ assert(N->getValueType(0) == MVT::i32); CurDAG->SelectNodeTo(N, PPC::CNTLZW, MVT::i32, Select(N->getOperand(0))); break; + case PPCISD::FSEL: + CurDAG->SelectNodeTo(N, PPC::FSEL, N->getValueType(0), + Select(N->getOperand(0)), + Select(N->getOperand(1)), + Select(N->getOperand(2))); + break; case ISD::ADD: { MVT::ValueType Ty = N->getValueType(0); if (Ty == MVT::i32) { Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.9 llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.10 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.9 Fri Aug 26 12:36:52 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Fri Aug 26 15:25:03 2005 @@ -125,34 +125,34 @@ std::swap(TV, FV); // fsel is natively setge, swap operands for setlt case ISD::SETUGE: case ISD::SETGE: - return DAG.getTargetNode(PPC::FSEL, ResVT, LHS, TV, FV); + return DAG.getNode(PPCISD::FSEL, ResVT, LHS, TV, FV); case ISD::SETUGT: case ISD::SETGT: std::swap(TV, FV); // fsel is natively setge, swap operands for setlt case ISD::SETULE: case ISD::SETLE: - return DAG.getTargetNode(PPC::FSEL, ResVT, - DAG.getNode(ISD::FNEG, ResVT, LHS), TV, FV); + return DAG.getNode(PPCISD::FSEL, ResVT, + DAG.getNode(ISD::FNEG, ResVT, LHS), TV, FV); } switch (CC) { default: assert(0 && "Invalid FSEL condition"); abort(); case ISD::SETULT: case ISD::SETLT: - return DAG.getTargetNode(PPC::FSEL, ResVT, - DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), FV,TV); + return DAG.getNode(PPCISD::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), FV, TV); case ISD::SETUGE: case ISD::SETGE: - return DAG.getTargetNode(PPC::FSEL, ResVT, - DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), TV,FV); + return DAG.getNode(PPCISD::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, LHS, RHS), TV, FV); case ISD::SETUGT: case ISD::SETGT: - return DAG.getTargetNode(PPC::FSEL, ResVT, - DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), FV,TV); + return DAG.getNode(PPCISD::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), FV, TV); case ISD::SETULE: case ISD::SETLE: - return DAG.getTargetNode(PPC::FSEL, ResVT, - DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), TV,FV); + return DAG.getNode(PPCISD::FSEL, ResVT, + DAG.getNode(ISD::SUB, CmpVT, RHS, LHS), TV, FV); } } break; Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.h diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.2 llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.3 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.2 Thu Aug 25 19:52:45 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.h Fri Aug 26 15:25:03 2005 @@ -1,4 +1,4 @@ -//===-- PPC32ISelLowering.cpp - PPC32 DAG Lowering Impl. --------*- C++ -*-===// +//===-- PPC32ISelLowering.h - PPC32 DAG Lowering Interface ------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -16,8 +16,21 @@ #define LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H #include "llvm/Target/TargetLowering.h" +#include "llvm/CodeGen/SelectionDAG.h" +#include "PowerPC.h" namespace llvm { + namespace PPCISD { + enum NodeType { + // Start the numbering where the builting ops and target ops leave off. + FIRST_NUMBER = ISD::BUILTIN_OP_END+PPC::INSTRUCTION_LIST_END, + + /// FSEL - Traditional three-operand fsel node. + /// + FSEL, + }; + } + class PPC32TargetLowering : public TargetLowering { int VarArgsFrameIndex; // FrameIndex for start of varargs area. int ReturnAddrIndex; // FrameIndex for return slot. Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.171 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.172 --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.171 Fri Aug 26 12:45:06 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Fri Aug 26 15:25:03 2005 @@ -811,7 +811,7 @@ default: Node->dump(); std::cerr << '\n'; assert(0 && "Node not handled!\n"); - case ISD::BUILTIN_OP_END+PPC::FSEL: + case PPCISD::FSEL: Tmp1 = SelectExpr(N.getOperand(0)); Tmp2 = SelectExpr(N.getOperand(1)); Tmp3 = SelectExpr(N.getOperand(2)); From lattner at cs.uiuc.edu Fri Aug 26 15:29:12 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:29:12 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Target.td Message-ID: <200508262029.PAA12965@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: Target.td updated: 1.47 -> 1.48 --- Log message: Add a flag --- Diffs of the changes: (+1 -0) Target.td | 1 + 1 files changed, 1 insertion(+) Index: llvm/lib/Target/Target.td diff -u llvm/lib/Target/Target.td:1.47 llvm/lib/Target/Target.td:1.48 --- llvm/lib/Target/Target.td:1.47 Thu Aug 25 12:07:09 2005 +++ llvm/lib/Target/Target.td Fri Aug 26 15:29:01 2005 @@ -143,6 +143,7 @@ bit isCommutable = 0; // Is this 3 operand instruction commutable? bit isTerminator = 0; // Is this part of the terminator for a basic block? bit hasDelaySlot = 0; // Does this instruction have an delay slot? + bit usesCustomDAGSChedInserter = 0; // Pseudo instr needing special help. } From lattner at cs.uiuc.edu Fri Aug 26 15:31:35 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:31:35 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetInstrInfo.h Message-ID: <200508262031.PAA13081@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetInstrInfo.h updated: 1.78 -> 1.79 --- Log message: Add a new instruction flag --- Diffs of the changes: (+12 -0) TargetInstrInfo.h | 12 ++++++++++++ 1 files changed, 12 insertions(+) Index: llvm/include/llvm/Target/TargetInstrInfo.h diff -u llvm/include/llvm/Target/TargetInstrInfo.h:1.78 llvm/include/llvm/Target/TargetInstrInfo.h:1.79 --- llvm/include/llvm/Target/TargetInstrInfo.h:1.78 Fri Aug 19 11:56:26 2005 +++ llvm/include/llvm/Target/TargetInstrInfo.h Fri Aug 26 15:31:24 2005 @@ -73,6 +73,11 @@ // before control flow occurs. const unsigned M_TERMINATOR_FLAG = 1 << 12; +// M_USES_CUSTOM_DAG_SCHED_INSERTION - Set if this instruction requires custom +// insertion support when the DAG scheduler is inserting it into a machine basic +// block. +const unsigned M_USES_CUSTOM_DAG_SCHED_INSERTION = 1 << 13; + /// TargetOperandInfo - This holds information about one operand of a machine /// instruction, indicating the register class for register operands, etc. /// @@ -264,6 +269,13 @@ return get(Opcode).Flags & M_DELAY_SLOT_FLAG; } + /// usesCustomDAGSchedInsertionHook - Return true if this instruction requires + /// custom insertion support when the DAG scheduler is inserting it into a + /// machine basic block. + bool usesCustomDAGSchedInsertionHook(unsigned Opcode) const { + return get(Opcode).Flags & M_USES_CUSTOM_DAG_SCHED_INSERTION; + } + virtual bool hasResultInterlock(MachineOpCode Opcode) const { return true; } From lattner at cs.uiuc.edu Fri Aug 26 15:40:57 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:40:57 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CodeGenInstruction.h CodeGenTarget.cpp InstrInfoEmitter.cpp Message-ID: <200508262040.PAA13360@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CodeGenInstruction.h updated: 1.10 -> 1.11 CodeGenTarget.cpp updated: 1.32 -> 1.33 InstrInfoEmitter.cpp updated: 1.26 -> 1.27 --- Log message: Expose a new flag to TargetInstrInfo --- Diffs of the changes: (+4 -0) CodeGenInstruction.h | 1 + CodeGenTarget.cpp | 1 + InstrInfoEmitter.cpp | 2 ++ 3 files changed, 4 insertions(+) Index: llvm/utils/TableGen/CodeGenInstruction.h diff -u llvm/utils/TableGen/CodeGenInstruction.h:1.10 llvm/utils/TableGen/CodeGenInstruction.h:1.11 --- llvm/utils/TableGen/CodeGenInstruction.h:1.10 Fri Aug 19 11:57:28 2005 +++ llvm/utils/TableGen/CodeGenInstruction.h Fri Aug 26 15:40:46 2005 @@ -81,6 +81,7 @@ bool isCommutable; bool isTerminator; bool hasDelaySlot; + bool usesCustomDAGSChedInserter; bool hasVariableNumberOfOperands; CodeGenInstruction(Record *R, const std::string &AsmStr); Index: llvm/utils/TableGen/CodeGenTarget.cpp diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.32 llvm/utils/TableGen/CodeGenTarget.cpp:1.33 --- llvm/utils/TableGen/CodeGenTarget.cpp:1.32 Fri Aug 19 14:12:51 2005 +++ llvm/utils/TableGen/CodeGenTarget.cpp Fri Aug 26 15:40:46 2005 @@ -250,6 +250,7 @@ isCommutable = R->getValueAsBit("isCommutable"); isTerminator = R->getValueAsBit("isTerminator"); hasDelaySlot = R->getValueAsBit("hasDelaySlot"); + usesCustomDAGSChedInserter = R->getValueAsBit("usesCustomDAGSChedInserter"); hasVariableNumberOfOperands = false; try { Index: llvm/utils/TableGen/InstrInfoEmitter.cpp diff -u llvm/utils/TableGen/InstrInfoEmitter.cpp:1.26 llvm/utils/TableGen/InstrInfoEmitter.cpp:1.27 --- llvm/utils/TableGen/InstrInfoEmitter.cpp:1.26 Fri Aug 26 15:17:00 2005 +++ llvm/utils/TableGen/InstrInfoEmitter.cpp Fri Aug 26 15:40:46 2005 @@ -197,6 +197,8 @@ if (Inst.isConvertibleToThreeAddress) OS << "|M_CONVERTIBLE_TO_3_ADDR"; if (Inst.isCommutable) OS << "|M_COMMUTABLE"; if (Inst.isTerminator) OS << "|M_TERMINATOR_FLAG"; + if (Inst.usesCustomDAGSChedInserter) + OS << "|M_USES_CUSTOM_DAG_SCHED_INSERTION"; OS << ", 0"; // Emit all of the target-specific flags... From lattner at cs.uiuc.edu Fri Aug 26 15:43:03 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:43:03 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CodeGenInstruction.h CodeGenTarget.cpp InstrInfoEmitter.cpp Message-ID: <200508262043.PAA13418@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CodeGenInstruction.h updated: 1.11 -> 1.12 CodeGenTarget.cpp updated: 1.33 -> 1.34 InstrInfoEmitter.cpp updated: 1.27 -> 1.28 --- Log message: spell this variable right --- Diffs of the changes: (+3 -3) CodeGenInstruction.h | 2 +- CodeGenTarget.cpp | 2 +- InstrInfoEmitter.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/utils/TableGen/CodeGenInstruction.h diff -u llvm/utils/TableGen/CodeGenInstruction.h:1.11 llvm/utils/TableGen/CodeGenInstruction.h:1.12 --- llvm/utils/TableGen/CodeGenInstruction.h:1.11 Fri Aug 26 15:40:46 2005 +++ llvm/utils/TableGen/CodeGenInstruction.h Fri Aug 26 15:42:52 2005 @@ -81,7 +81,7 @@ bool isCommutable; bool isTerminator; bool hasDelaySlot; - bool usesCustomDAGSChedInserter; + bool usesCustomDAGSchedInserter; bool hasVariableNumberOfOperands; CodeGenInstruction(Record *R, const std::string &AsmStr); Index: llvm/utils/TableGen/CodeGenTarget.cpp diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.33 llvm/utils/TableGen/CodeGenTarget.cpp:1.34 --- llvm/utils/TableGen/CodeGenTarget.cpp:1.33 Fri Aug 26 15:40:46 2005 +++ llvm/utils/TableGen/CodeGenTarget.cpp Fri Aug 26 15:42:52 2005 @@ -250,7 +250,7 @@ isCommutable = R->getValueAsBit("isCommutable"); isTerminator = R->getValueAsBit("isTerminator"); hasDelaySlot = R->getValueAsBit("hasDelaySlot"); - usesCustomDAGSChedInserter = R->getValueAsBit("usesCustomDAGSChedInserter"); + usesCustomDAGSchedInserter = R->getValueAsBit("usesCustomDAGSChedInserter"); hasVariableNumberOfOperands = false; try { Index: llvm/utils/TableGen/InstrInfoEmitter.cpp diff -u llvm/utils/TableGen/InstrInfoEmitter.cpp:1.27 llvm/utils/TableGen/InstrInfoEmitter.cpp:1.28 --- llvm/utils/TableGen/InstrInfoEmitter.cpp:1.27 Fri Aug 26 15:40:46 2005 +++ llvm/utils/TableGen/InstrInfoEmitter.cpp Fri Aug 26 15:42:52 2005 @@ -197,7 +197,7 @@ if (Inst.isConvertibleToThreeAddress) OS << "|M_CONVERTIBLE_TO_3_ADDR"; if (Inst.isCommutable) OS << "|M_COMMUTABLE"; if (Inst.isTerminator) OS << "|M_TERMINATOR_FLAG"; - if (Inst.usesCustomDAGSChedInserter) + if (Inst.usesCustomDAGSchedInserter) OS << "|M_USES_CUSTOM_DAG_SCHED_INSERTION"; OS << ", 0"; From lattner at cs.uiuc.edu Fri Aug 26 15:53:20 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:53:20 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200508262053.PAA13601@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.19 -> 1.20 --- Log message: Add a hook --- Diffs of the changes: (+11 -0) TargetLowering.h | 11 +++++++++++ 1 files changed, 11 insertions(+) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.19 llvm/include/llvm/Target/TargetLowering.h:1.20 --- llvm/include/llvm/Target/TargetLowering.h:1.19 Wed Aug 24 11:34:59 2005 +++ llvm/include/llvm/Target/TargetLowering.h Fri Aug 26 15:53:09 2005 @@ -333,6 +333,17 @@ /// implement this. The default implementation of this aborts. virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); + //===--------------------------------------------------------------------===// + // Scheduler hooks + // + + // InsertAtEndOfBasicBlock - This method should be implemented by targets that + // mark instructions with the 'usesCustomDAGSChedInserter' flag. These + // instructions are special in various ways, which require special support to + // insert. The specified MachineInstr is created but not inserted into any + // basic blocks, and the scheduler passes ownership of it to this method. + virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI, + MachineBasicBlock *MBB); private: TargetMachine &TM; From lattner at cs.uiuc.edu Fri Aug 26 15:53:55 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:53:55 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200508262053.PAA13636@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.20 -> 1.21 --- Log message: spell this right! --- Diffs of the changes: (+1 -1) TargetLowering.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.20 llvm/include/llvm/Target/TargetLowering.h:1.21 --- llvm/include/llvm/Target/TargetLowering.h:1.20 Fri Aug 26 15:53:09 2005 +++ llvm/include/llvm/Target/TargetLowering.h Fri Aug 26 15:53:44 2005 @@ -338,7 +338,7 @@ // // InsertAtEndOfBasicBlock - This method should be implemented by targets that - // mark instructions with the 'usesCustomDAGSChedInserter' flag. These + // mark instructions with the 'usesCustomDAGSchedInserter' flag. These // instructions are special in various ways, which require special support to // insert. The specified MachineInstr is created but not inserted into any // basic blocks, and the scheduler passes ownership of it to this method. From lattner at cs.uiuc.edu Fri Aug 26 15:54:58 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:54:58 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp SelectionDAGISel.cpp Message-ID: <200508262054.PAA13758@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.15 -> 1.16 SelectionDAGISel.cpp updated: 1.74 -> 1.75 --- Log message: Call the InsertAtEndOfBasicBlock hook if the usesCustomDAGSchedInserter flag is set on an instruction. --- Diffs of the changes: (+22 -1) ScheduleDAG.cpp | 9 ++++++++- SelectionDAGISel.cpp | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.15 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.16 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.15 Fri Aug 26 12:14:58 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Fri Aug 26 15:54:47 2005 @@ -20,6 +20,7 @@ #include "llvm/CodeGen/SSARegMap.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetInstrInfo.h" +#include "llvm/Target/TargetLowering.h" #include "llvm/Support/CommandLine.h" using namespace llvm; @@ -166,7 +167,13 @@ } // Now that we have emitted all operands, emit this instruction itself. - BB->insert(BB->end(), MI); + if ((II.Flags & M_USES_CUSTOM_DAG_SCHED_INSERTION) == 0) { + BB->insert(BB->end(), MI); + } else { + // Insert this instruction into the end of the basic block, potentially + // taking some custom action. + BB = DAG.getTargetLoweringInfo().InsertAtEndOfBasicBlock(MI, BB); + } } else { switch (Op.getOpcode()) { default: Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.74 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.75 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.74 Tue Aug 23 19:34:29 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Aug 26 15:54:47 2005 @@ -855,6 +855,20 @@ DAG.setRoot(Result.second); } +// InsertAtEndOfBasicBlock - This method should be implemented by targets that +// mark instructions with the 'usesCustomDAGSchedInserter' flag. These +// instructions are special in various ways, which require special support to +// insert. The specified MachineInstr is created but not inserted into any +// basic blocks, and the scheduler passes ownership of it to this method. +MachineBasicBlock *TargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI, + MachineBasicBlock *MBB) { + std::cerr << "If a target marks an instruction with " + "'usesCustomDAGSchedInserter', it must implement " + "TargetLowering::InsertAtEndOfBasicBlock!\n"; + abort(); + return 0; +} + SDOperand TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, SelectionDAG &DAG) { From lattner at cs.uiuc.edu Fri Aug 26 15:55:31 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:55:31 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Target.td Message-ID: <200508262055.PAA13797@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: Target.td updated: 1.48 -> 1.49 --- Log message: spell this right --- Diffs of the changes: (+1 -1) Target.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/Target.td diff -u llvm/lib/Target/Target.td:1.48 llvm/lib/Target/Target.td:1.49 --- llvm/lib/Target/Target.td:1.48 Fri Aug 26 15:29:01 2005 +++ llvm/lib/Target/Target.td Fri Aug 26 15:55:20 2005 @@ -143,7 +143,7 @@ bit isCommutable = 0; // Is this 3 operand instruction commutable? bit isTerminator = 0; // Is this part of the terminator for a basic block? bit hasDelaySlot = 0; // Does this instruction have an delay slot? - bit usesCustomDAGSChedInserter = 0; // Pseudo instr needing special help. + bit usesCustomDAGSchedInserter = 0; // Pseudo instr needing special help. } From lattner at cs.uiuc.edu Fri Aug 26 15:55:51 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 15:55:51 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CodeGenTarget.cpp Message-ID: <200508262055.PAA13831@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CodeGenTarget.cpp updated: 1.34 -> 1.35 --- Log message: spell this right --- Diffs of the changes: (+1 -1) CodeGenTarget.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/utils/TableGen/CodeGenTarget.cpp diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.34 llvm/utils/TableGen/CodeGenTarget.cpp:1.35 --- llvm/utils/TableGen/CodeGenTarget.cpp:1.34 Fri Aug 26 15:42:52 2005 +++ llvm/utils/TableGen/CodeGenTarget.cpp Fri Aug 26 15:55:40 2005 @@ -250,7 +250,7 @@ isCommutable = R->getValueAsBit("isCommutable"); isTerminator = R->getValueAsBit("isTerminator"); hasDelaySlot = R->getValueAsBit("hasDelaySlot"); - usesCustomDAGSchedInserter = R->getValueAsBit("usesCustomDAGSChedInserter"); + usesCustomDAGSchedInserter = R->getValueAsBit("usesCustomDAGSchedInserter"); hasVariableNumberOfOperands = false; try { From lattner at cs.uiuc.edu Fri Aug 26 16:06:51 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 16:06:51 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200508262106.QAA02688@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.21 -> 1.22 --- Log message: add some forward defs --- Diffs of the changes: (+2 -0) TargetLowering.h | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.21 llvm/include/llvm/Target/TargetLowering.h:1.22 --- llvm/include/llvm/Target/TargetLowering.h:1.21 Fri Aug 26 15:53:44 2005 +++ llvm/include/llvm/Target/TargetLowering.h Fri Aug 26 16:06:40 2005 @@ -35,6 +35,8 @@ class SDNode; class SDOperand; class SelectionDAG; + class MachineBasicBlock; + class MachineInstr; //===----------------------------------------------------------------------===// /// TargetLowering - This class defines information used to lower LLVM code to From lattner at cs.uiuc.edu Fri Aug 26 16:24:09 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 16:24:09 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp PPC32ISelLowering.cpp PPC32ISelLowering.h PowerPCInstrInfo.td Message-ID: <200508262124.QAA05293@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.44 -> 1.45 PPC32ISelLowering.cpp updated: 1.10 -> 1.11 PPC32ISelLowering.h updated: 1.3 -> 1.4 PowerPCInstrInfo.td updated: 1.82 -> 1.83 --- Log message: implement SELECT_CC fully for the DAG->DAG isel! --- Diffs of the changes: (+79 -2) PPC32ISelDAGToDAG.cpp | 13 ++++++++++- PPC32ISelLowering.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ PPC32ISelLowering.h | 3 ++ PowerPCInstrInfo.td | 10 +++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.44 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.45 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.44 Fri Aug 26 15:25:03 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Fri Aug 26 16:23:58 2005 @@ -1400,8 +1400,17 @@ Tmp.getValue(1)); break; } - - assert(0 && "Select_cc not implemented yet!"); + + SDOperand CCReg = SelectCC(Select(N->getOperand(0)), + Select(N->getOperand(1)), CC); + unsigned BROpc = getBCCForSetCC(CC); + + bool isFP = MVT::isFloatingPoint(N->getValueType(0)); + unsigned SelectCCOp = isFP ? PPC::SELECT_CC_FP : PPC::SELECT_CC_Int; + CurDAG->SelectNodeTo(N, SelectCCOp, N->getValueType(0), CCReg, + Select(N->getOperand(2)), Select(N->getOperand(3)), + getI32Imm(BROpc)); + break; } case ISD::CALLSEQ_START: Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.10 llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.11 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp:1.10 Fri Aug 26 15:25:03 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.cpp Fri Aug 26 16:23:58 2005 @@ -15,6 +15,7 @@ #include "PPC32TargetMachine.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Constants.h" #include "llvm/Function.h" @@ -553,3 +554,57 @@ assert(0 && "LowerFrameReturnAddress unimplemented"); abort(); } + +MachineBasicBlock * +PPC32TargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI, + MachineBasicBlock *BB) { + assert((MI->getOpcode() == PPC::SELECT_CC_Int || + MI->getOpcode() == PPC::SELECT_CC_FP) && + "Unexpected instr type to insert"); + + // To "insert" a SELECT_CC instruction, we actually have to insert the diamond + // control-flow pattern. The incoming instruction knows the destination vreg + // to set, the condition code register to branch on, the true/false values to + // select between, and a branch opcode to use. + const BasicBlock *LLVM_BB = BB->getBasicBlock(); + ilist::iterator It = BB; + ++It; + + // thisMBB: + // ... + // TrueVal = ... + // cmpTY ccX, r1, r2 + // bCC copy1MBB + // fallthrough --> copy0MBB + MachineBasicBlock *thisMBB = BB; + MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB); + MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB); + BuildMI(BB, MI->getOperand(4).getImmedValue(), 2) + .addReg(MI->getOperand(1).getReg()).addMBB(sinkMBB); + MachineFunction *F = BB->getParent(); + F->getBasicBlockList().insert(It, copy0MBB); + F->getBasicBlockList().insert(It, sinkMBB); + // Update machine-CFG edges + BB->addSuccessor(copy0MBB); + BB->addSuccessor(sinkMBB); + + // copy0MBB: + // %FalseValue = ... + // # fallthrough to sinkMBB + BB = copy0MBB; + + // Update machine-CFG edges + BB->addSuccessor(sinkMBB); + + // sinkMBB: + // %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ] + // ... + BB = sinkMBB; + BuildMI(BB, PPC::PHI, 4, MI->getOperand(0).getReg()) + .addReg(MI->getOperand(3).getReg()).addMBB(copy0MBB) + .addReg(MI->getOperand(2).getReg()).addMBB(thisMBB); + + delete MI; // The pseudo instruction is gone now. + return BB; +} + Index: llvm/lib/Target/PowerPC/PPC32ISelLowering.h diff -u llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.3 llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.4 --- llvm/lib/Target/PowerPC/PPC32ISelLowering.h:1.3 Fri Aug 26 15:25:03 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelLowering.h Fri Aug 26 16:23:58 2005 @@ -64,6 +64,9 @@ virtual std::pair LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, SelectionDAG &DAG); + + virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI, + MachineBasicBlock *MBB); }; } Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.82 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.83 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.82 Thu Aug 25 23:11:42 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Fri Aug 26 16:23:58 2005 @@ -67,6 +67,16 @@ def IMPLICIT_DEF_GPR : Pseudo<(ops GPRC:$rD), "; $rD = IMPLICIT_DEF_GPRC">; def IMPLICIT_DEF_FP : Pseudo<(ops FPRC:$rD), "; %rD = IMPLICIT_DEF_FP">; +// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded by the +// scheduler into a branch sequence. +let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler. + def SELECT_CC_Int : Pseudo<(ops GPRC:$dst, CRRC:$cond, GPRC:$T, GPRC:$F, + i32imm:$BROPC), "; SELECT_CC PSEUDO!">; + def SELECT_CC_FP : Pseudo<(ops FPRC:$dst, CRRC:$cond, FPRC:$T, FPRC:$F, + i32imm:$BROPC), "; SELECT_CC PSEUDO!">; +} + + let Defs = [LR] in def MovePCtoLR : Pseudo<(ops piclabel:$label), "bl $label">; From lattner at cs.uiuc.edu Fri Aug 26 16:26:54 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 16:26:54 -0500 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200508262126.QAA05353@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.166 -> 1.167 --- Log message: dag-isel becomes llc-beta for ppc --- Diffs of the changes: (+1 -1) Makefile.programs | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.166 llvm-test/Makefile.programs:1.167 --- llvm-test/Makefile.programs:1.166 Thu Aug 25 15:02:14 2005 +++ llvm-test/Makefile.programs Fri Aug 26 16:26:42 2005 @@ -187,7 +187,7 @@ endif#DISABLE_DIFFS ifeq ($(ARCH),PowerPC) -LLCBETAOPTION := +LLCBETAOPTION := -enable-ppc-dag-isel endif ifeq ($(ARCH),Alpha) LLCBETAOPTION := -enable-alpha-FTOI -enable-lsr-for-alpha From lattner at cs.uiuc.edu Fri Aug 26 16:39:26 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 16:39:26 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200508262139.QAA05621@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.171 -> 1.172 --- Log message: Checking types here is not safe, because multiple types can map to the same register class. --- Diffs of the changes: (+0 -3) SelectionDAG.cpp | 3 --- 1 files changed, 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.171 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.172 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.171 Fri Aug 26 13:36:28 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Aug 26 16:39:15 2005 @@ -2015,8 +2015,6 @@ assert(From->getNumValues() == 1 && To->getNumValues() == 1 && "Cannot replace with this method!"); assert(From != To && "Cannot replace uses of with self"); - assert(From->getValueType(0) == To->getValueType(0) && - "Replacing with different values"); while (!From->use_empty()) { // Process users until they are all gone. @@ -2102,7 +2100,6 @@ for (unsigned i = 0, e = U->getNumOperands(); i != e; ++i) if (U->getOperand(i).Val == From) { const SDOperand &ToOp = To[U->getOperand(i).ResNo]; - assert(U->getOperand(i).getValueType() == ToOp.getValueType()); From->removeUser(U); U->Operands[i] = ToOp; ToOp.Val->addUser(U); From lattner at cs.uiuc.edu Fri Aug 26 16:49:29 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 16:49:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp Message-ID: <200508262149.QAA05729@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32RegisterInfo.cpp updated: 1.18 -> 1.19 --- Log message: Minor cleanups: * avoid calling getClass() multiple times (it is relatively expensive) * Allow -disable-fp-elim to turn of frame pointer elimination. --- Diffs of the changes: (+8 -7) PPC32RegisterInfo.cpp | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp:1.18 llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp:1.19 --- llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp:1.18 Fri Aug 19 13:30:39 2005 +++ llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp Fri Aug 26 16:49:18 2005 @@ -81,11 +81,12 @@ static const unsigned Opcode[] = { PPC::STB, PPC::STH, PPC::STW, PPC::STFS, PPC::STFD }; - unsigned OC = Opcode[getIdx(getClass(SrcReg))]; + const TargetRegisterClass *RegClass = getClass(SrcReg); + unsigned OC = Opcode[getIdx(RegClass)]; if (SrcReg == PPC::LR) { BuildMI(MBB, MI, PPC::MFLR, 1, PPC::R11); addFrameReference(BuildMI(MBB, MI, OC, 3).addReg(PPC::R11),FrameIdx); - } else if (PPC32::CRRCRegisterClass == getClass(SrcReg)) { + } else if (RegClass == PPC32::CRRCRegisterClass) { BuildMI(MBB, MI, PPC::MFCR, 0, PPC::R11); addFrameReference(BuildMI(MBB, MI, OC, 3).addReg(PPC::R11),FrameIdx); } else { @@ -96,15 +97,16 @@ void PPC32RegisterInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, - unsigned DestReg, int FrameIdx) const{ + unsigned DestReg, int FrameIdx) const { static const unsigned Opcode[] = { PPC::LBZ, PPC::LHZ, PPC::LWZ, PPC::LFS, PPC::LFD }; - unsigned OC = Opcode[getIdx(getClass(DestReg))]; + const TargetRegisterClass *RegClass = getClass(SrcReg); + unsigned OC = Opcode[getIdx(RegClass)]; if (DestReg == PPC::LR) { addFrameReference(BuildMI(MBB, MI, OC, 2, PPC::R11), FrameIdx); BuildMI(MBB, MI, PPC::MTLR, 1).addReg(PPC::R11); - } else if (PPC32::CRRCRegisterClass == getClass(DestReg)) { + } else if (RegClass == PPC32::CRRCRegisterClass) { addFrameReference(BuildMI(MBB, MI, OC, 2, PPC::R11), FrameIdx); BuildMI(MBB, MI, PPC::MTCRF, 1, DestReg).addReg(PPC::R11); } else { @@ -139,8 +141,7 @@ // if frame pointer elimination is disabled. // static bool hasFP(MachineFunction &MF) { - MachineFrameInfo *MFI = MF.getFrameInfo(); - return MFI->hasVarSizedObjects(); + return NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects(); } void PPC32RegisterInfo:: From lattner at cs.uiuc.edu Fri Aug 26 16:51:41 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 16:51:41 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp Message-ID: <200508262151.QAA05768@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32RegisterInfo.cpp updated: 1.19 -> 1.20 --- Log message: teach getClass what a condition reg is --- Diffs of the changes: (+5 -3) PPC32RegisterInfo.cpp | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp:1.19 llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp:1.20 --- llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp:1.19 Fri Aug 26 16:49:18 2005 +++ llvm/lib/Target/PowerPC/PPC32RegisterInfo.cpp Fri Aug 26 16:51:29 2005 @@ -44,10 +44,12 @@ } static const TargetRegisterClass *getClass(unsigned SrcReg) { + if (PPC32::GPRCRegisterClass->contains(SrcReg)) + return PPC32::GPRCRegisterClass; if (PPC32::FPRCRegisterClass->contains(SrcReg)) return PPC32::FPRCRegisterClass; - assert(PPC32::GPRCRegisterClass->contains(SrcReg) && "Reg not FPR or GPR"); - return PPC32::GPRCRegisterClass; + assert(PPC32::CRRCRegisterClass->contains(SrcReg) &&"Reg not FPR, GPR, CRRC"); + return PPC32::CRRCRegisterClass; } static unsigned getIdx(const TargetRegisterClass *RC) { @@ -101,7 +103,7 @@ static const unsigned Opcode[] = { PPC::LBZ, PPC::LHZ, PPC::LWZ, PPC::LFS, PPC::LFD }; - const TargetRegisterClass *RegClass = getClass(SrcReg); + const TargetRegisterClass *RegClass = getClass(DestReg); unsigned OC = Opcode[getIdx(RegClass)]; if (DestReg == PPC::LR) { addFrameReference(BuildMI(MBB, MI, OC, 2, PPC::R11), FrameIdx); From natebegeman at mac.com Fri Aug 26 17:04:28 2005 From: natebegeman at mac.com (Nate Begeman) Date: Fri, 26 Aug 2005 17:04:28 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp PowerPCInstrInfo.td Message-ID: <200508262204.RAA06326@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCAsmPrinter.cpp updated: 1.88 -> 1.89 PowerPCInstrInfo.td updated: 1.83 -> 1.84 --- Log message: Remove operand type 'crbit', since it is no longer used --- Diffs of the changes: (+0 -11) PowerPCAsmPrinter.cpp | 8 -------- PowerPCInstrInfo.td | 3 --- 2 files changed, 11 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.88 llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.89 --- llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.88 Mon Aug 22 17:00:02 2005 +++ llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp Fri Aug 26 17:04:17 2005 @@ -160,14 +160,6 @@ O << ')'; } } - void printcrbit(const MachineInstr *MI, unsigned OpNo, - MVT::ValueType VT) { - unsigned char value = MI->getOperand(OpNo).getImmedValue(); - assert(value <= 3 && "Invalid crbit argument!"); - unsigned CCReg = MI->getOperand(OpNo-1).getReg(); - unsigned RegNo = enumRegToMachineReg(CCReg); - O << 4 * RegNo + value; - } void printcrbitm(const MachineInstr *MI, unsigned OpNo, MVT::ValueType VT) { unsigned CCReg = MI->getOperand(OpNo).getReg(); Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.83 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.84 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.83 Fri Aug 26 16:23:58 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Fri Aug 26 17:04:17 2005 @@ -51,9 +51,6 @@ def symbolLo: Operand { let PrintMethod = "printSymbolLo"; } -def crbit: Operand { - let PrintMethod = "printcrbit"; -} def crbitm: Operand { let PrintMethod = "printcrbitm"; } From lattner at cs.uiuc.edu Fri Aug 26 17:06:05 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 17:06:05 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Message-ID: <200508262206.RAA08106@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrInfo.td updated: 1.84 -> 1.85 --- Log message: allow code using mtcrf to assemble --- Diffs of the changes: (+1 -1) PowerPCInstrInfo.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.84 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.85 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.84 Fri Aug 26 17:04:17 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Fri Aug 26 17:05:54 2005 @@ -349,7 +349,7 @@ def MFCTR : XFXForm_1_ext<31, 339, 288, (ops GPRC:$rT), "mfctr $rT">; def MFLR : XFXForm_1_ext<31, 339, 256, (ops GPRC:$rT), "mflr $rT">; def MFCR : XFXForm_3<31, 19, (ops GPRC:$rT), "mfcr $rT">; -def MTCRF : XFXForm_5<31, 144, (ops CRRC:$FXM, GPRC:$rS), +def MTCRF : XFXForm_5<31, 144, (ops crbitm:$FXM, GPRC:$rS), "mtcrf $FXM, $rS">; def MFOCRF : XFXForm_5a<31, 19, (ops GPRC:$rT, crbitm:$FXM), "mfcr $rT, $FXM">; From lattner at cs.uiuc.edu Fri Aug 26 17:18:43 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 17:18:43 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/PrologEpilogInserter.cpp Message-ID: <200508262218.RAA11697@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: PrologEpilogInserter.cpp updated: 1.44 -> 1.45 --- Log message: Make this code safe for when loadRegFromStackSlot inserts multiple instructions. --- Diffs of the changes: (+13 -1) PrologEpilogInserter.cpp | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/PrologEpilogInserter.cpp diff -u llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.44 llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.45 --- llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.44 Sat May 14 22:09:58 2005 +++ llvm/lib/CodeGen/PrologEpilogInserter.cpp Fri Aug 26 17:18:32 2005 @@ -217,13 +217,25 @@ while (I2 != MBB->begin() && TII.isTerminatorInstr((--I2)->getOpcode())) I = I2; + bool AtStart = I2 == MBB->begin(); + MachineBasicBlock::iterator BeforeI = I; + if (!AtStart) + --BeforeI; + // Restore all registers immediately before the return and any terminators // that preceed it. for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) { RegInfo->loadRegFromStackSlot(*MBB, I, RegsToSave[i], StackSlots[i]); assert(I != MBB->begin() && "loadRegFromStackSlot didn't insert any code!"); - --I; // Insert in reverse order + // Insert in reverse order. loadRegFromStackSlot can insert multiple + // instructions. + if (AtStart) + I = MBB->begin(); + else { + I = BeforeI; + ++I; + } } } } From lattner at cs.uiuc.edu Fri Aug 26 17:50:11 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 17:50:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200508262250.RAA23151@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.75 -> 1.76 --- Log message: Don't copy regs that are only used in the entry block into a vreg. This changes the code generated for: short %test(short %A) { %B = xor short %A, -32768 ret short %B } to: _test: xori r2, r3, 32768 xoris r2, r2, 65535 extsh r3, r2 blr instead of: _test: rlwinm r2, r3, 0, 16, 31 xori r2, r3, 32768 xoris r2, r2, 65535 extsh r3, r2 blr --- Diffs of the changes: (+9 -3) SelectionDAGISel.cpp | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.75 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.76 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.75 Fri Aug 26 15:54:47 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Aug 26 17:49:59 2005 @@ -1077,9 +1077,15 @@ AI != E; ++AI,++a) if (!AI->use_empty()) { SDL.setValue(AI, Args[a]); - SDOperand Copy = - CopyValueToVirtualRegister(SDL, AI, FuncInfo.ValueMap[AI]); - UnorderedChains.push_back(Copy); + + if (IsOnlyUsedInOneBasicBlock(AI) == F.begin()) { + // Only used in the entry block, no need to copy it to a vreg for + // other blocks. + } else { + SDOperand Copy = + CopyValueToVirtualRegister(SDL, AI, FuncInfo.ValueMap[AI]); + UnorderedChains.push_back(Copy); + } } } else { // Otherwise, if any argument is only accessed in a single basic block, From lattner at cs.uiuc.edu Fri Aug 26 17:50:51 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 17:50:51 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200508262250.RAA23211@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.174 -> 1.175 --- Log message: Nate noticed that Andrew never did this. This fixes PR600: http://llvm.cs.uiuc.edu/PR600 --- Diffs of the changes: (+1 -1) LegalizeDAG.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.174 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.175 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.174 Fri Aug 26 12:14:58 2005 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Aug 26 17:50:40 2005 @@ -2005,7 +2005,7 @@ Result = DAG.getNode(ISD::UNDEF, NVT); break; case ISD::Constant: - Result = DAG.getNode(ISD::ZERO_EXTEND, NVT, Op); + Result = DAG.getNode(ISD::SIGN_EXTEND, NVT, Op); assert(isa(Result) && "Didn't constant fold zext?"); break; case ISD::ConstantFP: From lattner at cs.uiuc.edu Fri Aug 26 18:41:39 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 18:41:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp Message-ID: <200508262341.SAA23585@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCBranchSelector.cpp updated: 1.13 -> 1.14 --- Log message: Propagate cr# from COND_BRANCH to the actual branch instruction as appropriate --- Diffs of the changes: (+3 -2) PowerPCBranchSelector.cpp | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp diff -u llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp:1.13 llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp:1.14 --- llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp:1.13 Wed Aug 24 18:08:16 2005 +++ llvm/lib/Target/PowerPC/PowerPCBranchSelector.cpp Fri Aug 26 18:41:27 2005 @@ -106,12 +106,13 @@ int Displacement = OffsetMap[trueMBB] - ByteCount; unsigned Opcode = MBBI->getOperand(1).getImmedValue(); + unsigned CRReg = MBBI->getOperand(0).getReg(); unsigned Inverted = PPC32InstrInfo::invertPPCBranchOpcode(Opcode); if (Displacement >= -32768 && Displacement <= 32767) { - BuildMI(*MBB, MBBJ, Opcode, 2).addReg(PPC::CR0).addMBB(trueMBB); + BuildMI(*MBB, MBBJ, Opcode, 2).addReg(CRReg).addMBB(trueMBB); } else { - BuildMI(*MBB, MBBJ, Inverted, 2).addReg(PPC::CR0).addSImm(8); + BuildMI(*MBB, MBBJ, Inverted, 2).addReg(CRReg).addSImm(8); BuildMI(*MBB, MBBJ, PPC::B, 1).addMBB(trueMBB); BuildMI(*MBB, MBBJ, PPC::B, 1).addMBB(falseMBB); } From lattner at cs.uiuc.edu Fri Aug 26 18:42:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 18:42:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Message-ID: <200508262342.SAA23619@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PowerPCInstrInfo.td updated: 1.85 -> 1.86 --- Log message: The condition register being branched on may not be cr0, as such, print it. This fixes: UnitTests/2005-07-17-INT-To-FP.c --- Diffs of the changes: (+6 -6) PowerPCInstrInfo.td | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.85 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.86 --- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.85 Fri Aug 26 17:05:54 2005 +++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td Fri Aug 26 18:42:05 2005 @@ -88,17 +88,17 @@ // FIXME: 4*CR# needs to be added to the BI field! // This will only work for CR0 as it stands now def BLT : BForm<16, 0, 0, 12, 0, (ops CRRC:$crS, target:$block), - "blt $block">; + "blt $crS, $block">; def BLE : BForm<16, 0, 0, 4, 1, (ops CRRC:$crS, target:$block), - "ble $block">; + "ble $crS, $block">; def BEQ : BForm<16, 0, 0, 12, 2, (ops CRRC:$crS, target:$block), - "beq $block">; + "beq $crS, $block">; def BGE : BForm<16, 0, 0, 4, 0, (ops CRRC:$crS, target:$block), - "bge $block">; + "bge $crS, $block">; def BGT : BForm<16, 0, 0, 12, 1, (ops CRRC:$crS, target:$block), - "bgt $block">; + "bgt $crS, $block">; def BNE : BForm<16, 0, 0, 4, 2, (ops CRRC:$crS, target:$block), - "bne $block">; + "bne $crS, $block">; } let isCall = 1, From lattner at cs.uiuc.edu Fri Aug 26 19:58:17 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 26 Aug 2005 19:58:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Message-ID: <200508270058.TAA00619@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.16 -> 1.17 --- Log message: fix PHI node emission for basic blocks that have select_cc's in them on ppc32 --- Diffs of the changes: (+3 -2) ScheduleDAG.cpp | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.16 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.17 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.16 Fri Aug 26 15:54:47 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Fri Aug 26 19:58:02 2005 @@ -52,8 +52,9 @@ assert(&MRI && "Target doesn't provide register info?"); } - void Run() { + MachineBasicBlock *Run() { Emit(DAG.getRoot()); + return BB; } private: @@ -229,5 +230,5 @@ /// graph. void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &SD) { if (ViewDAGs) SD.viewGraph(); - SimpleSched(SD, BB).Run(); + BB = SimpleSched(SD, BB).Run(); } From lattner at cs.uiuc.edu Sat Aug 27 11:17:42 2005 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat, 27 Aug 2005 11:17:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200508271617.LAA04375@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.76 -> 1.77 --- Log message: Disable this code, which broke many tests last night --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.76 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.77 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.76 Fri Aug 26 17:49:59 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Aug 27 11:16:51 2005 @@ -1078,7 +1078,7 @@ if (!AI->use_empty()) { SDL.setValue(AI, Args[a]); - if (IsOnlyUsedInOneBasicBlock(AI) == F.begin()) { + if (0 && IsOnlyUsedInOneBasicBlock(AI) == F.begin()) { // Only used in the entry block, no need to copy it to a vreg for // other blocks. } else { From reid at x10sys.com Sat Aug 27 13:50:51 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 13:50:51 -0500 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200508271850.NAA19880@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.323 -> 1.324 --- Log message: Implement PR614: http://llvm.cs.uiuc.edu/PR614 : These changes modify the makefiles so that the output of flex and bison are placed in the SRC directory, not the OBJ directory. It is intended that they be checked in as any other LLVM source so that platforms without convenient access to flex/bison can be compiled. From now on, if you change a .y or .l file you *must* also commit the generated .cpp and .h files. --- Diffs of the changes: (+16 -12) Makefile.rules | 28 ++++++++++++++++------------ 1 files changed, 16 insertions(+), 12 deletions(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.323 llvm/Makefile.rules:1.324 --- llvm/Makefile.rules:1.323 Wed Aug 24 23:59:49 2005 +++ llvm/Makefile.rules Sat Aug 27 13:50:38 2005 @@ -1158,9 +1158,9 @@ ifneq ($(LexFiles),) -LexOutput := $(strip $(patsubst %.l,%.cpp,$(LexFiles))) - -.PRECIOUS: $(LexOutput) +# Cancel built-in rules for lex +%.c: %.l +%.cpp: %.l # Note the extra sed filtering here, used to cut down on the warnings emited # by GCC. The last line is a gross hack to work around flex aparently not @@ -1168,13 +1168,17 @@ # uninitialized string buffers in LLVM we can generate very long tokens, so # this is a hack around it. # FIXME. (f.e. char Buffer[10000] ) -%.cpp: %.l +$(PROJ_SRC_DIR)/%.cpp: $(PROJ_SRC_DIR)/%.l $(Echo) Flexing $*.l - $(Verb) $(FLEX) -t $< | \ + $(Verb) $(FLEX) -t $(PROJ_SRC_DIR)/$*.l | \ $(SED) 's/void yyunput/inline void yyunput/' | \ $(SED) 's/void \*yy_flex_realloc/inline void *yy_flex_realloc/' | \ $(SED) 's/#define YY_BUF_SIZE 16384/#define YY_BUF_SIZE (16384*64)/' \ - > $@ + > $(PROJ_SRC_DIR)/$*.cpp + $(Echo) "*** DON'T FORGET TO CHECK IN $*.cpp (generated file)" + +LexObjs := $(patsubst %.l,$(ObjDir)/%.o,$(LexFiles)) +$(LexObjs): $(ObjDir)/%.o : $(PROJ_SRC_DIR)/%.cpp clean-local:: -$(Verb) $(RM) -f $(LexOutput) @@ -1189,7 +1193,7 @@ YaccFiles := $(filter %.y,$(Sources)) ifneq ($(YaccFiles),) -YaccOutput := $(addprefix $(patsubst %.y,%,$(YaccFiles)),.h .cpp .output) +YaccOutput := $(addprefix $(patsubst %.y,%,$(YaccFiles)),.output) .PRECIOUS: $(YaccOutput) @@ -1199,14 +1203,14 @@ %.h: %.y # Rule for building the bison parsers... -%.cpp %.h : %.y +$(PROJ_SRC_DIR)/%.cpp $(PROJ_SRC_DIR)/%.h : $(PROJ_SRC_DIR)/%.y $(Echo) "Bisoning $*.y" - $(Verb) $(BISON) -v -d -p $( Changes in directory llvm/tools/llvmc: ConfigLexer.cpp added (r1.1) --- Log message: Implement PR614: http://llvm.cs.uiuc.edu/PR614 : These changes modify the makefiles so that the output of flex and bison are placed in the SRC directory, not the OBJ directory. It is intended that they be checked in as any other LLVM source so that platforms without convenient access to flex/bison can be compiled. From now on, if you change a .y or .l file you *must* also commit the generated .cpp and .h files. --- Diffs of the changes: (+2720 -0) ConfigLexer.cpp | 2720 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 2720 insertions(+) Index: llvm/tools/llvmc/ConfigLexer.cpp diff -c /dev/null llvm/tools/llvmc/ConfigLexer.cpp:1.1 *** /dev/null Sat Aug 27 13:50:49 2005 --- llvm/tools/llvmc/ConfigLexer.cpp Sat Aug 27 13:50:39 2005 *************** *** 0 **** --- 1,2720 ---- + #define yy_create_buffer Config_create_buffer + #define yy_delete_buffer Config_delete_buffer + #define yy_scan_buffer Config_scan_buffer + #define yy_scan_string Config_scan_string + #define yy_scan_bytes Config_scan_bytes + #define yy_flex_debug Config_flex_debug + #define yy_init_buffer Config_init_buffer + #define yy_flush_buffer Config_flush_buffer + #define yy_load_buffer_state Config_load_buffer_state + #define yy_switch_to_buffer Config_switch_to_buffer + #define yyin Configin + #define yyleng Configleng + #define yylex Configlex + #define yyout Configout + #define yyrestart Configrestart + #define yytext Configtext + + #line 19 "ConfigLexer.cpp" + /* A lexical scanner generated by flex */ + + /* Scanner skeleton version: + * $Header: /var/cvs/llvm/llvm/tools/llvmc/ConfigLexer.cpp,v 1.1 2005/08/27 18:50:39 reid Exp $ + */ + + #define FLEX_SCANNER + #define YY_FLEX_MAJOR_VERSION 2 + #define YY_FLEX_MINOR_VERSION 5 + + #include + #include + + + /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ + #ifdef c_plusplus + #ifndef __cplusplus + #define __cplusplus + #endif + #endif + + + #ifdef __cplusplus + + #include + + /* Use prototypes in function declarations. */ + #define YY_USE_PROTOS + + /* The "const" storage-class-modifier is valid. */ + #define YY_USE_CONST + + #else /* ! __cplusplus */ + + #if __STDC__ + + #define YY_USE_PROTOS + #define YY_USE_CONST + + #endif /* __STDC__ */ + #endif /* ! __cplusplus */ + + #ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use + #include + #include + #define YY_USE_CONST + #define YY_USE_PROTOS + #endif + + #ifdef YY_USE_CONST + #define yyconst const + #else + #define yyconst + #endif + + + #ifdef YY_USE_PROTOS + #define YY_PROTO(proto) proto + #else + #define YY_PROTO(proto) () + #endif + + /* Returned upon end-of-file. */ + #define YY_NULL 0 + + /* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ + #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + + /* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ + #define BEGIN yy_start = 1 + 2 * + + /* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ + #define YY_START ((yy_start - 1) / 2) + #define YYSTATE YY_START + + /* Action number for EOF rule of a given start state. */ + #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + + /* Special action meaning "start processing a new file". */ + #define YY_NEW_FILE yyrestart( yyin ) + + #define YY_END_OF_BUFFER_CHAR 0 + + /* Size of default input buffer. */ + #define YY_BUF_SIZE (16384*64) + + typedef struct yy_buffer_state *YY_BUFFER_STATE; + + extern int yyleng; + extern FILE *yyin, *yyout; + + #define EOB_ACT_CONTINUE_SCAN 0 + #define EOB_ACT_END_OF_FILE 1 + #define EOB_ACT_LAST_MATCH 2 + + /* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + + /* Return all but the first 'n' matched characters back to the input stream. */ + + #define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + + #define unput(c) yyunput( c, yytext_ptr ) + + /* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + typedef unsigned int yy_size_t; + + + struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + #define YY_BUFFER_NEW 0 + #define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ + #define YY_BUFFER_EOF_PENDING 2 + }; + + static YY_BUFFER_STATE yy_current_buffer = 0; + + /* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ + #define YY_CURRENT_BUFFER yy_current_buffer + + + /* yy_hold_char holds the character lost when yytext is formed. */ + static char yy_hold_char; + + static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + + int yyleng; + + /* Points to current character in buffer. */ + static char *yy_c_buf_p = (char *) 0; + static int yy_init = 1; /* whether we need to initialize */ + static int yy_start = 0; /* start state number */ + + /* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ + static int yy_did_buffer_switch_on_eof; + + void yyrestart YY_PROTO(( FILE *input_file )); + + void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); + void yy_load_buffer_state YY_PROTO(( void )); + YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); + void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); + void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); + void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); + #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + + YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); + YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); + YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + + static void *yy_flex_alloc YY_PROTO(( yy_size_t )); + static inline void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); + static void yy_flex_free YY_PROTO(( void * )); + + #define yy_new_buffer yy_create_buffer + + #define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + + #define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + + #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + + #define yywrap() 1 + #define YY_SKIP_YYWRAP + typedef unsigned char YY_CHAR; + FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + typedef int yy_state_type; + extern char *yytext; + #define yytext_ptr yytext + + static yy_state_type yy_get_previous_state YY_PROTO(( void )); + static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); + static int yy_get_next_buffer YY_PROTO(( void )); + static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + + /* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ + #define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + + #define YY_NUM_RULES 55 + #define YY_END_OF_BUFFER 56 + static yyconst short int yy_accept[411] = + { 0, + 1, 1, 56, 55, 1, 4, 55, 55, 55, 52, + 52, 6, 5, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 1, 4, + 0, 53, 0, 2, 0, 54, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 49, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 51, 52, 52, 50, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 3, 0, 52, 52, 52, 52, 52, + + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 29, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 8, 9, 52, 52, 10, + + 11, 12, 13, 14, 15, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 39, 40, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 26, 52, 28, 52, + 52, 52, 32, 52, 52, 52, 52, 43, 52, 52, + 52, 52, 52, 52, 52, 25, 52, 21, 52, 52, + + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 46, 47, 52, 45, 30, + 52, 52, 52, 52, 41, 52, 52, 52, 52, 52, + 52, 17, 52, 52, 52, 52, 52, 52, 52, 52, + 7, 52, 52, 52, 52, 52, 52, 27, 31, 52, + 52, 52, 42, 52, 52, 52, 52, 52, 52, 52, + 18, 52, 52, 52, 52, 52, 52, 37, 52, 35, + 52, 52, 36, 44, 24, 22, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 23, 19, 52, 52, 52, 52, 52, 52, 52, 52, + + 52, 52, 52, 52, 33, 20, 16, 38, 34, 0 + } ; + + static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 5, 6, 1, 7, 1, 1, 1, + 1, 1, 8, 8, 8, 9, 8, 8, 10, 11, + 12, 13, 14, 8, 8, 8, 8, 8, 1, 1, + 15, 1, 1, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 24, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 24, 39, 40, + 1, 41, 1, 1, 8, 1, 42, 43, 44, 45, + + 46, 47, 48, 49, 50, 24, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 24, 63, + 64, 65, 1, 8, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + + static yyconst int yy_meta[66] = + { 0, + 1, 1, 1, 1, 1, 1, 2, 3, 1, 3, + 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3 + } ; + + static yyconst short int yy_base[415] = + { 0, + 0, 0, 728, 3250, 725, 3250, 723, 719, 63, 61, + 0, 3250, 3250, 36, 61, 46, 65, 67, 80, 83, + 57, 72, 91, 105, 106, 75, 659, 84, 659, 671, + 41, 39, 82, 654, 665, 651, 662, 661, 704, 3250, + 700, 3250, 82, 3250, 701, 3250, 0, 146, 181, 216, + 251, 303, 347, 387, 422, 470, 516, 571, 625, 669, + 106, 644, 0, 667, 641, 672, 646, 671, 645, 667, + 69, 641, 88, 666, 0, 640, 670, 0, 656, 655, + 642, 628, 627, 665, 638, 646, 617, 128, 104, 640, + 614, 637, 611, 3250, 666, 88, 608, 612, 612, 609, + + 107, 609, 614, 600, 599, 612, 600, 113, 598, 596, + 709, 759, 809, 851, 899, 940, 990, 1028, 1065, 1121, + 1175, 1229, 1265, 1317, 1364, 0, 633, 607, 631, 605, + 622, 596, 614, 588, 623, 611, 618, 595, 583, 589, + 613, 584, 156, 598, 165, 572, 596, 595, 589, 563, + 594, 601, 567, 574, 585, 559, 571, 570, 562, 555, + 565, 552, 559, 563, 188, 552, 551, 545, 551, 558, + 544, 1416, 1470, 1524, 1577, 1616, 1669, 3250, 1723, 1769, + 1822, 196, 237, 1869, 1923, 1965, 2005, 574, 548, 581, + 555, 581, 555, 575, 549, 0, 0, 573, 546, 0, + + 0, 0, 0, 0, 0, 563, 554, 536, 527, 553, + 518, 550, 524, 539, 512, 545, 519, 508, 514, 514, + 508, 502, 492, 483, 483, 485, 466, 469, 2042, 2095, + 261, 2148, 277, 2192, 2245, 2298, 287, 2342, 3250, 3250, + 2384, 2437, 323, 2477, 499, 465, 477, 450, 470, 435, + 446, 417, 449, 437, 421, 409, 429, 398, 417, 389, + 414, 385, 401, 372, 383, 370, 369, 356, 363, 351, + 355, 351, 356, 352, 335, 361, 3250, 2526, 3250, 371, + 408, 2578, 3250, 2630, 2668, 432, 2725, 3250, 2779, 379, + 353, 384, 351, 372, 346, 0, 350, 0, 324, 367, + + 336, 349, 321, 349, 323, 333, 302, 300, 305, 296, + 275, 294, 286, 287, 273, 3250, 3250, 444, 3250, 3250, + 454, 480, 2832, 2870, 3250, 490, 2927, 151, 150, 305, + 279, 0, 303, 277, 301, 275, 300, 267, 273, 247, + 0, 167, 260, 258, 240, 238, 222, 3250, 3250, 126, + 2967, 502, 3250, 526, 248, 222, 243, 208, 226, 197, + 0, 150, 170, 197, 196, 193, 187, 3250, 189, 3250, + 3006, 3058, 3250, 3250, 0, 0, 206, 180, 202, 202, + 162, 162, 160, 159, 159, 144, 3102, 3140, 213, 224, + 0, 0, 250, 127, 3192, 539, 151, 151, 124, 115, + + 104, 74, 89, 552, 3250, 0, 0, 3250, 3250, 3250, + 3241, 3244, 3246, 85 + } ; + + static yyconst short int yy_def[415] = + { 0, + 410, 1, 410, 410, 410, 410, 410, 411, 412, 413, + 414, 410, 410, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 410, 410, + 411, 410, 412, 410, 410, 410, 414, 413, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 410, 410, 414, 414, 414, 414, 414, + + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, + 413, 413, 413, 413, 413, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 413, 413, 413, 413, 413, 413, 410, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 413, 413, + 413, 413, 413, 413, 413, 413, 413, 413, 410, 410, + 413, 413, 413, 413, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 413, 413, 410, 413, 410, 413, + 413, 413, 410, 413, 413, 413, 413, 410, 413, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 410, 410, 413, 410, 410, + 413, 413, 413, 413, 410, 413, 413, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 410, 410, 414, + 413, 413, 410, 413, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 414, 410, 414, 410, + 413, 413, 410, 410, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 413, 413, 414, 414, + 414, 414, 414, 414, 413, 413, 414, 414, 414, 414, + + 414, 414, 414, 413, 410, 414, 414, 410, 410, 0, + 410, 410, 410, 410 + } ; + + static yyconst short int yy_nxt[3316] = + { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 11, + 11, 11, 11, 11, 13, 4, 14, 15, 16, 11, + 11, 17, 11, 11, 11, 11, 18, 11, 19, 20, + 21, 11, 22, 11, 23, 11, 24, 11, 25, 11, + 26, 27, 28, 29, 11, 11, 30, 11, 11, 11, + 11, 31, 11, 32, 33, 34, 11, 35, 11, 36, + 11, 37, 11, 38, 11, 44, 45, 46, 47, 61, + 47, 47, 47, 47, 47, 66, 47, 94, 95, 63, + 102, 68, 100, 70, 44, 45, 136, 47, 49, 84, + 101, 71, 86, 75, 62, 408, 74, 137, 50, 64, + + 67, 47, 51, 52, 77, 53, 69, 54, 72, 75, + 55, 78, 56, 79, 85, 57, 73, 87, 80, 58, + 59, 76, 60, 88, 65, 90, 92, 63, 103, 81, + 139, 407, 368, 126, 75, 78, 78, 104, 82, 127, + 126, 140, 105, 83, 151, 153, 157, 97, 89, 162, + 91, 93, 46, 47, 169, 47, 47, 47, 47, 47, + 163, 47, 406, 152, 154, 201, 202, 203, 204, 205, + 379, 355, 407, 170, 201, 202, 203, 204, 205, 380, + 206, 369, 406, 407, 406, 403, 47, 46, 47, 126, + 47, 47, 47, 47, 47, 356, 47, 201, 202, 203, + + 204, 205, 239, 47, 394, 47, 47, 47, 47, 47, + 111, 47, 364, 126, 208, 381, 392, 391, 393, 392, + 391, 47, 46, 47, 382, 47, 47, 47, 47, 47, + 126, 47, 384, 397, 392, 391, 47, 223, 390, 389, + 386, 385, 398, 240, 47, 112, 47, 47, 47, 47, + 47, 383, 47, 376, 375, 378, 47, 46, 47, 377, + 47, 47, 47, 47, 47, 376, 47, 277, 47, 399, + 47, 47, 47, 47, 47, 376, 47, 47, 400, 375, + 375, 367, 361, 279, 47, 366, 47, 47, 47, 47, + 47, 47, 47, 283, 47, 401, 47, 47, 47, 47, + + 47, 47, 47, 365, 402, 63, 363, 362, 113, 46, + 47, 361, 47, 47, 47, 47, 47, 47, 47, 361, + 360, 359, 358, 357, 63, 63, 341, 47, 347, 288, + 47, 346, 47, 47, 47, 47, 47, 345, 47, 344, + 332, 316, 47, 47, 47, 47, 47, 47, 47, 343, + 47, 342, 114, 46, 47, 341, 47, 47, 47, 47, + 47, 341, 47, 47, 340, 339, 338, 317, 47, 337, + 47, 47, 47, 47, 47, 47, 47, 319, 47, 336, + 47, 47, 47, 47, 47, 335, 47, 47, 334, 333, + 332, 332, 115, 46, 47, 331, 47, 47, 47, 47, + + 47, 47, 47, 330, 329, 328, 315, 314, 313, 312, + 298, 47, 311, 296, 320, 47, 116, 47, 47, 47, + 47, 47, 310, 47, 309, 308, 307, 47, 46, 47, + 306, 47, 47, 47, 47, 47, 305, 47, 325, 47, + 304, 47, 47, 47, 47, 47, 303, 47, 47, 302, + 348, 47, 301, 47, 47, 47, 47, 47, 300, 47, + 349, 47, 47, 47, 47, 47, 47, 47, 298, 47, + 299, 298, 47, 297, 296, 117, 46, 47, 296, 47, + 47, 47, 47, 47, 47, 47, 46, 47, 295, 350, + 47, 47, 47, 47, 47, 47, 353, 47, 294, 47, + + 47, 47, 47, 47, 293, 47, 292, 291, 373, 47, + 47, 47, 47, 47, 47, 47, 290, 47, 274, 118, + 47, 119, 46, 47, 273, 47, 47, 47, 47, 47, + 47, 47, 374, 47, 272, 47, 47, 47, 47, 47, + 271, 47, 47, 270, 269, 405, 47, 268, 47, 47, + 47, 47, 47, 75, 47, 267, 47, 266, 409, 47, + 265, 47, 47, 47, 47, 47, 47, 47, 264, 263, + 262, 120, 261, 260, 259, 258, 121, 46, 47, 47, + 47, 47, 47, 47, 47, 257, 47, 256, 255, 254, + 253, 252, 47, 251, 75, 75, 250, 249, 248, 247, + + 246, 245, 228, 78, 227, 226, 225, 224, 200, 222, + 197, 47, 196, 221, 220, 219, 218, 217, 216, 78, + 215, 78, 214, 213, 212, 211, 210, 209, 207, 200, + 122, 46, 47, 200, 47, 47, 47, 47, 47, 199, + 47, 197, 196, 198, 197, 196, 195, 194, 193, 192, + 191, 190, 189, 188, 78, 171, 168, 167, 166, 165, + 75, 164, 161, 160, 159, 47, 123, 158, 94, 78, + 78, 156, 155, 150, 124, 46, 47, 149, 47, 47, + 47, 47, 47, 148, 47, 147, 146, 145, 75, 144, + 143, 75, 142, 141, 138, 135, 134, 133, 132, 131, + + 130, 129, 128, 44, 42, 39, 110, 109, 108, 47, + 107, 106, 99, 98, 125, 46, 47, 96, 47, 47, + 47, 47, 47, 42, 47, 40, 39, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 172, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 173, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 410, 410, 410, 410, 410, 410, 174, 46, 47, 410, + 47, 47, 47, 47, 47, 410, 47, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 47, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 175, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 410, 410, 410, 410, 410, 176, 46, 47, 410, 47, + 47, 47, 47, 47, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 177, 178, 47, 410, 47, + + 47, 47, 47, 47, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 47, 410, 410, 179, 46, 47, 410, 47, 47, 47, + 47, 47, 410, 47, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 47, 410, + 180, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 181, 46, 47, 410, + 47, 47, 47, 47, 47, 410, 47, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 47, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 182, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 183, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 184, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 185, 46, 47, 410, 47, 47, 47, 47, + 47, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 186, + 46, 47, 410, 47, 47, 47, 47, 47, 410, 47, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 187, 46, 47, 410, 47, 47, 47, 47, 47, + 410, 47, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 47, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 229, 46, 47, 410, 47, + 47, 47, 47, 47, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 230, + 46, 47, 410, 47, 47, 47, 47, 47, 410, 47, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 231, 46, 47, 410, 47, 47, 47, 47, + 47, 410, 47, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 47, 410, 410, + 410, 232, 46, 47, 410, 47, 47, 47, 47, 47, + 410, 47, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 47, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 233, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 234, 46, + 47, 410, 47, 47, 47, 47, 47, 410, 47, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 47, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 235, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 410, 410, 410, 236, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 237, 46, 47, + 410, 47, 47, 47, 47, 47, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 238, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 241, 46, + 47, 410, 47, 47, 47, 47, 47, 410, 47, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 47, 410, 410, 410, 410, 410, 410, + 242, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 47, 410, 410, 410, 410, + 243, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 47, 410, 244, 46, 47, + 410, 47, 47, 47, 47, 47, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 275, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 276, 46, 47, 410, 47, 47, 47, + 47, 47, 410, 47, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 47, 410, + 410, 410, 410, 410, 410, 410, 410, 278, 46, 47, + + 410, 47, 47, 47, 47, 47, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 280, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 281, 46, 47, 410, 47, 47, 47, + 47, 47, 410, 47, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 47, 410, + 410, 410, 410, 410, 410, 410, 410, 282, 46, 47, + 410, 47, 47, 47, 47, 47, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 47, 410, 410, 284, 410, 410, 410, 285, + 46, 47, 410, 47, 47, 47, 47, 47, 410, 47, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 47, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 286, 46, 47, 410, 47, 47, 47, 47, + 47, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 47, 410, 410, + 410, 410, 287, 46, 47, 410, 47, 47, 47, 47, + 47, 410, 47, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 289, 46, 47, 410, 47, 47, 47, 47, 47, + 410, 47, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 47, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 318, 46, 47, 410, 47, 47, 47, + 47, 47, 410, 47, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 47, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 321, 46, 47, 410, 47, + 47, 47, 47, 47, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 47, 410, 410, 322, 46, 47, 410, 47, 47, 47, + 47, 47, 410, 47, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 47, 410, + 410, 323, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 324, 46, 47, 410, 47, 47, 47, 47, 47, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 326, 46, 47, 410, 47, 47, + 47, 47, 47, 410, 47, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 47, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 327, 46, 47, + 410, 47, 47, 47, 47, 47, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 47, 410, 410, 351, 46, 47, 410, 47, + 47, 47, 47, 47, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 352, 46, 47, 410, 47, 47, 47, 47, + 47, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 47, 410, 410, + 410, 410, 354, 370, 47, 410, 47, 47, 47, 47, + 47, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 47, 371, 410, + 410, 372, 46, 47, 410, 47, 47, 47, 47, 47, + 410, 47, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 47, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 387, 46, 47, 410, 47, 47, 47, + 47, 47, 410, 47, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 47, 410, + + 410, 410, 410, 410, 410, 410, 410, 388, 46, 47, + 410, 47, 47, 47, 47, 47, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 47, 410, 410, 395, 46, 47, 410, 47, + 47, 47, 47, 47, 410, 47, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 47, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 396, 46, 47, + + 410, 47, 47, 47, 47, 47, 410, 47, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 47, 410, 410, 410, 410, 410, 410, 410, + 404, 41, 41, 41, 43, 43, 43, 48, 48, 3, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410 + } ; + + static yyconst short int yy_chk[3316] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 9, 9, 10, 10, 14, + 10, 10, 10, 10, 10, 16, 10, 26, 26, 15, + 32, 17, 31, 18, 43, 43, 71, 414, 10, 21, + 31, 18, 22, 32, 14, 403, 19, 71, 10, 15, + + 16, 10, 10, 10, 20, 10, 17, 10, 18, 19, + 10, 20, 10, 20, 21, 10, 18, 22, 20, 10, + 10, 19, 10, 23, 15, 24, 25, 28, 33, 20, + 73, 402, 350, 61, 19, 33, 20, 33, 20, 61, + 96, 73, 33, 20, 88, 89, 96, 28, 23, 101, + 24, 25, 48, 48, 108, 48, 48, 48, 48, 48, + 101, 48, 401, 88, 89, 143, 143, 143, 143, 143, + 362, 328, 400, 108, 145, 145, 145, 145, 145, 362, + 143, 350, 399, 398, 397, 394, 48, 49, 49, 328, + 49, 49, 49, 49, 49, 329, 49, 165, 165, 165, + + 165, 165, 182, 182, 386, 182, 182, 182, 182, 182, + 49, 182, 342, 329, 145, 363, 385, 384, 383, 382, + 381, 49, 50, 50, 363, 50, 50, 50, 50, 50, + 342, 50, 367, 389, 380, 379, 182, 165, 378, 377, + 369, 367, 389, 183, 183, 50, 183, 183, 183, 183, + 183, 366, 183, 365, 364, 360, 50, 51, 51, 359, + 51, 51, 51, 51, 51, 358, 51, 231, 231, 390, + 231, 231, 231, 231, 231, 357, 231, 183, 390, 356, + 355, 347, 346, 233, 233, 345, 233, 233, 233, 233, + 233, 51, 233, 237, 237, 393, 237, 237, 237, 237, + + 237, 231, 237, 344, 393, 343, 340, 339, 51, 52, + 52, 338, 52, 52, 52, 52, 52, 233, 52, 337, + 336, 335, 334, 333, 331, 330, 315, 237, 314, 243, + 243, 313, 243, 243, 243, 243, 243, 312, 243, 311, + 310, 275, 275, 52, 275, 275, 275, 275, 275, 309, + 275, 308, 52, 53, 53, 307, 53, 53, 53, 53, + 53, 306, 53, 243, 305, 304, 303, 276, 276, 302, + 276, 276, 276, 276, 276, 275, 276, 280, 280, 301, + 280, 280, 280, 280, 280, 300, 280, 53, 299, 297, + 295, 294, 53, 54, 54, 293, 54, 54, 54, 54, + + 54, 276, 54, 292, 291, 290, 274, 273, 272, 271, + 270, 280, 269, 268, 281, 281, 54, 281, 281, 281, + 281, 281, 267, 281, 266, 265, 264, 54, 55, 55, + 263, 55, 55, 55, 55, 55, 262, 55, 286, 286, + 261, 286, 286, 286, 286, 286, 260, 286, 281, 259, + 318, 318, 258, 318, 318, 318, 318, 318, 257, 318, + 321, 321, 55, 321, 321, 321, 321, 321, 256, 321, + 255, 254, 286, 253, 252, 55, 56, 56, 251, 56, + 56, 56, 56, 56, 318, 56, 322, 322, 250, 322, + 322, 322, 322, 322, 321, 322, 326, 326, 249, 326, + + 326, 326, 326, 326, 248, 326, 247, 246, 352, 352, + 56, 352, 352, 352, 352, 352, 245, 352, 228, 56, + 322, 56, 57, 57, 227, 57, 57, 57, 57, 57, + 326, 57, 354, 354, 226, 354, 354, 354, 354, 354, + 225, 354, 352, 224, 223, 396, 396, 222, 396, 396, + 396, 396, 396, 221, 396, 220, 57, 219, 404, 404, + 218, 404, 404, 404, 404, 404, 354, 404, 217, 216, + 215, 57, 214, 213, 212, 211, 57, 58, 58, 396, + 58, 58, 58, 58, 58, 210, 58, 209, 208, 207, + 206, 199, 404, 198, 195, 194, 193, 192, 191, 190, + + 189, 188, 171, 170, 169, 168, 167, 166, 164, 163, + 162, 58, 161, 160, 159, 158, 157, 156, 155, 154, + 153, 152, 151, 150, 149, 148, 147, 146, 144, 142, + 58, 59, 59, 141, 59, 59, 59, 59, 59, 140, + 59, 139, 138, 137, 136, 135, 134, 133, 132, 131, + 130, 129, 128, 127, 110, 109, 107, 106, 105, 104, + 103, 102, 100, 99, 98, 59, 59, 97, 95, 93, + 92, 91, 90, 87, 59, 60, 60, 86, 60, 60, + 60, 60, 60, 85, 60, 84, 83, 82, 81, 80, + 79, 77, 76, 74, 72, 70, 69, 68, 67, 66, + + 65, 64, 62, 45, 41, 39, 38, 37, 36, 60, + 35, 34, 30, 29, 60, 111, 111, 27, 111, 111, + 111, 111, 111, 8, 111, 7, 5, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 111, 112, 112, 0, 112, 112, + 112, 112, 112, 0, 112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 112, 113, 113, 0, 113, 113, + 113, 113, 113, 0, 113, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, + 0, 0, 0, 0, 0, 0, 113, 114, 114, 0, + 114, 114, 114, 114, 114, 0, 114, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 114, 115, 115, 0, 115, 115, + 115, 115, 115, 0, 115, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, + 0, 0, 0, 0, 0, 115, 116, 116, 0, 116, + 116, 116, 116, 116, 0, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 117, 117, 0, 117, + + 117, 117, 117, 117, 0, 117, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 117, 0, 0, 117, 118, 118, 0, 118, 118, 118, + 118, 118, 0, 118, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, + 118, 119, 119, 0, 119, 119, 119, 119, 119, 0, + 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 120, 120, 0, + 120, 120, 120, 120, 120, 0, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 120, 121, 121, 0, 121, 121, 121, 121, 121, 0, + 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 122, 0, 122, 122, + 122, 122, 122, 0, 122, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, + 122, 123, 123, 0, 123, 123, 123, 123, 123, 0, + 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 123, 124, 124, 0, 124, 124, 124, 124, + 124, 0, 124, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, + 125, 125, 0, 125, 125, 125, 125, 125, 0, 125, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 125, 172, 172, 0, 172, 172, 172, 172, 172, + 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 172, 173, 173, 0, 173, + 173, 173, 173, 173, 0, 173, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, + 174, 174, 0, 174, 174, 174, 174, 174, 0, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 174, 175, 175, 0, 175, 175, 175, 175, + 175, 0, 175, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 175, 0, 0, + 0, 175, 176, 176, 0, 176, 176, 176, 176, 176, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 177, 177, 0, 177, 177, + 177, 177, 177, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 179, + 179, 0, 179, 179, 179, 179, 179, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 180, 180, 0, 180, 180, + 180, 180, 180, 0, 180, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 181, 181, + 0, 181, 181, 181, 181, 181, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 181, 184, 184, 0, 184, 184, + 184, 184, 184, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 185, + 185, 0, 185, 185, 185, 185, 185, 0, 185, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, + 185, 186, 186, 0, 186, 186, 186, 186, 186, 0, + 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, + 186, 187, 187, 0, 187, 187, 187, 187, 187, 0, + 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 187, 0, 187, 229, 229, + 0, 229, 229, 229, 229, 229, 0, 229, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 229, 230, 230, 0, 230, 230, 230, 230, 230, 0, + 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 230, 232, 232, 0, 232, 232, 232, + 232, 232, 0, 232, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, + 0, 0, 0, 0, 0, 0, 0, 232, 234, 234, + + 0, 234, 234, 234, 234, 234, 0, 234, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 234, 235, 235, 0, 235, 235, 235, 235, 235, 0, + 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 235, 236, 236, 0, 236, 236, 236, + 236, 236, 0, 236, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, + 0, 0, 0, 0, 0, 0, 0, 236, 238, 238, + 0, 238, 238, 238, 238, 238, 0, 238, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 238, 0, 0, 238, 0, 0, 0, 238, + 241, 241, 0, 241, 241, 241, 241, 241, 0, 241, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 241, 242, 242, 0, 242, 242, 242, 242, + 242, 0, 242, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, + 0, 0, 242, 244, 244, 0, 244, 244, 244, 244, + 244, 0, 244, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 244, 278, 278, 0, 278, 278, 278, 278, 278, + 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 278, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 278, 282, 282, 0, 282, 282, 282, + 282, 282, 0, 282, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 282, 284, 284, 0, 284, + 284, 284, 284, 284, 0, 284, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 284, 0, 0, 284, 285, 285, 0, 285, 285, 285, + 285, 285, 0, 285, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 285, 0, + 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 285, 287, 287, 0, 287, 287, 287, 287, 287, 0, + 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 287, 289, 289, 0, 289, 289, + 289, 289, 289, 0, 289, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 289, 323, 323, + 0, 323, 323, 323, 323, 323, 0, 323, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 323, 0, 0, 323, 324, 324, 0, 324, + 324, 324, 324, 324, 0, 324, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 324, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 324, 327, 327, 0, 327, 327, 327, 327, + 327, 0, 327, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, + 0, 0, 327, 351, 351, 0, 351, 351, 351, 351, + 351, 0, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 351, 351, 0, + 0, 351, 371, 371, 0, 371, 371, 371, 371, 371, + 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 371, 372, 372, 0, 372, 372, 372, + 372, 372, 0, 372, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, + + 0, 0, 0, 0, 0, 0, 0, 372, 387, 387, + 0, 387, 387, 387, 387, 387, 0, 387, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 387, 0, 0, 387, 388, 388, 0, 388, + 388, 388, 388, 388, 0, 388, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 388, 395, 395, + + 0, 395, 395, 395, 395, 395, 0, 395, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 395, 0, 0, 0, 0, 0, 0, 0, + 395, 411, 411, 411, 412, 412, 412, 413, 413, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + + 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, + 410, 410, 410, 410, 410 + } ; + + static yy_state_type yy_last_accepting_state; + static char *yy_last_accepting_cpos; + + /* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ + #define REJECT reject_used_but_not_detected + #define yymore() yymore_used_but_not_detected + #define YY_MORE_ADJ 0 + #define YY_RESTORE_YY_MORE_OFFSET + char *yytext; + #line 1 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + #define INITIAL 0 + /*===- ConfigLexer.l - Scanner for CompilerDriver Config Files -*- C++ -*--===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the flex scanner for configuration files for the + // llvmc CompilerDriver. + // + //===----------------------------------------------------------------------===*/ + #define YY_NEVER_INTERACTIVE 1 + #line 29 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + + #include "ConfigLexer.h" + + #define YY_INPUT(buf,result,max_size) \ + { \ + assert(ConfigLexerInput != 0 && "Oops"); \ + result = ConfigLexerInput->read(buf,max_size); \ + if (result == 0 ) result = YY_NULL; \ + } + + #define YY_FATAL_ERROR(msg) \ + { \ + assert(ConfigLexerInput != 0 && "Oops"); \ + ConfigLexerInput->error(msg); \ + } + + #define YY_DECL ConfigLexerTokens llvm::Configlex() + + #define yyterminate() { return EOFTOK; } + + using namespace llvm; + + inline llvm::ConfigLexerTokens + handleNameContext(llvm::ConfigLexerTokens token) { + ConfigLexerState.StringVal = yytext; + if (ConfigLexerState.in_value) + return OPTION; + return token; + } + + inline llvm::ConfigLexerTokens + handleSubstitution(llvm::ConfigLexerTokens token) { + if (ConfigLexerState.in_value) { + ConfigLexerState.StringVal = yytext; + return token; + } + YY_FATAL_ERROR("Substitition tokens not allowed in names" ); + return ERRORTOK; + }; + + inline llvm::ConfigLexerTokens handleValueContext(llvm::ConfigLexerTokens token) { + ConfigLexerState.StringVal = yytext; + if (ConfigLexerState.in_value) + return token; + return OPTION; + } + + #line 1314 "ConfigLexer.cpp" + + /* Macros after this point can all be overridden by user definitions in + * section 1. + */ + + #ifndef YY_SKIP_YYWRAP + #ifdef __cplusplus + extern "C" int yywrap YY_PROTO(( void )); + #else + extern int yywrap YY_PROTO(( void )); + #endif + #endif + + #ifndef YY_NO_UNPUT + static inline void yyunput YY_PROTO(( int c, char *buf_ptr )); + #endif + + #ifndef yytext_ptr + static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); + #endif + + #ifdef YY_NEED_STRLEN + static int yy_flex_strlen YY_PROTO(( yyconst char * )); + #endif + + #ifndef YY_NO_INPUT + #ifdef __cplusplus + static int yyinput YY_PROTO(( void )); + #else + static int input YY_PROTO(( void )); + #endif + #endif + + #if YY_STACK_USED + static int yy_start_stack_ptr = 0; + static int yy_start_stack_depth = 0; + static int *yy_start_stack = 0; + #ifndef YY_NO_PUSH_STATE + static void yy_push_state YY_PROTO(( int new_state )); + #endif + #ifndef YY_NO_POP_STATE + static void yy_pop_state YY_PROTO(( void )); + #endif + #ifndef YY_NO_TOP_STATE + static int yy_top_state YY_PROTO(( void )); + #endif + + #else + #define YY_NO_PUSH_STATE 1 + #define YY_NO_POP_STATE 1 + #define YY_NO_TOP_STATE 1 + #endif + + #ifdef YY_MALLOC_DECL + YY_MALLOC_DECL + #else + #if __STDC__ + #ifndef __cplusplus + #include + #endif + #else + /* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ + #endif + #endif + + /* Amount of stuff to slurp up with each read. */ + #ifndef YY_READ_BUF_SIZE + #define YY_READ_BUF_SIZE 8192 + #endif + + /* Copy whatever the last rule matched to the standard output. */ + + #ifndef ECHO + /* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ + #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) + #endif + + /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ + #ifndef YY_INPUT + #define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); + #endif + + /* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ + #ifndef yyterminate + #define yyterminate() return YY_NULL + #endif + + /* Number of entries by which start-condition stack grows. */ + #ifndef YY_START_STACK_INCR + #define YY_START_STACK_INCR 25 + #endif + + /* Report a fatal error. */ + #ifndef YY_FATAL_ERROR + #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) + #endif + + /* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ + #ifndef YY_DECL + #define YY_DECL int yylex YY_PROTO(( void )) + #endif + + /* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ + #ifndef YY_USER_ACTION + #define YY_USER_ACTION + #endif + + /* Code executed at the end of each rule. */ + #ifndef YY_BREAK + #define YY_BREAK break; + #endif + + #define YY_RULE_SETUP \ + YY_USER_ACTION + + YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp = NULL, *yy_bp = NULL; + register int yy_act; + + #line 114 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + + + #line 1468 "ConfigLexer.cpp" + + if ( yy_init ) + { + yy_init = 0; + + #ifdef YY_USER_INIT + YY_USER_INIT; + #endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 411 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_current_state != 410 ); + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + + yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + + + do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + + case 1: + YY_RULE_SETUP + #line 116 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { if (ConfigLexerState.in_value) return SPACE; } + YY_BREAK + case 2: + YY_RULE_SETUP + #line 118 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { /* Ignore comments */ + ConfigLexerState.in_value = false; + ConfigLexerState.lineNum++; + return EOLTOK; + } + YY_BREAK + case 3: + YY_RULE_SETUP + #line 124 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { ConfigLexerState.lineNum++; + /* Don't return EOLTOK! */ + } + YY_BREAK + case 4: + YY_RULE_SETUP + #line 128 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { ConfigLexerState.in_value = false; + ConfigLexerState.lineNum++; + return EOLTOK; + } + YY_BREAK + case 5: + YY_RULE_SETUP + #line 133 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { ConfigLexerState.in_value = true; + return EQUALS; + } + YY_BREAK + case 6: + YY_RULE_SETUP + #line 137 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return SEPARATOR; } + YY_BREAK + case 7: + YY_RULE_SETUP + #line 139 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(VERSION_TOK); } + YY_BREAK + case 8: + YY_RULE_SETUP + #line 141 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(LANG); } + YY_BREAK + case 9: + YY_RULE_SETUP + #line 142 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(LIBS); } + YY_BREAK + case 10: + YY_RULE_SETUP + #line 143 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(NAME); } + YY_BREAK + case 11: + YY_RULE_SETUP + #line 144 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(OPT1); } + YY_BREAK + case 12: + YY_RULE_SETUP + #line 145 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(OPT2); } + YY_BREAK + case 13: + YY_RULE_SETUP + #line 146 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(OPT3); } + YY_BREAK + case 14: + YY_RULE_SETUP + #line 147 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(OPT4); } + YY_BREAK + case 15: + YY_RULE_SETUP + #line 148 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(OPT5); } + YY_BREAK + case 16: + YY_RULE_SETUP + #line 150 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(PREPROCESSOR); } + YY_BREAK + case 17: + YY_RULE_SETUP + #line 151 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(COMMAND); } + YY_BREAK + case 18: + YY_RULE_SETUP + #line 152 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(REQUIRED); } + YY_BREAK + case 19: + YY_RULE_SETUP + #line 154 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(TRANSLATOR); } + YY_BREAK + case 20: + YY_RULE_SETUP + #line 155 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(PREPROCESSES); } + YY_BREAK + case 21: + YY_RULE_SETUP + #line 156 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(OUTPUT); } + YY_BREAK + case 22: + YY_RULE_SETUP + #line 158 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(OPTIMIZER); } + YY_BREAK + case 23: + YY_RULE_SETUP + #line 159 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(TRANSLATES); } + YY_BREAK + case 24: + YY_RULE_SETUP + #line 161 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(ASSEMBLER); } + YY_BREAK + case 25: + YY_RULE_SETUP + #line 163 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleNameContext(LINKER); } + YY_BREAK + case 26: + YY_RULE_SETUP + #line 165 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(ARGS_SUBST); } + YY_BREAK + case 27: + YY_RULE_SETUP + #line 166 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(BINDIR_SUBST); } + YY_BREAK + case 28: + YY_RULE_SETUP + #line 167 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(DEFS_SUBST); } + YY_BREAK + case 29: + YY_RULE_SETUP + #line 168 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(IN_SUBST); } + YY_BREAK + case 30: + YY_RULE_SETUP + #line 169 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(INCLS_SUBST); } + YY_BREAK + case 31: + YY_RULE_SETUP + #line 170 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LIBDIR_SUBST); } + YY_BREAK + case 32: + YY_RULE_SETUP + #line 171 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LIBS_SUBST); } + YY_BREAK + case 33: + YY_RULE_SETUP + #line 172 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LLVMGCCDIR_SUBST); } + YY_BREAK + case 34: + YY_RULE_SETUP + #line 173 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LLVMGCCARCH_SUBST); } + YY_BREAK + case 35: + YY_RULE_SETUP + #line 174 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LLVMGCC_SUBST); } + YY_BREAK + case 36: + YY_RULE_SETUP + #line 175 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LLVMGXX_SUBST); } + YY_BREAK + case 37: + YY_RULE_SETUP + #line 176 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LLVMCC1_SUBST); } + YY_BREAK + case 38: + YY_RULE_SETUP + #line 177 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(LLVMCC1PLUS_SUBST); } + YY_BREAK + case 39: + YY_RULE_SETUP + #line 178 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(OPT_SUBST); } + YY_BREAK + case 40: + YY_RULE_SETUP + #line 179 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(OUT_SUBST); } + YY_BREAK + case 41: + YY_RULE_SETUP + #line 180 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(STATS_SUBST); } + YY_BREAK + case 42: + YY_RULE_SETUP + #line 181 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(TARGET_SUBST); } + YY_BREAK + case 43: + YY_RULE_SETUP + #line 182 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(TIME_SUBST); } + YY_BREAK + case 44: + YY_RULE_SETUP + #line 183 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(VERBOSE_SUBST); } + YY_BREAK + case 45: + YY_RULE_SETUP + #line 184 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(FOPTS_SUBST); } + YY_BREAK + case 46: + YY_RULE_SETUP + #line 185 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(MOPTS_SUBST); } + YY_BREAK + case 47: + YY_RULE_SETUP + #line 186 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleSubstitution(WOPTS_SUBST); } + YY_BREAK + case 48: + YY_RULE_SETUP + #line 188 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleValueContext(ASSEMBLY); } + YY_BREAK + case 49: + YY_RULE_SETUP + #line 189 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleValueContext(BYTECODE); } + YY_BREAK + case 50: + YY_RULE_SETUP + #line 190 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleValueContext(TRUETOK); } + YY_BREAK + case 51: + YY_RULE_SETUP + #line 191 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { return handleValueContext(FALSETOK); } + YY_BREAK + case 52: + YY_RULE_SETUP + #line 193 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { ConfigLexerState.StringVal = yytext; return OPTION; } + YY_BREAK + case 53: + YY_RULE_SETUP + #line 194 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { ConfigLexerState.StringVal = yytext+1; // Nuke start quote + ConfigLexerState.StringVal.erase( + --ConfigLexerState.StringVal.end()); + return STRING; + } + YY_BREAK + case 54: + YY_RULE_SETUP + #line 199 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + { YY_FATAL_ERROR("Invalid substitution token"); } + YY_BREAK + case 55: + YY_RULE_SETUP + #line 201 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + ECHO; + YY_BREAK + #line 1837 "ConfigLexer.cpp" + case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + + /* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + + static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + #ifdef YY_USES_REJECT + YY_FATAL_ERROR( + "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + #else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; + #endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + + /* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 411 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + + /* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + + #ifdef YY_USE_PROTOS + static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) + #else + static yy_state_type yy_try_NUL_trans( yy_current_state ) + yy_state_type yy_current_state; + #endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 411 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 410); + + return yy_is_jam ? 0 : yy_current_state; + } + + + #ifndef YY_NO_UNPUT + #ifdef YY_USE_PROTOS + static inline void yyunput( int c, register char *yy_bp ) + #else + static inline void yyunput( c, yy_bp ) + int c; + register char *yy_bp; + #endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } + #endif /* ifndef YY_NO_UNPUT */ + + + #ifndef YY_NO_INPUT + #ifdef __cplusplus + static int yyinput() + #else + static int input() + #endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + #ifdef __cplusplus + return yyinput(); + #else + return input(); + #endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + #endif /* YY_NO_INPUT */ + + #ifdef YY_USE_PROTOS + void yyrestart( FILE *input_file ) + #else + void yyrestart( input_file ) + FILE *input_file; + #endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + + #ifdef YY_USE_PROTOS + void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) + #else + void yy_switch_to_buffer( new_buffer ) + YY_BUFFER_STATE new_buffer; + #endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + + #ifdef YY_USE_PROTOS + void yy_load_buffer_state( void ) + #else + void yy_load_buffer_state() + #endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) + #else + YY_BUFFER_STATE yy_create_buffer( file, size ) + FILE *file; + int size; + #endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + + #ifdef YY_USE_PROTOS + void yy_delete_buffer( YY_BUFFER_STATE b ) + #else + void yy_delete_buffer( b ) + YY_BUFFER_STATE b; + #endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + + + #ifdef YY_USE_PROTOS + void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) + #else + void yy_init_buffer( b, file ) + YY_BUFFER_STATE b; + FILE *file; + #endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + #if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; + #else + #if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; + #else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + #endif + #endif + } + + + #ifdef YY_USE_PROTOS + void yy_flush_buffer( YY_BUFFER_STATE b ) + #else + void yy_flush_buffer( b ) + YY_BUFFER_STATE b; + #endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + + #ifndef YY_NO_SCAN_BUFFER + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) + #else + YY_BUFFER_STATE yy_scan_buffer( base, size ) + char *base; + yy_size_t size; + #endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } + #endif + + + #ifndef YY_NO_SCAN_STRING + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) + #else + YY_BUFFER_STATE yy_scan_string( yy_str ) + yyconst char *yy_str; + #endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } + #endif + + + #ifndef YY_NO_SCAN_BYTES + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) + #else + YY_BUFFER_STATE yy_scan_bytes( bytes, len ) + yyconst char *bytes; + int len; + #endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } + #endif + + + #ifndef YY_NO_PUSH_STATE + #ifdef YY_USE_PROTOS + static void yy_push_state( int new_state ) + #else + static void yy_push_state( new_state ) + int new_state; + #endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } + #endif + + + #ifndef YY_NO_POP_STATE + static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } + #endif + + + #ifndef YY_NO_TOP_STATE + static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } + #endif + + #ifndef YY_EXIT_FAILURE + #define YY_EXIT_FAILURE 2 + #endif + + #ifdef YY_USE_PROTOS + static void yy_fatal_error( yyconst char msg[] ) + #else + static void yy_fatal_error( msg ) + char msg[]; + #endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + + /* Redefine yyless() so it works in section 3 code. */ + + #undef yyless + #define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + + /* Internal utility routines. */ + + #ifndef yytext_ptr + #ifdef YY_USE_PROTOS + static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) + #else + static void yy_flex_strncpy( s1, s2, n ) + char *s1; + yyconst char *s2; + int n; + #endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } + #endif + + #ifdef YY_NEED_STRLEN + #ifdef YY_USE_PROTOS + static int yy_flex_strlen( yyconst char *s ) + #else + static int yy_flex_strlen( s ) + yyconst char *s; + #endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } + #endif + + + #ifdef YY_USE_PROTOS + static void *yy_flex_alloc( yy_size_t size ) + #else + static void *yy_flex_alloc( size ) + yy_size_t size; + #endif + { + return (void *) malloc( size ); + } + + #ifdef YY_USE_PROTOS + static inline void *yy_flex_realloc( void *ptr, yy_size_t size ) + #else + static inline void *yy_flex_realloc( ptr, size ) + void *ptr; + yy_size_t size; + #endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + + #ifdef YY_USE_PROTOS + static void yy_flex_free( void *ptr ) + #else + static void yy_flex_free( ptr ) + void *ptr; + #endif + { + free( ptr ); + } + + #if YY_MAIN + int main() + { + yylex(); + return 0; + } + #endif + #line 201 "/proj/llvm/build/../llvm/tools/llvmc/ConfigLexer.l" + From reid at x10sys.com Sat Aug 27 13:50:52 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 13:50:52 -0500 Subject: [llvm-commits] CVS: llvm/projects/Stacker/lib/compiler/Lexer.cpp StackerParser.cpp StackerParser.h Makefile Message-ID: <200508271850.NAA19918@zion.cs.uiuc.edu> Changes in directory llvm/projects/Stacker/lib/compiler: Lexer.cpp added (r1.1) StackerParser.cpp added (r1.1) StackerParser.h added (r1.1) Makefile updated: 1.5 -> 1.6 --- Log message: Implement PR614: http://llvm.cs.uiuc.edu/PR614 : These changes modify the makefiles so that the output of flex and bison are placed in the SRC directory, not the OBJ directory. It is intended that they be checked in as any other LLVM source so that platforms without convenient access to flex/bison can be compiled. From now on, if you change a .y or .l file you *must* also commit the generated .cpp and .h files. --- Diffs of the changes: (+4308 -2) Lexer.cpp | 2195 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 3 StackerParser.cpp | 1909 ++++++++++++++++++++++++++++++++++++++++++++++ StackerParser.h | 203 ++++ 4 files changed, 4308 insertions(+), 2 deletions(-) Index: llvm/projects/Stacker/lib/compiler/Lexer.cpp diff -c /dev/null llvm/projects/Stacker/lib/compiler/Lexer.cpp:1.1 *** /dev/null Sat Aug 27 13:50:49 2005 --- llvm/projects/Stacker/lib/compiler/Lexer.cpp Sat Aug 27 13:50:39 2005 *************** *** 0 **** --- 1,2195 ---- + #define yy_create_buffer Stacker_create_buffer + #define yy_delete_buffer Stacker_delete_buffer + #define yy_scan_buffer Stacker_scan_buffer + #define yy_scan_string Stacker_scan_string + #define yy_scan_bytes Stacker_scan_bytes + #define yy_flex_debug Stacker_flex_debug + #define yy_init_buffer Stacker_init_buffer + #define yy_flush_buffer Stacker_flush_buffer + #define yy_load_buffer_state Stacker_load_buffer_state + #define yy_switch_to_buffer Stacker_switch_to_buffer + #define yyin Stackerin + #define yyleng Stackerleng + #define yylex Stackerlex + #define yyout Stackerout + #define yyrestart Stackerrestart + #define yytext Stackertext + #define yylineno Stackerlineno + + #line 20 "Lexer.cpp" + /* A lexical scanner generated by flex */ + + /* Scanner skeleton version: + * $Header: /var/cvs/llvm/llvm/projects/Stacker/lib/compiler/Lexer.cpp,v 1.1 2005/08/27 18:50:39 reid Exp $ + */ + + #define FLEX_SCANNER + #define YY_FLEX_MAJOR_VERSION 2 + #define YY_FLEX_MINOR_VERSION 5 + + #include + #include + + + /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ + #ifdef c_plusplus + #ifndef __cplusplus + #define __cplusplus + #endif + #endif + + + #ifdef __cplusplus + + #include + + /* Use prototypes in function declarations. */ + #define YY_USE_PROTOS + + /* The "const" storage-class-modifier is valid. */ + #define YY_USE_CONST + + #else /* ! __cplusplus */ + + #if __STDC__ + + #define YY_USE_PROTOS + #define YY_USE_CONST + + #endif /* __STDC__ */ + #endif /* ! __cplusplus */ + + #ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use + #include + #include + #define YY_USE_CONST + #define YY_USE_PROTOS + #endif + + #ifdef YY_USE_CONST + #define yyconst const + #else + #define yyconst + #endif + + + #ifdef YY_USE_PROTOS + #define YY_PROTO(proto) proto + #else + #define YY_PROTO(proto) () + #endif + + /* Returned upon end-of-file. */ + #define YY_NULL 0 + + /* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ + #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + + /* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ + #define BEGIN yy_start = 1 + 2 * + + /* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ + #define YY_START ((yy_start - 1) / 2) + #define YYSTATE YY_START + + /* Action number for EOF rule of a given start state. */ + #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + + /* Special action meaning "start processing a new file". */ + #define YY_NEW_FILE yyrestart( yyin ) + + #define YY_END_OF_BUFFER_CHAR 0 + + /* Size of default input buffer. */ + #define YY_BUF_SIZE (16384*64) + + typedef struct yy_buffer_state *YY_BUFFER_STATE; + + extern int yyleng; + extern FILE *yyin, *yyout; + + #define EOB_ACT_CONTINUE_SCAN 0 + #define EOB_ACT_END_OF_FILE 1 + #define EOB_ACT_LAST_MATCH 2 + + /* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + + /* Return all but the first 'n' matched characters back to the input stream. */ + + #define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + + #define unput(c) yyunput( c, yytext_ptr ) + + /* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + typedef unsigned int yy_size_t; + + + struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + #define YY_BUFFER_NEW 0 + #define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ + #define YY_BUFFER_EOF_PENDING 2 + }; + + static YY_BUFFER_STATE yy_current_buffer = 0; + + /* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ + #define YY_CURRENT_BUFFER yy_current_buffer + + + /* yy_hold_char holds the character lost when yytext is formed. */ + static char yy_hold_char; + + static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + + int yyleng; + + /* Points to current character in buffer. */ + static char *yy_c_buf_p = (char *) 0; + static int yy_init = 1; /* whether we need to initialize */ + static int yy_start = 0; /* start state number */ + + /* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ + static int yy_did_buffer_switch_on_eof; + + void yyrestart YY_PROTO(( FILE *input_file )); + + void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); + void yy_load_buffer_state YY_PROTO(( void )); + YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); + void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); + void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); + void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); + #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + + YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); + YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); + YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + + static void *yy_flex_alloc YY_PROTO(( yy_size_t )); + static inline void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); + static void yy_flex_free YY_PROTO(( void * )); + + #define yy_new_buffer yy_create_buffer + + #define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + + #define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + + #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + + #define YY_USES_REJECT + + #define yywrap() 1 + #define YY_SKIP_YYWRAP + typedef unsigned char YY_CHAR; + FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + typedef int yy_state_type; + extern int yylineno; + int yylineno = 1; + extern char *yytext; + #define yytext_ptr yytext + + static yy_state_type yy_get_previous_state YY_PROTO(( void )); + static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); + static int yy_get_next_buffer YY_PROTO(( void )); + static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + + /* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ + #define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + + #define YY_NUM_RULES 89 + #define YY_END_OF_BUFFER 90 + static yyconst short int yy_acclist[266] = + { 0, + 90, 89, 88, 89, 89, 89, 89, 89, 25, 89, + 21, 89, 22, 89, 26, 89, 83, 89, 83, 89, + 3, 89, 4, 89, 9, 89, 19, 89, 11, 89, + 87, 89, 87, 89, 87, 89, 87, 89, 87, 89, + 87, 89, 87, 89, 87, 89, 87, 89, 87, 89, + 87, 89, 87, 89, 87, 89, 87, 89, 87, 89, + 87, 89, 87, 89, 87, 89, 81, 86, 1, 2, + 32, 23, 83, 24, 84, 36, 13, 17, 75, 74, + 73, 82, 15, 37, 78, 77, 76, 87, 87, 87, + 72, 87, 87, 87, 87, 87, 20, 87, 87, 87, + + 87, 87, 16, 87, 12, 87, 61, 87, 14, 87, + 10, 87, 87, 87, 87, 18, 87, 87, 87, 7, + 87, 34, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 85, 29, 87, + 33, 87, 87, 87, 40, 87, 87, 65, 87, 87, + 87, 87, 87, 59, 87, 87, 87, 31, 87, 30, + 87, 27, 87, 28, 87, 39, 87, 8, 87, 87, + 87, 60, 87, 87, 87, 87, 45, 87, 87, 87, + 87, 87, 70, 87, 87, 87, 87, 35, 87, 38, + 87, 80, 87, 51, 87, 62, 87, 87, 68, 87, + + 87, 87, 58, 87, 79, 87, 87, 50, 87, 42, + 87, 43, 87, 87, 87, 47, 87, 55, 87, 46, + 87, 87, 87, 41, 87, 5, 87, 48, 87, 87, + 49, 87, 63, 87, 6, 87, 87, 87, 53, 87, + 87, 87, 56, 87, 87, 71, 87, 52, 87, 54, + 87, 64, 87, 87, 57, 87, 87, 67, 87, 44, + 87, 69, 87, 66, 87 + } ; + + static yyconst short int yy_accept[189] = + { 0, + 1, 1, 1, 2, 3, 5, 6, 7, 8, 9, + 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, + 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, + 51, 53, 55, 57, 59, 61, 63, 65, 67, 68, + 68, 69, 69, 70, 70, 71, 72, 73, 74, 75, + 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 93, 94, 95, + 96, 97, 99, 100, 101, 102, 103, 105, 107, 109, + 111, 113, 114, 115, 116, 118, 119, 120, 122, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + + 135, 136, 137, 138, 139, 141, 143, 144, 145, 147, + 148, 150, 151, 152, 153, 154, 156, 157, 158, 160, + 162, 164, 166, 168, 170, 171, 172, 174, 175, 176, + 177, 179, 180, 181, 182, 183, 185, 186, 187, 188, + 190, 192, 194, 196, 198, 199, 201, 202, 203, 205, + 207, 208, 210, 212, 214, 215, 216, 218, 220, 222, + 223, 224, 226, 228, 230, 231, 233, 235, 237, 238, + 239, 241, 242, 243, 245, 246, 248, 250, 252, 254, + 255, 257, 258, 260, 262, 264, 266, 266 + } ; + + static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 1, 1, 1, 7, + 8, 9, 10, 1, 11, 1, 12, 13, 14, 15, + 14, 14, 14, 14, 14, 14, 14, 16, 17, 18, + 19, 20, 1, 1, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 30, 30, + 1, 1, 1, 1, 45, 1, 46, 46, 47, 48, + + 46, 46, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 49, 30, 30, 30, 30, 50, + 30, 30, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + + static yyconst int yy_meta[51] = + { 0, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 4, 4, 4, 1, 1, 1, 1, 1, + 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 4, 4, 4, 3, 3 + } ; + + static yyconst short int yy_base[193] = + { 0, + 0, 0, 228, 229, 229, 208, 221, 222, 216, 211, + 41, 46, 229, 49, 52, 229, 229, 53, 203, 33, + 36, 0, 183, 36, 51, 54, 44, 194, 51, 58, + 61, 70, 65, 72, 73, 82, 191, 183, 229, 212, + 229, 213, 229, 207, 206, 229, 229, 100, 229, 104, + 0, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 0, 174, 188, 0, 176, 88, 171, + 185, 0, 179, 175, 168, 180, 164, 0, 0, 0, + 0, 93, 169, 178, 174, 164, 173, 0, 0, 173, + 174, 156, 88, 94, 160, 162, 172, 171, 169, 149, + + 166, 159, 149, 0, 0, 0, 150, 149, 169, 158, + 153, 141, 141, 136, 153, 0, 143, 144, 0, 0, + 0, 0, 160, 0, 136, 142, 0, 131, 130, 138, + 154, 128, 142, 143, 129, 0, 139, 132, 130, 0, + 146, 0, 0, 0, 134, 0, 134, 137, 0, 0, + 122, 0, 141, 0, 117, 116, 0, 0, 138, 129, + 122, 121, 0, 120, 108, 0, 0, 0, 94, 108, + 0, 91, 95, 0, 87, 0, 0, 0, 0, 81, + 0, 53, 0, 0, 0, 0, 229, 137, 141, 145, + 147, 64 + + } ; + + static yyconst short int yy_def[193] = + { 0, + 187, 1, 187, 187, 187, 187, 188, 189, 190, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 187, 188, + 187, 189, 187, 190, 190, 187, 187, 187, 187, 187, + 192, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + + 191, 191, 191, 192, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 191, 191, 191, 0, 187, 187, 187, + 187, 187 + + } ; + + static yyconst short int yy_nxt[280] = + { 0, + 4, 5, 5, 6, 7, 8, 9, 4, 10, 11, + 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 22, 28, 22, + 22, 29, 30, 31, 32, 33, 22, 34, 35, 36, + 22, 22, 37, 38, 4, 22, 22, 22, 22, 22, + 47, 59, 60, 48, 48, 48, 49, 65, 50, 50, + 50, 48, 48, 48, 48, 48, 48, 104, 77, 66, + 52, 53, 54, 68, 74, 80, 69, 186, 82, 61, + 62, 63, 70, 78, 71, 85, 83, 72, 75, 86, + 81, 76, 84, 91, 73, 87, 93, 96, 51, 55, + + 56, 57, 99, 88, 185, 92, 94, 89, 97, 95, + 128, 90, 48, 48, 48, 98, 50, 50, 50, 100, + 108, 117, 101, 109, 118, 130, 184, 129, 183, 182, + 181, 180, 179, 131, 178, 177, 119, 40, 40, 40, + 40, 42, 42, 42, 42, 44, 176, 44, 44, 64, + 64, 175, 174, 173, 172, 171, 170, 169, 168, 167, + 166, 165, 164, 163, 162, 161, 160, 159, 158, 157, + 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, + 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, + 136, 135, 134, 133, 132, 127, 126, 125, 124, 123, + + 122, 121, 120, 116, 115, 114, 113, 112, 111, 110, + 107, 106, 105, 45, 45, 43, 41, 103, 102, 79, + 67, 58, 46, 45, 43, 41, 39, 187, 3, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187 + } ; + + static yyconst short int yy_chk[280] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 11, 20, 20, 11, 11, 11, 12, 21, 12, 12, + 12, 14, 14, 14, 15, 15, 15, 192, 27, 21, + 18, 18, 18, 24, 26, 29, 24, 182, 30, 20, + 20, 20, 25, 27, 25, 31, 30, 25, 26, 31, + 29, 26, 30, 33, 25, 32, 34, 35, 14, 18, + + 18, 18, 36, 32, 180, 33, 34, 32, 35, 34, + 93, 32, 48, 48, 48, 35, 50, 50, 50, 36, + 69, 82, 36, 69, 82, 94, 175, 93, 173, 172, + 170, 169, 165, 94, 164, 162, 82, 188, 188, 188, + 188, 189, 189, 189, 189, 190, 161, 190, 190, 191, + 191, 160, 159, 156, 155, 153, 151, 148, 147, 145, + 141, 139, 138, 137, 135, 134, 133, 132, 131, 130, + 129, 128, 126, 125, 123, 118, 117, 115, 114, 113, + 112, 111, 110, 109, 108, 107, 103, 102, 101, 100, + 99, 98, 97, 96, 95, 92, 91, 90, 87, 86, + + 85, 84, 83, 77, 76, 75, 74, 73, 71, 70, + 68, 66, 65, 45, 44, 42, 40, 38, 37, 28, + 23, 19, 10, 9, 8, 7, 6, 3, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187 + } ; + + static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; + static char *yy_full_match; + static int yy_lp; + #define REJECT \ + { \ + *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ + yy_cp = yy_full_match; /* restore poss. backed-over text */ \ + ++yy_lp; \ + goto find_rule; \ + } + #define yymore() yymore_used_but_not_detected + #define YY_MORE_ADJ 0 + #define YY_RESTORE_YY_MORE_OFFSET + char *yytext; + #line 1 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + #define INITIAL 0 + /*===-- Lexer.l - Scanner for Stacker language -----------------*- C++ -*--===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Reid Spencer and donated to the LLVM research + // group and is distributed under the University of Illinois Open Source + // License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the flex scanner for Stacker languages files. + // + //===----------------------------------------------------------------------===*/ + #define YY_NEVER_INTERACTIVE 1 + #line 29 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + + #include "StackerCompiler.h" + #include "StackerParser.h" + + /* Conversion of text ints to binary */ + static int64_t IntToVal(const char *Buffer) { + int64_t Result = 0; + for (; *Buffer; Buffer++) { + int64_t OldRes = Result; + Result *= 10; + Result += *Buffer-'0'; + if (Result < OldRes) // Uh, oh, overflow detected!!! + StackerCompiler::ThrowException("constant bigger than 64 bits detected!"); + } + return Result; + } + + /* Conversion of text hexadecimal ints to binary */ + static int64_t HexIntToVal(const char *Buffer) { + int64_t Result = 0; + for (; *Buffer; ++Buffer) { + int64_t OldRes = Result; + Result *= 16; + char C = *Buffer; + if (C >= '0' && C <= '9') + Result += C-'0'; + else if (C >= 'A' && C <= 'F') + Result += C-'A'+10; + else if (C >= 'a' && C <= 'f') + Result += C-'a'+10; + + if (Result < OldRes) // Uh, oh, overflow detected!!! + StackerCompiler::ThrowException("constant bigger than 64 bits detected!"); + } + return Result; + } + + #define YY_NEVER_INTERACTIVE 1 + /* Comments start with a ; and go till end of line */ + /* You can also embed them in ( ... ) */ + /* We ignore white space */ + /* jdentifiers start with a % sign */ + /* Strings can contain any character except " and \ */ + /* Positive and negative integer constants*/ + /* Special Characters - name them to avoid flex confusion */ + #line 608 "Lexer.cpp" + + /* Macros after this point can all be overridden by user definitions in + * section 1. + */ + + #ifndef YY_SKIP_YYWRAP + #ifdef __cplusplus + extern "C" int yywrap YY_PROTO(( void )); + #else + extern int yywrap YY_PROTO(( void )); + #endif + #endif + + #ifndef YY_NO_UNPUT + static inline void yyunput YY_PROTO(( int c, char *buf_ptr )); + #endif + + #ifndef yytext_ptr + static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); + #endif + + #ifdef YY_NEED_STRLEN + static int yy_flex_strlen YY_PROTO(( yyconst char * )); + #endif + + #ifndef YY_NO_INPUT + #ifdef __cplusplus + static int yyinput YY_PROTO(( void )); + #else + static int input YY_PROTO(( void )); + #endif + #endif + + #if YY_STACK_USED + static int yy_start_stack_ptr = 0; + static int yy_start_stack_depth = 0; + static int *yy_start_stack = 0; + #ifndef YY_NO_PUSH_STATE + static void yy_push_state YY_PROTO(( int new_state )); + #endif + #ifndef YY_NO_POP_STATE + static void yy_pop_state YY_PROTO(( void )); + #endif + #ifndef YY_NO_TOP_STATE + static int yy_top_state YY_PROTO(( void )); + #endif + + #else + #define YY_NO_PUSH_STATE 1 + #define YY_NO_POP_STATE 1 + #define YY_NO_TOP_STATE 1 + #endif + + #ifdef YY_MALLOC_DECL + YY_MALLOC_DECL + #else + #if __STDC__ + #ifndef __cplusplus + #include + #endif + #else + /* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ + #endif + #endif + + /* Amount of stuff to slurp up with each read. */ + #ifndef YY_READ_BUF_SIZE + #define YY_READ_BUF_SIZE 8192 + #endif + + /* Copy whatever the last rule matched to the standard output. */ + + #ifndef ECHO + /* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ + #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) + #endif + + /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ + #ifndef YY_INPUT + #define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); + #endif + + /* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ + #ifndef yyterminate + #define yyterminate() return YY_NULL + #endif + + /* Number of entries by which start-condition stack grows. */ + #ifndef YY_START_STACK_INCR + #define YY_START_STACK_INCR 25 + #endif + + /* Report a fatal error. */ + #ifndef YY_FATAL_ERROR + #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) + #endif + + /* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ + #ifndef YY_DECL + #define YY_DECL int yylex YY_PROTO(( void )) + #endif + + /* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ + #ifndef YY_USER_ACTION + #define YY_USER_ACTION + #endif + + /* Code executed at the end of each rule. */ + #ifndef YY_BREAK + #define YY_BREAK break; + #endif + + #define YY_RULE_SETUP \ + YY_USER_ACTION + + YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp = NULL, *yy_bp = NULL; + register int yy_act; + + #line 112 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + + + #line 762 "Lexer.cpp" + + if ( yy_init ) + { + yy_init = 0; + + #ifdef YY_USER_INIT + YY_USER_INIT; + #endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 188 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_current_state != 187 ); + + yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + { + yy_full_match = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER ) + { + int yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + ++yylineno; + } + + do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 1: + *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ + yy_c_buf_p = yy_cp -= 1; + YY_DO_BEFORE_ACTION; /* set up yytext again */ + YY_RULE_SETUP + #line 114 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { /* Ignore comments */ } + YY_BREAK + case 2: + YY_RULE_SETUP + #line 115 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { /* Ignore comments */ } + YY_BREAK + case 3: + YY_RULE_SETUP + #line 117 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return COLON; } + YY_BREAK + case 4: + YY_RULE_SETUP + #line 118 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return SEMI; } + YY_BREAK + case 5: + YY_RULE_SETUP + #line 120 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return TRUETOK; } + YY_BREAK + case 6: + YY_RULE_SETUP + #line 121 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return FALSETOK; } + YY_BREAK + case 7: + YY_RULE_SETUP + #line 122 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return TRUETOK; } + YY_BREAK + case 8: + YY_RULE_SETUP + #line 123 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return FALSETOK; } + YY_BREAK + case 9: + YY_RULE_SETUP + #line 124 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return LESS; } + YY_BREAK + case 10: + YY_RULE_SETUP + #line 125 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return LESS; } + YY_BREAK + case 11: + YY_RULE_SETUP + #line 126 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MORE; } + YY_BREAK + case 12: + YY_RULE_SETUP + #line 127 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MORE; } + YY_BREAK + case 13: + YY_RULE_SETUP + #line 128 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return LESS_EQUAL; } + YY_BREAK + case 14: + YY_RULE_SETUP + #line 129 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return LESS_EQUAL; } + YY_BREAK + case 15: + YY_RULE_SETUP + #line 130 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MORE_EQUAL; } + YY_BREAK + case 16: + YY_RULE_SETUP + #line 131 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MORE_EQUAL; } + YY_BREAK + case 17: + YY_RULE_SETUP + #line 132 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return NOT_EQUAL; } + YY_BREAK + case 18: + YY_RULE_SETUP + #line 133 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return NOT_EQUAL; } + YY_BREAK + case 19: + YY_RULE_SETUP + #line 134 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return EQUAL; } + YY_BREAK + case 20: + YY_RULE_SETUP + #line 135 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return EQUAL; } + YY_BREAK + case 21: + YY_RULE_SETUP + #line 137 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return PLUS; } + YY_BREAK + case 22: + YY_RULE_SETUP + #line 138 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MINUS; } + YY_BREAK + case 23: + YY_RULE_SETUP + #line 139 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return INCR; } + YY_BREAK + case 24: + YY_RULE_SETUP + #line 140 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return DECR; } + YY_BREAK + case 25: + YY_RULE_SETUP + #line 141 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MULT; } + YY_BREAK + case 26: + YY_RULE_SETUP + #line 142 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return DIV; } + YY_BREAK + case 27: + YY_RULE_SETUP + #line 143 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MODULUS; } + YY_BREAK + case 28: + YY_RULE_SETUP + #line 144 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return NEGATE; } + YY_BREAK + case 29: + YY_RULE_SETUP + #line 145 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return ABS; } + YY_BREAK + case 30: + YY_RULE_SETUP + #line 146 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MIN; } + YY_BREAK + case 31: + YY_RULE_SETUP + #line 147 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MAX; } + YY_BREAK + case 32: + YY_RULE_SETUP + #line 148 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return STAR_SLASH; } + YY_BREAK + case 33: + YY_RULE_SETUP + #line 150 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return AND; } + YY_BREAK + case 34: + YY_RULE_SETUP + #line 151 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return OR; } + YY_BREAK + case 35: + YY_RULE_SETUP + #line 152 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return XOR; } + YY_BREAK + case 36: + YY_RULE_SETUP + #line 153 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return LSHIFT; } + YY_BREAK + case 37: + YY_RULE_SETUP + #line 154 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return RSHIFT; } + YY_BREAK + case 38: + YY_RULE_SETUP + #line 156 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return DROP; } + YY_BREAK + case 39: + YY_RULE_SETUP + #line 157 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return NIP; } + YY_BREAK + case 40: + YY_RULE_SETUP + #line 158 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return DUP; } + YY_BREAK + case 41: + YY_RULE_SETUP + #line 159 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return SWAP; } + YY_BREAK + case 42: + YY_RULE_SETUP + #line 160 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return OVER; } + YY_BREAK + case 43: + YY_RULE_SETUP + #line 161 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return PICK; } + YY_BREAK + case 44: + YY_RULE_SETUP + #line 162 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return SELECT; } + YY_BREAK + case 45: + YY_RULE_SETUP + #line 163 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return ROT; } + YY_BREAK + case 46: + YY_RULE_SETUP + #line 164 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return RROT; } + YY_BREAK + case 47: + YY_RULE_SETUP + #line 165 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return ROLL; } + YY_BREAK + case 48: + YY_RULE_SETUP + #line 166 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return TUCK; } + YY_BREAK + case 49: + YY_RULE_SETUP + #line 167 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return DROP2; } + YY_BREAK + case 50: + YY_RULE_SETUP + #line 168 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return NIP2; } + YY_BREAK + case 51: + YY_RULE_SETUP + #line 169 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return DUP2; } + YY_BREAK + case 52: + YY_RULE_SETUP + #line 170 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return SWAP2; } + YY_BREAK + case 53: + YY_RULE_SETUP + #line 171 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return OVER2; } + YY_BREAK + case 54: + YY_RULE_SETUP + #line 172 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return TUCK2; } + YY_BREAK + case 55: + YY_RULE_SETUP + #line 173 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return ROT2; } + YY_BREAK + case 56: + YY_RULE_SETUP + #line 174 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return RROT2; } + YY_BREAK + case 57: + YY_RULE_SETUP + #line 176 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MALLOC; } + YY_BREAK + case 58: + YY_RULE_SETUP + #line 177 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return FREE; } + YY_BREAK + case 59: + YY_RULE_SETUP + #line 178 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return GET; } + YY_BREAK + case 60: + YY_RULE_SETUP + #line 179 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return PUT; } + YY_BREAK + case 61: + YY_RULE_SETUP + #line 181 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return IF; } + YY_BREAK + case 62: + YY_RULE_SETUP + #line 182 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return ELSE; } + YY_BREAK + case 63: + YY_RULE_SETUP + #line 183 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return ENDIF; } + YY_BREAK + case 64: + YY_RULE_SETUP + #line 184 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return WHILE; } + YY_BREAK + case 65: + YY_RULE_SETUP + #line 185 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return END; } + YY_BREAK + case 66: + YY_RULE_SETUP + #line 187 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return RECURSE; } + YY_BREAK + case 67: + YY_RULE_SETUP + #line 188 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return RETURN; } + YY_BREAK + case 68: + YY_RULE_SETUP + #line 189 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return EXIT; } + YY_BREAK + case 69: + YY_RULE_SETUP + #line 190 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return FORWARD; } + YY_BREAK + case 70: + YY_RULE_SETUP + #line 191 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return TAB; } + YY_BREAK + case 71: + YY_RULE_SETUP + #line 192 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return SPACE; } + YY_BREAK + case 72: + YY_RULE_SETUP + #line 193 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return CR; } + YY_BREAK + case 73: + YY_RULE_SETUP + #line 195 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return IN_STR; } + YY_BREAK + case 74: + YY_RULE_SETUP + #line 196 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return IN_NUM; } + YY_BREAK + case 75: + YY_RULE_SETUP + #line 197 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return IN_CHAR; } + YY_BREAK + case 76: + YY_RULE_SETUP + #line 199 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return OUT_STR; } + YY_BREAK + case 77: + YY_RULE_SETUP + #line 200 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return OUT_NUM; } + YY_BREAK + case 78: + YY_RULE_SETUP + #line 201 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return OUT_CHAR; } + YY_BREAK + case 79: + YY_RULE_SETUP + #line 203 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return MAIN; } + YY_BREAK + case 80: + YY_RULE_SETUP + #line 205 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { return DUMP; } + YY_BREAK + case 81: + YY_RULE_SETUP + #line 207 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { StackerCompiler::ThrowException( + "You probably meant to use a <> instead of !=" ); } + YY_BREAK + case 82: + YY_RULE_SETUP + #line 210 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { StackerCompiler::ThrowException( + "You probably meant to use a single = .. this isn't C"); } + YY_BREAK + case 83: + YY_RULE_SETUP + #line 213 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { Stackerlval.IntegerVal = IntToVal(yytext); return INTEGER; } + YY_BREAK + case 84: + YY_RULE_SETUP + #line 214 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { uint64_t Val = IntToVal(yytext+1); + // +1: we have bigger negative range + if (Val > (uint64_t)INT64_MAX+1) + StackerCompiler::ThrowException( + "Constant too large for signed 64 bits!"); + Stackerlval.IntegerVal = -Val; + return INTEGER; + } + YY_BREAK + case 85: + YY_RULE_SETUP + #line 222 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { Stackerlval.IntegerVal = HexIntToVal(yytext+3); + return INTEGER; + } + YY_BREAK + case 86: + YY_RULE_SETUP + #line 226 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { yytext[strlen(yytext)-1] = 0; // nuke end quote + Stackerlval.StringVal = strdup(yytext+1); // Nuke start quote + return STRING; + } + YY_BREAK + case 87: + YY_RULE_SETUP + #line 231 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { Stackerlval.StringVal = strdup(yytext); return IDENTIFIER; } + YY_BREAK + case 88: + YY_RULE_SETUP + #line 233 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + { /* Ignore whitespace */ } + YY_BREAK + case 89: + YY_RULE_SETUP + #line 234 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + #line 1315 "Lexer.cpp" + case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + + /* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + + static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + #ifdef YY_USES_REJECT + YY_FATAL_ERROR( + "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + #else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; + #endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + + /* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 188 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + + /* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + + #ifdef YY_USE_PROTOS + static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) + #else + static yy_state_type yy_try_NUL_trans( yy_current_state ) + yy_state_type yy_current_state; + #endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 188 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 187); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + + #ifndef YY_NO_UNPUT + #ifdef YY_USE_PROTOS + static inline void yyunput( int c, register char *yy_bp ) + #else + static inline void yyunput( c, yy_bp ) + int c; + register char *yy_bp; + #endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ) + --yylineno; + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } + #endif /* ifndef YY_NO_UNPUT */ + + + #ifndef YY_NO_INPUT + #ifdef __cplusplus + static int yyinput() + #else + static int input() + #endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + #ifdef __cplusplus + return yyinput(); + #else + return input(); + #endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + if ( c == '\n' ) + ++yylineno; + + return c; + } + #endif /* YY_NO_INPUT */ + + #ifdef YY_USE_PROTOS + void yyrestart( FILE *input_file ) + #else + void yyrestart( input_file ) + FILE *input_file; + #endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + + #ifdef YY_USE_PROTOS + void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) + #else + void yy_switch_to_buffer( new_buffer ) + YY_BUFFER_STATE new_buffer; + #endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + + #ifdef YY_USE_PROTOS + void yy_load_buffer_state( void ) + #else + void yy_load_buffer_state() + #endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) + #else + YY_BUFFER_STATE yy_create_buffer( file, size ) + FILE *file; + int size; + #endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + + #ifdef YY_USE_PROTOS + void yy_delete_buffer( YY_BUFFER_STATE b ) + #else + void yy_delete_buffer( b ) + YY_BUFFER_STATE b; + #endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + + + #ifdef YY_USE_PROTOS + void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) + #else + void yy_init_buffer( b, file ) + YY_BUFFER_STATE b; + FILE *file; + #endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + #if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; + #else + #if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; + #else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + #endif + #endif + } + + + #ifdef YY_USE_PROTOS + void yy_flush_buffer( YY_BUFFER_STATE b ) + #else + void yy_flush_buffer( b ) + YY_BUFFER_STATE b; + #endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + + #ifndef YY_NO_SCAN_BUFFER + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) + #else + YY_BUFFER_STATE yy_scan_buffer( base, size ) + char *base; + yy_size_t size; + #endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } + #endif + + + #ifndef YY_NO_SCAN_STRING + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) + #else + YY_BUFFER_STATE yy_scan_string( yy_str ) + yyconst char *yy_str; + #endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } + #endif + + + #ifndef YY_NO_SCAN_BYTES + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) + #else + YY_BUFFER_STATE yy_scan_bytes( bytes, len ) + yyconst char *bytes; + int len; + #endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } + #endif + + + #ifndef YY_NO_PUSH_STATE + #ifdef YY_USE_PROTOS + static void yy_push_state( int new_state ) + #else + static void yy_push_state( new_state ) + int new_state; + #endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } + #endif + + + #ifndef YY_NO_POP_STATE + static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } + #endif + + + #ifndef YY_NO_TOP_STATE + static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } + #endif + + #ifndef YY_EXIT_FAILURE + #define YY_EXIT_FAILURE 2 + #endif + + #ifdef YY_USE_PROTOS + static void yy_fatal_error( yyconst char msg[] ) + #else + static void yy_fatal_error( msg ) + char msg[]; + #endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + + /* Redefine yyless() so it works in section 3 code. */ + + #undef yyless + #define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + + /* Internal utility routines. */ + + #ifndef yytext_ptr + #ifdef YY_USE_PROTOS + static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) + #else + static void yy_flex_strncpy( s1, s2, n ) + char *s1; + yyconst char *s2; + int n; + #endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } + #endif + + #ifdef YY_NEED_STRLEN + #ifdef YY_USE_PROTOS + static int yy_flex_strlen( yyconst char *s ) + #else + static int yy_flex_strlen( s ) + yyconst char *s; + #endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } + #endif + + + #ifdef YY_USE_PROTOS + static void *yy_flex_alloc( yy_size_t size ) + #else + static void *yy_flex_alloc( size ) + yy_size_t size; + #endif + { + return (void *) malloc( size ); + } + + #ifdef YY_USE_PROTOS + static inline void *yy_flex_realloc( void *ptr, yy_size_t size ) + #else + static inline void *yy_flex_realloc( ptr, size ) + void *ptr; + yy_size_t size; + #endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + + #ifdef YY_USE_PROTOS + static void yy_flex_free( void *ptr ) + #else + static void yy_flex_free( ptr ) + void *ptr; + #endif + { + free( ptr ); + } + + #if YY_MAIN + int main() + { + yylex(); + return 0; + } + #endif + #line 234 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/Lexer.l" + Index: llvm/projects/Stacker/lib/compiler/StackerParser.cpp diff -c /dev/null llvm/projects/Stacker/lib/compiler/StackerParser.cpp:1.1 *** /dev/null Sat Aug 27 13:50:52 2005 --- llvm/projects/Stacker/lib/compiler/StackerParser.cpp Sat Aug 27 13:50:39 2005 *************** *** 0 **** --- 1,1909 ---- + /* A Bison parser, made by GNU Bison 1.875c. */ + + /* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + /* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + + /* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + + /* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + + /* Identify Bison output. */ + #define YYBISON 1 + + /* Skeleton name. */ + #define YYSKELETON_NAME "yacc.c" + + /* Pure parsers. */ + #define YYPURE 0 + + /* Using locations. */ + #define YYLSP_NEEDED 0 + + /* If NAME_PREFIX is specified substitute the variables and functions + names. */ + #define yyparse Stackerparse + #define yylex Stackerlex + #define yyerror Stackererror + #define yylval Stackerlval + #define yychar Stackerchar + #define yydebug Stackerdebug + #define yynerrs Stackernerrs + + + /* Tokens. */ + #ifndef YYTOKENTYPE + # define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + INTEGER = 258, + STRING = 259, + IDENTIFIER = 260, + SEMI = 261, + COLON = 262, + FORWARD = 263, + MAIN = 264, + DUMP = 265, + TRUETOK = 266, + FALSETOK = 267, + LESS = 268, + MORE = 269, + LESS_EQUAL = 270, + MORE_EQUAL = 271, + NOT_EQUAL = 272, + EQUAL = 273, + PLUS = 274, + MINUS = 275, + INCR = 276, + DECR = 277, + MULT = 278, + DIV = 279, + MODULUS = 280, + NEGATE = 281, + ABS = 282, + MIN = 283, + MAX = 284, + STAR_SLASH = 285, + AND = 286, + OR = 287, + XOR = 288, + LSHIFT = 289, + RSHIFT = 290, + DROP = 291, + DROP2 = 292, + NIP = 293, + NIP2 = 294, + DUP = 295, + DUP2 = 296, + SWAP = 297, + SWAP2 = 298, + OVER = 299, + OVER2 = 300, + ROT = 301, + ROT2 = 302, + RROT = 303, + RROT2 = 304, + TUCK = 305, + TUCK2 = 306, + ROLL = 307, + PICK = 308, + SELECT = 309, + MALLOC = 310, + FREE = 311, + GET = 312, + PUT = 313, + IF = 314, + ELSE = 315, + ENDIF = 316, + WHILE = 317, + END = 318, + RECURSE = 319, + RETURN = 320, + EXIT = 321, + TAB = 322, + SPACE = 323, + CR = 324, + IN_STR = 325, + IN_NUM = 326, + IN_CHAR = 327, + OUT_STR = 328, + OUT_NUM = 329, + OUT_CHAR = 330 + }; + #endif + #define INTEGER 258 + #define STRING 259 + #define IDENTIFIER 260 + #define SEMI 261 + #define COLON 262 + #define FORWARD 263 + #define MAIN 264 + #define DUMP 265 + #define TRUETOK 266 + #define FALSETOK 267 + #define LESS 268 + #define MORE 269 + #define LESS_EQUAL 270 + #define MORE_EQUAL 271 + #define NOT_EQUAL 272 + #define EQUAL 273 + #define PLUS 274 + #define MINUS 275 + #define INCR 276 + #define DECR 277 + #define MULT 278 + #define DIV 279 + #define MODULUS 280 + #define NEGATE 281 + #define ABS 282 + #define MIN 283 + #define MAX 284 + #define STAR_SLASH 285 + #define AND 286 + #define OR 287 + #define XOR 288 + #define LSHIFT 289 + #define RSHIFT 290 + #define DROP 291 + #define DROP2 292 + #define NIP 293 + #define NIP2 294 + #define DUP 295 + #define DUP2 296 + #define SWAP 297 + #define SWAP2 298 + #define OVER 299 + #define OVER2 300 + #define ROT 301 + #define ROT2 302 + #define RROT 303 + #define RROT2 304 + #define TUCK 305 + #define TUCK2 306 + #define ROLL 307 + #define PICK 308 + #define SELECT 309 + #define MALLOC 310 + #define FREE 311 + #define GET 312 + #define PUT 313 + #define IF 314 + #define ELSE 315 + #define ENDIF 316 + #define WHILE 317 + #define END 318 + #define RECURSE 319 + #define RETURN 320 + #define EXIT 321 + #define TAB 322 + #define SPACE 323 + #define CR 324 + #define IN_STR 325 + #define IN_NUM 326 + #define IN_CHAR 327 + #define OUT_STR 328 + #define OUT_NUM 329 + #define OUT_CHAR 330 + + + + + /* Copy the first part of user declarations. */ + #line 14 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + + #include "StackerCompiler.h" + #include "llvm/SymbolTable.h" + #include "llvm/Module.h" + #include "llvm/Instructions.h" + #include "llvm/ADT/STLExtras.h" + #include "llvm/ADT/DepthFirstIterator.h" + #include + #include + #include + + #define YYERROR_VERBOSE 1 + #define SCI StackerCompiler::TheInstance + + int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit + int yylex(); // declaration" of xxx warnings. + int yyparse(); + + + + /* Enabling traces. */ + #ifndef YYDEBUG + # define YYDEBUG 0 + #endif + + /* Enabling verbose error messages. */ + #ifdef YYERROR_VERBOSE + # undef YYERROR_VERBOSE + # define YYERROR_VERBOSE 1 + #else + # define YYERROR_VERBOSE 0 + #endif + + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + #line 35 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + typedef union YYSTYPE { + llvm::Module* ModuleVal; + llvm::Function* FunctionVal; + llvm::BasicBlock* BasicBlockVal; + int64_t IntegerVal; + char* StringVal; + } YYSTYPE; + /* Line 191 of yacc.c. */ + #line 263 "StackerParser.tab.c" + # define yystype YYSTYPE /* obsolescent; will be withdrawn */ + # define YYSTYPE_IS_DECLARED 1 + # define YYSTYPE_IS_TRIVIAL 1 + #endif + + + + /* Copy the second part of user declarations. */ + + + /* Line 214 of yacc.c. */ + #line 275 "StackerParser.tab.c" + + #if ! defined (yyoverflow) || YYERROR_VERBOSE + + # ifndef YYFREE + # define YYFREE free + # endif + # ifndef YYMALLOC + # define YYMALLOC malloc + # endif + + /* The parser invokes alloca or malloc; define the necessary symbols. */ + + # ifdef YYSTACK_USE_ALLOCA + # if YYSTACK_USE_ALLOCA + # define YYSTACK_ALLOC alloca + # endif + # else + # if defined (alloca) || defined (_ALLOCA_H) + # define YYSTACK_ALLOC alloca + # else + # ifdef __GNUC__ + # define YYSTACK_ALLOC __builtin_alloca + # endif + # endif + # endif + + # ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ + # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) + # else + # if defined (__STDC__) || defined (__cplusplus) + # include /* INFRINGES ON USER NAME SPACE */ + # define YYSIZE_T size_t + # endif + # define YYSTACK_ALLOC YYMALLOC + # define YYSTACK_FREE YYFREE + # endif + #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + + #if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + + /* A type that is properly aligned for any stack member. */ + union yyalloc + { + short yyss; + YYSTYPE yyvs; + }; + + /* The size of the maximum gap between one aligned stack and the next. */ + # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + + /* The size of an array large to enough to hold all stacks, each with + N elements. */ + # define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + + /* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ + # ifndef YYCOPY + # if defined (__GNUC__) && 1 < __GNUC__ + # define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) + # else + # define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) + # endif + # endif + + /* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ + # define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + + #endif + + #if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; + #else + typedef short yysigned_char; + #endif + + /* YYFINAL -- State number of the termination state. */ + #define YYFINAL 3 + /* YYLAST -- Last index in YYTABLE. */ + #define YYLAST 150 + + /* YYNTOKENS -- Number of terminals. */ + #define YYNTOKENS 76 + /* YYNNTS -- Number of nonterminals. */ + #define YYNNTS 10 + /* YYNRULES -- Number of rules. */ + #define YYNRULES 80 + /* YYNRULES -- Number of states. */ + #define YYNSTATES 93 + + /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ + #define YYUNDEFTOK 2 + #define YYMAXUTOK 330 + + #define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + + /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ + static const unsigned char yytranslate[] = + { + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75 + }; + + #if YYDEBUG + /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ + static const unsigned char yyprhs[] = + { + 0, 0, 3, 4, 7, 10, 11, 13, 15, 17, + 21, 26, 31, 34, 35, 41, 45, 49, 51, 53, + 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, + 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, + 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, + 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, + 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, + 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, + 175 + }; + + /* YYRHS -- A `-1'-separated list of the rules' RHS. */ + static const yysigned_char yyrhs[] = + { + 77, 0, -1, -1, 78, 79, -1, 79, 80, -1, + -1, 81, -1, 83, -1, 82, -1, 8, 5, 6, + -1, 7, 9, 84, 6, -1, 7, 5, 84, 6, + -1, 84, 85, -1, -1, 59, 5, 60, 5, 61, + -1, 59, 5, 61, -1, 62, 5, 63, -1, 5, + -1, 4, -1, 3, -1, 11, -1, 12, -1, 13, + -1, 14, -1, 15, -1, 16, -1, 17, -1, 18, + -1, 19, -1, 20, -1, 21, -1, 22, -1, 23, + -1, 24, -1, 25, -1, 26, -1, 27, -1, 28, + -1, 29, -1, 30, -1, 31, -1, 32, -1, 33, + -1, 34, -1, 35, -1, 36, -1, 37, -1, 38, + -1, 39, -1, 40, -1, 41, -1, 42, -1, 43, + -1, 44, -1, 45, -1, 46, -1, 47, -1, 48, + -1, 49, -1, 50, -1, 51, -1, 52, -1, 53, + -1, 54, -1, 55, -1, 56, -1, 57, -1, 58, + -1, 64, -1, 65, -1, 66, -1, 67, -1, 68, + -1, 69, -1, 70, -1, 71, -1, 72, -1, 73, + -1, 74, -1, 75, -1, 10, -1 + }; + + /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ + static const unsigned char yyrline[] = + { + 0, 70, 70, 70, 74, 75, 78, 79, 80, 83, + 86, 89, 92, 93, 99, 100, 101, 104, 105, 106, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169 + }; + #endif + + #if YYDEBUG || YYERROR_VERBOSE + /* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ + static const char *const yytname[] = + { + "$end", "error", "$undefined", "INTEGER", "STRING", "IDENTIFIER", + "SEMI", "COLON", "FORWARD", "MAIN", "DUMP", "TRUETOK", "FALSETOK", + "LESS", "MORE", "LESS_EQUAL", "MORE_EQUAL", "NOT_EQUAL", "EQUAL", "PLUS", + "MINUS", "INCR", "DECR", "MULT", "DIV", "MODULUS", "NEGATE", "ABS", + "MIN", "MAX", "STAR_SLASH", "AND", "OR", "XOR", "LSHIFT", "RSHIFT", + "DROP", "DROP2", "NIP", "NIP2", "DUP", "DUP2", "SWAP", "SWAP2", "OVER", + "OVER2", "ROT", "ROT2", "RROT", "RROT2", "TUCK", "TUCK2", "ROLL", "PICK", + "SELECT", "MALLOC", "FREE", "GET", "PUT", "IF", "ELSE", "ENDIF", "WHILE", + "END", "RECURSE", "RETURN", "EXIT", "TAB", "SPACE", "CR", "IN_STR", + "IN_NUM", "IN_CHAR", "OUT_STR", "OUT_NUM", "OUT_CHAR", "$accept", + "Module", "@1", "DefinitionList", "Definition", "ForwardDef", "MainDef", + "ColonDef", "WordList", "Word", 0 + }; + #endif + + # ifdef YYPRINT + /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ + static const unsigned short yytoknum[] = + { + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330 + }; + # endif + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ + static const unsigned char yyr1[] = + { + 0, 76, 78, 77, 79, 79, 80, 80, 80, 81, + 82, 83, 84, 84, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85 + }; + + /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ + static const unsigned char yyr2[] = + { + 0, 2, 0, 2, 2, 0, 1, 1, 1, 3, + 4, 4, 2, 0, 5, 3, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1 + }; + + /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ + static const unsigned char yydefact[] = + { + 2, 0, 5, 1, 3, 0, 0, 4, 6, 8, + 7, 13, 13, 0, 0, 0, 9, 19, 18, 17, + 11, 80, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 12, 10, 0, 0, 0, 15, + 16, 0, 14 + }; + + /* YYDEFGOTO[NTERM-NUM]. */ + static const yysigned_char yydefgoto[] = + { + -1, 1, 2, 4, 7, 8, 9, 10, 14, 84 + }; + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ + #define YYPACT_NINF -4 + static const short yypact[] = + { + -4, 4, -4, -4, -2, 141, 52, -4, -4, -4, + -4, -4, -4, 54, -3, 70, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + 53, 74, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -4, -4, 17, 67, 126, -4, + -4, 72, -4 + }; + + /* YYPGOTO[NTERM-NUM]. */ + static const short yypgoto[] = + { + -4, -4, -4, -4, -4, -4, -4, -4, 135, -4 + }; + + /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ + #define YYTABLE_NINF -1 + static const unsigned char yytable[] = + { + 17, 18, 19, 20, 3, 5, 6, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 13, 86, 71, + 16, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 17, 18, 19, 85, 88, 89, 87, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 90, 91, 71, 92, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 11, 15, 0, 0, + 12 + }; + + static const yysigned_char yycheck[] = + { + 3, 4, 5, 6, 0, 7, 8, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 5, 5, 62, + 6, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 3, 4, 5, 6, 60, 61, 5, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 63, 5, 62, 61, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 5, 12, -1, -1, + 9 + }; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ + static const unsigned char yystos[] = + { + 0, 77, 78, 0, 79, 7, 8, 80, 81, 82, + 83, 5, 9, 5, 84, 84, 6, 3, 4, 5, + 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 62, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 85, 6, 5, 5, 60, 61, + 63, 5, 61 + }; + + #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) + # define YYSIZE_T __SIZE_TYPE__ + #endif + #if ! defined (YYSIZE_T) && defined (size_t) + # define YYSIZE_T size_t + #endif + #if ! defined (YYSIZE_T) + # if defined (__STDC__) || defined (__cplusplus) + # include /* INFRINGES ON USER NAME SPACE */ + # define YYSIZE_T size_t + # endif + #endif + #if ! defined (YYSIZE_T) + # define YYSIZE_T unsigned int + #endif + + #define yyerrok (yyerrstatus = 0) + #define yyclearin (yychar = YYEMPTY) + #define YYEMPTY (-2) + #define YYEOF 0 + + #define YYACCEPT goto yyacceptlab + #define YYABORT goto yyabortlab + #define YYERROR goto yyerrorlab + + + /* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + + #define YYFAIL goto yyerrlab + + #define YYRECOVERING() (!!yyerrstatus) + + #define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ + while (0) + + #define YYTERROR 1 + #define YYERRCODE 256 + + /* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + + #ifndef YYLLOC_DEFAULT + # define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) + #endif + + /* YYLEX -- calling `yylex' with the right arguments. */ + + #ifdef YYLEX_PARAM + # define YYLEX yylex (YYLEX_PARAM) + #else + # define YYLEX yylex () + #endif + + /* Enable debugging if requested. */ + #if YYDEBUG + + # ifndef YYFPRINTF + # include /* INFRINGES ON USER NAME SPACE */ + # define YYFPRINTF fprintf + # endif + + # define YYDPRINTF(Args) \ + do { \ + if (yydebug) \ + YYFPRINTF Args; \ + } while (0) + + # define YYDSYMPRINT(Args) \ + do { \ + if (yydebug) \ + yysymprint Args; \ + } while (0) + + # define YYDSYMPRINTF(Title, Token, Value, Location) \ + do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ + } while (0) + + /*------------------------------------------------------------------. + | yy_stack_print -- Print the state stack from its BOTTOM up to its | + | TOP (included). | + `------------------------------------------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yy_stack_print (short *bottom, short *top) + #else + static void + yy_stack_print (bottom, top) + short *bottom; + short *top; + #endif + { + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); + } + + # define YY_STACK_PRINT(Bottom, Top) \ + do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ + } while (0) + + + /*------------------------------------------------. + | Report that the YYRULE is going to be reduced. | + `------------------------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yy_reduce_print (int yyrule) + #else + static void + yy_reduce_print (yyrule) + int yyrule; + #endif + { + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); + } + + # define YY_REDUCE_PRINT(Rule) \ + do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ + } while (0) + + /* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ + int yydebug; + #else /* !YYDEBUG */ + # define YYDPRINTF(Args) + # define YYDSYMPRINT(Args) + # define YYDSYMPRINTF(Title, Token, Value, Location) + # define YY_STACK_PRINT(Bottom, Top) + # define YY_REDUCE_PRINT(Rule) + #endif /* !YYDEBUG */ + + + /* YYINITDEPTH -- initial size of the parser's stacks. */ + #ifndef YYINITDEPTH + # define YYINITDEPTH 200 + #endif + + /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + + #if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 + # undef YYMAXDEPTH + #endif + + #ifndef YYMAXDEPTH + # define YYMAXDEPTH 10000 + #endif + + + + #if YYERROR_VERBOSE + + # ifndef yystrlen + # if defined (__GLIBC__) && defined (_STRING_H) + # define yystrlen strlen + # else + /* Return the length of YYSTR. */ + static YYSIZE_T + # if defined (__STDC__) || defined (__cplusplus) + yystrlen (const char *yystr) + # else + yystrlen (yystr) + const char *yystr; + # endif + { + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; + } + # endif + # endif + + # ifndef yystpcpy + # if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) + # define yystpcpy stpcpy + # else + /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ + static char * + # if defined (__STDC__) || defined (__cplusplus) + yystpcpy (char *yydest, const char *yysrc) + # else + yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; + # endif + { + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; + } + # endif + # endif + + #endif /* !YYERROR_VERBOSE */ + + + + #if YYDEBUG + /*--------------------------------. + | Print this symbol on YYOUTPUT. | + `--------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) + #else + static void + yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; + #endif + { + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + # ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); + # endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); + } + + #endif /* ! YYDEBUG */ + /*-----------------------------------------------. + | Release the memory associated to this symbol. | + `-----------------------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yydestruct (int yytype, YYSTYPE *yyvaluep) + #else + static void + yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; + #endif + { + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } + } + + + /* Prevent warnings from -Wmissing-prototypes. */ + + #ifdef YYPARSE_PARAM + # if defined (__STDC__) || defined (__cplusplus) + int yyparse (void *YYPARSE_PARAM); + # else + int yyparse (); + # endif + #else /* ! YYPARSE_PARAM */ + #if defined (__STDC__) || defined (__cplusplus) + int yyparse (void); + #else + int yyparse (); + #endif + #endif /* ! YYPARSE_PARAM */ + + + + /* The lookahead symbol. */ + int yychar; + + /* The semantic value of the lookahead symbol. */ + YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + + + /*----------. + | yyparse. | + `----------*/ + + #ifdef YYPARSE_PARAM + # if defined (__STDC__) || defined (__cplusplus) + int yyparse (void *YYPARSE_PARAM) + # else + int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; + # endif + #else /* ! YYPARSE_PARAM */ + #if defined (__STDC__) || defined (__cplusplus) + int + yyparse (void) + #else + int + yyparse () + + #endif + #endif + { + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + + #define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + + /*------------------------------------------------------------. + | yynewstate -- Push a new state, which is found in yystate. | + `------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + + #ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } + #else /* no yyoverflow */ + # ifndef YYSTACK_RELOCATE + goto yyoverflowlab; + # else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + + # undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } + # endif + #endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + + /*-----------. + | yybackup. | + `-----------*/ + yybackup: + + /* Do appropriate processing given the current state. */ + /* Read a lookahead token if we need one and don't already have one. */ + /* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + + /*-----------------------------------------------------------. + | yydefault -- do the default action for the current state. | + `-----------------------------------------------------------*/ + yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + + /*-----------------------------. + | yyreduce -- Do a reduction. | + `-----------------------------*/ + yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: + #line 70 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { SCI->handle_module_start( ); ;} + break; + + case 3: + #line 71 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.ModuleVal = SCI->handle_module_end( yyvsp[0].ModuleVal ); ;} + break; + + case 4: + #line 74 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.ModuleVal = SCI->handle_definition_list_end( yyvsp[-1].ModuleVal, yyvsp[0].FunctionVal ); ;} + break; + + case 5: + #line 75 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.ModuleVal = SCI->handle_definition_list_start(); ;} + break; + + case 6: + #line 78 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = yyvsp[0].FunctionVal; ;} + break; + + case 7: + #line 79 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = yyvsp[0].FunctionVal; ;} + break; + + case 8: + #line 80 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = yyvsp[0].FunctionVal; ;} + break; + + case 9: + #line 83 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = SCI->handle_forward( yyvsp[-1].StringVal ); ;} + break; + + case 10: + #line 86 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = SCI->handle_main_definition(yyvsp[-1].FunctionVal); ;} + break; + + case 11: + #line 89 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = SCI->handle_definition( yyvsp[-2].StringVal, yyvsp[-1].FunctionVal ); ;} + break; + + case 12: + #line 92 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = SCI->handle_word_list_end( yyvsp[-1].FunctionVal, yyvsp[0].BasicBlockVal ); ;} + break; + + case 13: + #line 93 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.FunctionVal = SCI->handle_word_list_start(); ;} + break; + + case 14: + #line 99 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_if( yyvsp[-3].StringVal, yyvsp[-1].StringVal ); ;} + break; + + case 15: + #line 100 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_if( yyvsp[-1].StringVal ); ;} + break; + + case 16: + #line 101 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_while( yyvsp[-1].StringVal ); ;} + break; + + case 17: + #line 104 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_identifier( yyvsp[0].StringVal ); ;} + break; + + case 18: + #line 105 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_string( yyvsp[0].StringVal ); ;} + break; + + case 19: + #line 106 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_integer( yyvsp[0].IntegerVal ); ;} + break; + + case 20: + #line 109 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( TRUETOK ); ;} + break; + + case 21: + #line 110 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( FALSETOK ); ;} + break; + + case 22: + #line 111 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( LESS ); ;} + break; + + case 23: + #line 112 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MORE ); ;} + break; + + case 24: + #line 113 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( LESS_EQUAL ); ;} + break; + + case 25: + #line 114 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MORE_EQUAL ); ;} + break; + + case 26: + #line 115 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( NOT_EQUAL ); ;} + break; + + case 27: + #line 116 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( EQUAL ); ;} + break; + + case 28: + #line 117 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( PLUS ); ;} + break; + + case 29: + #line 118 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MINUS ); ;} + break; + + case 30: + #line 119 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( INCR ); ;} + break; + + case 31: + #line 120 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( DECR ); ;} + break; + + case 32: + #line 121 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MULT ); ;} + break; + + case 33: + #line 122 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( DIV ); ;} + break; + + case 34: + #line 123 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MODULUS ); ;} + break; + + case 35: + #line 124 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( NEGATE ); ;} + break; + + case 36: + #line 125 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( ABS ); ;} + break; + + case 37: + #line 126 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MIN ); ;} + break; + + case 38: + #line 127 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MAX ); ;} + break; + + case 39: + #line 128 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( STAR_SLASH ); ;} + break; + + case 40: + #line 129 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( AND ); ;} + break; + + case 41: + #line 130 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( OR ); ;} + break; + + case 42: + #line 131 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( XOR ); ;} + break; + + case 43: + #line 132 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( LSHIFT ); ;} + break; + + case 44: + #line 133 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( RSHIFT ); ;} + break; + + case 45: + #line 134 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( DROP ); ;} + break; + + case 46: + #line 135 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( DROP2 ); ;} + break; + + case 47: + #line 136 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( NIP ); ;} + break; + + case 48: + #line 137 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( NIP2 ); ;} + break; + + case 49: + #line 138 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( DUP ); ;} + break; + + case 50: + #line 139 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( DUP2 ); ;} + break; + + case 51: + #line 140 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( SWAP ); ;} + break; + + case 52: + #line 141 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( SWAP2 ); ;} + break; + + case 53: + #line 142 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( OVER ); ;} + break; + + case 54: + #line 143 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( OVER2 ); ;} + break; + + case 55: + #line 144 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( ROT ); ;} + break; + + case 56: + #line 145 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( ROT2 ); ;} + break; + + case 57: + #line 146 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( RROT ); ;} + break; + + case 58: + #line 147 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( RROT2 ); ;} + break; + + case 59: + #line 148 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( TUCK ); ;} + break; + + case 60: + #line 149 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( TUCK2 ); ;} + break; + + case 61: + #line 150 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( ROLL ); ;} + break; + + case 62: + #line 151 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( PICK ); ;} + break; + + case 63: + #line 152 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( SELECT ); ;} + break; + + case 64: + #line 153 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( MALLOC ); ;} + break; + + case 65: + #line 154 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( FREE ); ;} + break; + + case 66: + #line 155 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( GET ); ;} + break; + + case 67: + #line 156 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( PUT ); ;} + break; + + case 68: + #line 157 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( RECURSE ); ;} + break; + + case 69: + #line 158 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( RETURN ); ;} + break; + + case 70: + #line 159 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( EXIT ); ;} + break; + + case 71: + #line 160 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( TAB ); ;} + break; + + case 72: + #line 161 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( SPACE ); ;} + break; + + case 73: + #line 162 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( CR ); ;} + break; + + case 74: + #line 163 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( IN_STR ); ;} + break; + + case 75: + #line 164 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( IN_NUM ); ;} + break; + + case 76: + #line 165 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( IN_CHAR ); ;} + break; + + case 77: + #line 166 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( OUT_STR ); ;} + break; + + case 78: + #line 167 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( OUT_NUM ); ;} + break; + + case 79: + #line 168 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( OUT_CHAR ); ;} + break; + + case 80: + #line 169 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + { yyval.BasicBlockVal = SCI->handle_word( DUMP ); ;} + break; + + + } + + /* Line 1000 of yacc.c. */ + #line 1669 "StackerParser.tab.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + + /*------------------------------------. + | yyerrlab -- here on detecting error | + `------------------------------------*/ + yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + #if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else + #endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + + /*---------------------------------------------------. + | yyerrorlab -- error raised explicitly by YYERROR. | + `---------------------------------------------------*/ + yyerrorlab: + + #ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; + #endif + + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + + /*-------------------------------------------------------------. + | yyerrlab1 -- common code for both syntax error and YYERROR. | + `-------------------------------------------------------------*/ + yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + + /*-------------------------------------. + | yyacceptlab -- YYACCEPT comes here. | + `-------------------------------------*/ + yyacceptlab: + yyresult = 0; + goto yyreturn; + + /*-----------------------------------. + | yyabortlab -- YYABORT comes here. | + `-----------------------------------*/ + yyabortlab: + yyresult = 1; + goto yyreturn; + + #ifndef yyoverflow + /*----------------------------------------------. + | yyoverflowlab -- parser overflow comes here. | + `----------------------------------------------*/ + yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ + #endif + + yyreturn: + #ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); + #endif + return yyresult; + } + + + #line 171 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + + + /* Handle messages a little more nicely than the default yyerror */ + int yyerror(const char *ErrorMsg) { + std::string where + = std::string((SCI->filename() == "-") ? std::string("") : SCI->filename()) + + ":" + utostr((unsigned) Stackerlineno ) + ": "; + std::string errMsg = std::string(ErrorMsg) + "\n" + where + " while reading "; + if (yychar == YYEMPTY) + errMsg += "end-of-file."; + else + errMsg += "token: '" + std::string(Stackertext, Stackerleng) + "'"; + StackerCompiler::ThrowException(errMsg); + return 0; + } + Index: llvm/projects/Stacker/lib/compiler/StackerParser.h diff -c /dev/null llvm/projects/Stacker/lib/compiler/StackerParser.h:1.1 *** /dev/null Sat Aug 27 13:50:52 2005 --- llvm/projects/Stacker/lib/compiler/StackerParser.h Sat Aug 27 13:50:39 2005 *************** *** 0 **** --- 1,203 ---- + /* A Bison parser, made by GNU Bison 1.875c. */ + + /* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + /* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + + /* Tokens. */ + #ifndef YYTOKENTYPE + # define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + INTEGER = 258, + STRING = 259, + IDENTIFIER = 260, + SEMI = 261, + COLON = 262, + FORWARD = 263, + MAIN = 264, + DUMP = 265, + TRUETOK = 266, + FALSETOK = 267, + LESS = 268, + MORE = 269, + LESS_EQUAL = 270, + MORE_EQUAL = 271, + NOT_EQUAL = 272, + EQUAL = 273, + PLUS = 274, + MINUS = 275, + INCR = 276, + DECR = 277, + MULT = 278, + DIV = 279, + MODULUS = 280, + NEGATE = 281, + ABS = 282, + MIN = 283, + MAX = 284, + STAR_SLASH = 285, + AND = 286, + OR = 287, + XOR = 288, + LSHIFT = 289, + RSHIFT = 290, + DROP = 291, + DROP2 = 292, + NIP = 293, + NIP2 = 294, + DUP = 295, + DUP2 = 296, + SWAP = 297, + SWAP2 = 298, + OVER = 299, + OVER2 = 300, + ROT = 301, + ROT2 = 302, + RROT = 303, + RROT2 = 304, + TUCK = 305, + TUCK2 = 306, + ROLL = 307, + PICK = 308, + SELECT = 309, + MALLOC = 310, + FREE = 311, + GET = 312, + PUT = 313, + IF = 314, + ELSE = 315, + ENDIF = 316, + WHILE = 317, + END = 318, + RECURSE = 319, + RETURN = 320, + EXIT = 321, + TAB = 322, + SPACE = 323, + CR = 324, + IN_STR = 325, + IN_NUM = 326, + IN_CHAR = 327, + OUT_STR = 328, + OUT_NUM = 329, + OUT_CHAR = 330 + }; + #endif + #define INTEGER 258 + #define STRING 259 + #define IDENTIFIER 260 + #define SEMI 261 + #define COLON 262 + #define FORWARD 263 + #define MAIN 264 + #define DUMP 265 + #define TRUETOK 266 + #define FALSETOK 267 + #define LESS 268 + #define MORE 269 + #define LESS_EQUAL 270 + #define MORE_EQUAL 271 + #define NOT_EQUAL 272 + #define EQUAL 273 + #define PLUS 274 + #define MINUS 275 + #define INCR 276 + #define DECR 277 + #define MULT 278 + #define DIV 279 + #define MODULUS 280 + #define NEGATE 281 + #define ABS 282 + #define MIN 283 + #define MAX 284 + #define STAR_SLASH 285 + #define AND 286 + #define OR 287 + #define XOR 288 + #define LSHIFT 289 + #define RSHIFT 290 + #define DROP 291 + #define DROP2 292 + #define NIP 293 + #define NIP2 294 + #define DUP 295 + #define DUP2 296 + #define SWAP 297 + #define SWAP2 298 + #define OVER 299 + #define OVER2 300 + #define ROT 301 + #define ROT2 302 + #define RROT 303 + #define RROT2 304 + #define TUCK 305 + #define TUCK2 306 + #define ROLL 307 + #define PICK 308 + #define SELECT 309 + #define MALLOC 310 + #define FREE 311 + #define GET 312 + #define PUT 313 + #define IF 314 + #define ELSE 315 + #define ENDIF 316 + #define WHILE 317 + #define END 318 + #define RECURSE 319 + #define RETURN 320 + #define EXIT 321 + #define TAB 322 + #define SPACE 323 + #define CR 324 + #define IN_STR 325 + #define IN_NUM 326 + #define IN_CHAR 327 + #define OUT_STR 328 + #define OUT_NUM 329 + #define OUT_CHAR 330 + + + + + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + #line 35 "/proj/llvm/build/projects/Stacker/../../../llvm/projects/Stacker/lib/compiler/StackerParser.y" + typedef union YYSTYPE { + llvm::Module* ModuleVal; + llvm::Function* FunctionVal; + llvm::BasicBlock* BasicBlockVal; + int64_t IntegerVal; + char* StringVal; + } YYSTYPE; + /* Line 1275 of yacc.c. */ + #line 195 "StackerParser.tab.h" + # define yystype YYSTYPE /* obsolescent; will be withdrawn */ + # define YYSTYPE_IS_DECLARED 1 + # define YYSTYPE_IS_TRIVIAL 1 + #endif + + extern YYSTYPE Stackerlval; + + + Index: llvm/projects/Stacker/lib/compiler/Makefile diff -u llvm/projects/Stacker/lib/compiler/Makefile:1.5 llvm/projects/Stacker/lib/compiler/Makefile:1.6 --- llvm/projects/Stacker/lib/compiler/Makefile:1.5 Wed Oct 27 20:25:28 2004 +++ llvm/projects/Stacker/lib/compiler/Makefile Sat Aug 27 13:50:39 2005 @@ -2,7 +2,6 @@ LEVEL := ../.. LIBRARYNAME := stkr_compiler -BUILT_SOURCES := StackerParser.cpp StackerParser.h Lexer.cpp include $(LEVEL)/Makefile.common @@ -10,4 +9,4 @@ INCLUDES += -DPARSE_DEBUG endif -$(OBJDIR)/Lexer.o : StackerParser.h +$(ObjDir)/Lexer.o : $(PROJ_SRC_DIR)/StackerParser.h From reid at x10sys.com Sat Aug 27 13:50:52 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 13:50:52 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileLexer.cpp FileParser.cpp FileParser.h .cvsignore Makefile Message-ID: <200508271850.NAA19898@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileLexer.cpp added (r1.1) FileParser.cpp added (r1.1) FileParser.h added (r1.1) .cvsignore updated: 1.1 -> 1.2 Makefile updated: 1.15 -> 1.16 --- Log message: Implement PR614: http://llvm.cs.uiuc.edu/PR614 : These changes modify the makefiles so that the output of flex and bison are placed in the SRC directory, not the OBJ directory. It is intended that they be checked in as any other LLVM source so that platforms without convenient access to flex/bison can be compiled. From now on, if you change a .y or .l file you *must* also commit the generated .cpp and .h files. --- Diffs of the changes: (+4259 -8) .cvsignore | 3 FileLexer.cpp | 1936 +++++++++++++++++++++++++++++++++++++++++++++++++ FileParser.cpp | 2220 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FileParser.h | 102 ++ Makefile | 6 5 files changed, 4259 insertions(+), 8 deletions(-) Index: llvm/utils/TableGen/FileLexer.cpp diff -c /dev/null llvm/utils/TableGen/FileLexer.cpp:1.1 *** /dev/null Sat Aug 27 13:50:49 2005 --- llvm/utils/TableGen/FileLexer.cpp Sat Aug 27 13:50:39 2005 *************** *** 0 **** --- 1,1936 ---- + #define yy_create_buffer File_create_buffer + #define yy_delete_buffer File_delete_buffer + #define yy_scan_buffer File_scan_buffer + #define yy_scan_string File_scan_string + #define yy_scan_bytes File_scan_bytes + #define yy_flex_debug File_flex_debug + #define yy_init_buffer File_init_buffer + #define yy_flush_buffer File_flush_buffer + #define yy_load_buffer_state File_load_buffer_state + #define yy_switch_to_buffer File_switch_to_buffer + #define yyin Filein + #define yyleng Fileleng + #define yylex Filelex + #define yyout Fileout + #define yyrestart Filerestart + #define yytext Filetext + #define yylineno Filelineno + #define yywrap Filewrap + + #line 21 "Lexer.cpp" + /* A lexical scanner generated by flex */ + + /* Scanner skeleton version: + * $Header: /var/cvs/llvm/llvm/utils/TableGen/FileLexer.cpp,v 1.1 2005/08/27 18:50:39 reid Exp $ + */ + + #define FLEX_SCANNER + #define YY_FLEX_MAJOR_VERSION 2 + #define YY_FLEX_MINOR_VERSION 5 + + #include + #include + + + /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ + #ifdef c_plusplus + #ifndef __cplusplus + #define __cplusplus + #endif + #endif + + + #ifdef __cplusplus + + #include + + /* Use prototypes in function declarations. */ + #define YY_USE_PROTOS + + /* The "const" storage-class-modifier is valid. */ + #define YY_USE_CONST + + #else /* ! __cplusplus */ + + #if __STDC__ + + #define YY_USE_PROTOS + #define YY_USE_CONST + + #endif /* __STDC__ */ + #endif /* ! __cplusplus */ + + #ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use + #include + #include + #define YY_USE_CONST + #define YY_USE_PROTOS + #endif + + #ifdef YY_USE_CONST + #define yyconst const + #else + #define yyconst + #endif + + + #ifdef YY_USE_PROTOS + #define YY_PROTO(proto) proto + #else + #define YY_PROTO(proto) () + #endif + + /* Returned upon end-of-file. */ + #define YY_NULL 0 + + /* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ + #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + + /* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ + #define BEGIN yy_start = 1 + 2 * + + /* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ + #define YY_START ((yy_start - 1) / 2) + #define YYSTATE YY_START + + /* Action number for EOF rule of a given start state. */ + #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + + /* Special action meaning "start processing a new file". */ + #define YY_NEW_FILE yyrestart( yyin ) + + #define YY_END_OF_BUFFER_CHAR 0 + + /* Size of default input buffer. */ + #define YY_BUF_SIZE (16384*64) + + typedef struct yy_buffer_state *YY_BUFFER_STATE; + + extern int yyleng; + extern FILE *yyin, *yyout; + + #define EOB_ACT_CONTINUE_SCAN 0 + #define EOB_ACT_END_OF_FILE 1 + #define EOB_ACT_LAST_MATCH 2 + + /* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + + /* Return all but the first 'n' matched characters back to the input stream. */ + + #define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + + #define unput(c) yyunput( c, yytext_ptr ) + + /* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + typedef unsigned int yy_size_t; + + + struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + #define YY_BUFFER_NEW 0 + #define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ + #define YY_BUFFER_EOF_PENDING 2 + }; + + static YY_BUFFER_STATE yy_current_buffer = 0; + + /* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ + #define YY_CURRENT_BUFFER yy_current_buffer + + + /* yy_hold_char holds the character lost when yytext is formed. */ + static char yy_hold_char; + + static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + + int yyleng; + + /* Points to current character in buffer. */ + static char *yy_c_buf_p = (char *) 0; + static int yy_init = 1; /* whether we need to initialize */ + static int yy_start = 0; /* start state number */ + + /* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ + static int yy_did_buffer_switch_on_eof; + + void yyrestart YY_PROTO(( FILE *input_file )); + + void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); + void yy_load_buffer_state YY_PROTO(( void )); + YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); + void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); + void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); + void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); + #define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + + YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); + YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); + YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + + static void *yy_flex_alloc YY_PROTO(( yy_size_t )); + static inline void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); + static void yy_flex_free YY_PROTO(( void * )); + + #define yy_new_buffer yy_create_buffer + + #define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + + #define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + + #define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + + #define YY_USES_REJECT + typedef unsigned char YY_CHAR; + FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + typedef int yy_state_type; + extern int yylineno; + int yylineno = 1; + extern char *yytext; + #define yytext_ptr yytext + + static yy_state_type yy_get_previous_state YY_PROTO(( void )); + static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); + static int yy_get_next_buffer YY_PROTO(( void )); + static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + + /* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ + #define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + + #define YY_NUM_RULES 31 + #define YY_END_OF_BUFFER 32 + static yyconst short int yy_acclist[129] = + { 0, + 25, 25, 32, 30, 31, 23, 30, 31, 23, 31, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 22, 30, 31, 22, 30, 31, 19, 30, 31, 30, + 31, 19, 30, 31, 19, 30, 31, 19, 30, 31, + 19, 30, 31, 19, 30, 31, 19, 30, 31, 19, + 30, 31, 25, 31, 26, 31, 28, 31, 23, 21, + 20, 22, 24, 1, 19, 19, 19, 19, 19, 19, + 19, 15, 19, 19, 19, 19, 25, 26, 26, 29, + 28, 27, 28, 20, 1, 22, 22, 5, 19, 19, + 19, 10, 19, 12, 19, 19, 19, 4, 19, 14, + + 19, 19, 19, 18, 16, 17, 3, 6, 19, 19, + 9, 19, 19, 19, 8, 19, 19, 11, 19, 13, + 19, 19, 19, 19, 7, 19, 19, 2 + } ; + + static yyconst short int yy_accept[101] = + { 0, + 1, 1, 1, 2, 3, 4, 6, 9, 11, 13, + 15, 17, 19, 21, 24, 27, 30, 32, 35, 38, + 41, 44, 47, 50, 53, 55, 57, 59, 60, 60, + 60, 61, 62, 63, 64, 65, 65, 65, 66, 66, + 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 84, 84, 85, + 86, 87, 88, 88, 88, 90, 91, 92, 94, 96, + 97, 98, 100, 102, 103, 104, 105, 106, 107, 107, + 108, 110, 111, 113, 114, 115, 117, 118, 120, 122, + 123, 124, 125, 127, 128, 128, 128, 128, 129, 129 + + } ; + + static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 5, 6, 1, 7, 1, 1, 1, 1, + 1, 8, 9, 1, 9, 1, 10, 11, 12, 13, + 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, + 1, 1, 1, 1, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 16, 1, 17, 1, 15, 1, 18, 19, 20, 21, + + 22, 23, 24, 25, 26, 15, 15, 27, 15, 28, + 29, 15, 15, 30, 31, 32, 33, 15, 15, 34, + 15, 15, 35, 1, 36, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + + static yyconst int yy_meta[37] = + { 0, + 1, 1, 2, 1, 1, 1, 1, 3, 1, 3, + 4, 4, 4, 5, 6, 1, 1, 5, 5, 5, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 1, 1 + } ; + + static yyconst short int yy_base[113] = + { 0, + 0, 0, 29, 30, 198, 199, 39, 42, 166, 190, + 0, 36, 42, 42, 45, 0, 160, 168, 33, 41, + 167, 164, 42, 159, 0, 57, 61, 70, 45, 184, + 199, 0, 66, 199, 0, 69, 0, 0, 153, 156, + 169, 165, 161, 161, 161, 62, 150, 150, 150, 0, + 75, 76, 199, 171, 199, 79, 151, 70, 0, 0, + 79, 0, 141, 159, 144, 143, 151, 0, 0, 145, + 144, 0, 0, 138, 143, 199, 199, 199, 132, 199, + 0, 136, 0, 145, 132, 0, 136, 0, 0, 118, + 95, 76, 0, 90, 93, 60, 45, 199, 199, 99, + + 105, 107, 110, 116, 122, 128, 131, 137, 140, 145, + 151, 157 + } ; + + static yyconst short int yy_def[113] = + { 0, + 99, 1, 100, 100, 99, 99, 99, 99, 99, 101, + 102, 99, 99, 99, 99, 103, 99, 103, 103, 103, + 103, 103, 103, 103, 104, 105, 106, 99, 99, 101, + 99, 107, 99, 99, 108, 99, 109, 103, 110, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 104, + 105, 105, 99, 106, 99, 106, 99, 99, 107, 108, + 99, 109, 110, 111, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 99, 99, 99, 110, 99, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 99, 112, 112, 99, 0, 99, + + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99 + } ; + + static yyconst short int yy_nxt[236] = + { 0, + 6, 7, 8, 7, 9, 10, 11, 6, 12, 13, + 14, 15, 15, 16, 16, 17, 6, 16, 18, 19, + 20, 16, 21, 16, 16, 22, 23, 16, 16, 16, + 24, 16, 16, 16, 6, 6, 26, 26, 27, 27, + 28, 28, 28, 28, 28, 28, 33, 33, 33, 34, + 98, 35, 33, 33, 33, 33, 33, 33, 43, 41, + 36, 42, 44, 47, 52, 98, 53, 48, 55, 57, + 56, 28, 28, 28, 58, 37, 33, 33, 33, 61, + 61, 71, 99, 52, 99, 53, 99, 77, 56, 61, + 61, 95, 95, 72, 95, 95, 78, 94, 96, 25, + + 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, + 30, 32, 32, 38, 38, 38, 50, 50, 93, 50, + 50, 50, 51, 51, 51, 51, 51, 51, 54, 54, + 54, 54, 54, 54, 59, 59, 59, 60, 92, 60, + 60, 60, 60, 62, 62, 63, 63, 63, 63, 63, + 63, 79, 79, 79, 79, 79, 79, 97, 97, 97, + 97, 97, 97, 91, 90, 89, 88, 64, 87, 86, + 85, 84, 83, 82, 81, 80, 64, 76, 99, 75, + 74, 73, 70, 69, 68, 67, 66, 65, 64, 31, + 49, 46, 45, 40, 39, 31, 29, 99, 5, 99, + + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99 + } ; + + static yyconst short int yy_chk[236] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 4, 3, 4, + 7, 7, 7, 8, 8, 8, 12, 12, 12, 13, + 97, 13, 14, 14, 14, 15, 15, 15, 20, 19, + 14, 19, 20, 23, 26, 96, 26, 23, 27, 29, + 27, 28, 28, 28, 29, 14, 33, 33, 33, 36, + 36, 46, 51, 52, 51, 52, 56, 58, 56, 61, + 61, 94, 94, 46, 95, 95, 58, 92, 95, 100, + + 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, + 101, 102, 102, 103, 103, 103, 104, 104, 91, 104, + 104, 104, 105, 105, 105, 105, 105, 105, 106, 106, + 106, 106, 106, 106, 107, 107, 107, 108, 90, 108, + 108, 108, 108, 109, 109, 110, 110, 110, 110, 110, + 110, 111, 111, 111, 111, 111, 111, 112, 112, 112, + 112, 112, 112, 87, 85, 84, 82, 79, 75, 74, + 71, 70, 67, 66, 65, 64, 63, 57, 54, 49, + 48, 47, 45, 44, 43, 42, 41, 40, 39, 30, + 24, 22, 21, 18, 17, 10, 9, 5, 99, 99, + + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99 + } ; + + static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; + static char *yy_full_match; + static int yy_lp; + #define REJECT \ + { \ + *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ + yy_cp = yy_full_match; /* restore poss. backed-over text */ \ + ++yy_lp; \ + goto find_rule; \ + } + #define yymore() yymore_used_but_not_detected + #define YY_MORE_ADJ 0 + #define YY_RESTORE_YY_MORE_OFFSET + char *yytext; + #line 1 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + #define INITIAL 0 + /*===-- FileLexer.l - Scanner for TableGen Files ----------------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file defines a simple flex scanner for TableGen files. This is pretty + // straight-forward, except for the magic to handle file inclusion. + // + //===----------------------------------------------------------------------===*/ + #define YY_NEVER_INTERACTIVE 1 + #define comment 1 + + #line 30 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + #include "Record.h" + typedef std::pair*> SubClassRefTy; + #include "FileParser.h" + + int Fileparse(); + + namespace llvm { + + // Global variable recording the location of the include directory + std::string IncludeDirectory; + + /// ParseInt - This has to handle the special case of binary numbers 0b0101 + /// + static int ParseInt(const char *Str) { + if (Str[0] == '0' && Str[1] == 'b') + return strtol(Str+2, 0, 2); + return strtol(Str, 0, 0); + } + + static int CommentDepth = 0; + + struct IncludeRec { + std::string Filename; + FILE *File; + unsigned LineNo; + YY_BUFFER_STATE Buffer; + + IncludeRec(const std::string &FN, FILE *F) + : Filename(FN), File(F), LineNo(0){ + } + }; + + static std::vector IncludeStack; + + std::ostream &err() { + if (IncludeStack.empty()) + return std::cerr << "At end of input: "; + + for (unsigned i = 0, e = IncludeStack.size()-1; i != e; ++i) + std::cerr << "Included from " << IncludeStack[i].Filename << ":" + << IncludeStack[i].LineNo << ":\n"; + return std::cerr << "Parsing " << IncludeStack.back().Filename << ":" + << Filelineno << ": "; + } + + /// ParseFile - this function begins the parsing of the specified tablegen file. + /// + void ParseFile(const std::string &Filename, const std::string & IncludeDir) { + FILE *F = stdin; + if (Filename != "-") { + F = fopen(Filename.c_str(), "r"); + + if (F == 0) { + std::cerr << "Could not open input file '" + Filename + "'!\n"; + exit (1); + } + IncludeStack.push_back(IncludeRec(Filename, F)); + } else { + IncludeStack.push_back(IncludeRec("", stdin)); + } + + // Record the location of the include directory so that the lexer can find + // it later. + IncludeDirectory = IncludeDir; + + Filein = F; + Filelineno = 1; + Fileparse(); + Filein = stdin; + } + + /// HandleInclude - This function is called when an include directive is + /// encountered in the input stream... + /// + static void HandleInclude(const char *Buffer) { + unsigned Length = yyleng; + assert(Buffer[Length-1] == '"'); + Buffer += strlen("include "); + Length -= strlen("include "); + while (*Buffer != '"') { + ++Buffer; + --Length; + } + assert(Length >= 2 && "Double quotes not found?"); + std::string Filename(Buffer+1, Buffer+Length-1); + //std::cerr << "Filename = '" << Filename << "'\n"; + + // Save the line number and lex buffer of the includer... + IncludeStack.back().LineNo = Filelineno; + IncludeStack.back().Buffer = YY_CURRENT_BUFFER; + + // Open the new input file... + yyin = fopen(Filename.c_str(), "r"); + if (yyin == 0) { + // If we couldn't find the file in the current directory, look for it in + // the include directories. + // + // NOTE: Right now, there is only one directory. We need to eventually add + // support for more. + std::string NextFilename = IncludeDirectory + "/" + Filename; + yyin = fopen(NextFilename.c_str(), "r"); + if (yyin == 0) { + err() << "Could not find include file '" << Filename << "'!\n"; + exit(1); + } + Filename = NextFilename; + } + + // Add the file to our include stack... + IncludeStack.push_back(IncludeRec(Filename, yyin)); + Filelineno = 1; // Reset line numbering... + //yyrestart(yyin); // Start lexing the new file... + + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); + } + + /// yywrap - This is called when the lexer runs out of input in one of the + /// files. Switch back to an includer if an includee has run out of input. + /// + extern "C" + int yywrap(void) { + if (IncludeStack.back().File != stdin) + fclose(IncludeStack.back().File); + IncludeStack.pop_back(); + if (IncludeStack.empty()) return 1; // Top-level file is done. + + // Otherwise, we need to switch back to a file which included the current one. + Filelineno = IncludeStack.back().LineNo; // Restore current line number + yy_switch_to_buffer(IncludeStack.back().Buffer); + return 0; + } + + } // End llvm namespace + + using namespace llvm; + + #line 648 "Lexer.cpp" + + /* Macros after this point can all be overridden by user definitions in + * section 1. + */ + + #ifndef YY_SKIP_YYWRAP + #ifdef __cplusplus + extern "C" int yywrap YY_PROTO(( void )); + #else + extern int yywrap YY_PROTO(( void )); + #endif + #endif + + #ifndef YY_NO_UNPUT + static inline void yyunput YY_PROTO(( int c, char *buf_ptr )); + #endif + + #ifndef yytext_ptr + static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); + #endif + + #ifdef YY_NEED_STRLEN + static int yy_flex_strlen YY_PROTO(( yyconst char * )); + #endif + + #ifndef YY_NO_INPUT + #ifdef __cplusplus + static int yyinput YY_PROTO(( void )); + #else + static int input YY_PROTO(( void )); + #endif + #endif + + #if YY_STACK_USED + static int yy_start_stack_ptr = 0; + static int yy_start_stack_depth = 0; + static int *yy_start_stack = 0; + #ifndef YY_NO_PUSH_STATE + static void yy_push_state YY_PROTO(( int new_state )); + #endif + #ifndef YY_NO_POP_STATE + static void yy_pop_state YY_PROTO(( void )); + #endif + #ifndef YY_NO_TOP_STATE + static int yy_top_state YY_PROTO(( void )); + #endif + + #else + #define YY_NO_PUSH_STATE 1 + #define YY_NO_POP_STATE 1 + #define YY_NO_TOP_STATE 1 + #endif + + #ifdef YY_MALLOC_DECL + YY_MALLOC_DECL + #else + #if __STDC__ + #ifndef __cplusplus + #include + #endif + #else + /* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ + #endif + #endif + + /* Amount of stuff to slurp up with each read. */ + #ifndef YY_READ_BUF_SIZE + #define YY_READ_BUF_SIZE 8192 + #endif + + /* Copy whatever the last rule matched to the standard output. */ + + #ifndef ECHO + /* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ + #define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) + #endif + + /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ + #ifndef YY_INPUT + #define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); + #endif + + /* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ + #ifndef yyterminate + #define yyterminate() return YY_NULL + #endif + + /* Number of entries by which start-condition stack grows. */ + #ifndef YY_START_STACK_INCR + #define YY_START_STACK_INCR 25 + #endif + + /* Report a fatal error. */ + #ifndef YY_FATAL_ERROR + #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) + #endif + + /* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ + #ifndef YY_DECL + #define YY_DECL int yylex YY_PROTO(( void )) + #endif + + /* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ + #ifndef YY_USER_ACTION + #define YY_USER_ACTION + #endif + + /* Code executed at the end of each rule. */ + #ifndef YY_BREAK + #define YY_BREAK break; + #endif + + #define YY_RULE_SETUP \ + YY_USER_ACTION + + YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp = NULL, *yy_bp = NULL; + register int yy_act; + + #line 176 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + + + #line 802 "Lexer.cpp" + + if ( yy_init ) + { + yy_init = 0; + + #ifdef YY_USER_INIT + YY_USER_INIT; + #endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 100 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_current_state != 99 ); + + yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + { + yy_full_match = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER ) + { + int yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + ++yylineno; + } + + do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 1: + YY_RULE_SETUP + #line 178 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { /* Ignore comments */ } + YY_BREAK + case 2: + YY_RULE_SETUP + #line 180 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { HandleInclude(yytext); } + YY_BREAK + case 3: + YY_RULE_SETUP + #line 181 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { Filelval.StrVal = new std::string(yytext+2, yytext+yyleng-2); + return CODEFRAGMENT; } + YY_BREAK + case 4: + YY_RULE_SETUP + #line 184 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return INT; } + YY_BREAK + case 5: + YY_RULE_SETUP + #line 185 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return BIT; } + YY_BREAK + case 6: + YY_RULE_SETUP + #line 186 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return BITS; } + YY_BREAK + case 7: + YY_RULE_SETUP + #line 187 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return STRING; } + YY_BREAK + case 8: + YY_RULE_SETUP + #line 188 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return LIST; } + YY_BREAK + case 9: + YY_RULE_SETUP + #line 189 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return CODE; } + YY_BREAK + case 10: + YY_RULE_SETUP + #line 190 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return DAG; } + YY_BREAK + case 11: + YY_RULE_SETUP + #line 192 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return CLASS; } + YY_BREAK + case 12: + YY_RULE_SETUP + #line 193 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return DEF; } + YY_BREAK + case 13: + YY_RULE_SETUP + #line 194 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return FIELD; } + YY_BREAK + case 14: + YY_RULE_SETUP + #line 195 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return LET; } + YY_BREAK + case 15: + YY_RULE_SETUP + #line 196 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return IN; } + YY_BREAK + case 16: + YY_RULE_SETUP + #line 198 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return SRATOK; } + YY_BREAK + case 17: + YY_RULE_SETUP + #line 199 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return SRLTOK; } + YY_BREAK + case 18: + YY_RULE_SETUP + #line 200 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return SHLTOK; } + YY_BREAK + case 19: + YY_RULE_SETUP + #line 203 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { Filelval.StrVal = new std::string(yytext, yytext+yyleng); + return ID; } + YY_BREAK + case 20: + YY_RULE_SETUP + #line 205 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng); + return VARNAME; } + YY_BREAK + case 21: + YY_RULE_SETUP + #line 208 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng-1); + return STRVAL; } + YY_BREAK + case 22: + YY_RULE_SETUP + #line 211 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { Filelval.IntVal = ParseInt(Filetext); return INTVAL; } + YY_BREAK + case 23: + YY_RULE_SETUP + #line 213 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { /* Ignore whitespace */ } + YY_BREAK + case 24: + YY_RULE_SETUP + #line 216 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { BEGIN(comment); CommentDepth++; } + YY_BREAK + case 25: + YY_RULE_SETUP + #line 217 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + /* eat anything that's not a '*' or '/' */ + YY_BREAK + case 26: + YY_RULE_SETUP + #line 218 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + /* eat up '*'s not followed by '/'s */ + YY_BREAK + case 27: + YY_RULE_SETUP + #line 219 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { ++CommentDepth; } + YY_BREAK + case 28: + YY_RULE_SETUP + #line 220 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + /* eat up /'s not followed by *'s */ + YY_BREAK + case 29: + YY_RULE_SETUP + #line 221 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { if (!--CommentDepth) { BEGIN(INITIAL); } } + YY_BREAK + case YY_STATE_EOF(comment): + #line 222 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { err() << "Unterminated comment!\n"; exit(1); } + YY_BREAK + case 30: + YY_RULE_SETUP + #line 224 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + { return Filetext[0]; } + YY_BREAK + case 31: + YY_RULE_SETUP + #line 226 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + #line 1056 "Lexer.cpp" + case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + + /* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + + static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + #ifdef YY_USES_REJECT + YY_FATAL_ERROR( + "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + #else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; + #endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + + /* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 100 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + + /* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + + #ifdef YY_USE_PROTOS + static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) + #else + static yy_state_type yy_try_NUL_trans( yy_current_state ) + yy_state_type yy_current_state; + #endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 100 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 99); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + + #ifndef YY_NO_UNPUT + #ifdef YY_USE_PROTOS + static inline void yyunput( int c, register char *yy_bp ) + #else + static inline void yyunput( c, yy_bp ) + int c; + register char *yy_bp; + #endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ) + --yylineno; + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } + #endif /* ifndef YY_NO_UNPUT */ + + + #ifndef YY_NO_INPUT + #ifdef __cplusplus + static int yyinput() + #else + static int input() + #endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + #ifdef __cplusplus + return yyinput(); + #else + return input(); + #endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + if ( c == '\n' ) + ++yylineno; + + return c; + } + #endif /* YY_NO_INPUT */ + + #ifdef YY_USE_PROTOS + void yyrestart( FILE *input_file ) + #else + void yyrestart( input_file ) + FILE *input_file; + #endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + + #ifdef YY_USE_PROTOS + void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) + #else + void yy_switch_to_buffer( new_buffer ) + YY_BUFFER_STATE new_buffer; + #endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + + #ifdef YY_USE_PROTOS + void yy_load_buffer_state( void ) + #else + void yy_load_buffer_state() + #endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) + #else + YY_BUFFER_STATE yy_create_buffer( file, size ) + FILE *file; + int size; + #endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + + #ifdef YY_USE_PROTOS + void yy_delete_buffer( YY_BUFFER_STATE b ) + #else + void yy_delete_buffer( b ) + YY_BUFFER_STATE b; + #endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + + + #ifdef YY_USE_PROTOS + void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) + #else + void yy_init_buffer( b, file ) + YY_BUFFER_STATE b; + FILE *file; + #endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + #if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; + #else + #if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; + #else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + #endif + #endif + } + + + #ifdef YY_USE_PROTOS + void yy_flush_buffer( YY_BUFFER_STATE b ) + #else + void yy_flush_buffer( b ) + YY_BUFFER_STATE b; + #endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + + #ifndef YY_NO_SCAN_BUFFER + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) + #else + YY_BUFFER_STATE yy_scan_buffer( base, size ) + char *base; + yy_size_t size; + #endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } + #endif + + + #ifndef YY_NO_SCAN_STRING + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) + #else + YY_BUFFER_STATE yy_scan_string( yy_str ) + yyconst char *yy_str; + #endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } + #endif + + + #ifndef YY_NO_SCAN_BYTES + #ifdef YY_USE_PROTOS + YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) + #else + YY_BUFFER_STATE yy_scan_bytes( bytes, len ) + yyconst char *bytes; + int len; + #endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } + #endif + + + #ifndef YY_NO_PUSH_STATE + #ifdef YY_USE_PROTOS + static void yy_push_state( int new_state ) + #else + static void yy_push_state( new_state ) + int new_state; + #endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } + #endif + + + #ifndef YY_NO_POP_STATE + static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } + #endif + + + #ifndef YY_NO_TOP_STATE + static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } + #endif + + #ifndef YY_EXIT_FAILURE + #define YY_EXIT_FAILURE 2 + #endif + + #ifdef YY_USE_PROTOS + static void yy_fatal_error( yyconst char msg[] ) + #else + static void yy_fatal_error( msg ) + char msg[]; + #endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + + /* Redefine yyless() so it works in section 3 code. */ + + #undef yyless + #define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + + /* Internal utility routines. */ + + #ifndef yytext_ptr + #ifdef YY_USE_PROTOS + static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) + #else + static void yy_flex_strncpy( s1, s2, n ) + char *s1; + yyconst char *s2; + int n; + #endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } + #endif + + #ifdef YY_NEED_STRLEN + #ifdef YY_USE_PROTOS + static int yy_flex_strlen( yyconst char *s ) + #else + static int yy_flex_strlen( s ) + yyconst char *s; + #endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } + #endif + + + #ifdef YY_USE_PROTOS + static void *yy_flex_alloc( yy_size_t size ) + #else + static void *yy_flex_alloc( size ) + yy_size_t size; + #endif + { + return (void *) malloc( size ); + } + + #ifdef YY_USE_PROTOS + static inline void *yy_flex_realloc( void *ptr, yy_size_t size ) + #else + static inline void *yy_flex_realloc( ptr, size ) + void *ptr; + yy_size_t size; + #endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + + #ifdef YY_USE_PROTOS + static void yy_flex_free( void *ptr ) + #else + static void yy_flex_free( ptr ) + void *ptr; + #endif + { + free( ptr ); + } + + #if YY_MAIN + int main() + { + yylex(); + return 0; + } + #endif + #line 226 "/proj/llvm/build/../llvm/utils/TableGen/FileLexer.l" + Index: llvm/utils/TableGen/FileParser.cpp diff -c /dev/null llvm/utils/TableGen/FileParser.cpp:1.1 *** /dev/null Sat Aug 27 13:50:52 2005 --- llvm/utils/TableGen/FileParser.cpp Sat Aug 27 13:50:39 2005 *************** *** 0 **** --- 1,2220 ---- + /* A Bison parser, made by GNU Bison 1.875c. */ + + /* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + /* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + + /* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + + /* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + + /* Identify Bison output. */ + #define YYBISON 1 + + /* Skeleton name. */ + #define YYSKELETON_NAME "yacc.c" + + /* Pure parsers. */ + #define YYPURE 0 + + /* Using locations. */ + #define YYLSP_NEEDED 0 + + /* If NAME_PREFIX is specified substitute the variables and functions + names. */ + #define yyparse Fileparse + #define yylex Filelex + #define yyerror Fileerror + #define yylval Filelval + #define yychar Filechar + #define yydebug Filedebug + #define yynerrs Filenerrs + + + /* Tokens. */ + #ifndef YYTOKENTYPE + # define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + INT = 258, + BIT = 259, + STRING = 260, + BITS = 261, + LIST = 262, + CODE = 263, + DAG = 264, + CLASS = 265, + DEF = 266, + FIELD = 267, + LET = 268, + IN = 269, + SHLTOK = 270, + SRATOK = 271, + SRLTOK = 272, + INTVAL = 273, + ID = 274, + VARNAME = 275, + STRVAL = 276, + CODEFRAGMENT = 277 + }; + #endif + #define INT 258 + #define BIT 259 + #define STRING 260 + #define BITS 261 + #define LIST 262 + #define CODE 263 + #define DAG 264 + #define CLASS 265 + #define DEF 266 + #define FIELD 267 + #define LET 268 + #define IN 269 + #define SHLTOK 270 + #define SRATOK 271 + #define SRLTOK 272 + #define INTVAL 273 + #define ID 274 + #define VARNAME 275 + #define STRVAL 276 + #define CODEFRAGMENT 277 + + + + + /* Copy the first part of user declarations. */ + #line 14 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + + #include "Record.h" + #include "llvm/ADT/StringExtras.h" + #include + #include + #define YYERROR_VERBOSE 1 + + int yyerror(const char *ErrorMsg); + int yylex(); + + namespace llvm { + + extern int Filelineno; + static Record *CurRec = 0; + static bool ParsingTemplateArgs = false; + + typedef std::pair*> SubClassRefTy; + + struct LetRecord { + std::string Name; + std::vector Bits; + Init *Value; + bool HasBits; + LetRecord(const std::string &N, std::vector *B, Init *V) + : Name(N), Value(V), HasBits(B != 0) { + if (HasBits) Bits = *B; + } + }; + + static std::vector > LetStack; + + + extern std::ostream &err(); + + static void addValue(const RecordVal &RV) { + if (RecordVal *ERV = CurRec->getValue(RV.getName())) { + // The value already exists in the class, treat this as a set... + if (ERV->setValue(RV.getValue())) { + err() << "New definition of '" << RV.getName() << "' of type '" + << *RV.getType() << "' is incompatible with previous " + << "definition of type '" << *ERV->getType() << "'!\n"; + exit(1); + } + } else { + CurRec->addValue(RV); + } + } + + static void addSuperClass(Record *SC) { + if (CurRec->isSubClassOf(SC)) { + err() << "Already subclass of '" << SC->getName() << "'!\n"; + exit(1); + } + CurRec->addSuperClass(SC); + } + + static void setValue(const std::string &ValName, + std::vector *BitList, Init *V) { + if (!V) return; + + RecordVal *RV = CurRec->getValue(ValName); + if (RV == 0) { + err() << "Value '" << ValName << "' unknown!\n"; + exit(1); + } + + // Do not allow assignments like 'X = X'. This will just cause infinite loops + // in the resolution machinery. + if (!BitList) + if (VarInit *VI = dynamic_cast(V)) + if (VI->getName() == ValName) + return; + + // If we are assigning to a subset of the bits in the value... then we must be + // assigning to a field of BitsRecTy, which must have a BitsInit + // initializer... + // + if (BitList) { + BitsInit *CurVal = dynamic_cast(RV->getValue()); + if (CurVal == 0) { + err() << "Value '" << ValName << "' is not a bits type!\n"; + exit(1); + } + + // Convert the incoming value to a bits type of the appropriate size... + Init *BI = V->convertInitializerTo(new BitsRecTy(BitList->size())); + if (BI == 0) { + V->convertInitializerTo(new BitsRecTy(BitList->size())); + err() << "Initializer '" << *V << "' not compatible with bit range!\n"; + exit(1); + } + + // We should have a BitsInit type now... + assert(dynamic_cast(BI) != 0 || &(std::cerr << *BI) == 0); + BitsInit *BInit = (BitsInit*)BI; + + BitsInit *NewVal = new BitsInit(CurVal->getNumBits()); + + // Loop over bits, assigning values as appropriate... + for (unsigned i = 0, e = BitList->size(); i != e; ++i) { + unsigned Bit = (*BitList)[i]; + if (NewVal->getBit(Bit)) { + err() << "Cannot set bit #" << Bit << " of value '" << ValName + << "' more than once!\n"; + exit(1); + } + NewVal->setBit(Bit, BInit->getBit(i)); + } + + for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i) + if (NewVal->getBit(i) == 0) + NewVal->setBit(i, CurVal->getBit(i)); + + V = NewVal; + } + + if (RV->setValue(V)) { + err() << "Value '" << ValName << "' of type '" << *RV->getType() + << "' is incompatible with initializer '" << *V << "'!\n"; + exit(1); + } + } + + // addSubClass - Add SC as a subclass to CurRec, resolving TemplateArgs as SC's + // template arguments. + static void addSubClass(Record *SC, const std::vector &TemplateArgs) { + // Add all of the values in the subclass into the current class... + const std::vector &Vals = SC->getValues(); + for (unsigned i = 0, e = Vals.size(); i != e; ++i) + addValue(Vals[i]); + + const std::vector &TArgs = SC->getTemplateArgs(); + + // Ensure that an appropriate number of template arguments are specified... + if (TArgs.size() < TemplateArgs.size()) { + err() << "ERROR: More template args specified than expected!\n"; + exit(1); + } else { // This class expects template arguments... + // Loop over all of the template arguments, setting them to the specified + // value or leaving them as the default if necessary. + for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { + if (i < TemplateArgs.size()) { // A value is specified for this temp-arg? + // Set it now. + setValue(TArgs[i], 0, TemplateArgs[i]); + + // Resolve it next. + CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i])); + + + // Now remove it. + CurRec->removeValue(TArgs[i]); + + } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { + err() << "ERROR: Value not specified for template argument #" + << i << " (" << TArgs[i] << ") of subclass '" << SC->getName() + << "'!\n"; + exit(1); + } + } + } + + // Since everything went well, we can now set the "superclass" list for the + // current record. + const std::vector &SCs = SC->getSuperClasses(); + for (unsigned i = 0, e = SCs.size(); i != e; ++i) + addSuperClass(SCs[i]); + addSuperClass(SC); + } + + } // End llvm namespace + + using namespace llvm; + + + + /* Enabling traces. */ + #ifndef YYDEBUG + # define YYDEBUG 0 + #endif + + /* Enabling verbose error messages. */ + #ifdef YYERROR_VERBOSE + # undef YYERROR_VERBOSE + # define YYERROR_VERBOSE 1 + #else + # define YYERROR_VERBOSE 0 + #endif + + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + #line 189 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + typedef union YYSTYPE { + std::string* StrVal; + int IntVal; + llvm::RecTy* Ty; + llvm::Init* Initializer; + std::vector* FieldList; + std::vector* BitList; + llvm::Record* Rec; + SubClassRefTy* SubClassRef; + std::vector* SubClassList; + std::vector >* DagValueList; + } YYSTYPE; + /* Line 191 of yacc.c. */ + #line 317 "FileParser.tab.c" + # define yystype YYSTYPE /* obsolescent; will be withdrawn */ + # define YYSTYPE_IS_DECLARED 1 + # define YYSTYPE_IS_TRIVIAL 1 + #endif + + + + /* Copy the second part of user declarations. */ + + + /* Line 214 of yacc.c. */ + #line 329 "FileParser.tab.c" + + #if ! defined (yyoverflow) || YYERROR_VERBOSE + + # ifndef YYFREE + # define YYFREE free + # endif + # ifndef YYMALLOC + # define YYMALLOC malloc + # endif + + /* The parser invokes alloca or malloc; define the necessary symbols. */ + + # ifdef YYSTACK_USE_ALLOCA + # if YYSTACK_USE_ALLOCA + # define YYSTACK_ALLOC alloca + # endif + # else + # if defined (alloca) || defined (_ALLOCA_H) + # define YYSTACK_ALLOC alloca + # else + # ifdef __GNUC__ + # define YYSTACK_ALLOC __builtin_alloca + # endif + # endif + # endif + + # ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ + # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) + # else + # if defined (__STDC__) || defined (__cplusplus) + # include /* INFRINGES ON USER NAME SPACE */ + # define YYSIZE_T size_t + # endif + # define YYSTACK_ALLOC YYMALLOC + # define YYSTACK_FREE YYFREE + # endif + #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + + #if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + + /* A type that is properly aligned for any stack member. */ + union yyalloc + { + short yyss; + YYSTYPE yyvs; + }; + + /* The size of the maximum gap between one aligned stack and the next. */ + # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + + /* The size of an array large to enough to hold all stacks, each with + N elements. */ + # define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + + /* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ + # ifndef YYCOPY + # if defined (__GNUC__) && 1 < __GNUC__ + # define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) + # else + # define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) + # endif + # endif + + /* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ + # define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + + #endif + + #if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; + #else + typedef short yysigned_char; + #endif + + /* YYFINAL -- State number of the termination state. */ + #define YYFINAL 18 + /* YYLAST -- Last index in YYTABLE. */ + #define YYLAST 149 + + /* YYNTOKENS -- Number of terminals. */ + #define YYNTOKENS 38 + /* YYNNTS -- Number of nonterminals. */ + #define YYNNTS 37 + /* YYNRULES -- Number of rules. */ + #define YYNRULES 84 + /* YYNRULES -- Number of states. */ + #define YYNSTATES 152 + + /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ + #define YYUNDEFTOK 2 + #define YYMAXUTOK 277 + + #define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + + /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ + static const unsigned char yytranslate[] = + { + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 32, 33, 2, 2, 34, 36, 31, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 35, 37, + 23, 25, 24, 26, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 29, 2, 30, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 27, 2, 28, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22 + }; + + #if YYDEBUG + /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ + static const unsigned char yyprhs[] = + { + 0, 0, 3, 5, 7, 9, 14, 16, 21, 23, + 25, 27, 28, 30, 31, 34, 36, 38, 40, 42, + 46, 48, 53, 57, 61, 66, 71, 78, 85, 92, + 93, 96, 99, 104, 105, 107, 109, 113, 116, 120, + 126, 131, 133, 134, 138, 139, 141, 143, 147, 152, + 155, 162, 163, 166, 168, 172, 174, 179, 181, 185, + 186, 189, 191, 195, 199, 200, 202, 204, 205, 206, + 207, 214, 217, 220, 222, 224, 229, 231, 235, 236, + 241, 246, 249, 251, 254 + }; + + /* YYRHS -- A `-1'-separated list of the rules' RHS. */ + static const yysigned_char yyrhs[] = + { + 74, 0, -1, 19, -1, 5, -1, 4, -1, 6, + 23, 18, 24, -1, 3, -1, 7, 23, 40, 24, + -1, 8, -1, 9, -1, 39, -1, -1, 12, -1, + -1, 25, 43, -1, 18, -1, 21, -1, 22, -1, + 26, -1, 27, 50, 28, -1, 19, -1, 43, 27, + 48, 28, -1, 29, 50, 30, -1, 43, 31, 19, + -1, 32, 19, 46, 33, -1, 43, 29, 48, 30, + -1, 15, 32, 43, 34, 43, 33, -1, 16, 32, + 43, 34, 43, 33, -1, 17, 32, 43, 34, 43, + 33, -1, -1, 35, 20, -1, 43, 44, -1, 45, + 34, 43, 44, -1, -1, 45, -1, 18, -1, 18, + 36, 18, -1, 18, 18, -1, 47, 34, 18, -1, + 47, 34, 18, 36, 18, -1, 47, 34, 18, 18, + -1, 47, -1, -1, 27, 48, 28, -1, -1, 51, + -1, 43, -1, 51, 34, 43, -1, 41, 40, 19, + 42, -1, 52, 37, -1, 13, 19, 49, 25, 43, + 37, -1, -1, 54, 53, -1, 37, -1, 27, 54, + 28, -1, 39, -1, 39, 23, 51, 24, -1, 56, + -1, 57, 34, 56, -1, -1, 35, 57, -1, 52, + -1, 59, 34, 52, -1, 23, 59, 24, -1, -1, + 60, -1, 19, -1, -1, -1, -1, 62, 64, 61, + 58, 65, 55, -1, 10, 63, -1, 11, 63, -1, + 66, -1, 67, -1, 19, 49, 25, 43, -1, 69, + -1, 70, 34, 69, -1, -1, 13, 72, 70, 14, + -1, 71, 27, 73, 28, -1, 71, 68, -1, 68, + -1, 73, 68, -1, 73, -1 + }; + + /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ + static const unsigned short yyrline[] = + { + 0, 223, 223, 234, 236, 238, 240, 242, 244, 246, + 248, 252, 252, 254, 254, 256, 258, 261, 264, 266, + 279, 294, 301, 304, 311, 319, 327, 333, 339, 347, + 350, 354, 359, 365, 368, 371, 374, 387, 401, 403, + 416, 432, 434, 434, 438, 440, 444, 447, 451, 461, + 463, 469, 469, 470, 470, 472, 474, 478, 483, 488, + 491, 495, 498, 503, 504, 504, 506, 506, 508, 515, + 508, 535, 543, 560, 560, 562, 567, 567, 570, 570, + 573, 576, 580, 580, 582 + }; + #endif + + #if YYDEBUG || YYERROR_VERBOSE + /* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ + static const char *const yytname[] = + { + "$end", "error", "$undefined", "INT", "BIT", "STRING", "BITS", "LIST", + "CODE", "DAG", "CLASS", "DEF", "FIELD", "LET", "IN", "SHLTOK", "SRATOK", + "SRLTOK", "INTVAL", "ID", "VARNAME", "STRVAL", "CODEFRAGMENT", "'<'", + "'>'", "'='", "'?'", "'{'", "'}'", "'['", "']'", "'.'", "'('", "')'", + "','", "':'", "'-'", "';'", "$accept", "ClassID", "Type", "OptPrefix", + "OptValue", "Value", "OptVarName", "DagArgListNE", "DagArgList", + "RBitList", "BitList", "OptBitList", "ValueList", "ValueListNE", + "Declaration", "BodyItem", "BodyList", "Body", "SubClassRef", + "ClassListNE", "ClassList", "DeclListNE", "TemplateArgList", + "OptTemplateArgList", "OptID", "ObjectBody", "@1", "@2", "ClassInst", + "DefInst", "Object", "LETItem", "LETList", "LETCommand", "@3", + "ObjectList", "File", 0 + }; + #endif + + # ifdef YYPRINT + /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ + static const unsigned short yytoknum[] = + { + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 60, 62, 61, 63, 123, 125, 91, + 93, 46, 40, 41, 44, 58, 45, 59 + }; + # endif + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ + static const unsigned char yyr1[] = + { + 0, 38, 39, 40, 40, 40, 40, 40, 40, 40, + 40, 41, 41, 42, 42, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, + 44, 45, 45, 46, 46, 47, 47, 47, 47, 47, + 47, 48, 49, 49, 50, 50, 51, 51, 52, 53, + 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, + 58, 59, 59, 60, 61, 61, 62, 62, 64, 65, + 63, 66, 67, 68, 68, 69, 70, 70, 72, 71, + 68, 68, 73, 73, 74 + }; + + /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ + static const unsigned char yyr2[] = + { + 0, 2, 1, 1, 1, 4, 1, 4, 1, 1, + 1, 0, 1, 0, 2, 1, 1, 1, 1, 3, + 1, 4, 3, 3, 4, 4, 6, 6, 6, 0, + 2, 2, 4, 0, 1, 1, 3, 2, 3, 5, + 4, 1, 0, 3, 0, 1, 1, 3, 4, 2, + 6, 0, 2, 1, 3, 1, 4, 1, 3, 0, + 2, 1, 3, 3, 0, 1, 1, 0, 0, 0, + 6, 2, 2, 1, 1, 4, 1, 3, 0, 4, + 4, 2, 1, 2, 1 + }; + + /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ + static const unsigned char yydefact[] = + { + 0, 67, 67, 78, 73, 74, 82, 0, 84, 0, + 66, 68, 71, 72, 0, 0, 81, 83, 1, 64, + 42, 76, 0, 0, 11, 65, 59, 0, 0, 79, + 0, 80, 12, 0, 61, 0, 0, 69, 35, 41, + 0, 0, 77, 6, 4, 3, 0, 0, 8, 9, + 2, 10, 0, 63, 11, 55, 57, 60, 0, 37, + 0, 0, 43, 0, 0, 0, 15, 20, 16, 17, + 18, 44, 44, 0, 75, 0, 0, 13, 62, 0, + 0, 51, 53, 70, 36, 38, 0, 0, 0, 46, + 0, 45, 0, 33, 0, 0, 0, 0, 0, 0, + 48, 0, 58, 11, 40, 0, 0, 0, 0, 19, + 0, 22, 29, 34, 0, 0, 0, 23, 5, 7, + 14, 56, 0, 54, 0, 52, 39, 0, 0, 0, + 47, 0, 31, 0, 24, 21, 25, 42, 49, 0, + 0, 0, 30, 29, 0, 26, 27, 28, 32, 0, + 0, 50 + }; + + /* YYDEFGOTO[NTERM-NUM]. */ + static const short yydefgoto[] = + { + -1, 51, 52, 33, 100, 89, 132, 113, 114, 39, + 40, 28, 90, 91, 34, 125, 103, 83, 56, 57, + 37, 35, 25, 26, 11, 12, 19, 58, 4, 5, + 6, 21, 22, 7, 14, 8, 9 + }; + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ + #define YYPACT_NINF -54 + static const yysigned_char yypact[] = + { + 61, -7, -7, -54, -54, -54, -54, 4, 61, 24, + -54, -54, -54, -54, 23, 61, -54, -54, -54, 18, + 29, -54, -12, -5, 55, -54, 38, 65, 69, -54, + 23, -54, -54, 56, -54, -14, 71, -54, -15, 64, + 72, 11, -54, -54, -54, -54, 81, 83, -54, -54, + -54, -54, 91, -54, 55, 89, -54, 80, 12, -54, + 100, 101, -54, 88, 90, 92, -54, -54, -54, -54, + -54, 11, 11, 102, 26, 105, 56, 103, -54, 11, + 71, -54, -54, -54, -54, -11, 11, 11, 11, 26, + 97, 93, 96, 11, 65, 65, 110, 106, 107, 11, + -54, 20, -54, 6, -54, 114, -18, 62, 68, -54, + 11, -54, 50, 99, 104, 108, 109, -54, -54, -54, + 26, -54, 115, -54, 98, -54, -54, 11, 11, 11, + 26, 118, -54, 11, -54, -54, -54, 29, -54, 51, + 74, 82, -54, 50, 116, -54, -54, -54, -54, 11, + 39, -54 + }; + + /* YYPGOTO[NTERM-NUM]. */ + static const short yypgoto[] = + { + -54, -32, 66, -54, -54, -41, -3, -54, -54, -54, + 22, 7, 73, 67, -53, -54, -54, -54, 63, -54, + -54, -54, -54, -54, -54, 145, -54, -54, -54, -54, + 28, 119, -54, -54, -54, 133, -54 + }; + + /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ + #define YYTABLE_NINF -1 + static const unsigned char yytable[] = + { + 74, 78, 29, 59, 55, 1, 2, 104, 3, 94, + 53, 95, 10, 96, 1, 2, 127, 3, 32, 122, + 54, 60, 30, 31, 18, 105, 63, 64, 65, 66, + 67, 15, 68, 69, 123, 16, 17, 70, 71, 81, + 72, 24, 20, 73, 121, 106, 107, 108, 55, 82, + 124, 17, 112, 94, 110, 95, 27, 96, 120, 43, + 44, 45, 46, 47, 48, 49, 94, 32, 95, 130, + 96, 1, 2, 36, 3, 50, 151, 94, 94, 95, + 95, 96, 96, 38, 145, 131, 139, 140, 141, 94, + 50, 95, 143, 96, 41, 94, 128, 95, 61, 96, + 62, 94, 129, 95, 75, 96, 76, 146, 150, 94, + 77, 95, 79, 96, 80, 147, 115, 116, 84, 85, + 86, 93, 87, 97, 88, 109, 111, 110, 99, 117, + 118, 119, 126, 133, 137, 138, 135, 134, 142, 136, + 148, 149, 98, 102, 144, 92, 101, 13, 23, 42 + }; + + static const unsigned char yycheck[] = + { + 41, 54, 14, 18, 36, 10, 11, 18, 13, 27, + 24, 29, 19, 31, 10, 11, 34, 13, 12, 13, + 34, 36, 34, 28, 0, 36, 15, 16, 17, 18, + 19, 27, 21, 22, 28, 7, 8, 26, 27, 27, + 29, 23, 19, 32, 24, 86, 87, 88, 80, 37, + 103, 23, 93, 27, 34, 29, 27, 31, 99, 3, + 4, 5, 6, 7, 8, 9, 27, 12, 29, 110, + 31, 10, 11, 35, 13, 19, 37, 27, 27, 29, + 29, 31, 31, 18, 33, 35, 127, 128, 129, 27, + 19, 29, 133, 31, 25, 27, 34, 29, 34, 31, + 28, 27, 34, 29, 23, 31, 23, 33, 149, 27, + 19, 29, 23, 31, 34, 33, 94, 95, 18, 18, + 32, 19, 32, 18, 32, 28, 30, 34, 25, 19, + 24, 24, 18, 34, 19, 37, 28, 33, 20, 30, + 143, 25, 76, 80, 137, 72, 79, 2, 15, 30 + }; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ + static const unsigned char yystos[] = + { + 0, 10, 11, 13, 66, 67, 68, 71, 73, 74, + 19, 62, 63, 63, 72, 27, 68, 68, 0, 64, + 19, 69, 70, 73, 23, 60, 61, 27, 49, 14, + 34, 28, 12, 41, 52, 59, 35, 58, 18, 47, + 48, 25, 69, 3, 4, 5, 6, 7, 8, 9, + 19, 39, 40, 24, 34, 39, 56, 57, 65, 18, + 36, 34, 28, 15, 16, 17, 18, 19, 21, 22, + 26, 27, 29, 32, 43, 23, 23, 19, 52, 23, + 34, 27, 37, 55, 18, 18, 32, 32, 32, 43, + 50, 51, 50, 19, 27, 29, 31, 18, 40, 25, + 42, 51, 56, 54, 18, 36, 43, 43, 43, 28, + 34, 30, 43, 45, 46, 48, 48, 19, 24, 24, + 43, 24, 13, 28, 52, 53, 18, 34, 34, 34, + 43, 35, 44, 34, 33, 28, 30, 19, 37, 43, + 43, 43, 20, 43, 49, 33, 33, 33, 44, 25, + 43, 37 + }; + + #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) + # define YYSIZE_T __SIZE_TYPE__ + #endif + #if ! defined (YYSIZE_T) && defined (size_t) + # define YYSIZE_T size_t + #endif + #if ! defined (YYSIZE_T) + # if defined (__STDC__) || defined (__cplusplus) + # include /* INFRINGES ON USER NAME SPACE */ + # define YYSIZE_T size_t + # endif + #endif + #if ! defined (YYSIZE_T) + # define YYSIZE_T unsigned int + #endif + + #define yyerrok (yyerrstatus = 0) + #define yyclearin (yychar = YYEMPTY) + #define YYEMPTY (-2) + #define YYEOF 0 + + #define YYACCEPT goto yyacceptlab + #define YYABORT goto yyabortlab + #define YYERROR goto yyerrorlab + + + /* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + + #define YYFAIL goto yyerrlab + + #define YYRECOVERING() (!!yyerrstatus) + + #define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ + while (0) + + #define YYTERROR 1 + #define YYERRCODE 256 + + /* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + + #ifndef YYLLOC_DEFAULT + # define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) + #endif + + /* YYLEX -- calling `yylex' with the right arguments. */ + + #ifdef YYLEX_PARAM + # define YYLEX yylex (YYLEX_PARAM) + #else + # define YYLEX yylex () + #endif + + /* Enable debugging if requested. */ + #if YYDEBUG + + # ifndef YYFPRINTF + # include /* INFRINGES ON USER NAME SPACE */ + # define YYFPRINTF fprintf + # endif + + # define YYDPRINTF(Args) \ + do { \ + if (yydebug) \ + YYFPRINTF Args; \ + } while (0) + + # define YYDSYMPRINT(Args) \ + do { \ + if (yydebug) \ + yysymprint Args; \ + } while (0) + + # define YYDSYMPRINTF(Title, Token, Value, Location) \ + do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ + } while (0) + + /*------------------------------------------------------------------. + | yy_stack_print -- Print the state stack from its BOTTOM up to its | + | TOP (included). | + `------------------------------------------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yy_stack_print (short *bottom, short *top) + #else + static void + yy_stack_print (bottom, top) + short *bottom; + short *top; + #endif + { + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); + } + + # define YY_STACK_PRINT(Bottom, Top) \ + do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ + } while (0) + + + /*------------------------------------------------. + | Report that the YYRULE is going to be reduced. | + `------------------------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yy_reduce_print (int yyrule) + #else + static void + yy_reduce_print (yyrule) + int yyrule; + #endif + { + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); + } + + # define YY_REDUCE_PRINT(Rule) \ + do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ + } while (0) + + /* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ + int yydebug; + #else /* !YYDEBUG */ + # define YYDPRINTF(Args) + # define YYDSYMPRINT(Args) + # define YYDSYMPRINTF(Title, Token, Value, Location) + # define YY_STACK_PRINT(Bottom, Top) + # define YY_REDUCE_PRINT(Rule) + #endif /* !YYDEBUG */ + + + /* YYINITDEPTH -- initial size of the parser's stacks. */ + #ifndef YYINITDEPTH + # define YYINITDEPTH 200 + #endif + + /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + + #if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 + # undef YYMAXDEPTH + #endif + + #ifndef YYMAXDEPTH + # define YYMAXDEPTH 10000 + #endif + + + + #if YYERROR_VERBOSE + + # ifndef yystrlen + # if defined (__GLIBC__) && defined (_STRING_H) + # define yystrlen strlen + # else + /* Return the length of YYSTR. */ + static YYSIZE_T + # if defined (__STDC__) || defined (__cplusplus) + yystrlen (const char *yystr) + # else + yystrlen (yystr) + const char *yystr; + # endif + { + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; + } + # endif + # endif + + # ifndef yystpcpy + # if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) + # define yystpcpy stpcpy + # else + /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ + static char * + # if defined (__STDC__) || defined (__cplusplus) + yystpcpy (char *yydest, const char *yysrc) + # else + yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; + # endif + { + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; + } + # endif + # endif + + #endif /* !YYERROR_VERBOSE */ + + + + #if YYDEBUG + /*--------------------------------. + | Print this symbol on YYOUTPUT. | + `--------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) + #else + static void + yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; + #endif + { + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + # ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); + # endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); + } + + #endif /* ! YYDEBUG */ + /*-----------------------------------------------. + | Release the memory associated to this symbol. | + `-----------------------------------------------*/ + + #if defined (__STDC__) || defined (__cplusplus) + static void + yydestruct (int yytype, YYSTYPE *yyvaluep) + #else + static void + yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; + #endif + { + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } + } + + + /* Prevent warnings from -Wmissing-prototypes. */ + + #ifdef YYPARSE_PARAM + # if defined (__STDC__) || defined (__cplusplus) + int yyparse (void *YYPARSE_PARAM); + # else + int yyparse (); + # endif + #else /* ! YYPARSE_PARAM */ + #if defined (__STDC__) || defined (__cplusplus) + int yyparse (void); + #else + int yyparse (); + #endif + #endif /* ! YYPARSE_PARAM */ + + + + /* The lookahead symbol. */ + int yychar; + + /* The semantic value of the lookahead symbol. */ + YYSTYPE yylval; + + /* Number of syntax errors so far. */ + int yynerrs; + + + + /*----------. + | yyparse. | + `----------*/ + + #ifdef YYPARSE_PARAM + # if defined (__STDC__) || defined (__cplusplus) + int yyparse (void *YYPARSE_PARAM) + # else + int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; + # endif + #else /* ! YYPARSE_PARAM */ + #if defined (__STDC__) || defined (__cplusplus) + int + yyparse (void) + #else + int + yyparse () + + #endif + #endif + { + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + + #define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + + /*------------------------------------------------------------. + | yynewstate -- Push a new state, which is found in yystate. | + `------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + + #ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } + #else /* no yyoverflow */ + # ifndef YYSTACK_RELOCATE + goto yyoverflowlab; + # else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + + # undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } + # endif + #endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + + /*-----------. + | yybackup. | + `-----------*/ + yybackup: + + /* Do appropriate processing given the current state. */ + /* Read a lookahead token if we need one and don't already have one. */ + /* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + + /*-----------------------------------------------------------. + | yydefault -- do the default action for the current state. | + `-----------------------------------------------------------*/ + yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + + /*-----------------------------. + | yyreduce -- Do a reduction. | + `-----------------------------*/ + yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: + #line 223 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Rec = Records.getClass(*yyvsp[0].StrVal); + if (yyval.Rec == 0) { + err() << "Couldn't find class '" << *yyvsp[0].StrVal << "'!\n"; + exit(1); + } + delete yyvsp[0].StrVal; + ;} + break; + + case 3: + #line 234 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // string type + yyval.Ty = new StringRecTy(); + ;} + break; + + case 4: + #line 236 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // bit type + yyval.Ty = new BitRecTy(); + ;} + break; + + case 5: + #line 238 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // bits type + yyval.Ty = new BitsRecTy(yyvsp[-1].IntVal); + ;} + break; + + case 6: + #line 240 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // int type + yyval.Ty = new IntRecTy(); + ;} + break; + + case 7: + #line 242 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // list type + yyval.Ty = new ListRecTy(yyvsp[-1].Ty); + ;} + break; + + case 8: + #line 244 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // code type + yyval.Ty = new CodeRecTy(); + ;} + break; + + case 9: + #line 246 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // dag type + yyval.Ty = new DagRecTy(); + ;} + break; + + case 10: + #line 248 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { // Record Type + yyval.Ty = new RecordRecTy(yyvsp[0].Rec); + ;} + break; + + case 11: + #line 252 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.IntVal = 0; ;} + break; + + case 12: + #line 252 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.IntVal = 1; ;} + break; + + case 13: + #line 254 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = 0; ;} + break; + + case 14: + #line 254 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = yyvsp[0].Initializer; ;} + break; + + case 15: + #line 256 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = new IntInit(yyvsp[0].IntVal); + ;} + break; + + case 16: + #line 258 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = new StringInit(*yyvsp[0].StrVal); + delete yyvsp[0].StrVal; + ;} + break; + + case 17: + #line 261 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = new CodeInit(*yyvsp[0].StrVal); + delete yyvsp[0].StrVal; + ;} + break; + + case 18: + #line 264 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = new UnsetInit(); + ;} + break; + + case 19: + #line 266 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + BitsInit *Init = new BitsInit(yyvsp[-1].FieldList->size()); + for (unsigned i = 0, e = yyvsp[-1].FieldList->size(); i != e; ++i) { + struct Init *Bit = (*yyvsp[-1].FieldList)[i]->convertInitializerTo(new BitRecTy()); + if (Bit == 0) { + err() << "Element #" << i << " (" << *(*yyvsp[-1].FieldList)[i] + << ") is not convertable to a bit!\n"; + exit(1); + } + Init->setBit(yyvsp[-1].FieldList->size()-i-1, Bit); + } + yyval.Initializer = Init; + delete yyvsp[-1].FieldList; + ;} + break; + + case 20: + #line 279 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + if (const RecordVal *RV = (CurRec ? CurRec->getValue(*yyvsp[0].StrVal) : 0)) { + yyval.Initializer = new VarInit(*yyvsp[0].StrVal, RV->getType()); + } else if (CurRec && CurRec->isTemplateArg(CurRec->getName()+":"+*yyvsp[0].StrVal)) { + const RecordVal *RV = CurRec->getValue(CurRec->getName()+":"+*yyvsp[0].StrVal); + assert(RV && "Template arg doesn't exist??"); + yyval.Initializer = new VarInit(CurRec->getName()+":"+*yyvsp[0].StrVal, RV->getType()); + } else if (Record *D = Records.getDef(*yyvsp[0].StrVal)) { + yyval.Initializer = new DefInit(D); + } else { + err() << "Variable not defined: '" << *yyvsp[0].StrVal << "'!\n"; + exit(1); + } + + delete yyvsp[0].StrVal; + ;} + break; + + case 21: + #line 294 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = yyvsp[-3].Initializer->convertInitializerBitRange(*yyvsp[-1].BitList); + if (yyval.Initializer == 0) { + err() << "Invalid bit range for value '" << *yyvsp[-3].Initializer << "'!\n"; + exit(1); + } + delete yyvsp[-1].BitList; + ;} + break; + + case 22: + #line 301 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = new ListInit(*yyvsp[-1].FieldList); + delete yyvsp[-1].FieldList; + ;} + break; + + case 23: + #line 304 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + if (!yyvsp[-2].Initializer->getFieldType(*yyvsp[0].StrVal)) { + err() << "Cannot access field '" << *yyvsp[0].StrVal << "' of value '" << *yyvsp[-2].Initializer << "!\n"; + exit(1); + } + yyval.Initializer = new FieldInit(yyvsp[-2].Initializer, *yyvsp[0].StrVal); + delete yyvsp[0].StrVal; + ;} + break; + + case 24: + #line 311 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + Record *D = Records.getDef(*yyvsp[-2].StrVal); + if (D == 0) { + err() << "Invalid def '" << *yyvsp[-2].StrVal << "'!\n"; + exit(1); + } + yyval.Initializer = new DagInit(D, *yyvsp[-1].DagValueList); + delete yyvsp[-2].StrVal; delete yyvsp[-1].DagValueList; + ;} + break; + + case 25: + #line 319 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + std::reverse(yyvsp[-1].BitList->begin(), yyvsp[-1].BitList->end()); + yyval.Initializer = yyvsp[-3].Initializer->convertInitListSlice(*yyvsp[-1].BitList); + if (yyval.Initializer == 0) { + err() << "Invalid list slice for value '" << *yyvsp[-3].Initializer << "'!\n"; + exit(1); + } + delete yyvsp[-1].BitList; + ;} + break; + + case 26: + #line 327 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = yyvsp[-3].Initializer->getBinaryOp(Init::SHL, yyvsp[-1].Initializer); + if (yyval.Initializer == 0) { + err() << "Cannot shift values '" << *yyvsp[-3].Initializer << "' and '" << *yyvsp[-1].Initializer << "'!\n"; + exit(1); + } + ;} + break; + + case 27: + #line 333 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = yyvsp[-3].Initializer->getBinaryOp(Init::SRA, yyvsp[-1].Initializer); + if (yyval.Initializer == 0) { + err() << "Cannot shift values '" << *yyvsp[-3].Initializer << "' and '" << *yyvsp[-1].Initializer << "'!\n"; + exit(1); + } + ;} + break; + + case 28: + #line 339 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Initializer = yyvsp[-3].Initializer->getBinaryOp(Init::SRL, yyvsp[-1].Initializer); + if (yyval.Initializer == 0) { + err() << "Cannot shift values '" << *yyvsp[-3].Initializer << "' and '" << *yyvsp[-1].Initializer << "'!\n"; + exit(1); + } + ;} + break; + + case 29: + #line 347 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.StrVal = new std::string(); + ;} + break; + + case 30: + #line 350 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.StrVal = yyvsp[0].StrVal; + ;} + break; + + case 31: + #line 354 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.DagValueList = new std::vector >(); + yyval.DagValueList->push_back(std::make_pair(yyvsp[-1].Initializer, *yyvsp[0].StrVal)); + delete yyvsp[0].StrVal; + ;} + break; + + case 32: + #line 359 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyvsp[-3].DagValueList->push_back(std::make_pair(yyvsp[-1].Initializer, *yyvsp[0].StrVal)); + delete yyvsp[0].StrVal; + yyval.DagValueList = yyvsp[-3].DagValueList; + ;} + break; + + case 33: + #line 365 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.DagValueList = new std::vector >(); + ;} + break; + + case 34: + #line 368 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.DagValueList = yyvsp[0].DagValueList; ;} + break; + + case 35: + #line 371 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.BitList = new std::vector(); + yyval.BitList->push_back(yyvsp[0].IntVal); + ;} + break; + + case 36: + #line 374 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + if (yyvsp[-2].IntVal < 0 || yyvsp[0].IntVal < 0) { + err() << "Invalid range: " << yyvsp[-2].IntVal << "-" << yyvsp[0].IntVal << "!\n"; + exit(1); + } + yyval.BitList = new std::vector(); + if (yyvsp[-2].IntVal < yyvsp[0].IntVal) { + for (int i = yyvsp[-2].IntVal; i <= yyvsp[0].IntVal; ++i) + yyval.BitList->push_back(i); + } else { + for (int i = yyvsp[-2].IntVal; i >= yyvsp[0].IntVal; --i) + yyval.BitList->push_back(i); + } + ;} + break; + + case 37: + #line 387 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyvsp[0].IntVal = -yyvsp[0].IntVal; + if (yyvsp[-1].IntVal < 0 || yyvsp[0].IntVal < 0) { + err() << "Invalid range: " << yyvsp[-1].IntVal << "-" << yyvsp[0].IntVal << "!\n"; + exit(1); + } + yyval.BitList = new std::vector(); + if (yyvsp[-1].IntVal < yyvsp[0].IntVal) { + for (int i = yyvsp[-1].IntVal; i <= yyvsp[0].IntVal; ++i) + yyval.BitList->push_back(i); + } else { + for (int i = yyvsp[-1].IntVal; i >= yyvsp[0].IntVal; --i) + yyval.BitList->push_back(i); + } + ;} + break; + + case 38: + #line 401 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + (yyval.BitList=yyvsp[-2].BitList)->push_back(yyvsp[0].IntVal); + ;} + break; + + case 39: + #line 403 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + if (yyvsp[-2].IntVal < 0 || yyvsp[0].IntVal < 0) { + err() << "Invalid range: " << yyvsp[-2].IntVal << "-" << yyvsp[0].IntVal << "!\n"; + exit(1); + } + yyval.BitList = yyvsp[-4].BitList; + if (yyvsp[-2].IntVal < yyvsp[0].IntVal) { + for (int i = yyvsp[-2].IntVal; i <= yyvsp[0].IntVal; ++i) + yyval.BitList->push_back(i); + } else { + for (int i = yyvsp[-2].IntVal; i >= yyvsp[0].IntVal; --i) + yyval.BitList->push_back(i); + } + ;} + break; + + case 40: + #line 416 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyvsp[0].IntVal = -yyvsp[0].IntVal; + if (yyvsp[-1].IntVal < 0 || yyvsp[0].IntVal < 0) { + err() << "Invalid range: " << yyvsp[-1].IntVal << "-" << yyvsp[0].IntVal << "!\n"; + exit(1); + } + yyval.BitList = yyvsp[-3].BitList; + if (yyvsp[-1].IntVal < yyvsp[0].IntVal) { + for (int i = yyvsp[-1].IntVal; i <= yyvsp[0].IntVal; ++i) + yyval.BitList->push_back(i); + } else { + for (int i = yyvsp[-1].IntVal; i >= yyvsp[0].IntVal; --i) + yyval.BitList->push_back(i); + } + ;} + break; + + case 41: + #line 432 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.BitList = yyvsp[0].BitList; std::reverse(yyvsp[0].BitList->begin(), yyvsp[0].BitList->end()); ;} + break; + + case 42: + #line 434 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.BitList = 0; ;} + break; + + case 43: + #line 434 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.BitList = yyvsp[-1].BitList; ;} + break; + + case 44: + #line 438 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.FieldList = new std::vector(); + ;} + break; + + case 45: + #line 440 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.FieldList = yyvsp[0].FieldList; + ;} + break; + + case 46: + #line 444 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.FieldList = new std::vector(); + yyval.FieldList->push_back(yyvsp[0].Initializer); + ;} + break; + + case 47: + #line 447 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + (yyval.FieldList = yyvsp[-2].FieldList)->push_back(yyvsp[0].Initializer); + ;} + break; + + case 48: + #line 451 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + std::string DecName = *yyvsp[-1].StrVal; + if (ParsingTemplateArgs) + DecName = CurRec->getName() + ":" + DecName; + + addValue(RecordVal(DecName, yyvsp[-2].Ty, yyvsp[-3].IntVal)); + setValue(DecName, 0, yyvsp[0].Initializer); + yyval.StrVal = new std::string(DecName); + ;} + break; + + case 49: + #line 461 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + delete yyvsp[-1].StrVal; + ;} + break; + + case 50: + #line 463 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + setValue(*yyvsp[-4].StrVal, yyvsp[-3].BitList, yyvsp[-1].Initializer); + delete yyvsp[-4].StrVal; + delete yyvsp[-3].BitList; + ;} + break; + + case 55: + #line 472 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.SubClassRef = new SubClassRefTy(yyvsp[0].Rec, new std::vector()); + ;} + break; + + case 56: + #line 474 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.SubClassRef = new SubClassRefTy(yyvsp[-3].Rec, yyvsp[-1].FieldList); + ;} + break; + + case 57: + #line 478 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.SubClassList = new std::vector(); + yyval.SubClassList->push_back(*yyvsp[0].SubClassRef); + delete yyvsp[0].SubClassRef; + ;} + break; + + case 58: + #line 483 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + (yyval.SubClassList=yyvsp[-2].SubClassList)->push_back(*yyvsp[0].SubClassRef); + delete yyvsp[0].SubClassRef; + ;} + break; + + case 59: + #line 488 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.SubClassList = new std::vector(); + ;} + break; + + case 60: + #line 491 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.SubClassList = yyvsp[0].SubClassList; + ;} + break; + + case 61: + #line 495 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + CurRec->addTemplateArg(*yyvsp[0].StrVal); + delete yyvsp[0].StrVal; + ;} + break; + + case 62: + #line 498 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + CurRec->addTemplateArg(*yyvsp[0].StrVal); + delete yyvsp[0].StrVal; + ;} + break; + + case 63: + #line 503 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + {;} + break; + + case 66: + #line 506 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.StrVal = yyvsp[0].StrVal; ;} + break; + + case 67: + #line 506 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { yyval.StrVal = new std::string(); ;} + break; + + case 68: + #line 508 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + static unsigned AnonCounter = 0; + if (yyvsp[0].StrVal->empty()) + *yyvsp[0].StrVal = "anonymous."+utostr(AnonCounter++); + CurRec = new Record(*yyvsp[0].StrVal); + delete yyvsp[0].StrVal; + ParsingTemplateArgs = true; + ;} + break; + + case 69: + #line 515 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + ParsingTemplateArgs = false; + for (unsigned i = 0, e = yyvsp[0].SubClassList->size(); i != e; ++i) { + addSubClass((*yyvsp[0].SubClassList)[i].first, *(*yyvsp[0].SubClassList)[i].second); + // Delete the template arg values for the class + delete (*yyvsp[0].SubClassList)[i].second; + } + delete yyvsp[0].SubClassList; // Delete the class list... + + // Process any variables on the set stack... + for (unsigned i = 0, e = LetStack.size(); i != e; ++i) + for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j) + setValue(LetStack[i][j].Name, + LetStack[i][j].HasBits ? &LetStack[i][j].Bits : 0, + LetStack[i][j].Value); + ;} + break; + + case 70: + #line 530 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyval.Rec = CurRec; + CurRec = 0; + ;} + break; + + case 71: + #line 535 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + if (Records.getClass(yyvsp[0].Rec->getName())) { + err() << "Class '" << yyvsp[0].Rec->getName() << "' already defined!\n"; + exit(1); + } + Records.addClass(yyval.Rec = yyvsp[0].Rec); + ;} + break; + + case 72: + #line 543 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + yyvsp[0].Rec->resolveReferences(); + + if (!yyvsp[0].Rec->getTemplateArgs().empty()) { + err() << "Def '" << yyvsp[0].Rec->getName() + << "' is not permitted to have template arguments!\n"; + exit(1); + } + // If ObjectBody has template arguments, it's an error. + if (Records.getDef(yyvsp[0].Rec->getName())) { + err() << "Def '" << yyvsp[0].Rec->getName() << "' already defined!\n"; + exit(1); + } + Records.addDef(yyval.Rec = yyvsp[0].Rec); + ;} + break; + + case 75: + #line 562 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + LetStack.back().push_back(LetRecord(*yyvsp[-3].StrVal, yyvsp[-2].BitList, yyvsp[0].Initializer)); + delete yyvsp[-3].StrVal; delete yyvsp[-2].BitList; + ;} + break; + + case 78: + #line 570 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { LetStack.push_back(std::vector()); ;} + break; + + case 80: + #line 573 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + LetStack.pop_back(); + ;} + break; + + case 81: + #line 576 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + { + LetStack.pop_back(); + ;} + break; + + case 82: + #line 580 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + {;} + break; + + case 83: + #line 580 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + {;} + break; + + case 84: + #line 582 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + {;} + break; + + + } + + /* Line 1000 of yacc.c. */ + #line 1989 "FileParser.tab.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + + /*------------------------------------. + | yyerrlab -- here on detecting error | + `------------------------------------*/ + yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + #if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else + #endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + + /*---------------------------------------------------. + | yyerrorlab -- error raised explicitly by YYERROR. | + `---------------------------------------------------*/ + yyerrorlab: + + #ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; + #endif + + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + + /*-------------------------------------------------------------. + | yyerrlab1 -- common code for both syntax error and YYERROR. | + `-------------------------------------------------------------*/ + yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + + /*-------------------------------------. + | yyacceptlab -- YYACCEPT comes here. | + `-------------------------------------*/ + yyacceptlab: + yyresult = 0; + goto yyreturn; + + /*-----------------------------------. + | yyabortlab -- YYABORT comes here. | + `-----------------------------------*/ + yyabortlab: + yyresult = 1; + goto yyreturn; + + #ifndef yyoverflow + /*----------------------------------------------. + | yyoverflowlab -- parser overflow comes here. | + `----------------------------------------------*/ + yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ + #endif + + yyreturn: + #ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); + #endif + return yyresult; + } + + + #line 584 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + + + int yyerror(const char *ErrorMsg) { + err() << "Error parsing: " << ErrorMsg << "\n"; + exit(1); + } + Index: llvm/utils/TableGen/FileParser.h diff -c /dev/null llvm/utils/TableGen/FileParser.h:1.1 *** /dev/null Sat Aug 27 13:50:52 2005 --- llvm/utils/TableGen/FileParser.h Sat Aug 27 13:50:39 2005 *************** *** 0 **** --- 1,102 ---- + /* A Bison parser, made by GNU Bison 1.875c. */ + + /* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + /* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + + /* Tokens. */ + #ifndef YYTOKENTYPE + # define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + INT = 258, + BIT = 259, + STRING = 260, + BITS = 261, + LIST = 262, + CODE = 263, + DAG = 264, + CLASS = 265, + DEF = 266, + FIELD = 267, + LET = 268, + IN = 269, + SHLTOK = 270, + SRATOK = 271, + SRLTOK = 272, + INTVAL = 273, + ID = 274, + VARNAME = 275, + STRVAL = 276, + CODEFRAGMENT = 277 + }; + #endif + #define INT 258 + #define BIT 259 + #define STRING 260 + #define BITS 261 + #define LIST 262 + #define CODE 263 + #define DAG 264 + #define CLASS 265 + #define DEF 266 + #define FIELD 267 + #define LET 268 + #define IN 269 + #define SHLTOK 270 + #define SRATOK 271 + #define SRLTOK 272 + #define INTVAL 273 + #define ID 274 + #define VARNAME 275 + #define STRVAL 276 + #define CODEFRAGMENT 277 + + + + + #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + #line 189 "/proj/llvm/build/../llvm/utils/TableGen/FileParser.y" + typedef union YYSTYPE { + std::string* StrVal; + int IntVal; + llvm::RecTy* Ty; + llvm::Init* Initializer; + std::vector* FieldList; + std::vector* BitList; + llvm::Record* Rec; + SubClassRefTy* SubClassRef; + std::vector* SubClassList; + std::vector >* DagValueList; + } YYSTYPE; + /* Line 1275 of yacc.c. */ + #line 94 "FileParser.tab.h" + # define yystype YYSTYPE /* obsolescent; will be withdrawn */ + # define YYSTYPE_IS_DECLARED 1 + # define YYSTYPE_IS_TRIVIAL 1 + #endif + + extern YYSTYPE Filelval; + + + Index: llvm/utils/TableGen/.cvsignore diff -u llvm/utils/TableGen/.cvsignore:1.1 llvm/utils/TableGen/.cvsignore:1.2 --- llvm/utils/TableGen/.cvsignore:1.1 Tue Apr 19 10:34:36 2005 +++ llvm/utils/TableGen/.cvsignore Sat Aug 27 13:50:39 2005 @@ -1,4 +1 @@ -FileLexer.cpp -FileParser.cpp -FileParser.h FileParser.output Index: llvm/utils/TableGen/Makefile diff -u llvm/utils/TableGen/Makefile:1.15 llvm/utils/TableGen/Makefile:1.16 --- llvm/utils/TableGen/Makefile:1.15 Sat Oct 30 04:19:36 2004 +++ llvm/utils/TableGen/Makefile Sat Aug 27 13:50:39 2005 @@ -17,8 +17,4 @@ # (which depend on the source file) won't get generated until bison is done # generating the C source and header files for the parser. # -FileLexer.cpp: FileParser.h - -clean:: - $(Verb) $(RM) -f FileParser.cpp FileParser.h FileLexer.cpp CommandLine.cpp - $(Verb) $(RM) -f FileParser.output +$(ObjDir)/FileLexer.o : $(PROJ_SRC_DIR)/FileParser.h From reid at x10sys.com Sat Aug 27 13:50:52 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 13:50:52 -0500 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/Lexer.cpp llvmAsmParser.cpp llvmAsmParser.h .cvsignore Makefile Message-ID: <200508271850.NAA19906@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: Lexer.cpp updated: 1.9 -> 1.10 llvmAsmParser.cpp updated: 1.16 -> 1.17 llvmAsmParser.h updated: 1.8 -> 1.9 .cvsignore updated: 1.2 -> 1.3 Makefile updated: 1.7 -> 1.8 --- Log message: Implement PR614: http://llvm.cs.uiuc.edu/PR614 : These changes modify the makefiles so that the output of flex and bison are placed in the SRC directory, not the OBJ directory. It is intended that they be checked in as any other LLVM source so that platforms without convenient access to flex/bison can be compiled. From now on, if you change a .y or .l file you *must* also commit the generated .cpp and .h files. --- Diffs of the changes: (+7414 -5) .cvsignore | 3 Lexer.cpp | 2551 ++++++++++++++++++++++++++++++ Makefile | 3 llvmAsmParser.cpp | 4590 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ llvmAsmParser.h | 271 +++ 5 files changed, 7413 insertions(+), 5 deletions(-) Index: llvm/lib/AsmParser/Lexer.cpp diff -u /dev/null llvm/lib/AsmParser/Lexer.cpp:1.10 --- /dev/null Sat Aug 27 13:50:48 2005 +++ llvm/lib/AsmParser/Lexer.cpp Sat Aug 27 13:50:38 2005 @@ -0,0 +1,2552 @@ +#define yy_create_buffer llvmAsm_create_buffer +#define yy_delete_buffer llvmAsm_delete_buffer +#define yy_scan_buffer llvmAsm_scan_buffer +#define yy_scan_string llvmAsm_scan_string +#define yy_scan_bytes llvmAsm_scan_bytes +#define yy_flex_debug llvmAsm_flex_debug +#define yy_init_buffer llvmAsm_init_buffer +#define yy_flush_buffer llvmAsm_flush_buffer +#define yy_load_buffer_state llvmAsm_load_buffer_state +#define yy_switch_to_buffer llvmAsm_switch_to_buffer +#define yyin llvmAsmin +#define yyleng llvmAsmleng +#define yylex llvmAsmlex +#define yyout llvmAsmout +#define yyrestart llvmAsmrestart +#define yytext llvmAsmtext +#define yylineno llvmAsmlineno + +#line 20 "Lexer.cpp" +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header: /var/cvs/llvm/llvm/lib/AsmParser/Lexer.cpp,v 1.10 2005/08/27 18:50:38 reid Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE (16384*64) + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static inline void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern int yylineno; +int yylineno = 1; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 99 +#define YY_END_OF_BUFFER 100 +static yyconst short int yy_acclist[177] = + { 0, + 100, 98, 99, 97, 98, 99, 97, 99, 98, 99, + 98, 99, 98, 99, 98, 99, 98, 99, 98, 99, + 90, 98, 99, 90, 98, 99, 1, 98, 99, 98, + 99, 98, 99, 98, 99, 98, 99, 98, 99, 98, + 99, 98, 99, 98, 99, 98, 99, 98, 99, 98, + 99, 98, 99, 98, 99, 98, 99, 98, 99, 98, + 99, 98, 99, 98, 99, 98, 99, 98, 99, 98, + 99, 89, 87, 86, 86, 93, 91, 95, 90, 1, + 75, 32, 57, 20, 89, 86, 86, 94, 95, 17, + 95, 96, 51, 56, 30, 33, 54, 3, 42, 53, + + 22, 65, 55, 74, 69, 70, 52, 58, 88, 95, + 95, 37, 66, 67, 82, 83, 44, 19, 92, 23, + 4, 49, 43, 36, 11, 95, 2, 5, 46, 48, + 38, 60, 64, 62, 63, 61, 59, 40, 84, 39, + 45, 18, 72, 81, 35, 47, 27, 21, 34, 7, + 77, 29, 80, 50, 68, 76, 24, 25, 78, 41, + 73, 71, 6, 26, 8, 14, 9, 10, 31, 12, + 28, 79, 85, 13, 15, 16 + } ; + +static yyconst short int yy_accept[398] = + { 0, + 1, 1, 1, 2, 4, 7, 9, 11, 13, 15, + 17, 19, 21, 24, 27, 30, 32, 34, 36, 38, + 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, + 60, 62, 64, 66, 68, 70, 72, 72, 73, 73, + 74, 75, 76, 77, 77, 78, 78, 79, 80, 80, + 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, + + 85, 85, 85, 85, 85, 85, 85, 86, 87, 89, + 90, 91, 92, 92, 93, 94, 94, 95, 95, 95, + 96, 96, 96, 96, 97, 97, 97, 97, 97, 98, + 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 100, 100, 100, 100, 100, 100, 100, 100, 101, + 102, 102, 102, 103, 103, 104, 105, 105, 105, 105, + 105, 106, 106, 107, 107, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 109, 109, 110, 111, + 111, 111, 111, 112, 112, 112, 112, 113, 114, 115, + + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 117, 118, 118, 119, 119, 119, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 121, 121, 121, 122, + 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 125, 125, 126, 126, 127, 127, 127, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, + 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, + 131, 131, 132, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 140, 140, 140, 141, 142, 143, 143, 143, + + 143, 143, 143, 144, 144, 144, 144, 145, 145, 146, + 146, 146, 146, 147, 148, 149, 149, 150, 150, 151, + 151, 151, 152, 152, 153, 154, 155, 155, 156, 157, + 158, 159, 159, 159, 160, 161, 162, 163, 163, 163, + 163, 163, 164, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 166, 167, 167, 167, 168, + 169, 169, 169, 169, 170, 170, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 172, 172, 173, 173, 173, 173, 173, 173, 174, + 174, 175, 175, 176, 176, 177, 177 + + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 1, 5, 6, 1, 1, 1, + 1, 1, 7, 1, 8, 9, 1, 10, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 12, 13, 1, + 1, 1, 1, 1, 14, 14, 14, 14, 15, 14, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 1, 1, 1, 1, 16, 1, 17, 18, 19, 20, + + 21, 22, 23, 24, 25, 5, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[42] = + { 0, + 1, 1, 2, 1, 3, 1, 1, 3, 3, 3, + 3, 4, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3 + } ; + +static yyconst short int yy_base[402] = + { 0, + 0, 0, 834, 835, 835, 835, 829, 820, 34, 36, + 38, 42, 46, 50, 0, 51, 54, 53, 56, 61, + 76, 77, 79, 80, 82, 83, 84, 90, 31, 111, + 94, 140, 113, 55, 110, 116, 827, 835, 818, 835, + 0, 128, 131, 144, 150, 124, 160, 167, 172, 0, + 136, 89, 168, 100, 41, 145, 114, 817, 139, 183, + 184, 185, 173, 186, 187, 189, 191, 133, 188, 193, + 200, 202, 194, 203, 205, 215, 208, 211, 207, 214, + 57, 816, 224, 225, 227, 231, 233, 234, 241, 235, + 236, 239, 247, 815, 251, 244, 245, 248, 254, 266, + + 255, 276, 269, 278, 270, 277, 814, 0, 287, 291, + 813, 303, 309, 0, 812, 295, 811, 288, 310, 810, + 296, 299, 315, 809, 316, 317, 318, 319, 808, 240, + 322, 320, 321, 325, 326, 327, 328, 331, 336, 341, + 343, 344, 345, 346, 348, 350, 353, 351, 807, 806, + 355, 357, 805, 359, 804, 803, 380, 361, 363, 391, + 802, 373, 801, 374, 800, 369, 365, 393, 396, 398, + 401, 397, 399, 409, 403, 411, 405, 368, 413, 416, + 417, 418, 367, 419, 423, 799, 425, 835, 431, 437, + 443, 446, 449, 450, 439, 451, 798, 797, 796, 452, + + 453, 455, 454, 458, 461, 462, 463, 465, 464, 469, + 795, 470, 472, 478, 475, 479, 480, 482, 483, 794, + 793, 486, 792, 488, 490, 0, 494, 499, 489, 501, + 502, 505, 497, 507, 508, 791, 517, 518, 790, 789, + 519, 788, 521, 527, 522, 529, 523, 530, 531, 536, + 538, 787, 539, 786, 541, 544, 544, 545, 785, 548, + 556, 546, 557, 550, 558, 560, 564, 784, 566, 783, + 568, 569, 570, 571, 576, 782, 572, 578, 590, 582, + 592, 781, 579, 780, 779, 778, 777, 776, 775, 774, + 773, 593, 580, 595, 772, 771, 770, 594, 599, 600, + + 596, 598, 769, 607, 610, 611, 768, 612, 767, 614, + 613, 615, 766, 765, 764, 616, 763, 618, 762, 620, + 627, 761, 626, 760, 759, 758, 624, 757, 756, 755, + 754, 635, 638, 753, 752, 749, 739, 636, 639, 640, + 641, 738, 737, 643, 644, 642, 646, 647, 649, 655, + 662, 654, 665, 666, 736, 735, 668, 669, 734, 733, + 670, 672, 673, 732, 676, 731, 674, 675, 678, 681, + 684, 686, 682, 690, 693, 695, 696, 700, 698, 703, + 730, 708, 728, 706, 704, 709, 710, 711, 726, 712, + 722, 714, 574, 720, 491, 835, 753, 755, 280, 759, + + 161 + } ; + +static yyconst short int yy_def[402] = + { 0, + 396, 1, 396, 396, 396, 396, 397, 398, 399, 396, + 398, 398, 398, 398, 400, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 397, 396, 398, 396, + 401, 401, 396, 396, 398, 398, 398, 398, 398, 400, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + + 398, 398, 398, 398, 398, 398, 396, 401, 401, 396, + 398, 398, 398, 49, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 49, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 396, 396, 396, + 396, 398, 398, 398, 398, 398, 398, 398, 398, 398, + + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 157, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 396, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 0, 396, 396, 396, 396, + + 396 + } ; + +static yyconst short int yy_nxt[877] = + { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 4, 15, 8, 8, 8, 16, 17, 18, 19, + 20, 21, 22, 8, 23, 8, 24, 25, 26, 27, + 28, 8, 29, 30, 31, 32, 33, 34, 35, 8, + 36, 42, 40, 43, 43, 44, 44, 45, 45, 40, + 46, 85, 40, 40, 47, 48, 48, 40, 47, 48, + 48, 40, 40, 119, 40, 40, 40, 40, 40, 59, + 51, 60, 40, 152, 55, 104, 62, 52, 56, 53, + 63, 54, 61, 57, 49, 64, 58, 40, 40, 65, + 40, 40, 67, 40, 40, 40, 74, 70, 77, 66, + + 40, 40, 68, 71, 75, 40, 72, 73, 69, 76, + 93, 40, 79, 83, 81, 116, 82, 78, 80, 84, + 86, 40, 40, 94, 40, 40, 95, 40, 87, 102, + 118, 88, 111, 96, 89, 40, 106, 109, 109, 105, + 43, 43, 103, 121, 40, 90, 91, 40, 92, 86, + 40, 40, 110, 44, 44, 115, 40, 97, 47, 45, + 45, 40, 136, 108, 98, 122, 99, 120, 100, 112, + 112, 40, 123, 101, 113, 47, 48, 48, 40, 40, + 113, 114, 114, 40, 40, 114, 114, 117, 114, 114, + 114, 114, 114, 114, 40, 40, 40, 40, 40, 40, + + 40, 124, 40, 127, 40, 40, 131, 132, 137, 129, + 125, 40, 126, 40, 40, 128, 40, 134, 40, 40, + 143, 130, 40, 133, 135, 40, 40, 138, 141, 139, + 142, 146, 140, 144, 148, 40, 40, 149, 40, 145, + 151, 150, 40, 147, 40, 40, 40, 40, 153, 154, + 40, 40, 40, 165, 155, 40, 40, 204, 40, 40, + 159, 156, 40, 166, 164, 40, 40, 161, 160, 157, + 162, 167, 158, 163, 171, 169, 173, 40, 179, 168, + 40, 40, 41, 174, 172, 175, 170, 40, 40, 40, + 176, 180, 181, 183, 185, 184, 109, 109, 177, 40, + + 189, 189, 186, 178, 182, 190, 40, 40, 195, 187, + 40, 190, 112, 112, 40, 191, 192, 113, 193, 193, + 40, 40, 197, 113, 194, 198, 40, 40, 40, 40, + 40, 40, 40, 40, 196, 200, 40, 40, 40, 40, + 206, 207, 40, 210, 202, 203, 205, 40, 211, 199, + 201, 212, 40, 213, 40, 40, 40, 40, 208, 40, + 209, 40, 40, 215, 40, 217, 40, 214, 40, 220, + 40, 218, 40, 216, 40, 221, 40, 222, 40, 40, + 40, 223, 219, 228, 40, 40, 252, 225, 224, 226, + 226, 236, 247, 226, 226, 227, 226, 226, 226, 226, + + 226, 226, 40, 235, 40, 233, 234, 40, 40, 40, + 40, 229, 40, 230, 40, 237, 40, 231, 239, 232, + 40, 240, 40, 244, 40, 246, 238, 40, 40, 40, + 40, 241, 249, 242, 40, 253, 40, 243, 251, 245, + 189, 189, 248, 191, 191, 190, 256, 256, 254, 250, + 40, 190, 256, 256, 255, 193, 193, 40, 193, 193, + 40, 40, 40, 40, 40, 40, 40, 258, 257, 40, + 260, 262, 40, 40, 40, 40, 40, 265, 263, 259, + 40, 40, 269, 40, 264, 268, 40, 261, 272, 40, + 40, 40, 266, 40, 40, 267, 271, 40, 273, 40, + + 40, 40, 40, 270, 275, 40, 276, 274, 40, 278, + 40, 277, 40, 40, 282, 279, 40, 283, 40, 40, + 284, 285, 287, 280, 281, 289, 292, 291, 40, 40, + 40, 290, 40, 40, 40, 286, 288, 293, 40, 295, + 40, 40, 40, 296, 294, 299, 298, 40, 297, 40, + 40, 300, 40, 256, 256, 40, 40, 40, 303, 40, + 307, 40, 301, 302, 308, 306, 309, 40, 40, 40, + 313, 40, 310, 305, 312, 40, 304, 40, 311, 40, + 40, 40, 40, 40, 317, 40, 314, 40, 318, 40, + 40, 40, 316, 40, 315, 319, 322, 320, 324, 321, + + 323, 40, 326, 40, 40, 40, 40, 40, 325, 40, + 40, 40, 327, 328, 330, 331, 329, 333, 40, 334, + 336, 40, 40, 40, 40, 40, 40, 40, 332, 40, + 335, 40, 344, 342, 338, 40, 340, 40, 40, 339, + 346, 337, 341, 347, 348, 345, 40, 40, 343, 40, + 40, 40, 40, 40, 40, 40, 349, 40, 40, 350, + 40, 351, 352, 353, 357, 40, 40, 360, 354, 356, + 358, 362, 359, 40, 364, 355, 40, 40, 363, 40, + 40, 40, 361, 40, 40, 40, 40, 40, 366, 40, + 371, 374, 40, 40, 369, 40, 367, 40, 370, 365, + + 372, 40, 378, 368, 40, 376, 40, 40, 373, 40, + 377, 40, 379, 381, 40, 40, 383, 40, 375, 40, + 40, 40, 40, 40, 380, 40, 384, 386, 387, 391, + 388, 40, 385, 40, 394, 382, 389, 40, 390, 40, + 393, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 392, 395, 37, 37, 37, 37, 39, 39, 50, + 40, 50, 50, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 188, 40, 40, 40, 40, + 107, 40, 38, 396, 3, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396 + } ; + +static yyconst short int yy_chk[877] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 9, 29, 9, 9, 10, 10, 11, 11, 11, + 12, 29, 55, 12, 13, 13, 13, 13, 14, 14, + 14, 14, 16, 55, 18, 17, 34, 19, 81, 18, + 16, 18, 20, 81, 17, 34, 19, 16, 17, 16, + 19, 16, 18, 17, 13, 19, 17, 21, 22, 20, + 23, 24, 21, 25, 26, 27, 24, 22, 25, 20, + + 52, 28, 21, 22, 24, 31, 23, 23, 21, 24, + 31, 54, 26, 28, 27, 52, 27, 25, 26, 28, + 30, 35, 30, 31, 33, 57, 31, 36, 30, 33, + 54, 30, 46, 31, 30, 46, 36, 42, 42, 35, + 43, 43, 33, 57, 68, 30, 30, 51, 30, 32, + 59, 32, 44, 44, 44, 51, 56, 32, 45, 45, + 45, 45, 68, 401, 32, 59, 32, 56, 32, 47, + 47, 47, 59, 32, 47, 48, 48, 48, 48, 53, + 47, 49, 49, 49, 63, 49, 49, 53, 49, 49, + 49, 49, 49, 49, 60, 61, 62, 64, 65, 69, + + 66, 60, 67, 62, 70, 73, 65, 66, 69, 63, + 61, 71, 61, 72, 74, 62, 75, 67, 79, 77, + 74, 64, 78, 66, 67, 80, 76, 70, 73, 71, + 73, 76, 72, 75, 77, 83, 84, 78, 85, 75, + 80, 79, 86, 76, 87, 88, 90, 91, 83, 84, + 92, 130, 89, 91, 85, 96, 97, 130, 93, 98, + 88, 85, 95, 92, 90, 99, 101, 89, 88, 86, + 89, 93, 87, 89, 96, 95, 98, 100, 101, 93, + 103, 105, 399, 99, 97, 100, 95, 102, 106, 104, + 100, 102, 102, 103, 104, 103, 109, 109, 100, 118, + + 110, 110, 105, 100, 102, 110, 116, 121, 118, 106, + 122, 110, 112, 112, 112, 113, 113, 112, 113, 113, + 113, 119, 121, 112, 116, 122, 123, 125, 126, 127, + 128, 132, 133, 131, 119, 125, 134, 135, 136, 137, + 132, 133, 138, 136, 127, 128, 131, 139, 137, 123, + 126, 138, 140, 139, 141, 142, 143, 144, 134, 145, + 135, 146, 148, 141, 147, 143, 151, 140, 152, 146, + 154, 144, 158, 142, 159, 147, 167, 148, 183, 178, + 166, 151, 145, 159, 162, 164, 183, 154, 152, 157, + 157, 167, 178, 157, 157, 158, 157, 157, 157, 157, + + 157, 157, 160, 166, 168, 162, 164, 169, 172, 170, + 173, 160, 171, 160, 175, 168, 177, 160, 170, 160, + 174, 171, 176, 175, 179, 177, 169, 180, 181, 182, + 184, 172, 180, 173, 185, 184, 187, 174, 182, 176, + 189, 189, 179, 190, 190, 189, 190, 190, 185, 181, + 195, 189, 191, 191, 187, 192, 192, 192, 193, 193, + 193, 194, 196, 200, 201, 203, 202, 195, 194, 204, + 200, 202, 205, 206, 207, 209, 208, 205, 203, 196, + 210, 212, 209, 213, 204, 208, 215, 201, 213, 214, + 216, 217, 206, 218, 219, 207, 212, 222, 214, 224, + + 229, 225, 395, 210, 216, 227, 217, 215, 233, 219, + 228, 218, 230, 231, 227, 222, 232, 228, 234, 235, + 229, 230, 231, 224, 225, 232, 235, 234, 237, 238, + 241, 233, 243, 245, 247, 230, 231, 237, 244, 241, + 246, 248, 249, 243, 238, 246, 245, 250, 244, 251, + 253, 247, 255, 256, 256, 257, 258, 262, 250, 260, + 257, 264, 248, 249, 258, 255, 260, 261, 263, 265, + 264, 266, 261, 253, 263, 267, 251, 269, 262, 271, + 272, 273, 274, 277, 269, 393, 265, 275, 271, 278, + 283, 293, 267, 280, 266, 272, 275, 273, 278, 274, + + 277, 279, 280, 281, 292, 298, 294, 301, 279, 302, + 299, 300, 281, 283, 293, 294, 292, 299, 304, 300, + 302, 305, 306, 308, 311, 310, 312, 316, 298, 318, + 301, 320, 316, 311, 305, 327, 308, 323, 321, 306, + 320, 304, 310, 321, 323, 318, 332, 338, 312, 333, + 339, 340, 341, 346, 344, 345, 327, 347, 348, 332, + 349, 333, 338, 339, 345, 352, 350, 348, 340, 344, + 346, 350, 347, 351, 352, 341, 353, 354, 351, 357, + 358, 361, 349, 362, 363, 367, 368, 365, 354, 369, + 363, 368, 370, 373, 361, 371, 357, 372, 362, 353, + + 365, 374, 372, 358, 375, 370, 376, 377, 367, 379, + 371, 378, 373, 375, 380, 385, 377, 384, 369, 382, + 386, 387, 388, 390, 374, 392, 378, 380, 382, 387, + 384, 394, 379, 391, 392, 376, 385, 389, 386, 383, + 390, 381, 366, 364, 360, 359, 356, 355, 343, 342, + 337, 388, 394, 397, 397, 397, 397, 398, 398, 400, + 336, 400, 400, 335, 334, 331, 330, 329, 328, 326, + 325, 324, 322, 319, 317, 315, 314, 313, 309, 307, + 303, 297, 296, 295, 291, 290, 289, 288, 287, 286, + 285, 284, 282, 276, 270, 268, 259, 254, 252, 242, + + 240, 239, 236, 223, 221, 220, 211, 199, 198, 197, + 186, 165, 163, 161, 156, 155, 153, 150, 149, 129, + 124, 120, 117, 115, 111, 107, 94, 82, 58, 39, + 37, 8, 7, 3, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 396, 396, 396 + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +++yy_lp; \ +goto find_rule; \ +} +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +#define INITIAL 0 +/*===-- Lexer.l - Scanner for llvm assembly files --------------*- C++ -*--===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the flex scanner for LLVM assembly languages files. +// +//===----------------------------------------------------------------------===*/ +#define YY_NEVER_INTERACTIVE 1 +#line 28 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +#include "ParserInternals.h" +#include "llvm/Module.h" +#include +#include "llvmAsmParser.h" +#include +#include + +void set_scan_file(FILE * F){ + yy_switch_to_buffer(yy_create_buffer( F, YY_BUF_SIZE ) ); +} +void set_scan_string (const char * str) { + yy_scan_string (str); +} + +#define RET_TOK(type, Enum, sym) \ + llvmAsmlval.type = Instruction::Enum; return sym + +namespace llvm { + +// TODO: All of the static identifiers are figured out by the lexer, +// these should be hashed to reduce the lexer size + + +// atoull - Convert an ascii string of decimal digits into the unsigned long +// long representation... this does not have to do input error checking, +// because we know that the input will be matched by a suitable regex... +// +static uint64_t atoull(const char *Buffer) { + uint64_t Result = 0; + for (; *Buffer; Buffer++) { + uint64_t OldRes = Result; + Result *= 10; + Result += *Buffer-'0'; + if (Result < OldRes) // Uh, oh, overflow detected!!! + ThrowException("constant bigger than 64 bits detected!"); + } + return Result; +} + +static uint64_t HexIntToVal(const char *Buffer) { + uint64_t Result = 0; + for (; *Buffer; ++Buffer) { + uint64_t OldRes = Result; + Result *= 16; + char C = *Buffer; + if (C >= '0' && C <= '9') + Result += C-'0'; + else if (C >= 'A' && C <= 'F') + Result += C-'A'+10; + else if (C >= 'a' && C <= 'f') + Result += C-'a'+10; + + if (Result < OldRes) // Uh, oh, overflow detected!!! + ThrowException("constant bigger than 64 bits detected!"); + } + return Result; +} + + +// HexToFP - Convert the ascii string in hexidecimal format to the floating +// point representation of it. +// +static double HexToFP(const char *Buffer) { + // Behave nicely in the face of C TBAA rules... see: + // http://www.nullstone.com/htmls/category/aliastyp.htm + union { + uint64_t UI; + double FP; + } UIntToFP; + UIntToFP.UI = HexIntToVal(Buffer); + + assert(sizeof(double) == sizeof(uint64_t) && + "Data sizes incompatible on this target!"); + return UIntToFP.FP; // Cast Hex constant to double +} + + +// UnEscapeLexed - Run through the specified buffer and change \xx codes to the +// appropriate character. If AllowNull is set to false, a \00 value will cause +// an exception to be thrown. +// +// If AllowNull is set to true, the return value of the function points to the +// last character of the string in memory. +// +char *UnEscapeLexed(char *Buffer, bool AllowNull) { + char *BOut = Buffer; + for (char *BIn = Buffer; *BIn; ) { + if (BIn[0] == '\\' && isxdigit(BIn[1]) && isxdigit(BIn[2])) { + char Tmp = BIn[3]; BIn[3] = 0; // Terminate string + *BOut = (char)strtol(BIn+1, 0, 16); // Convert to number + if (!AllowNull && !*BOut) + ThrowException("String literal cannot accept \\00 escape!"); + + BIn[3] = Tmp; // Restore character + BIn += 3; // Skip over handled chars + ++BOut; + } else { + *BOut++ = *BIn++; + } + } + + return BOut; +} + +} // End llvm namespace + +using namespace llvm; + +#define YY_NEVER_INTERACTIVE 1 +/* Comments start with a ; and go till end of line */ +/* Variable(Value) identifiers start with a % sign */ +/* Label identifiers end with a colon */ +/* Quoted names can contain any character except " and \ */ +/* [PN]Integer: match positive and negative literal integer values that + * are preceeded by a '%' character. These represent unnamed variable slots. + */ +/* E[PN]Integer: match positive and negative literal integer values */ +/* FPConstant - A Floating point constant. + */ +/* HexFPConstant - Floating point constant represented in IEEE format as a + * hexadecimal number for when exponential notation is not precise enough. + */ +/* HexIntConstant - Hexadecimal constant generated by the CFE to avoid forcing + * it to deal with 64 bit numbers. + */ +#line 879 "Lexer.cpp" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static inline void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp = NULL, *yy_bp = NULL; + register int yy_act; + +#line 179 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" + + +#line 1033 "Lexer.cpp" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 397 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_current_state != 396 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + { + yy_full_match = yy_cp; + break; + } + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER ) + { + int yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + ++yylineno; + } + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 181 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ /* Ignore comments for now */ } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 183 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return BEGINTOK; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 184 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return ENDTOK; } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 185 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return TRUETOK; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 186 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return FALSETOK; } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 187 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return DECLARE; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 188 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return GLOBAL; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 189 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return CONSTANT; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 190 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return INTERNAL; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 191 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return LINKONCE; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 192 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return WEAK; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 193 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return APPENDING; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 194 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return EXTERNAL; } /* Deprecated, turn into external */ + YY_BREAK +case 14: +YY_RULE_SETUP +#line 195 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return EXTERNAL; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 196 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return IMPLEMENTATION; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 197 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return ZEROINITIALIZER; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 198 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return DOTDOTDOT; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 199 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return UNDEF; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 200 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return NULL_TOK; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 201 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return TO; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 202 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(TermOpVal, Unwind, UNWIND); } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 203 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return NOT; } /* Deprecated, turned into XOR */ + YY_BREAK +case 23: +YY_RULE_SETUP +#line 204 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return TAIL; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 205 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return TARGET; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 206 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return TRIPLE; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 207 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return DEPLIBS; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 208 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return ENDIAN; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 209 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return POINTERSIZE; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 210 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return LITTLE; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 211 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return BIG; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 212 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return VOLATILE; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 214 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return CC_TOK; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 215 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return CCC_TOK; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 216 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return FASTCC_TOK; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 217 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return COLDCC_TOK; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 219 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::VoidTy ; return VOID; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 220 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::BoolTy ; return BOOL; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 221 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::SByteTy ; return SBYTE; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 222 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::UByteTy ; return UBYTE; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 223 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::ShortTy ; return SHORT; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 224 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::UShortTy; return USHORT; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 225 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::IntTy ; return INT; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 226 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::UIntTy ; return UINT; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 227 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::LongTy ; return LONG; } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 228 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::ULongTy ; return ULONG; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 229 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::FloatTy ; return FLOAT; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 230 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::DoubleTy; return DOUBLE; } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 231 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.PrimType = Type::LabelTy ; return LABEL; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 232 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return TYPE; } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 233 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return OPAQUE; } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 235 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, Add, ADD); } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 236 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, Sub, SUB); } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 237 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, Mul, MUL); } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 238 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, Div, DIV); } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 239 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, Rem, REM); } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 240 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, And, AND); } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 241 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, Or , OR ); } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 242 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, Xor, XOR); } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 243 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, SetNE, SETNE); } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 244 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, SetEQ, SETEQ); } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 245 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, SetLT, SETLT); } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 246 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, SetGT, SETGT); } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 247 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, SetLE, SETLE); } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 248 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(BinaryOpVal, SetGE, SETGE); } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 250 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(OtherOpVal, PHI, PHI_TOK); } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 251 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(OtherOpVal, Call, CALL); } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 252 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(OtherOpVal, Cast, CAST); } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 253 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(OtherOpVal, Select, SELECT); } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 254 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(OtherOpVal, Shl, SHL); } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 255 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(OtherOpVal, Shr, SHR); } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 256 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return VANEXT_old; } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 257 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return VAARG_old; } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 258 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(OtherOpVal, VAArg , VAARG); } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 259 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(TermOpVal, Ret, RET); } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 260 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(TermOpVal, Br, BR); } + YY_BREAK +case 76: +YY_RULE_SETUP +#line 261 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(TermOpVal, Switch, SWITCH); } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 262 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(TermOpVal, Invoke, INVOKE); } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 263 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(TermOpVal, Unwind, UNWIND); } + YY_BREAK +case 79: +YY_RULE_SETUP +#line 264 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(TermOpVal, Unreachable, UNREACHABLE); } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 266 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(MemOpVal, Malloc, MALLOC); } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 267 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(MemOpVal, Alloca, ALLOCA); } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 268 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(MemOpVal, Free, FREE); } + YY_BREAK +case 83: +YY_RULE_SETUP +#line 269 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(MemOpVal, Load, LOAD); } + YY_BREAK +case 84: +YY_RULE_SETUP +#line 270 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(MemOpVal, Store, STORE); } + YY_BREAK +case 85: +YY_RULE_SETUP +#line 271 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ RET_TOK(MemOpVal, GetElementPtr, GETELEMENTPTR); } + YY_BREAK +case 86: +YY_RULE_SETUP +#line 274 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + UnEscapeLexed(yytext+1); + llvmAsmlval.StrVal = strdup(yytext+1); // Skip % + return VAR_ID; + } + YY_BREAK +case 87: +YY_RULE_SETUP +#line 279 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + yytext[strlen(yytext)-1] = 0; // nuke colon + UnEscapeLexed(yytext); + llvmAsmlval.StrVal = strdup(yytext); + return LABELSTR; + } + YY_BREAK +case 88: +YY_RULE_SETUP +#line 285 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + yytext[strlen(yytext)-2] = 0; // nuke colon, end quote + UnEscapeLexed(yytext+1); + llvmAsmlval.StrVal = strdup(yytext+1); + return LABELSTR; + } + YY_BREAK +case 89: +YY_RULE_SETUP +#line 292 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ // Note that we cannot unescape a string constant here! The + // string constant might contain a \00 which would not be + // understood by the string stuff. It is valid to make a + // [sbyte] c"Hello World\00" constant, for example. + // + yytext[strlen(yytext)-1] = 0; // nuke end quote + llvmAsmlval.StrVal = strdup(yytext+1); // Nuke start quote + return STRINGCONSTANT; + } + YY_BREAK +case 90: +YY_RULE_SETUP +#line 303 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.UInt64Val = atoull(yytext); return EUINT64VAL; } + YY_BREAK +case 91: +YY_RULE_SETUP +#line 304 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + uint64_t Val = atoull(yytext+1); + // +1: we have bigger negative range + if (Val > (uint64_t)INT64_MAX+1) + ThrowException("Constant too large for signed 64 bits!"); + llvmAsmlval.SInt64Val = -Val; + return ESINT64VAL; + } + YY_BREAK +case 92: +YY_RULE_SETUP +#line 312 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + llvmAsmlval.UInt64Val = HexIntToVal(yytext+3); + return yytext[0] == 's' ? ESINT64VAL : EUINT64VAL; + } + YY_BREAK +case 93: +YY_RULE_SETUP +#line 317 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + uint64_t Val = atoull(yytext+1); + if ((unsigned)Val != Val) + ThrowException("Invalid value number (too large)!"); + llvmAsmlval.UIntVal = unsigned(Val); + return UINTVAL; + } + YY_BREAK +case 94: +YY_RULE_SETUP +#line 324 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + uint64_t Val = atoull(yytext+2); + // +1: we have bigger negative range + if (Val > (uint64_t)INT32_MAX+1) + ThrowException("Constant too large for signed 32 bits!"); + llvmAsmlval.SIntVal = (int)-Val; + return SINTVAL; + } + YY_BREAK +case 95: +YY_RULE_SETUP +#line 333 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.FPVal = atof(yytext); return FPVAL; } + YY_BREAK +case 96: +YY_RULE_SETUP +#line 334 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ llvmAsmlval.FPVal = HexToFP(yytext); return FPVAL; } + YY_BREAK +case YY_STATE_EOF(INITIAL): +#line 336 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ + /* Make sure to free the internal buffers for flex when we are + * done reading our input! + */ + yy_delete_buffer(YY_CURRENT_BUFFER); + return EOF; + } + YY_BREAK +case 97: +YY_RULE_SETUP +#line 344 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ /* Ignore whitespace */ } + YY_BREAK +case 98: +YY_RULE_SETUP +#line 345 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +{ return yytext[0]; } + YY_BREAK +case 99: +YY_RULE_SETUP +#line 347 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 1674 "Lexer.cpp" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 397 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 397 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 396); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static inline void yyunput( int c, register char *yy_bp ) +#else +static inline void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ) + --yylineno; + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + if ( c == '\n' ) + ++yylineno; + + return c; + } +#endif /* YY_NO_INPUT */ + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static inline void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static inline void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 347 "/proj/llvm/build/../llvm/lib/AsmParser/Lexer.l" + Index: llvm/lib/AsmParser/llvmAsmParser.cpp diff -u /dev/null llvm/lib/AsmParser/llvmAsmParser.cpp:1.17 --- /dev/null Sat Aug 27 13:50:52 2005 +++ llvm/lib/AsmParser/llvmAsmParser.cpp Sat Aug 27 13:50:38 2005 @@ -0,0 +1,4590 @@ +/* A Bison parser, made by GNU Bison 1.875c. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse llvmAsmparse +#define yylex llvmAsmlex +#define yyerror llvmAsmerror +#define yylval llvmAsmlval +#define yychar llvmAsmchar +#define yydebug llvmAsmdebug +#define yynerrs llvmAsmnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + VOLATILE = 289, + TO = 290, + DOTDOTDOT = 291, + NULL_TOK = 292, + UNDEF = 293, + CONST = 294, + INTERNAL = 295, + LINKONCE = 296, + WEAK = 297, + APPENDING = 298, + OPAQUE = 299, + NOT = 300, + EXTERNAL = 301, + TARGET = 302, + TRIPLE = 303, + ENDIAN = 304, + POINTERSIZE = 305, + LITTLE = 306, + BIG = 307, + DEPLIBS = 308, + CALL = 309, + TAIL = 310, + CC_TOK = 311, + CCC_TOK = 312, + FASTCC_TOK = 313, + COLDCC_TOK = 314, + RET = 315, + BR = 316, + SWITCH = 317, + INVOKE = 318, + UNWIND = 319, + UNREACHABLE = 320, + ADD = 321, + SUB = 322, + MUL = 323, + DIV = 324, + REM = 325, + AND = 326, + OR = 327, + XOR = 328, + SETLE = 329, + SETGE = 330, + SETLT = 331, + SETGT = 332, + SETEQ = 333, + SETNE = 334, + MALLOC = 335, + ALLOCA = 336, + FREE = 337, + LOAD = 338, + STORE = 339, + GETELEMENTPTR = 340, + PHI_TOK = 341, + CAST = 342, + SELECT = 343, + SHL = 344, + SHR = 345, + VAARG = 346, + VAARG_old = 347, + VANEXT_old = 348 + }; +#endif +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define VOLATILE 289 +#define TO 290 +#define DOTDOTDOT 291 +#define NULL_TOK 292 +#define UNDEF 293 +#define CONST 294 +#define INTERNAL 295 +#define LINKONCE 296 +#define WEAK 297 +#define APPENDING 298 +#define OPAQUE 299 +#define NOT 300 +#define EXTERNAL 301 +#define TARGET 302 +#define TRIPLE 303 +#define ENDIAN 304 +#define POINTERSIZE 305 +#define LITTLE 306 +#define BIG 307 +#define DEPLIBS 308 +#define CALL 309 +#define TAIL 310 +#define CC_TOK 311 +#define CCC_TOK 312 +#define FASTCC_TOK 313 +#define COLDCC_TOK 314 +#define RET 315 +#define BR 316 +#define SWITCH 317 +#define INVOKE 318 +#define UNWIND 319 +#define UNREACHABLE 320 +#define ADD 321 +#define SUB 322 +#define MUL 323 +#define DIV 324 +#define REM 325 +#define AND 326 +#define OR 327 +#define XOR 328 +#define SETLE 329 +#define SETGE 330 +#define SETLT 331 +#define SETGT 332 +#define SETEQ 333 +#define SETNE 334 +#define MALLOC 335 +#define ALLOCA 336 +#define FREE 337 +#define LOAD 338 +#define STORE 339 +#define GETELEMENTPTR 340 +#define PHI_TOK 341 +#define CAST 342 +#define SELECT 343 +#define SHL 344 +#define SHR 345 +#define VAARG 346 +#define VAARG_old 347 +#define VANEXT_old 348 + + + + +/* Copy the first part of user declarations. */ +#line 14 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + +#include "ParserInternals.h" +#include "llvm/CallingConv.h" +#include "llvm/Instructions.h" +#include "llvm/Module.h" +#include "llvm/SymbolTable.h" +#include "llvm/Support/GetElementPtrTypeIterator.h" +#include "llvm/ADT/STLExtras.h" +#include +#include +#include +#include + +int yyerror(const char *ErrorMsg); // Forward declarations to prevent "implicit +int yylex(); // declaration" of xxx warnings. +int yyparse(); + +namespace llvm { + std::string CurFilename; +} +using namespace llvm; + +static Module *ParserResult; + +// DEBUG_UPREFS - Define this symbol if you want to enable debugging output +// relating to upreferences in the input stream. +// +//#define DEBUG_UPREFS 1 +#ifdef DEBUG_UPREFS +#define UR_OUT(X) std::cerr << X +#else +#define UR_OUT(X) +#endif + +#define YYERROR_VERBOSE 1 + +static bool ObsoleteVarArgs; +static bool NewVarArgs; +static BasicBlock* CurBB; + + +// This contains info used when building the body of a function. It is +// destroyed when the function is completed. +// +typedef std::vector ValueList; // Numbered defs +static void +ResolveDefinitions(std::map &LateResolvers, + std::map *FutureLateResolvers = 0); + +static struct PerModuleInfo { + Module *CurrentModule; + std::map Values; // Module level numbered definitions + std::map LateResolveValues; + std::vector Types; + std::map LateResolveTypes; + + /// PlaceHolderInfo - When temporary placeholder objects are created, remember + /// how they were referenced and one which line of the input they came from so + /// that we can resolve them later and print error messages as appropriate. + std::map > PlaceHolderInfo; + + // GlobalRefs - This maintains a mapping between 's and forward + // references to global values. Global values may be referenced before they + // are defined, and if so, the temporary object that they represent is held + // here. This is used for forward references of GlobalValues. + // + typedef std::map, GlobalValue*> GlobalRefsType; + GlobalRefsType GlobalRefs; + + void ModuleDone() { + // If we could not resolve some functions at function compilation time + // (calls to functions before they are defined), resolve them now... Types + // are resolved when the constant pool has been completely parsed. + // + ResolveDefinitions(LateResolveValues); + + // Check to make sure that all global value forward references have been + // resolved! + // + if (!GlobalRefs.empty()) { + std::string UndefinedReferences = "Unresolved global references exist:\n"; + + for (GlobalRefsType::iterator I = GlobalRefs.begin(), E =GlobalRefs.end(); + I != E; ++I) { + UndefinedReferences += " " + I->first.first->getDescription() + " " + + I->first.second.getName() + "\n"; + } + ThrowException(UndefinedReferences); + } + + Values.clear(); // Clear out function local definitions + Types.clear(); + CurrentModule = 0; + } + + + // GetForwardRefForGlobal - Check to see if there is a forward reference + // for this global. If so, remove it from the GlobalRefs map and return it. + // If not, just return null. + GlobalValue *GetForwardRefForGlobal(const PointerType *PTy, ValID ID) { + // Check to see if there is a forward reference to this global variable... + // if there is, eliminate it and patch the reference to use the new def'n. + GlobalRefsType::iterator I = GlobalRefs.find(std::make_pair(PTy, ID)); + GlobalValue *Ret = 0; + if (I != GlobalRefs.end()) { + Ret = I->second; + GlobalRefs.erase(I); + } + return Ret; + } +} CurModule; + +static struct PerFunctionInfo { + Function *CurrentFunction; // Pointer to current function being created + + std::map Values; // Keep track of #'d definitions + std::map LateResolveValues; + bool isDeclare; // Is this function a forward declararation? + + /// BBForwardRefs - When we see forward references to basic blocks, keep + /// track of them here. + std::map > BBForwardRefs; + std::vector NumberedBlocks; + unsigned NextBBNum; + + inline PerFunctionInfo() { + CurrentFunction = 0; + isDeclare = false; + } + + inline void FunctionStart(Function *M) { + CurrentFunction = M; + NextBBNum = 0; + } + + void FunctionDone() { + NumberedBlocks.clear(); + + // Any forward referenced blocks left? + if (!BBForwardRefs.empty()) + ThrowException("Undefined reference to label " + + BBForwardRefs.begin()->first->getName()); + + // Resolve all forward references now. + ResolveDefinitions(LateResolveValues, &CurModule.LateResolveValues); + + Values.clear(); // Clear out function local definitions + CurrentFunction = 0; + isDeclare = false; + } +} CurFun; // Info for the current function... + +static bool inFunctionScope() { return CurFun.CurrentFunction != 0; } + + +//===----------------------------------------------------------------------===// +// Code to handle definitions of all the types +//===----------------------------------------------------------------------===// + +static int InsertValue(Value *V, + std::map &ValueTab = CurFun.Values) { + if (V->hasName()) return -1; // Is this a numbered definition? + + // Yes, insert the value into the value table... + ValueList &List = ValueTab[V->getType()]; + List.push_back(V); + return List.size()-1; +} + +static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) { + switch (D.Type) { + case ValID::NumberVal: // Is it a numbered definition? + // Module constants occupy the lowest numbered slots... + if ((unsigned)D.Num < CurModule.Types.size()) + return CurModule.Types[(unsigned)D.Num]; + break; + case ValID::NameVal: // Is it a named definition? + if (const Type *N = CurModule.CurrentModule->getTypeByName(D.Name)) { + D.destroy(); // Free old strdup'd memory... + return N; + } + break; + default: + ThrowException("Internal parser error: Invalid symbol type reference!"); + } + + // If we reached here, we referenced either a symbol that we don't know about + // or an id number that hasn't been read yet. We may be referencing something + // forward, so just create an entry to be resolved later and get to it... + // + if (DoNotImprovise) return 0; // Do we just want a null to be returned? + + + if (inFunctionScope()) { + if (D.Type == ValID::NameVal) + ThrowException("Reference to an undefined type: '" + D.getName() + "'"); + else + ThrowException("Reference to an undefined type: #" + itostr(D.Num)); + } + + std::map::iterator I =CurModule.LateResolveTypes.find(D); + if (I != CurModule.LateResolveTypes.end()) + return I->second; + + Type *Typ = OpaqueType::get(); + CurModule.LateResolveTypes.insert(std::make_pair(D, Typ)); + return Typ; + } + +static Value *lookupInSymbolTable(const Type *Ty, const std::string &Name) { + SymbolTable &SymTab = + inFunctionScope() ? CurFun.CurrentFunction->getSymbolTable() : + CurModule.CurrentModule->getSymbolTable(); + return SymTab.lookup(Ty, Name); +} + +// getValNonImprovising - Look up the value specified by the provided type and +// the provided ValID. If the value exists and has already been defined, return +// it. Otherwise return null. +// +static Value *getValNonImprovising(const Type *Ty, const ValID &D) { + if (isa(Ty)) + ThrowException("Functions are not values and " + "must be referenced as pointers"); + + switch (D.Type) { + case ValID::NumberVal: { // Is it a numbered definition? + unsigned Num = (unsigned)D.Num; + + // Module constants occupy the lowest numbered slots... + std::map::iterator VI = CurModule.Values.find(Ty); + if (VI != CurModule.Values.end()) { + if (Num < VI->second.size()) + return VI->second[Num]; + Num -= VI->second.size(); + } + + // Make sure that our type is within bounds + VI = CurFun.Values.find(Ty); + if (VI == CurFun.Values.end()) return 0; + + // Check that the number is within bounds... + if (VI->second.size() <= Num) return 0; + + return VI->second[Num]; + } + + case ValID::NameVal: { // Is it a named definition? + Value *N = lookupInSymbolTable(Ty, std::string(D.Name)); + if (N == 0) return 0; + + D.destroy(); // Free old strdup'd memory... + return N; + } + + // Check to make sure that "Ty" is an integral type, and that our + // value will fit into the specified type... + case ValID::ConstSIntVal: // Is it a constant pool reference?? + if (!ConstantSInt::isValueValidForType(Ty, D.ConstPool64)) + ThrowException("Signed integral constant '" + + itostr(D.ConstPool64) + "' is invalid for type '" + + Ty->getDescription() + "'!"); + return ConstantSInt::get(Ty, D.ConstPool64); + + case ValID::ConstUIntVal: // Is it an unsigned const pool reference? + if (!ConstantUInt::isValueValidForType(Ty, D.UConstPool64)) { + if (!ConstantSInt::isValueValidForType(Ty, D.ConstPool64)) { + ThrowException("Integral constant '" + utostr(D.UConstPool64) + + "' is invalid or out of range!"); + } else { // This is really a signed reference. Transmogrify. + return ConstantSInt::get(Ty, D.ConstPool64); + } + } else { + return ConstantUInt::get(Ty, D.UConstPool64); + } + + case ValID::ConstFPVal: // Is it a floating point const pool reference? + if (!ConstantFP::isValueValidForType(Ty, D.ConstPoolFP)) + ThrowException("FP constant invalid for type!!"); + return ConstantFP::get(Ty, D.ConstPoolFP); + + case ValID::ConstNullVal: // Is it a null value? + if (!isa(Ty)) + ThrowException("Cannot create a a non pointer null!"); + return ConstantPointerNull::get(cast(Ty)); + + case ValID::ConstUndefVal: // Is it an undef value? + return UndefValue::get(Ty); + + case ValID::ConstantVal: // Fully resolved constant? + if (D.ConstantValue->getType() != Ty) + ThrowException("Constant expression type different from required type!"); + return D.ConstantValue; + + default: + assert(0 && "Unhandled case!"); + return 0; + } // End of switch + + assert(0 && "Unhandled case!"); + return 0; +} + +// getVal - This function is identical to getValNonImprovising, except that if a +// value is not already defined, it "improvises" by creating a placeholder var +// that looks and acts just like the requested variable. When the value is +// defined later, all uses of the placeholder variable are replaced with the +// real thing. +// +static Value *getVal(const Type *Ty, const ValID &ID) { + if (Ty == Type::LabelTy) + ThrowException("Cannot use a basic block here"); + + // See if the value has already been defined. + Value *V = getValNonImprovising(Ty, ID); + if (V) return V; + + if (!Ty->isFirstClassType() && !isa(Ty)) + ThrowException("Invalid use of a composite type!"); + + // If we reached here, we referenced either a symbol that we don't know about + // or an id number that hasn't been read yet. We may be referencing something + // forward, so just create an entry to be resolved later and get to it... + // + V = new Argument(Ty); + + // Remember where this forward reference came from. FIXME, shouldn't we try + // to recycle these things?? + CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID, + llvmAsmlineno))); + + if (inFunctionScope()) + InsertValue(V, CurFun.LateResolveValues); + else + InsertValue(V, CurModule.LateResolveValues); + return V; +} + +/// getBBVal - This is used for two purposes: +/// * If isDefinition is true, a new basic block with the specified ID is being +/// defined. +/// * If isDefinition is true, this is a reference to a basic block, which may +/// or may not be a forward reference. +/// +static BasicBlock *getBBVal(const ValID &ID, bool isDefinition = false) { + assert(inFunctionScope() && "Can't get basic block at global scope!"); + + std::string Name; + BasicBlock *BB = 0; + switch (ID.Type) { + default: ThrowException("Illegal label reference " + ID.getName()); + case ValID::NumberVal: // Is it a numbered definition? + if (unsigned(ID.Num) >= CurFun.NumberedBlocks.size()) + CurFun.NumberedBlocks.resize(ID.Num+1); + BB = CurFun.NumberedBlocks[ID.Num]; + break; + case ValID::NameVal: // Is it a named definition? + Name = ID.Name; + if (Value *N = CurFun.CurrentFunction-> + getSymbolTable().lookup(Type::LabelTy, Name)) + BB = cast(N); + break; + } + + // See if the block has already been defined. + if (BB) { + // If this is the definition of the block, make sure the existing value was + // just a forward reference. If it was a forward reference, there will be + // an entry for it in the PlaceHolderInfo map. + if (isDefinition && !CurFun.BBForwardRefs.erase(BB)) + // The existing value was a definition, not a forward reference. + ThrowException("Redefinition of label " + ID.getName()); + + ID.destroy(); // Free strdup'd memory. + return BB; + } + + // Otherwise this block has not been seen before. + BB = new BasicBlock("", CurFun.CurrentFunction); + if (ID.Type == ValID::NameVal) { + BB->setName(ID.Name); + } else { + CurFun.NumberedBlocks[ID.Num] = BB; + } + + // If this is not a definition, keep track of it so we can use it as a forward + // reference. + if (!isDefinition) { + // Remember where this forward reference came from. + CurFun.BBForwardRefs[BB] = std::make_pair(ID, llvmAsmlineno); + } else { + // The forward declaration could have been inserted anywhere in the + // function: insert it into the correct place now. + CurFun.CurrentFunction->getBasicBlockList().remove(BB); + CurFun.CurrentFunction->getBasicBlockList().push_back(BB); + } + ID.destroy(); + return BB; +} + + +//===----------------------------------------------------------------------===// +// Code to handle forward references in instructions +//===----------------------------------------------------------------------===// +// +// This code handles the late binding needed with statements that reference +// values not defined yet... for example, a forward branch, or the PHI node for +// a loop body. +// +// This keeps a table (CurFun.LateResolveValues) of all such forward references +// and back patchs after we are done. +// + +// ResolveDefinitions - If we could not resolve some defs at parsing +// time (forward branches, phi functions for loops, etc...) resolve the +// defs now... +// +static void +ResolveDefinitions(std::map &LateResolvers, + std::map *FutureLateResolvers) { + // Loop over LateResolveDefs fixing up stuff that couldn't be resolved + for (std::map::iterator LRI = LateResolvers.begin(), + E = LateResolvers.end(); LRI != E; ++LRI) { + ValueList &List = LRI->second; + while (!List.empty()) { + Value *V = List.back(); + List.pop_back(); + + std::map >::iterator PHI = + CurModule.PlaceHolderInfo.find(V); + assert(PHI != CurModule.PlaceHolderInfo.end() && "Placeholder error!"); + + ValID &DID = PHI->second.first; + + Value *TheRealValue = getValNonImprovising(LRI->first, DID); + if (TheRealValue) { + V->replaceAllUsesWith(TheRealValue); + delete V; + CurModule.PlaceHolderInfo.erase(PHI); + } else if (FutureLateResolvers) { + // Functions have their unresolved items forwarded to the module late + // resolver table + InsertValue(V, *FutureLateResolvers); + } else { + if (DID.Type == ValID::NameVal) + ThrowException("Reference to an invalid definition: '" +DID.getName()+ + "' of type '" + V->getType()->getDescription() + "'", + PHI->second.second); + else + ThrowException("Reference to an invalid definition: #" + + itostr(DID.Num) + " of type '" + + V->getType()->getDescription() + "'", + PHI->second.second); + } + } + } + + LateResolvers.clear(); +} + +// ResolveTypeTo - A brand new type was just declared. This means that (if +// name is not null) things referencing Name can be resolved. Otherwise, things +// refering to the number can be resolved. Do this now. +// +static void ResolveTypeTo(char *Name, const Type *ToTy) { + ValID D; + if (Name) D = ValID::create(Name); + else D = ValID::create((int)CurModule.Types.size()); + + std::map::iterator I = + CurModule.LateResolveTypes.find(D); + if (I != CurModule.LateResolveTypes.end()) { + ((DerivedType*)I->second.get())->refineAbstractTypeTo(ToTy); + CurModule.LateResolveTypes.erase(I); + } +} + +// setValueName - Set the specified value to the name given. The name may be +// null potentially, in which case this is a noop. The string passed in is +// assumed to be a malloc'd string buffer, and is free'd by this function. +// +static void setValueName(Value *V, char *NameStr) { + if (NameStr) { + std::string Name(NameStr); // Copy string + free(NameStr); // Free old string + + if (V->getType() == Type::VoidTy) + ThrowException("Can't assign name '" + Name+"' to value with void type!"); + + assert(inFunctionScope() && "Must be in function scope!"); + SymbolTable &ST = CurFun.CurrentFunction->getSymbolTable(); + if (ST.lookup(V->getType(), Name)) + ThrowException("Redefinition of value named '" + Name + "' in the '" + + V->getType()->getDescription() + "' type plane!"); + + // Set the name. + V->setName(Name); + } +} + +/// ParseGlobalVariable - Handle parsing of a global. If Initializer is null, +/// this is a declaration, otherwise it is a definition. +static void ParseGlobalVariable(char *NameStr,GlobalValue::LinkageTypes Linkage, + bool isConstantGlobal, const Type *Ty, + Constant *Initializer) { + if (isa(Ty)) + ThrowException("Cannot declare global vars of function type!"); + + const PointerType *PTy = PointerType::get(Ty); + + std::string Name; + if (NameStr) { + Name = NameStr; // Copy string + free(NameStr); // Free old string + } + + // See if this global value was forward referenced. If so, recycle the + // object. + ValID ID; + if (!Name.empty()) { + ID = ValID::create((char*)Name.c_str()); + } else { + ID = ValID::create((int)CurModule.Values[PTy].size()); + } + + if (GlobalValue *FWGV = CurModule.GetForwardRefForGlobal(PTy, ID)) { + // Move the global to the end of the list, from whereever it was + // previously inserted. + GlobalVariable *GV = cast(FWGV); + CurModule.CurrentModule->getGlobalList().remove(GV); + CurModule.CurrentModule->getGlobalList().push_back(GV); + GV->setInitializer(Initializer); + GV->setLinkage(Linkage); + GV->setConstant(isConstantGlobal); + InsertValue(GV, CurModule.Values); + return; + } + + // If this global has a name, check to see if there is already a definition + // of this global in the module. If so, merge as appropriate. Note that + // this is really just a hack around problems in the CFE. :( + if (!Name.empty()) { + // We are a simple redefinition of a value, check to see if it is defined + // the same as the old one. + if (GlobalVariable *EGV = + CurModule.CurrentModule->getGlobalVariable(Name, Ty)) { + // We are allowed to redefine a global variable in two circumstances: + // 1. If at least one of the globals is uninitialized or + // 2. If both initializers have the same value. + // + if (!EGV->hasInitializer() || !Initializer || + EGV->getInitializer() == Initializer) { + + // Make sure the existing global version gets the initializer! Make + // sure that it also gets marked const if the new version is. + if (Initializer && !EGV->hasInitializer()) + EGV->setInitializer(Initializer); + if (isConstantGlobal) + EGV->setConstant(true); + EGV->setLinkage(Linkage); + return; + } + + ThrowException("Redefinition of global variable named '" + Name + + "' in the '" + Ty->getDescription() + "' type plane!"); + } + } + + // Otherwise there is no existing GV to use, create one now. + GlobalVariable *GV = + new GlobalVariable(Ty, isConstantGlobal, Linkage, Initializer, Name, + CurModule.CurrentModule); + InsertValue(GV, CurModule.Values); +} + +// setTypeName - Set the specified type to the name given. The name may be +// null potentially, in which case this is a noop. The string passed in is +// assumed to be a malloc'd string buffer, and is freed by this function. +// +// This function returns true if the type has already been defined, but is +// allowed to be redefined in the specified context. If the name is a new name +// for the type plane, it is inserted and false is returned. +static bool setTypeName(const Type *T, char *NameStr) { + assert(!inFunctionScope() && "Can't give types function-local names!"); + if (NameStr == 0) return false; + + std::string Name(NameStr); // Copy string + free(NameStr); // Free old string + + // We don't allow assigning names to void type + if (T == Type::VoidTy) + ThrowException("Can't assign name '" + Name + "' to the void type!"); + + // Set the type name, checking for conflicts as we do so. + bool AlreadyExists = CurModule.CurrentModule->addTypeName(Name, T); + + if (AlreadyExists) { // Inserting a name that is already defined??? + const Type *Existing = CurModule.CurrentModule->getTypeByName(Name); + assert(Existing && "Conflict but no matching type?"); + + // There is only one case where this is allowed: when we are refining an + // opaque type. In this case, Existing will be an opaque type. + if (const OpaqueType *OpTy = dyn_cast(Existing)) { + // We ARE replacing an opaque type! + const_cast(OpTy)->refineAbstractTypeTo(T); + return true; + } + + // Otherwise, this is an attempt to redefine a type. That's okay if + // the redefinition is identical to the original. This will be so if + // Existing and T point to the same Type object. In this one case we + // allow the equivalent redefinition. + if (Existing == T) return true; // Yes, it's equal. + + // Any other kind of (non-equivalent) redefinition is an error. + ThrowException("Redefinition of type named '" + Name + "' in the '" + + T->getDescription() + "' type plane!"); + } + + return false; +} + +//===----------------------------------------------------------------------===// +// Code for handling upreferences in type names... +// + +// TypeContains - Returns true if Ty directly contains E in it. +// +static bool TypeContains(const Type *Ty, const Type *E) { + return std::find(Ty->subtype_begin(), Ty->subtype_end(), + E) != Ty->subtype_end(); +} + +namespace { + struct UpRefRecord { + // NestingLevel - The number of nesting levels that need to be popped before + // this type is resolved. + unsigned NestingLevel; + + // LastContainedTy - This is the type at the current binding level for the + // type. Every time we reduce the nesting level, this gets updated. + const Type *LastContainedTy; + + // UpRefTy - This is the actual opaque type that the upreference is + // represented with. + OpaqueType *UpRefTy; + + UpRefRecord(unsigned NL, OpaqueType *URTy) + : NestingLevel(NL), LastContainedTy(URTy), UpRefTy(URTy) {} + }; +} + +// UpRefs - A list of the outstanding upreferences that need to be resolved. +static std::vector UpRefs; + +/// HandleUpRefs - Every time we finish a new layer of types, this function is +/// called. It loops through the UpRefs vector, which is a list of the +/// currently active types. For each type, if the up reference is contained in +/// the newly completed type, we decrement the level count. When the level +/// count reaches zero, the upreferenced type is the type that is passed in: +/// thus we can complete the cycle. +/// +static PATypeHolder HandleUpRefs(const Type *ty) { + if (!ty->isAbstract()) return ty; + PATypeHolder Ty(ty); + UR_OUT("Type '" << Ty->getDescription() << + "' newly formed. Resolving upreferences.\n" << + UpRefs.size() << " upreferences active!\n"); + + // If we find any resolvable upreferences (i.e., those whose NestingLevel goes + // to zero), we resolve them all together before we resolve them to Ty. At + // the end of the loop, if there is anything to resolve to Ty, it will be in + // this variable. + OpaqueType *TypeToResolve = 0; + + for (unsigned i = 0; i != UpRefs.size(); ++i) { + UR_OUT(" UR#" << i << " - TypeContains(" << Ty->getDescription() << ", " + << UpRefs[i].second->getDescription() << ") = " + << (TypeContains(Ty, UpRefs[i].second) ? "true" : "false") << "\n"); + if (TypeContains(Ty, UpRefs[i].LastContainedTy)) { + // Decrement level of upreference + unsigned Level = --UpRefs[i].NestingLevel; + UpRefs[i].LastContainedTy = Ty; + UR_OUT(" Uplevel Ref Level = " << Level << "\n"); + if (Level == 0) { // Upreference should be resolved! + if (!TypeToResolve) { + TypeToResolve = UpRefs[i].UpRefTy; + } else { + UR_OUT(" * Resolving upreference for " + << UpRefs[i].second->getDescription() << "\n"; + std::string OldName = UpRefs[i].UpRefTy->getDescription()); + UpRefs[i].UpRefTy->refineAbstractTypeTo(TypeToResolve); + UR_OUT(" * Type '" << OldName << "' refined upreference to: " + << (const void*)Ty << ", " << Ty->getDescription() << "\n"); + } + UpRefs.erase(UpRefs.begin()+i); // Remove from upreference list... + --i; // Do not skip the next element... + } + } + } + + if (TypeToResolve) { + UR_OUT(" * Resolving upreference for " + << UpRefs[i].second->getDescription() << "\n"; + std::string OldName = TypeToResolve->getDescription()); + TypeToResolve->refineAbstractTypeTo(Ty); + } + + return Ty; +} + + +// common code from the two 'RunVMAsmParser' functions + static Module * RunParser(Module * M) { + + llvmAsmlineno = 1; // Reset the current line number... + ObsoleteVarArgs = false; + NewVarArgs = false; + + CurModule.CurrentModule = M; + yyparse(); // Parse the file, potentially throwing exception + + Module *Result = ParserResult; + ParserResult = 0; + + //Not all functions use vaarg, so make a second check for ObsoleteVarArgs + { + Function* F; + if ((F = Result->getNamedFunction("llvm.va_start")) + && F->getFunctionType()->getNumParams() == 0) + ObsoleteVarArgs = true; + if((F = Result->getNamedFunction("llvm.va_copy")) + && F->getFunctionType()->getNumParams() == 1) + ObsoleteVarArgs = true; + } + + if (ObsoleteVarArgs && NewVarArgs) + ThrowException("This file is corrupt: it uses both new and old style varargs"); + + if(ObsoleteVarArgs) { + if(Function* F = Result->getNamedFunction("llvm.va_start")) { + if (F->arg_size() != 0) + ThrowException("Obsolete va_start takes 0 argument!"); + + //foo = va_start() + // -> + //bar = alloca typeof(foo) + //va_start(bar) + //foo = load bar + + const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID); + const Type* ArgTy = F->getFunctionType()->getReturnType(); + const Type* ArgTyPtr = PointerType::get(ArgTy); + Function* NF = Result->getOrInsertFunction("llvm.va_start", + RetTy, ArgTyPtr, 0); + + while (!F->use_empty()) { + CallInst* CI = cast(F->use_back()); + AllocaInst* bar = new AllocaInst(ArgTy, 0, "vastart.fix.1", CI); + new CallInst(NF, bar, "", CI); + Value* foo = new LoadInst(bar, "vastart.fix.2", CI); + CI->replaceAllUsesWith(foo); + CI->getParent()->getInstList().erase(CI); + } + Result->getFunctionList().erase(F); + } + + if(Function* F = Result->getNamedFunction("llvm.va_end")) { + if(F->arg_size() != 1) + ThrowException("Obsolete va_end takes 1 argument!"); + + //vaend foo + // -> + //bar = alloca 1 of typeof(foo) + //vaend bar + const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID); + const Type* ArgTy = F->getFunctionType()->getParamType(0); + const Type* ArgTyPtr = PointerType::get(ArgTy); + Function* NF = Result->getOrInsertFunction("llvm.va_end", + RetTy, ArgTyPtr, 0); + + while (!F->use_empty()) { + CallInst* CI = cast(F->use_back()); + AllocaInst* bar = new AllocaInst(ArgTy, 0, "vaend.fix.1", CI); + new StoreInst(CI->getOperand(1), bar, CI); + new CallInst(NF, bar, "", CI); + CI->getParent()->getInstList().erase(CI); + } + Result->getFunctionList().erase(F); + } + + if(Function* F = Result->getNamedFunction("llvm.va_copy")) { + if(F->arg_size() != 1) + ThrowException("Obsolete va_copy takes 1 argument!"); + //foo = vacopy(bar) + // -> + //a = alloca 1 of typeof(foo) + //b = alloca 1 of typeof(foo) + //store bar -> b + //vacopy(a, b) + //foo = load a + + const Type* RetTy = Type::getPrimitiveType(Type::VoidTyID); + const Type* ArgTy = F->getFunctionType()->getReturnType(); + const Type* ArgTyPtr = PointerType::get(ArgTy); + Function* NF = Result->getOrInsertFunction("llvm.va_copy", + RetTy, ArgTyPtr, ArgTyPtr, 0); + + while (!F->use_empty()) { + CallInst* CI = cast(F->use_back()); + AllocaInst* a = new AllocaInst(ArgTy, 0, "vacopy.fix.1", CI); + AllocaInst* b = new AllocaInst(ArgTy, 0, "vacopy.fix.2", CI); + new StoreInst(CI->getOperand(1), b, CI); + new CallInst(NF, a, b, "", CI); + Value* foo = new LoadInst(a, "vacopy.fix.3", CI); + CI->replaceAllUsesWith(foo); + CI->getParent()->getInstList().erase(CI); + } + Result->getFunctionList().erase(F); + } + } + + return Result; + + } + +//===----------------------------------------------------------------------===// +// RunVMAsmParser - Define an interface to this parser +//===----------------------------------------------------------------------===// +// +Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) { + set_scan_file(F); + + CurFilename = Filename; + return RunParser(new Module(CurFilename)); +} + +Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { + set_scan_string(AsmString); + + CurFilename = "from_memory"; + if (M == NULL) { + return RunParser(new Module (CurFilename)); + } else { + return RunParser(M); + } +} + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 865 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { + llvm::Module *ModuleVal; + llvm::Function *FunctionVal; + std::pair *ArgVal; + llvm::BasicBlock *BasicBlockVal; + llvm::TerminatorInst *TermInstVal; + llvm::Instruction *InstVal; + llvm::Constant *ConstVal; + + const llvm::Type *PrimType; + llvm::PATypeHolder *TypeVal; + llvm::Value *ValueVal; + + std::vector > *ArgList; + std::vector *ValueList; + std::list *TypeList; + // Represent the RHS of PHI node + std::list > *PHIList; + std::vector > *JumpTable; + std::vector *ConstVector; + + llvm::GlobalValue::LinkageTypes Linkage; + int64_t SInt64Val; + uint64_t UInt64Val; + int SIntVal; + unsigned UIntVal; + double FPVal; + bool BoolVal; + + char *StrVal; // This memory is strdup'd! + llvm::ValID ValIDVal; // strdup'd memory maybe! + + llvm::Instruction::BinaryOps BinaryOpVal; + llvm::Instruction::TermOps TermOpVal; + llvm::Instruction::MemoryOps MemOpVal; + llvm::Instruction::OtherOps OtherOpVal; + llvm::Module::Endianness Endianness; +} YYSTYPE; +/* Line 191 of yacc.c. */ +#line 1162 "llvmAsmParser.tab.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 1174 "llvmAsmParser.tab.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# endif +# else +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 4 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 1102 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 108 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 62 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 212 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 419 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 348 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 96, 97, 105, 2, 106, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 101, 94, 102, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 98, 95, 100, 2, 2, 2, 2, 2, 107, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 99, 2, 2, 103, 2, 104, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 5, 7, 9, 11, 13, 15, 17, + 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, + 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, + 59, 61, 63, 65, 67, 70, 71, 73, 75, 77, + 79, 80, 81, 83, 85, 87, 90, 92, 94, 96, + 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, + 118, 120, 122, 124, 126, 128, 130, 132, 135, 140, + 146, 152, 156, 159, 162, 164, 168, 170, 174, 176, + 177, 182, 186, 190, 195, 200, 204, 207, 210, 213, + 216, 219, 222, 225, 228, 231, 234, 241, 247, 256, + 263, 270, 277, 284, 288, 290, 292, 294, 296, 299, + 302, 305, 307, 312, 315, 321, 327, 331, 336, 337, + 339, 341, 345, 349, 353, 357, 361, 363, 364, 366, + 368, 370, 371, 374, 378, 380, 382, 386, 388, 389, + 396, 398, 400, 404, 406, 408, 411, 412, 416, 418, + 420, 422, 424, 426, 428, 430, 434, 436, 438, 440, + 442, 444, 447, 450, 453, 457, 460, 461, 463, 466, + 469, 473, 483, 493, 502, 516, 518, 520, 527, 533, + 536, 543, 551, 553, 557, 559, 560, 563, 565, 571, + 577, 583, 586, 591, 596, 603, 608, 613, 618, 621, + 629, 631, 634, 635, 637, 638, 641, 647, 650, 656, + 659, 664, 671 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short yyrhs[] = +{ + 133, 0, -1, 5, -1, 6, -1, 3, -1, 4, + -1, 66, -1, 67, -1, 68, -1, 69, -1, 70, + -1, 71, -1, 72, -1, 73, -1, 74, -1, 75, + -1, 76, -1, 77, -1, 78, -1, 79, -1, 89, + -1, 90, -1, 16, -1, 14, -1, 12, -1, 10, + -1, 17, -1, 15, -1, 13, -1, 11, -1, 115, + -1, 116, -1, 18, -1, 19, -1, 140, 94, -1, + -1, 40, -1, 41, -1, 42, -1, 43, -1, -1, + -1, 57, -1, 58, -1, 59, -1, 56, 4, -1, + 124, -1, 8, -1, 126, -1, 8, -1, 126, -1, + 9, -1, 10, -1, 11, -1, 12, -1, 13, -1, + 14, -1, 15, -1, 16, -1, 17, -1, 18, -1, + 19, -1, 20, -1, 21, -1, 44, -1, 125, -1, + 153, -1, 95, 4, -1, 123, 96, 128, 97, -1, + 98, 4, 99, 126, 100, -1, 101, 4, 99, 126, + 102, -1, 103, 127, 104, -1, 103, 104, -1, 126, + 105, -1, 126, -1, 127, 106, 126, -1, 127, -1, + 127, 106, 36, -1, 36, -1, -1, 124, 98, 131, + 100, -1, 124, 98, 100, -1, 124, 107, 24, -1, + 124, 101, 131, 102, -1, 124, 103, 131, 104, -1, + 124, 103, 104, -1, 124, 37, -1, 124, 38, -1, + 124, 153, -1, 124, 130, -1, 124, 26, -1, 115, + 110, -1, 116, 4, -1, 9, 27, -1, 9, 28, + -1, 118, 7, -1, 87, 96, 129, 35, 124, 97, + -1, 85, 96, 129, 167, 97, -1, 88, 96, 129, + 106, 129, 106, 129, 97, -1, 111, 96, 129, 106, + 129, 97, -1, 112, 96, 129, 106, 129, 97, -1, + 113, 96, 129, 106, 129, 97, -1, 114, 96, 129, + 106, 129, 97, -1, 131, 106, 129, -1, 129, -1, + 32, -1, 33, -1, 134, -1, 134, 149, -1, 134, + 150, -1, 134, 25, -1, 135, -1, 135, 119, 20, + 122, -1, 135, 150, -1, 135, 119, 120, 132, 129, + -1, 135, 119, 46, 132, 124, -1, 135, 47, 137, + -1, 135, 53, 94, 138, -1, -1, 52, -1, 51, + -1, 49, 94, 136, -1, 50, 94, 4, -1, 48, + 94, 24, -1, 98, 139, 100, -1, 139, 106, 24, + -1, 24, -1, -1, 22, -1, 24, -1, 140, -1, + -1, 124, 141, -1, 143, 106, 142, -1, 142, -1, + 143, -1, 143, 106, 36, -1, 36, -1, -1, 121, + 122, 140, 96, 144, 97, -1, 29, -1, 103, -1, + 120, 145, 146, -1, 30, -1, 104, -1, 156, 148, + -1, -1, 31, 151, 145, -1, 3, -1, 4, -1, + 7, -1, 27, -1, 28, -1, 37, -1, 38, -1, + 101, 131, 102, -1, 130, -1, 109, -1, 140, -1, + 153, -1, 152, -1, 124, 154, -1, 156, 157, -1, + 147, 157, -1, 158, 119, 159, -1, 158, 161, -1, + -1, 23, -1, 60, 155, -1, 60, 8, -1, 61, + 21, 154, -1, 61, 9, 154, 106, 21, 154, 106, + 21, 154, -1, 62, 117, 154, 106, 21, 154, 98, + 160, 100, -1, 62, 117, 154, 106, 21, 154, 98, + 100, -1, 63, 121, 122, 154, 96, 164, 97, 35, + 21, 154, 64, 21, 154, -1, 64, -1, 65, -1, + 160, 117, 152, 106, 21, 154, -1, 117, 152, 106, + 21, 154, -1, 119, 166, -1, 124, 98, 154, 106, + 154, 100, -1, 162, 106, 98, 154, 106, 154, 100, + -1, 155, -1, 163, 106, 155, -1, 163, -1, -1, + 55, 54, -1, 54, -1, 111, 124, 154, 106, 154, + -1, 112, 124, 154, 106, 154, -1, 113, 124, 154, + 106, 154, -1, 45, 155, -1, 114, 155, 106, 155, + -1, 87, 155, 35, 124, -1, 88, 155, 106, 155, + 106, 155, -1, 91, 155, 106, 124, -1, 92, 155, + 106, 124, -1, 93, 155, 106, 124, -1, 86, 162, + -1, 165, 121, 122, 154, 96, 164, 97, -1, 169, + -1, 106, 163, -1, -1, 34, -1, -1, 80, 124, + -1, 80, 124, 106, 15, 154, -1, 81, 124, -1, + 81, 124, 106, 15, 154, -1, 82, 155, -1, 168, + 83, 124, 154, -1, 168, 84, 155, 106, 124, 154, + -1, 85, 124, 154, 167, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 982, 982, 983, 990, 991, 1000, 1000, 1000, 1000, + 1000, 1001, 1001, 1001, 1002, 1002, 1002, 1002, 1002, 1002, + 1004, 1004, 1008, 1008, 1008, 1008, 1009, 1009, 1009, 1009, + 1010, 1010, 1011, 1011, 1014, 1017, 1021, 1022, 1023, 1024, + 1025, 1027, 1028, 1029, 1030, 1031, 1044, 1044, 1045, 1045, + 1047, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1057, 1057, + 1057, 1057, 1057, 1057, 1058, 1061, 1064, 1070, 1077, 1089, + 1093, 1104, 1113, 1116, 1124, 1128, 1133, 1134, 1137, 1140, + 1150, 1175, 1188, 1216, 1241, 1261, 1273, 1282, 1286, 1345, + 1351, 1359, 1364, 1369, 1372, 1375, 1382, 1392, 1423, 1430, + 1451, 1458, 1463, 1473, 1476, 1483, 1483, 1493, 1500, 1504, + 1507, 1510, 1523, 1543, 1545, 1549, 1553, 1555, 1557, 1562, + 1563, 1565, 1568, 1576, 1581, 1583, 1587, 1591, 1599, 1599, + 1600, 1600, 1602, 1608, 1613, 1619, 1622, 1627, 1631, 1635, + 1715, 1715, 1717, 1725, 1725, 1727, 1731, 1731, 1740, 1743, + 1746, 1749, 1752, 1755, 1758, 1761, 1785, 1792, 1795, 1800, + 1800, 1806, 1810, 1813, 1821, 1830, 1834, 1844, 1855, 1858, + 1861, 1864, 1867, 1881, 1885, 1938, 1941, 1947, 1955, 1965, + 1972, 1977, 1984, 1988, 1994, 1994, 1996, 1999, 2005, 2017, + 2025, 2035, 2047, 2054, 2061, 2068, 2073, 2092, 2114, 2128, + 2185, 2191, 2193, 2197, 2200, 2206, 2210, 2214, 2218, 2222, + 2229, 2239, 2252 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL", + "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT", + "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL", + "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION", + "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK", + "DECLARE", "GLOBAL", "CONSTANT", "VOLATILE", "TO", "DOTDOTDOT", + "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE", "WEAK", + "APPENDING", "OPAQUE", "NOT", "EXTERNAL", "TARGET", "TRIPLE", "ENDIAN", + "POINTERSIZE", "LITTLE", "BIG", "DEPLIBS", "CALL", "TAIL", "CC_TOK", + "CCC_TOK", "FASTCC_TOK", "COLDCC_TOK", "RET", "BR", "SWITCH", "INVOKE", + "UNWIND", "UNREACHABLE", "ADD", "SUB", "MUL", "DIV", "REM", "AND", "OR", + "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", "SETNE", "MALLOC", + "ALLOCA", "FREE", "LOAD", "STORE", "GETELEMENTPTR", "PHI_TOK", "CAST", + "SELECT", "SHL", "SHR", "VAARG", "VAARG_old", "VANEXT_old", "'='", + "'\\\\'", "'('", "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", "'}'", + "'*'", "','", "'c'", "$accept", "INTVAL", "EINT64VAL", "ArithmeticOps", + "LogicalOps", "SetCondOps", "ShiftOps", "SIntType", "UIntType", + "IntType", "FPType", "OptAssign", "OptLinkage", "OptCallingConv", + "TypesV", "UpRTypesV", "Types", "PrimType", "UpRTypes", "TypeListI", + "ArgTypeListI", "ConstVal", "ConstExpr", "ConstVector", "GlobalType", + "Module", "FunctionList", "ConstPool", "BigOrLittle", "TargetDefinition", + "LibrariesDefinition", "LibList", "Name", "OptName", "ArgVal", + "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", "FunctionHeader", + "END", "Function", "FunctionProto", "@1", "ConstValueRef", + "SymbolicValueRef", "ValueRef", "ResolvedVal", "BasicBlockList", + "BasicBlock", "InstructionList", "BBTerminatorInst", "JumpTable", "Inst", + "PHIList", "ValueRefList", "ValueRefListE", "OptTailCall", "InstVal", + "IndexList", "OptVolatile", "MemoryInst", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 61, 92, 40, 41, 91, 120, + 93, 60, 62, 123, 125, 42, 44, 99 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 108, 109, 109, 110, 110, 111, 111, 111, 111, + 111, 112, 112, 112, 113, 113, 113, 113, 113, 113, + 114, 114, 115, 115, 115, 115, 116, 116, 116, 116, + 117, 117, 118, 118, 119, 119, 120, 120, 120, 120, + 120, 121, 121, 121, 121, 121, 122, 122, 123, 123, + 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 127, 127, 128, 128, 128, 128, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, + 130, 130, 130, 131, 131, 132, 132, 133, 134, 134, + 134, 134, 135, 135, 135, 135, 135, 135, 135, 136, + 136, 137, 137, 137, 138, 139, 139, 139, 140, 140, + 141, 141, 142, 143, 143, 144, 144, 144, 144, 145, + 146, 146, 147, 148, 148, 149, 151, 150, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 153, 153, 154, + 154, 155, 156, 156, 157, 158, 158, 158, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 160, 160, 161, + 162, 162, 163, 163, 164, 164, 165, 165, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 167, 167, 168, 168, 169, 169, 169, 169, 169, + 169, 169, 169 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, + 5, 3, 2, 2, 1, 3, 1, 3, 1, 0, + 4, 3, 3, 4, 4, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 6, 5, 8, 6, + 6, 6, 6, 3, 1, 1, 1, 1, 2, 2, + 2, 1, 4, 2, 5, 5, 3, 4, 0, 1, + 1, 3, 3, 3, 3, 3, 1, 0, 1, 1, + 1, 0, 2, 3, 1, 1, 3, 1, 0, 6, + 1, 1, 3, 1, 1, 2, 0, 3, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, + 1, 2, 2, 2, 3, 2, 0, 1, 2, 2, + 3, 9, 9, 8, 13, 1, 1, 6, 5, 2, + 6, 7, 1, 3, 1, 0, 2, 1, 5, 5, + 5, 2, 4, 4, 6, 4, 4, 4, 2, 7, + 1, 2, 0, 1, 0, 2, 5, 2, 5, 2, + 4, 6, 4 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 118, 0, 40, 111, 1, 110, 146, 36, 37, 38, + 39, 41, 166, 108, 109, 166, 128, 129, 0, 0, + 40, 0, 113, 41, 0, 42, 43, 44, 0, 0, + 167, 163, 35, 143, 144, 145, 162, 0, 0, 0, + 116, 0, 0, 0, 0, 34, 147, 45, 2, 3, + 47, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 0, 0, 0, 0, 157, + 0, 0, 46, 65, 50, 158, 66, 140, 141, 142, + 204, 165, 0, 0, 0, 127, 117, 112, 105, 106, + 0, 0, 67, 0, 0, 49, 72, 74, 0, 0, + 79, 73, 203, 0, 187, 0, 0, 0, 0, 41, + 175, 176, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, + 0, 0, 164, 41, 179, 0, 200, 123, 120, 119, + 121, 122, 126, 0, 115, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, + 114, 0, 0, 71, 0, 138, 78, 76, 0, 0, + 191, 186, 169, 168, 0, 0, 25, 29, 24, 28, + 23, 27, 22, 26, 30, 31, 0, 0, 205, 207, + 209, 0, 0, 198, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 124, 0, 93, 94, + 4, 5, 91, 92, 95, 90, 86, 87, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 88, 48, 48, 75, 137, 131, 134, 135, 0, 0, + 68, 148, 149, 150, 151, 152, 153, 154, 0, 156, + 160, 159, 161, 0, 170, 0, 0, 0, 0, 202, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 125, 0, 0, 0, 81, 104, + 0, 0, 85, 0, 82, 0, 0, 0, 0, 69, + 70, 130, 132, 0, 139, 77, 0, 0, 0, 0, + 0, 0, 0, 212, 0, 0, 193, 0, 195, 196, + 197, 0, 0, 0, 192, 0, 210, 0, 202, 0, + 0, 80, 0, 83, 84, 0, 0, 0, 0, 136, + 133, 155, 0, 0, 185, 206, 208, 182, 201, 0, + 0, 0, 188, 189, 190, 185, 0, 0, 0, 0, + 103, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 194, 0, 211, 97, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 180, 0, 199, 96, + 0, 99, 100, 101, 102, 0, 173, 0, 0, 0, + 181, 0, 171, 0, 172, 0, 0, 98, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 177, 174 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 69, 222, 235, 236, 237, 238, 166, 167, 196, + 168, 20, 11, 28, 70, 71, 169, 73, 74, 98, + 178, 289, 259, 290, 90, 1, 2, 3, 150, 40, + 86, 153, 75, 302, 246, 247, 248, 29, 79, 12, + 35, 13, 14, 23, 260, 76, 262, 347, 15, 31, + 32, 142, 398, 81, 203, 367, 368, 143, 144, 313, + 145, 146 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -383 +static const short yypact[] = +{ + -383, 48, 136, 517, -383, -383, -383, -383, -383, -383, + -383, 27, 36, -383, -383, -17, -383, -383, 46, -21, + -3, 3, -383, 27, 73, -383, -383, -383, 879, -24, + -383, -383, 113, -383, -383, -383, -383, 20, 51, 60, + -383, 21, 879, -13, -13, -383, -383, -383, -383, -383, + 62, -383, -383, -383, -383, -383, -383, -383, -383, -383, + -383, -383, -383, -383, -383, 156, 162, 164, 480, -383, + 113, 76, -383, -383, -25, -383, -383, -383, -383, -383, + 992, -383, 149, 37, 170, 157, -383, -383, -383, -383, + 900, 941, -383, 81, 83, -383, -383, -25, 34, 87, + 643, -383, -383, 900, -383, 130, 999, 32, 243, 27, + -383, -383, -383, -383, -383, -383, -383, -383, -383, -383, + -383, -383, -383, -383, -383, -383, 900, 900, 900, 900, + 900, 900, 900, -383, -383, 900, 900, 900, 900, 900, + 900, 900, -383, 27, -383, 22, -383, -383, -383, -383, + -383, -383, -383, -82, -383, 122, 148, 184, 153, 185, + 159, 186, 161, 187, 191, 193, 167, 197, 195, 380, + -383, 900, 900, -383, 900, 680, -383, 97, 114, 549, + -383, -383, 62, -383, 549, 549, -383, -383, -383, -383, + -383, -383, -383, -383, -383, -383, 549, 879, 108, 109, + -383, 549, 118, 111, 183, 116, 117, 119, 121, 549, + 549, 549, 124, 879, 900, 900, -383, 196, -383, -383, + -383, -383, -383, -383, -383, -383, -383, -383, 123, 132, + 135, 742, 941, 501, 208, 137, 144, 145, 147, -383, + -383, -84, -12, -25, -383, 113, -383, 155, 154, 779, + -383, -383, -383, -383, -383, -383, -383, -383, 941, -383, + -383, -383, -383, 158, -383, 160, 549, 235, 247, 173, + 549, 165, 900, 900, 900, 900, 900, 174, 175, 176, + 900, 549, 549, 177, -383, 941, 941, 941, -383, -383, + -54, -57, -383, 42, -383, 941, 941, 941, 941, -383, + -383, -383, -383, 842, -383, -383, -30, 244, 246, 172, + 549, 549, 900, -383, 179, 549, -383, 180, -383, -383, + -383, 549, 549, 549, -383, 194, -383, 900, 173, 241, + 181, -383, 941, -383, -383, 190, 198, 199, 202, -383, + -383, -383, 549, 549, 900, -383, -383, -383, 205, 549, + 206, 900, -383, -383, -383, 900, 549, 192, 900, 941, + -383, 941, 941, 941, 941, 207, 203, 205, 200, 900, + 214, 549, -383, 218, -383, -383, 220, 212, 222, 223, + 224, 225, 281, 17, 268, -383, -383, 226, -383, -383, + 941, -383, -383, -383, -383, 549, -383, 54, 53, 303, + -383, 228, -383, 227, -383, 54, 549, -383, 307, 231, + 265, 549, 310, 311, -383, 549, 549, -383, -383 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -383, -383, -383, 254, 262, 264, 272, -106, -105, -372, + -383, 313, 333, -101, -38, -383, -28, -383, -56, 255, + -383, -90, 188, -223, 312, -383, -383, -383, -383, -383, + -383, -383, 4, -383, 55, -383, -383, 331, -383, -383, + -383, -383, 356, -383, -382, 25, 28, -81, -383, 345, + -383, -383, -383, -383, -383, 49, 7, -383, -383, 35, + -383, -383 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -108 +static const short yytable[] = +{ + 72, 170, 194, 195, 87, 77, 30, 21, 197, 291, + 293, 397, 97, 33, 72, 403, 299, 42, 216, 88, + 89, 101, 180, 409, 217, 183, 405, 186, 187, 188, + 189, 190, 191, 192, 193, 306, 21, 7, 8, 9, + 10, 184, 213, 43, 97, 333, 331, 200, 4, 332, + 204, 205, 332, 185, 206, 207, 208, 251, 252, 30, + 212, 253, 154, 186, 187, 188, 189, 190, 191, 192, + 193, -48, 341, 41, 99, 179, 332, 47, 179, 78, + 101, 254, 255, 24, 25, 26, 27, 34, 148, 149, + 300, 256, 257, 101, 37, 38, 39, 45, 198, 199, + 179, 201, 202, 179, 179, 214, 215, 179, 179, 179, + 209, 210, 211, 179, 82, 241, 242, 396, 243, 85, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 283, 16, -107, 17, 173, 228, + 174, 229, 230, 133, 134, 83, 334, 245, 332, 218, + 219, -25, -25, 404, 84, 258, -24, -24, -49, 266, + 92, 5, -23, -23, -22, -22, 93, 6, 94, 72, + 220, 221, 100, 147, 151, 281, 7, 8, 9, 10, + 171, 152, 172, 175, 181, 72, 282, 179, -29, -28, + -27, -26, 317, 243, 240, 328, 329, 330, -32, 324, + -33, 223, 224, 249, 261, 335, 336, 337, 338, 261, + 261, 250, 263, 264, 267, 268, 270, 271, 272, 285, + 284, 261, 273, 274, 265, 275, 261, 276, 286, 269, + 280, 287, 294, 295, 261, 261, 261, 277, 278, 279, + 296, 297, 360, 298, 316, 179, 318, 319, 320, 301, + 310, 304, 179, 186, 187, 188, 189, 190, 191, 192, + 193, 303, 311, 315, 307, 342, 308, 343, 344, 377, + 372, 378, 379, 380, 381, 245, 358, 194, 195, 312, + 321, 322, 323, 327, 179, 349, 351, 359, 385, 375, + 355, 261, 194, 195, 309, 261, 361, 384, 314, 356, + 401, 383, 395, 399, 362, 363, 261, 261, 364, 325, + 326, 369, 371, 382, 386, 388, 179, 389, 390, 391, + 392, 393, 394, 179, 406, 407, 400, 179, 411, 413, + 376, 415, 416, 408, 138, 261, 261, 412, 345, 346, + 261, 179, 139, 350, 140, 80, 261, 261, 261, 352, + 353, 354, 141, 44, 46, 177, 91, 239, 340, 22, + 36, 348, 373, 357, 0, 0, 0, 261, 261, 0, + 365, 366, 0, 0, 261, 0, 0, 370, 0, 0, + 0, 261, 0, 0, 374, 48, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 261, 0, 0, 387, + 0, 0, 16, 0, 17, 0, 225, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 226, 227, 0, + 261, 0, 0, 402, 0, 0, 0, 0, 0, 0, + 0, 261, 0, 0, 410, 0, 261, 0, 0, 414, + 261, 261, 0, 417, 418, 0, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 0, 0, 0, 0, 0, 228, 0, 229, 230, 133, + 134, 0, 0, 0, 0, 0, 0, 0, 231, 0, + 0, 232, 0, 233, 0, 48, 49, 234, 95, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 16, 0, 17, 0, 48, 49, 0, 95, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 62, 63, 16, 64, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -35, 0, 16, + 0, 17, 0, 0, 0, 64, 0, 0, 6, -35, + -35, 0, 251, 252, 48, 49, 253, -35, -35, -35, + -35, 0, 0, -35, 18, 0, 0, 0, 0, 0, + 19, 16, 0, 17, 0, 65, 254, 255, 66, 0, + 0, 67, 0, 68, 96, 0, 256, 257, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 0, 66, + 0, 0, 67, 0, 68, 292, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 0, + 0, 0, 0, 0, 228, 0, 229, 230, 133, 134, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, + 258, 95, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 16, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 48, 49, 64, 95, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 16, 0, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, + 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, + 0, 66, 0, 0, 67, 0, 68, 48, 49, 0, + 95, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 62, 63, 16, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 0, 65, 0, 0, 66, 0, + 0, 67, 0, 68, 48, 49, 64, 95, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 16, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 305, 0, 0, 0, 0, + 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, + 66, 0, 288, 67, 0, 68, 0, 48, 49, 0, + 95, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 16, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 0, 66, 339, 0, + 67, 0, 68, 0, 48, 49, 64, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 16, 0, 17, 0, 48, 49, 0, 95, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 16, 64, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, + 66, 0, 0, 67, 64, 68, 48, 49, 0, 95, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 62, 63, 16, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 0, 66, 0, 0, + 67, 0, 68, 0, 0, 64, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 65, 0, 0, 66, 0, + 0, 67, 0, 68, 48, 49, 0, 182, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 16, 0, 17, 0, 0, 102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 103, 0, 66, + 0, 0, 67, 64, 68, 0, 104, 105, 0, 0, + 0, 0, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 0, 0, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 0, 66, 0, 0, + 67, 0, 68 +}; + +static const short yycheck[] = +{ + 28, 91, 108, 108, 42, 29, 23, 3, 109, 232, + 233, 383, 68, 30, 42, 397, 100, 20, 100, 32, + 33, 105, 103, 405, 106, 106, 398, 10, 11, 12, + 13, 14, 15, 16, 17, 258, 32, 40, 41, 42, + 43, 9, 143, 46, 100, 102, 100, 128, 0, 106, + 131, 132, 106, 21, 135, 136, 137, 3, 4, 23, + 141, 7, 90, 10, 11, 12, 13, 14, 15, 16, + 17, 96, 102, 94, 70, 103, 106, 4, 106, 103, + 105, 27, 28, 56, 57, 58, 59, 104, 51, 52, + 102, 37, 38, 105, 48, 49, 50, 94, 126, 127, + 128, 129, 130, 131, 132, 83, 84, 135, 136, 137, + 138, 139, 140, 141, 94, 171, 172, 100, 174, 98, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 215, 22, 0, 24, 104, 85, + 106, 87, 88, 89, 90, 94, 104, 175, 106, 27, + 28, 3, 4, 100, 94, 101, 3, 4, 96, 197, + 4, 25, 3, 4, 3, 4, 4, 31, 4, 197, + 3, 4, 96, 24, 4, 213, 40, 41, 42, 43, + 99, 24, 99, 96, 54, 213, 214, 215, 4, 4, + 4, 4, 273, 249, 169, 285, 286, 287, 7, 280, + 7, 4, 7, 106, 179, 295, 296, 297, 298, 184, + 185, 97, 184, 185, 106, 106, 98, 106, 35, 96, + 24, 196, 106, 106, 196, 106, 201, 106, 96, 201, + 106, 96, 24, 96, 209, 210, 211, 209, 210, 211, + 96, 96, 332, 96, 272, 273, 274, 275, 276, 245, + 15, 97, 280, 10, 11, 12, 13, 14, 15, 16, + 17, 106, 15, 98, 106, 21, 106, 21, 96, 359, + 351, 361, 362, 363, 364, 303, 35, 383, 383, 106, + 106, 106, 106, 106, 312, 106, 106, 106, 369, 97, + 96, 266, 398, 398, 266, 270, 106, 97, 270, 327, + 390, 98, 21, 35, 106, 106, 281, 282, 106, 281, + 282, 106, 106, 106, 100, 97, 344, 97, 106, 97, + 97, 97, 97, 351, 21, 97, 100, 355, 21, 64, + 358, 21, 21, 106, 80, 310, 311, 106, 310, 311, + 315, 369, 80, 315, 80, 32, 321, 322, 323, 321, + 322, 323, 80, 20, 23, 100, 44, 169, 303, 3, + 15, 312, 355, 328, -1, -1, -1, 342, 343, -1, + 342, 343, -1, -1, 349, -1, -1, 349, -1, -1, + -1, 356, -1, -1, 356, 5, 6, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 371, -1, -1, 371, + -1, -1, 22, -1, 24, -1, 26, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 37, 38, -1, + 395, -1, -1, 395, -1, -1, -1, -1, -1, -1, + -1, 406, -1, -1, 406, -1, 411, -1, -1, 411, + 415, 416, -1, 415, 416, -1, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + -1, -1, -1, -1, -1, 85, -1, 87, 88, 89, + 90, -1, -1, -1, -1, -1, -1, -1, 98, -1, + -1, 101, -1, 103, -1, 5, 6, 107, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, -1, 24, -1, 5, 6, -1, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 44, 24, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 20, -1, 22, + -1, 24, -1, -1, -1, 44, -1, -1, 31, 32, + 33, -1, 3, 4, 5, 6, 7, 40, 41, 42, + 43, -1, -1, 46, 47, -1, -1, -1, -1, -1, + 53, 22, -1, 24, -1, 95, 27, 28, 98, -1, + -1, 101, -1, 103, 104, -1, 37, 38, -1, -1, + -1, -1, -1, -1, -1, -1, 95, -1, -1, 98, + -1, -1, 101, -1, 103, 104, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, -1, + -1, -1, -1, -1, 85, -1, 87, 88, 89, 90, + -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, + 101, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, -1, -1, 5, 6, 44, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, + -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 95, -1, + -1, 98, -1, -1, 101, -1, 103, 5, 6, -1, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, -1, -1, -1, 95, -1, -1, 98, -1, + -1, 101, -1, 103, 5, 6, 44, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, + -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 95, -1, -1, + 98, -1, 100, 101, -1, 103, -1, 5, 6, -1, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, -1, -1, 95, -1, -1, 98, 36, -1, + 101, -1, 103, -1, 5, 6, 44, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, 5, 6, -1, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 44, 24, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 95, -1, -1, + 98, -1, -1, 101, 44, 103, 5, 6, -1, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, + -1, -1, -1, -1, 95, -1, -1, 98, -1, -1, + 101, -1, 103, -1, -1, 44, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 95, -1, -1, 98, -1, + -1, 101, -1, 103, 5, 6, -1, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, 34, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 95, 45, -1, 98, + -1, -1, 101, 44, 103, -1, 54, 55, -1, -1, + -1, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, -1, -1, 85, 86, 87, + 88, 89, 90, 91, 92, 93, -1, -1, -1, -1, + -1, -1, -1, -1, 95, -1, -1, 98, -1, -1, + 101, -1, 103 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 133, 134, 135, 0, 25, 31, 40, 41, 42, + 43, 120, 147, 149, 150, 156, 22, 24, 47, 53, + 119, 140, 150, 151, 56, 57, 58, 59, 121, 145, + 23, 157, 158, 30, 104, 148, 157, 48, 49, 50, + 137, 94, 20, 46, 120, 94, 145, 4, 5, 6, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 44, 95, 98, 101, 103, 109, + 122, 123, 124, 125, 126, 140, 153, 29, 103, 146, + 119, 161, 94, 94, 94, 98, 138, 122, 32, 33, + 132, 132, 4, 4, 4, 8, 104, 126, 127, 140, + 96, 105, 34, 45, 54, 55, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 111, 112, + 113, 114, 159, 165, 166, 168, 169, 24, 51, 52, + 136, 4, 24, 139, 124, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 115, 116, 118, 124, + 129, 99, 99, 104, 106, 96, 36, 127, 128, 124, + 155, 54, 8, 155, 9, 21, 10, 11, 12, 13, + 14, 15, 16, 17, 115, 116, 117, 121, 124, 124, + 155, 124, 124, 162, 155, 155, 155, 155, 155, 124, + 124, 124, 155, 121, 83, 84, 100, 106, 27, 28, + 3, 4, 110, 4, 7, 26, 37, 38, 85, 87, + 88, 98, 101, 103, 107, 111, 112, 113, 114, 130, + 153, 126, 126, 126, 36, 124, 142, 143, 144, 106, + 97, 3, 4, 7, 27, 28, 37, 38, 101, 130, + 152, 153, 154, 154, 154, 154, 122, 106, 106, 154, + 98, 106, 35, 106, 106, 106, 106, 154, 154, 154, + 106, 122, 124, 155, 24, 96, 96, 96, 100, 129, + 131, 131, 104, 131, 24, 96, 96, 96, 96, 100, + 102, 140, 141, 106, 97, 36, 131, 106, 106, 154, + 15, 15, 106, 167, 154, 98, 124, 155, 124, 124, + 124, 106, 106, 106, 155, 154, 154, 106, 129, 129, + 129, 100, 106, 102, 104, 129, 129, 129, 129, 36, + 142, 102, 21, 21, 96, 154, 154, 155, 163, 106, + 154, 106, 154, 154, 154, 96, 124, 167, 35, 106, + 129, 106, 106, 106, 106, 154, 154, 163, 164, 106, + 154, 106, 155, 164, 154, 97, 124, 129, 129, 129, + 129, 129, 106, 98, 97, 155, 100, 154, 97, 97, + 106, 97, 97, 97, 97, 21, 100, 117, 160, 35, + 100, 129, 154, 152, 100, 117, 21, 97, 106, 152, + 154, 21, 106, 64, 154, 21, 21, 154, 154 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: +#line 983 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range! + ThrowException("Value too large for type!"); + yyval.SIntVal = (int32_t)yyvsp[0].UIntVal; +;} + break; + + case 5: +#line 991 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range! + ThrowException("Value too large for type!"); + yyval.SInt64Val = (int64_t)yyvsp[0].UInt64Val; +;} + break; + + case 34: +#line 1014 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.StrVal = yyvsp[-1].StrVal; + ;} + break; + + case 35: +#line 1017 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.StrVal = 0; + ;} + break; + + case 36: +#line 1021 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::InternalLinkage; ;} + break; + + case 37: +#line 1022 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;} + break; + + case 38: +#line 1023 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::WeakLinkage; ;} + break; + + case 39: +#line 1024 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::AppendingLinkage; ;} + break; + + case 40: +#line 1025 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::ExternalLinkage; ;} + break; + + case 41: +#line 1027 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::C; ;} + break; + + case 42: +#line 1028 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::C; ;} + break; + + case 43: +#line 1029 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::Fast; ;} + break; + + case 44: +#line 1030 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::Cold; ;} + break; + + case 45: +#line 1031 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) + ThrowException("Calling conv too large!"); + yyval.UIntVal = yyvsp[0].UInt64Val; + ;} + break; + + case 47: +#line 1044 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + break; + + case 49: +#line 1045 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + break; + + case 50: +#line 1047 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!UpRefs.empty()) + ThrowException("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); + yyval.TypeVal = yyvsp[0].TypeVal; + ;} + break; + + case 64: +#line 1058 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.TypeVal = new PATypeHolder(OpaqueType::get()); + ;} + break; + + case 65: +#line 1061 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); + ;} + break; + + case 66: +#line 1064 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Named types are also simple types... + yyval.TypeVal = new PATypeHolder(getTypeVal(yyvsp[0].ValIDVal)); +;} + break; + + case 67: +#line 1070 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Type UpReference + if (yyvsp[0].UInt64Val > (uint64_t)~0U) ThrowException("Value out of range!"); + OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder + UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector... + yyval.TypeVal = new PATypeHolder(OT); + UR_OUT("New Upreference!\n"); + ;} + break; + + case 68: +#line 1077 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Function derived type? + std::vector Params; + for (std::list::iterator I = yyvsp[-1].TypeList->begin(), + E = yyvsp[-1].TypeList->end(); I != E; ++I) + Params.push_back(*I); + bool isVarArg = Params.size() && Params.back() == Type::VoidTy; + if (isVarArg) Params.pop_back(); + + yyval.TypeVal = new PATypeHolder(HandleUpRefs(FunctionType::get(*yyvsp[-3].TypeVal,Params,isVarArg))); + delete yyvsp[-1].TypeList; // Delete the argument list + delete yyvsp[-3].TypeVal; // Delete the return type handle + ;} + break; + + case 69: +#line 1089 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Sized array type? + yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 70: +#line 1093 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Packed array type? + const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); + if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) { + ThrowException("Unsigned result not equal to signed result"); + } + if(!ElemTy->isPrimitiveType()) { + ThrowException("Elemental type of a PackedType must be primitive"); + } + yyval.TypeVal = new PATypeHolder(HandleUpRefs(PackedType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 71: +#line 1104 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Structure type? + std::vector Elements; + for (std::list::iterator I = yyvsp[-1].TypeList->begin(), + E = yyvsp[-1].TypeList->end(); I != E; ++I) + Elements.push_back(*I); + + yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); + delete yyvsp[-1].TypeList; + ;} + break; + + case 72: +#line 1113 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Empty structure type? + yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); + ;} + break; + + case 73: +#line 1116 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Pointer type? + yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 74: +#line 1124 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.TypeList = new std::list(); + yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + ;} + break; + + case 75: +#line 1128 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; + ;} + break; + + case 77: +#line 1134 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeList=yyvsp[-2].TypeList)->push_back(Type::VoidTy); + ;} + break; + + case 78: +#line 1137 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.TypeList = new std::list())->push_back(Type::VoidTy); + ;} + break; + + case 79: +#line 1140 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.TypeList = new std::list(); + ;} + break; + + case 80: +#line 1150 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr + const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); + if (ATy == 0) + ThrowException("Cannot make array constant with type: '" + + (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + const Type *ETy = ATy->getElementType(); + int NumElements = ATy->getNumElements(); + + // Verify that we have the correct size... + if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) + ThrowException("Type mismatch: constant sized array initialized with " + + utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + itostr(NumElements) + "!"); + + // Verify all elements are correct type! + for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { + if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + ThrowException("Element #" + utostr(i) + " is not of type '" + + ETy->getDescription() +"' as required!\nIt is of type '"+ + (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + } + + yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector); + delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + ;} + break; + + case 81: +#line 1175 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + if (ATy == 0) + ThrowException("Cannot make array constant with type: '" + + (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + + int NumElements = ATy->getNumElements(); + if (NumElements != -1 && NumElements != 0) + ThrowException("Type mismatch: constant sized array initialized with 0" + " arguments, but has size of " + itostr(NumElements) +"!"); + yyval.ConstVal = ConstantArray::get(ATy, std::vector()); + delete yyvsp[-2].TypeVal; + ;} + break; + + case 82: +#line 1188 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); + if (ATy == 0) + ThrowException("Cannot make array constant with type: '" + + (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + + int NumElements = ATy->getNumElements(); + const Type *ETy = ATy->getElementType(); + char *EndStr = UnEscapeLexed(yyvsp[0].StrVal, true); + if (NumElements != -1 && NumElements != (EndStr-yyvsp[0].StrVal)) + ThrowException("Can't build string constant of size " + + itostr((int)(EndStr-yyvsp[0].StrVal)) + + " when array has size " + itostr(NumElements) + "!"); + std::vector Vals; + if (ETy == Type::SByteTy) { + for (char *C = yyvsp[0].StrVal; C != EndStr; ++C) + Vals.push_back(ConstantSInt::get(ETy, *C)); + } else if (ETy == Type::UByteTy) { + for (char *C = yyvsp[0].StrVal; C != EndStr; ++C) + Vals.push_back(ConstantUInt::get(ETy, (unsigned char)*C)); + } else { + free(yyvsp[0].StrVal); + ThrowException("Cannot build string arrays of non byte sized elements!"); + } + free(yyvsp[0].StrVal); + yyval.ConstVal = ConstantArray::get(ATy, Vals); + delete yyvsp[-2].TypeVal; + ;} + break; + + case 83: +#line 1216 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr + const PackedType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); + if (PTy == 0) + ThrowException("Cannot make packed constant with type: '" + + (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + const Type *ETy = PTy->getElementType(); + int NumElements = PTy->getNumElements(); + + // Verify that we have the correct size... + if (NumElements != -1 && NumElements != (int)yyvsp[-1].ConstVector->size()) + ThrowException("Type mismatch: constant sized packed initialized with " + + utostr(yyvsp[-1].ConstVector->size()) + " arguments, but has size of " + + itostr(NumElements) + "!"); + + // Verify all elements are correct type! + for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { + if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + ThrowException("Element #" + utostr(i) + " is not of type '" + + ETy->getDescription() +"' as required!\nIt is of type '"+ + (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + } + + yyval.ConstVal = ConstantPacked::get(PTy, *yyvsp[-1].ConstVector); + delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + ;} + break; + + case 84: +#line 1241 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); + if (STy == 0) + ThrowException("Cannot make struct constant with type: '" + + (*yyvsp[-3].TypeVal)->getDescription() + "'!"); + + if (yyvsp[-1].ConstVector->size() != STy->getNumContainedTypes()) + ThrowException("Illegal number of initializers for structure type!"); + + // Check to ensure that constants are compatible with the type initializer! + for (unsigned i = 0, e = yyvsp[-1].ConstVector->size(); i != e; ++i) + if ((*yyvsp[-1].ConstVector)[i]->getType() != STy->getElementType(i)) + ThrowException("Expected type '" + + STy->getElementType(i)->getDescription() + + "' for element #" + utostr(i) + + " of structure initializer!"); + + yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector); + delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; + ;} + break; + + case 85: +#line 1261 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); + if (STy == 0) + ThrowException("Cannot make struct constant with type: '" + + (*yyvsp[-2].TypeVal)->getDescription() + "'!"); + + if (STy->getNumContainedTypes() != 0) + ThrowException("Illegal number of initializers for structure type!"); + + yyval.ConstVal = ConstantStruct::get(STy, std::vector()); + delete yyvsp[-2].TypeVal; + ;} + break; + + case 86: +#line 1273 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); + if (PTy == 0) + ThrowException("Cannot make null pointer constant with type: '" + + (*yyvsp[-1].TypeVal)->getDescription() + "'!"); + + yyval.ConstVal = ConstantPointerNull::get(PTy); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 87: +#line 1282 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 88: +#line 1286 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); + if (Ty == 0) + ThrowException("Global const reference must be a pointer type!"); + + // ConstExprs can exist in the body of a function, thus creating + // GlobalValues whenever they refer to a variable. Because we are in + // the context of a function, getValNonImprovising will search the functions + // symbol table instead of the module symbol table for the global symbol, + // which throws things all off. To get around this, we just tell + // getValNonImprovising that we are at global scope here. + // + Function *SavedCurFn = CurFun.CurrentFunction; + CurFun.CurrentFunction = 0; + + Value *V = getValNonImprovising(Ty, yyvsp[0].ValIDVal); + + CurFun.CurrentFunction = SavedCurFn; + + // If this is an initializer for a constant pointer, which is referencing a + // (currently) undefined variable, create a stub now that shall be replaced + // in the future with the right type of variable. + // + if (V == 0) { + assert(isa(Ty) && "Globals may only be used as pointers!"); + const PointerType *PT = cast(Ty); + + // First check to see if the forward references value is already created! + PerModuleInfo::GlobalRefsType::iterator I = + CurModule.GlobalRefs.find(std::make_pair(PT, yyvsp[0].ValIDVal)); + + if (I != CurModule.GlobalRefs.end()) { + V = I->second; // Placeholder already exists, use it... + yyvsp[0].ValIDVal.destroy(); + } else { + std::string Name; + if (yyvsp[0].ValIDVal.Type == ValID::NameVal) Name = yyvsp[0].ValIDVal.Name; + + // Create the forward referenced global. + GlobalValue *GV; + if (const FunctionType *FTy = + dyn_cast(PT->getElementType())) { + GV = new Function(FTy, GlobalValue::ExternalLinkage, Name, + CurModule.CurrentModule); + } else { + GV = new GlobalVariable(PT->getElementType(), false, + GlobalValue::ExternalLinkage, 0, + Name, CurModule.CurrentModule); + } + + // Keep track of the fact that we have a forward ref to recycle it + CurModule.GlobalRefs.insert(std::make_pair(std::make_pair(PT, yyvsp[0].ValIDVal), GV)); + V = GV; + } + } + + yyval.ConstVal = cast(V); + delete yyvsp[-1].TypeVal; // Free the type handle + ;} + break; + + case 89: +#line 1345 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) + ThrowException("Mismatched types for constant expression!"); + yyval.ConstVal = yyvsp[0].ConstVal; + delete yyvsp[-1].TypeVal; + ;} + break; + + case 90: +#line 1351 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const Type *Ty = yyvsp[-1].TypeVal->get(); + if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) + ThrowException("Cannot create a null initialized value of this type!"); + yyval.ConstVal = Constant::getNullValue(Ty); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 91: +#line 1359 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantSInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) + ThrowException("Constant value doesn't fit in type!"); + yyval.ConstVal = ConstantSInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val); + ;} + break; + + case 92: +#line 1364 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // integral constants + if (!ConstantUInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) + ThrowException("Constant value doesn't fit in type!"); + yyval.ConstVal = ConstantUInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val); + ;} + break; + + case 93: +#line 1369 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + yyval.ConstVal = ConstantBool::True; + ;} + break; + + case 94: +#line 1372 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants + yyval.ConstVal = ConstantBool::False; + ;} + break; + + case 95: +#line 1375 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Float & Double constants + if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) + ThrowException("Floating point constant invalid for type!!"); + yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal); + ;} + break; + + case 96: +#line 1382 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!yyvsp[-3].ConstVal->getType()->isFirstClassType()) + ThrowException("cast constant expression from a non-primitive type: '" + + yyvsp[-3].ConstVal->getType()->getDescription() + "'!"); + if (!yyvsp[-1].TypeVal->get()->isFirstClassType()) + ThrowException("cast constant expression to a non-primitive type: '" + + yyvsp[-1].TypeVal->get()->getDescription() + "'!"); + yyval.ConstVal = ConstantExpr::getCast(yyvsp[-3].ConstVal, yyvsp[-1].TypeVal->get()); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 97: +#line 1392 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa(yyvsp[-2].ConstVal->getType())) + ThrowException("GetElementPtr requires a pointer operand!"); + + // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte struct + // indices to uint struct indices for compatibility. + generic_gep_type_iterator::iterator> + GTI = gep_type_begin(yyvsp[-2].ConstVal->getType(), yyvsp[-1].ValueList->begin(), yyvsp[-1].ValueList->end()), + GTE = gep_type_end(yyvsp[-2].ConstVal->getType(), yyvsp[-1].ValueList->begin(), yyvsp[-1].ValueList->end()); + for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e && GTI != GTE; ++i, ++GTI) + if (isa(*GTI)) // Only change struct indices + if (ConstantUInt *CUI = dyn_cast((*yyvsp[-1].ValueList)[i])) + if (CUI->getType() == Type::UByteTy) + (*yyvsp[-1].ValueList)[i] = ConstantExpr::getCast(CUI, Type::UIntTy); + + const Type *IdxTy = + GetElementPtrInst::getIndexedType(yyvsp[-2].ConstVal->getType(), *yyvsp[-1].ValueList, true); + if (!IdxTy) + ThrowException("Index list invalid for constant getelementptr!"); + + std::vector IdxVec; + for (unsigned i = 0, e = yyvsp[-1].ValueList->size(); i != e; ++i) + if (Constant *C = dyn_cast((*yyvsp[-1].ValueList)[i])) + IdxVec.push_back(C); + else + ThrowException("Indices to constant getelementptr must be constants!"); + + delete yyvsp[-1].ValueList; + + yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, IdxVec); + ;} + break; + + case 98: +#line 1423 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[-5].ConstVal->getType() != Type::BoolTy) + ThrowException("Select condition must be of boolean type!"); + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ThrowException("Select operand types must match!"); + yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + ;} + break; + + case 99: +#line 1430 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ThrowException("Binary operator types must match!"); + // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs. + // To retain backward compatibility with these early compilers, we emit a + // cast to the appropriate integer type automatically if we are in the + // broken case. See PR424 for more information. + if (!isa(yyvsp[-3].ConstVal->getType())) { + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + } else { + const Type *IntPtrTy = 0; + switch (CurModule.CurrentModule->getPointerSize()) { + case Module::Pointer32: IntPtrTy = Type::IntTy; break; + case Module::Pointer64: IntPtrTy = Type::LongTy; break; + default: ThrowException("invalid pointer binary constant expr!"); + } + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, ConstantExpr::getCast(yyvsp[-3].ConstVal, IntPtrTy), + ConstantExpr::getCast(yyvsp[-1].ConstVal, IntPtrTy)); + yyval.ConstVal = ConstantExpr::getCast(yyval.ConstVal, yyvsp[-3].ConstVal->getType()); + } + ;} + break; + + case 100: +#line 1451 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ThrowException("Logical operator types must match!"); + if (!yyvsp[-3].ConstVal->getType()->isIntegral()) + ThrowException("Logical operands must have integral types!"); + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + ;} + break; + + case 101: +#line 1458 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) + ThrowException("setcc operand types must match!"); + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + ;} + break; + + case 102: +#line 1463 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) + ThrowException("Shift count for shift constant must be unsigned byte!"); + if (!yyvsp[-3].ConstVal->getType()->isInteger()) + ThrowException("Shift constant expression requires integer operand!"); + yyval.ConstVal = ConstantExpr::get(yyvsp[-5].OtherOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); + ;} + break; + + case 103: +#line 1473 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); + ;} + break; + + case 104: +#line 1476 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ConstVector = new std::vector(); + yyval.ConstVector->push_back(yyvsp[0].ConstVal); + ;} + break; + + case 105: +#line 1483 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = false; ;} + break; + + case 106: +#line 1483 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = true; ;} + break; + + case 107: +#line 1493 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; + CurModule.ModuleDone(); +;} + break; + + case 108: +#line 1500 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ModuleVal = yyvsp[-1].ModuleVal; + CurFun.FunctionDone(); + ;} + break; + + case 109: +#line 1504 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ModuleVal = yyvsp[-1].ModuleVal; + ;} + break; + + case 110: +#line 1507 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ModuleVal = yyvsp[-1].ModuleVal; + ;} + break; + + case 111: +#line 1510 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ModuleVal = CurModule.CurrentModule; + // Emit an error if there are any unresolved types left. + if (!CurModule.LateResolveTypes.empty()) { + const ValID &DID = CurModule.LateResolveTypes.begin()->first; + if (DID.Type == ValID::NameVal) + ThrowException("Reference to an undefined type: '"+DID.getName() + "'"); + else + ThrowException("Reference to an undefined type: #" + itostr(DID.Num)); + } + ;} + break; + + case 112: +#line 1523 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + // Eagerly resolve types. This is not an optimization, this is a + // requirement that is due to the fact that we could have this: + // + // %list = type { %list * } + // %list = type { %list * } ; repeated type decl + // + // If types are not resolved eagerly, then the two types will not be + // determined to be the same type! + // + ResolveTypeTo(yyvsp[-2].StrVal, *yyvsp[0].TypeVal); + + if (!setTypeName(*yyvsp[0].TypeVal, yyvsp[-2].StrVal) && !yyvsp[-2].StrVal) { + // If this is a named type that is not a redefinition, add it to the slot + // table. + CurModule.Types.push_back(*yyvsp[0].TypeVal); + } + + delete yyvsp[0].TypeVal; + ;} + break; + + case 113: +#line 1543 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Function prototypes can be in const pool + ;} + break; + + case 114: +#line 1545 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[0].ConstVal == 0) ThrowException("Global value initializer is not a constant!"); + ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); + ;} + break; + + case 115: +#line 1549 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); + delete yyvsp[0].TypeVal; + ;} + break; + + case 116: +#line 1553 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 117: +#line 1555 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 118: +#line 1557 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 119: +#line 1562 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.Endianness = Module::BigEndian; ;} + break; + + case 120: +#line 1563 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.Endianness = Module::LittleEndian; ;} + break; + + case 121: +#line 1565 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); + ;} + break; + + case 122: +#line 1568 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[0].UInt64Val == 32) + CurModule.CurrentModule->setPointerSize(Module::Pointer32); + else if (yyvsp[0].UInt64Val == 64) + CurModule.CurrentModule->setPointerSize(Module::Pointer64); + else + ThrowException("Invalid pointer size: '" + utostr(yyvsp[0].UInt64Val) + "'!"); + ;} + break; + + case 123: +#line 1576 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); + free(yyvsp[0].StrVal); + ;} + break; + + case 125: +#line 1583 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); + free(yyvsp[0].StrVal); + ;} + break; + + case 126: +#line 1587 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); + free(yyvsp[0].StrVal); + ;} + break; + + case 127: +#line 1591 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 131: +#line 1600 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = 0; ;} + break; + + case 132: +#line 1602 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (*yyvsp[-1].TypeVal == Type::VoidTy) + ThrowException("void typed arguments are invalid!"); + yyval.ArgVal = new std::pair(yyvsp[-1].TypeVal, yyvsp[0].StrVal); +;} + break; + + case 133: +#line 1608 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ArgList = yyvsp[-2].ArgList; + yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); + delete yyvsp[0].ArgVal; + ;} + break; + + case 134: +#line 1613 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ArgList = new std::vector >(); + yyval.ArgList->push_back(*yyvsp[0].ArgVal); + delete yyvsp[0].ArgVal; + ;} + break; + + case 135: +#line 1619 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ArgList = yyvsp[0].ArgList; + ;} + break; + + case 136: +#line 1622 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ArgList = yyvsp[-2].ArgList; + yyval.ArgList->push_back(std::pair(new PATypeHolder(Type::VoidTy), 0)); + ;} + break; + + case 137: +#line 1627 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ArgList = new std::vector >(); + yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); + ;} + break; + + case 138: +#line 1631 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ArgList = 0; + ;} + break; + + case 139: +#line 1635 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + UnEscapeLexed(yyvsp[-3].StrVal); + std::string FunctionName(yyvsp[-3].StrVal); + free(yyvsp[-3].StrVal); // Free strdup'd memory! + + if (!(*yyvsp[-4].TypeVal)->isFirstClassType() && *yyvsp[-4].TypeVal != Type::VoidTy) + ThrowException("LLVM functions cannot return aggregate types!"); + + std::vector ParamTypeList; + if (yyvsp[-1].ArgList) { // If there are arguments... + for (std::vector >::iterator I = yyvsp[-1].ArgList->begin(); + I != yyvsp[-1].ArgList->end(); ++I) + ParamTypeList.push_back(I->first->get()); + } + + bool isVarArg = ParamTypeList.size() && ParamTypeList.back() == Type::VoidTy; + if (isVarArg) ParamTypeList.pop_back(); + + const FunctionType *FT = FunctionType::get(*yyvsp[-4].TypeVal, ParamTypeList, isVarArg); + const PointerType *PFT = PointerType::get(FT); + delete yyvsp[-4].TypeVal; + + ValID ID; + if (!FunctionName.empty()) { + ID = ValID::create((char*)FunctionName.c_str()); + } else { + ID = ValID::create((int)CurModule.Values[PFT].size()); + } + + Function *Fn = 0; + // See if this function was forward referenced. If so, recycle the object. + if (GlobalValue *FWRef = CurModule.GetForwardRefForGlobal(PFT, ID)) { + // Move the function to the end of the list, from whereever it was + // previously inserted. + Fn = cast(FWRef); + CurModule.CurrentModule->getFunctionList().remove(Fn); + CurModule.CurrentModule->getFunctionList().push_back(Fn); + } else if (!FunctionName.empty() && // Merge with an earlier prototype? + (Fn = CurModule.CurrentModule->getFunction(FunctionName, FT))) { + // If this is the case, either we need to be a forward decl, or it needs + // to be. + if (!CurFun.isDeclare && !Fn->isExternal()) + ThrowException("Redefinition of function '" + FunctionName + "'!"); + + // Make sure to strip off any argument names so we can't get conflicts. + if (Fn->isExternal()) + for (Function::arg_iterator AI = Fn->arg_begin(), AE = Fn->arg_end(); + AI != AE; ++AI) + AI->setName(""); + + } else { // Not already defined? + Fn = new Function(FT, GlobalValue::ExternalLinkage, FunctionName, + CurModule.CurrentModule); + InsertValue(Fn, CurModule.Values); + } + + CurFun.FunctionStart(Fn); + Fn->setCallingConv(yyvsp[-5].UIntVal); + + // Add all of the arguments we parsed to the function... + if (yyvsp[-1].ArgList) { // Is null if empty... + if (isVarArg) { // Nuke the last entry + assert(yyvsp[-1].ArgList->back().first->get() == Type::VoidTy && yyvsp[-1].ArgList->back().second == 0&& + "Not a varargs marker!"); + delete yyvsp[-1].ArgList->back().first; + yyvsp[-1].ArgList->pop_back(); // Delete the last entry + } + Function::arg_iterator ArgIt = Fn->arg_begin(); + for (std::vector >::iterator I = yyvsp[-1].ArgList->begin(); + I != yyvsp[-1].ArgList->end(); ++I, ++ArgIt) { + delete I->first; // Delete the typeholder... + + setValueName(ArgIt, I->second); // Insert arg into symtab... + InsertValue(ArgIt); + } + + delete yyvsp[-1].ArgList; // We're now done with the argument list + } +;} + break; + + case 142: +#line 1717 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.FunctionVal = CurFun.CurrentFunction; + + // Make sure that we keep track of the linkage type even if there was a + // previous "declare". + yyval.FunctionVal->setLinkage(yyvsp[-2].Linkage); +;} + break; + + case 145: +#line 1727 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.FunctionVal = yyvsp[-1].FunctionVal; +;} + break; + + case 146: +#line 1731 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { CurFun.isDeclare = true; ;} + break; + + case 147: +#line 1731 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.FunctionVal = CurFun.CurrentFunction; + CurFun.FunctionDone(); +;} + break; + + case 148: +#line 1740 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // A reference to a direct constant + yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); + ;} + break; + + case 149: +#line 1743 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); + ;} + break; + + case 150: +#line 1746 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Perhaps it's an FP constant? + yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); + ;} + break; + + case 151: +#line 1749 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValIDVal = ValID::create(ConstantBool::True); + ;} + break; + + case 152: +#line 1752 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValIDVal = ValID::create(ConstantBool::False); + ;} + break; + + case 153: +#line 1755 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValIDVal = ValID::createNull(); + ;} + break; + + case 154: +#line 1758 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValIDVal = ValID::createUndef(); + ;} + break; + + case 155: +#line 1761 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized packed vector + const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); + int NumElements = yyvsp[-1].ConstVector->size(); + + PackedType* pt = PackedType::get(ETy, NumElements); + PATypeHolder* PTy = new PATypeHolder( + HandleUpRefs( + PackedType::get( + ETy, + NumElements) + ) + ); + + // Verify all elements are correct type! + for (unsigned i = 0; i < yyvsp[-1].ConstVector->size(); i++) { + if (ETy != (*yyvsp[-1].ConstVector)[i]->getType()) + ThrowException("Element #" + utostr(i) + " is not of type '" + + ETy->getDescription() +"' as required!\nIt is of type '" + + (*yyvsp[-1].ConstVector)[i]->getType()->getDescription() + "'."); + } + + yyval.ValIDVal = ValID::create(ConstantPacked::get(pt, *yyvsp[-1].ConstVector)); + delete PTy; delete yyvsp[-1].ConstVector; + ;} + break; + + case 156: +#line 1785 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); + ;} + break; + + case 157: +#line 1792 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Is it an integer reference...? + yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); + ;} + break; + + case 158: +#line 1795 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Is it a named reference...? + yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); + ;} + break; + + case 161: +#line 1806 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; + ;} + break; + + case 162: +#line 1810 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.FunctionVal = yyvsp[-1].FunctionVal; + ;} + break; + + case 163: +#line 1813 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Do not allow functions with 0 basic blocks + yyval.FunctionVal = yyvsp[-1].FunctionVal; + ;} + break; + + case 164: +#line 1821 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); + InsertValue(yyvsp[0].TermInstVal); + + yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal); + InsertValue(yyvsp[-2].BasicBlockVal); + yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; + ;} + break; + + case 165: +#line 1830 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); + yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; + ;} + break; + + case 166: +#line 1834 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); + + // Make sure to move the basic block to the correct location in the + // function, instead of leaving it inserted wherever it was first + // referenced. + Function::BasicBlockListType &BBL = + CurFun.CurrentFunction->getBasicBlockList(); + BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + ;} + break; + + case 167: +#line 1844 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true); + + // Make sure to move the basic block to the correct location in the + // function, instead of leaving it inserted wherever it was first + // referenced. + Function::BasicBlockListType &BBL = + CurFun.CurrentFunction->getBasicBlockList(); + BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); + ;} + break; + + case 168: +#line 1855 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Return with a result... + yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); + ;} + break; + + case 169: +#line 1858 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Return with no result... + yyval.TermInstVal = new ReturnInst(); + ;} + break; + + case 170: +#line 1861 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Unconditional Branch... + yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[0].ValIDVal)); + ;} + break; + + case 171: +#line 1864 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[-3].ValIDVal), getBBVal(yyvsp[0].ValIDVal), getVal(Type::BoolTy, yyvsp[-6].ValIDVal)); + ;} + break; + + case 172: +#line 1867 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + SwitchInst *S = new SwitchInst(getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal), getBBVal(yyvsp[-3].ValIDVal), yyvsp[-1].JumpTable->size()); + yyval.TermInstVal = S; + + std::vector >::iterator I = yyvsp[-1].JumpTable->begin(), + E = yyvsp[-1].JumpTable->end(); + for (; I != E; ++I) { + if (ConstantInt *CI = dyn_cast(I->first)) + S->addCase(CI, I->second); + else + ThrowException("Switch case is constant, but not a simple integer!"); + } + delete yyvsp[-1].JumpTable; + ;} + break; + + case 173: +#line 1881 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + SwitchInst *S = new SwitchInst(getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal), getBBVal(yyvsp[-2].ValIDVal), 0); + yyval.TermInstVal = S; + ;} + break; + + case 174: +#line 1886 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *PFTy; + const FunctionType *Ty; + + if (!(PFTy = dyn_cast(yyvsp[-10].TypeVal->get())) || + !(Ty = dyn_cast(PFTy->getElementType()))) { + // Pull out the types of all of the arguments... + std::vector ParamTypes; + if (yyvsp[-7].ValueList) { + for (std::vector::iterator I = yyvsp[-7].ValueList->begin(), E = yyvsp[-7].ValueList->end(); + I != E; ++I) + ParamTypes.push_back((*I)->getType()); + } + + bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; + if (isVarArg) ParamTypes.pop_back(); + + Ty = FunctionType::get(yyvsp[-10].TypeVal->get(), ParamTypes, isVarArg); + PFTy = PointerType::get(Ty); + } + + Value *V = getVal(PFTy, yyvsp[-9].ValIDVal); // Get the function we're calling... + + BasicBlock *Normal = getBBVal(yyvsp[-3].ValIDVal); + BasicBlock *Except = getBBVal(yyvsp[0].ValIDVal); + + // Create the call node... + if (!yyvsp[-7].ValueList) { // Has no arguments? + yyval.TermInstVal = new InvokeInst(V, Normal, Except, std::vector()); + } else { // Has arguments? + // Loop through FunctionType's arguments and ensure they are specified + // correctly! + // + FunctionType::param_iterator I = Ty->param_begin(); + FunctionType::param_iterator E = Ty->param_end(); + std::vector::iterator ArgI = yyvsp[-7].ValueList->begin(), ArgE = yyvsp[-7].ValueList->end(); + + for (; ArgI != ArgE && I != E; ++ArgI, ++I) + if ((*ArgI)->getType() != *I) + ThrowException("Parameter " +(*ArgI)->getName()+ " is not of type '" + + (*I)->getDescription() + "'!"); + + if (I != E || (ArgI != ArgE && !Ty->isVarArg())) + ThrowException("Invalid number of parameters detected!"); + + yyval.TermInstVal = new InvokeInst(V, Normal, Except, *yyvsp[-7].ValueList); + } + cast(yyval.TermInstVal)->setCallingConv(yyvsp[-11].UIntVal); + + delete yyvsp[-10].TypeVal; + delete yyvsp[-7].ValueList; + ;} + break; + + case 175: +#line 1938 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.TermInstVal = new UnwindInst(); + ;} + break; + + case 176: +#line 1941 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.TermInstVal = new UnreachableInst(); + ;} + break; + + case 177: +#line 1947 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.JumpTable = yyvsp[-5].JumpTable; + Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + if (V == 0) + ThrowException("May only switch on a constant pool value!"); + + yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); + ;} + break; + + case 178: +#line 1955 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.JumpTable = new std::vector >(); + Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); + + if (V == 0) + ThrowException("May only switch on a constant pool value!"); + + yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); + ;} + break; + + case 179: +#line 1965 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + // Is this definition named?? if so, assign the name... + setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); + InsertValue(yyvsp[0].InstVal); + yyval.InstVal = yyvsp[0].InstVal; +;} + break; + + case 180: +#line 1972 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Used for PHI nodes + yyval.PHIList = new std::list >(); + yyval.PHIList->push_back(std::make_pair(getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); + delete yyvsp[-5].TypeVal; + ;} + break; + + case 181: +#line 1977 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.PHIList = yyvsp[-6].PHIList; + yyvsp[-6].PHIList->push_back(std::make_pair(getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal), + getBBVal(yyvsp[-1].ValIDVal))); + ;} + break; + + case 182: +#line 1984 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { // Used for call statements, and memory insts... + yyval.ValueList = new std::vector(); + yyval.ValueList->push_back(yyvsp[0].ValueVal); + ;} + break; + + case 183: +#line 1988 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValueList = yyvsp[-2].ValueList; + yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); + ;} + break; + + case 185: +#line 1994 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = 0; ;} + break; + + case 186: +#line 1996 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.BoolVal = true; + ;} + break; + + case 187: +#line 1999 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.BoolVal = false; + ;} + break; + + case 188: +#line 2005 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && + !isa((*yyvsp[-3].TypeVal).get())) + ThrowException( + "Arithmetic operator requires integer, FP, or packed operands!"); + if (isa((*yyvsp[-3].TypeVal).get()) && yyvsp[-4].BinaryOpVal == Instruction::Rem) + ThrowException("Rem not supported on packed types!"); + yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal), getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal)); + if (yyval.InstVal == 0) + ThrowException("binary operator returned null!"); + delete yyvsp[-3].TypeVal; + ;} + break; + + case 189: +#line 2017 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!(*yyvsp[-3].TypeVal)->isIntegral()) + ThrowException("Logical operator requires integral operands!"); + yyval.InstVal = BinaryOperator::create(yyvsp[-4].BinaryOpVal, getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal), getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal)); + if (yyval.InstVal == 0) + ThrowException("binary operator returned null!"); + delete yyvsp[-3].TypeVal; + ;} + break; + + case 190: +#line 2025 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if(isa((*yyvsp[-3].TypeVal).get())) { + ThrowException( + "PackedTypes currently not supported in setcc instructions!"); + } + yyval.InstVal = new SetCondInst(yyvsp[-4].BinaryOpVal, getVal(*yyvsp[-3].TypeVal, yyvsp[-2].ValIDVal), getVal(*yyvsp[-3].TypeVal, yyvsp[0].ValIDVal)); + if (yyval.InstVal == 0) + ThrowException("binary operator returned null!"); + delete yyvsp[-3].TypeVal; + ;} + break; + + case 191: +#line 2035 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + std::cerr << "WARNING: Use of eliminated 'not' instruction:" + << " Replacing with 'xor'.\n"; + + Value *Ones = ConstantIntegral::getAllOnesValue(yyvsp[0].ValueVal->getType()); + if (Ones == 0) + ThrowException("Expected integral type for not instruction!"); + + yyval.InstVal = BinaryOperator::create(Instruction::Xor, yyvsp[0].ValueVal, Ones); + if (yyval.InstVal == 0) + ThrowException("Could not create a xor instruction!"); + ;} + break; + + case 192: +#line 2047 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[0].ValueVal->getType() != Type::UByteTy) + ThrowException("Shift amount must be ubyte!"); + if (!yyvsp[-2].ValueVal->getType()->isInteger()) + ThrowException("Shift constant expression requires integer operand!"); + yyval.InstVal = new ShiftInst(yyvsp[-3].OtherOpVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + ;} + break; + + case 193: +#line 2054 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!yyvsp[0].TypeVal->get()->isFirstClassType()) + ThrowException("cast instruction to a non-primitive type: '" + + yyvsp[0].TypeVal->get()->getDescription() + "'!"); + yyval.InstVal = new CastInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; + ;} + break; + + case 194: +#line 2061 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) + ThrowException("select condition must be boolean!"); + if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType()) + ThrowException("select value types should match!"); + yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); + ;} + break; + + case 195: +#line 2068 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + NewVarArgs = true; + yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; + ;} + break; + + case 196: +#line 2073 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + ObsoleteVarArgs = true; + const Type* ArgTy = yyvsp[-2].ValueVal->getType(); + Function* NF = CurModule.CurrentModule-> + getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, 0); + + //b = vaarg a, t -> + //foo = alloca 1 of t + //bar = vacopy a + //store bar -> foo + //b = vaarg foo, t + AllocaInst* foo = new AllocaInst(ArgTy, 0, "vaarg.fix"); + CurBB->getInstList().push_back(foo); + CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal); + CurBB->getInstList().push_back(bar); + CurBB->getInstList().push_back(new StoreInst(bar, foo)); + yyval.InstVal = new VAArgInst(foo, *yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; + ;} + break; + + case 197: +#line 2092 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + ObsoleteVarArgs = true; + const Type* ArgTy = yyvsp[-2].ValueVal->getType(); + Function* NF = CurModule.CurrentModule-> + getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, 0); + + //b = vanext a, t -> + //foo = alloca 1 of t + //bar = vacopy a + //store bar -> foo + //tmp = vaarg foo, t + //b = load foo + AllocaInst* foo = new AllocaInst(ArgTy, 0, "vanext.fix"); + CurBB->getInstList().push_back(foo); + CallInst* bar = new CallInst(NF, yyvsp[-2].ValueVal); + CurBB->getInstList().push_back(bar); + CurBB->getInstList().push_back(new StoreInst(bar, foo)); + Instruction* tmp = new VAArgInst(foo, *yyvsp[0].TypeVal); + CurBB->getInstList().push_back(tmp); + yyval.InstVal = new LoadInst(foo); + delete yyvsp[0].TypeVal; + ;} + break; + + case 198: +#line 2114 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const Type *Ty = yyvsp[0].PHIList->front().first->getType(); + if (!Ty->isFirstClassType()) + ThrowException("PHI node operands must be of first class type!"); + yyval.InstVal = new PHINode(Ty); + ((PHINode*)yyval.InstVal)->reserveOperandSpace(yyvsp[0].PHIList->size()); + while (yyvsp[0].PHIList->begin() != yyvsp[0].PHIList->end()) { + if (yyvsp[0].PHIList->front().first->getType() != Ty) + ThrowException("All elements of a PHI node must be of the same type!"); + cast(yyval.InstVal)->addIncoming(yyvsp[0].PHIList->front().first, yyvsp[0].PHIList->front().second); + yyvsp[0].PHIList->pop_front(); + } + delete yyvsp[0].PHIList; // Free the list... + ;} + break; + + case 199: +#line 2128 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *PFTy; + const FunctionType *Ty; + + if (!(PFTy = dyn_cast(yyvsp[-4].TypeVal->get())) || + !(Ty = dyn_cast(PFTy->getElementType()))) { + // Pull out the types of all of the arguments... + std::vector ParamTypes; + if (yyvsp[-1].ValueList) { + for (std::vector::iterator I = yyvsp[-1].ValueList->begin(), E = yyvsp[-1].ValueList->end(); + I != E; ++I) + ParamTypes.push_back((*I)->getType()); + } + + bool isVarArg = ParamTypes.size() && ParamTypes.back() == Type::VoidTy; + if (isVarArg) ParamTypes.pop_back(); + + if (!(*yyvsp[-4].TypeVal)->isFirstClassType() && *yyvsp[-4].TypeVal != Type::VoidTy) + ThrowException("LLVM functions cannot return aggregate types!"); + + Ty = FunctionType::get(yyvsp[-4].TypeVal->get(), ParamTypes, isVarArg); + PFTy = PointerType::get(Ty); + } + + Value *V = getVal(PFTy, yyvsp[-3].ValIDVal); // Get the function we're calling... + + // Create the call node... + if (!yyvsp[-1].ValueList) { // Has no arguments? + // Make sure no arguments is a good thing! + if (Ty->getNumParams() != 0) + ThrowException("No arguments passed to a function that " + "expects arguments!"); + + yyval.InstVal = new CallInst(V, std::vector()); + } else { // Has arguments? + // Loop through FunctionType's arguments and ensure they are specified + // correctly! + // + FunctionType::param_iterator I = Ty->param_begin(); + FunctionType::param_iterator E = Ty->param_end(); + std::vector::iterator ArgI = yyvsp[-1].ValueList->begin(), ArgE = yyvsp[-1].ValueList->end(); + + for (; ArgI != ArgE && I != E; ++ArgI, ++I) + if ((*ArgI)->getType() != *I) + ThrowException("Parameter " +(*ArgI)->getName()+ " is not of type '" + + (*I)->getDescription() + "'!"); + + if (I != E || (ArgI != ArgE && !Ty->isVarArg())) + ThrowException("Invalid number of parameters detected!"); + + yyval.InstVal = new CallInst(V, *yyvsp[-1].ValueList); + } + cast(yyval.InstVal)->setTailCall(yyvsp[-6].BoolVal); + cast(yyval.InstVal)->setCallingConv(yyvsp[-5].UIntVal); + delete yyvsp[-4].TypeVal; + delete yyvsp[-1].ValueList; + ;} + break; + + case 200: +#line 2185 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.InstVal = yyvsp[0].InstVal; + ;} + break; + + case 201: +#line 2191 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValueList = yyvsp[0].ValueList; + ;} + break; + + case 202: +#line 2193 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.ValueList = new std::vector(); + ;} + break; + + case 203: +#line 2197 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.BoolVal = true; + ;} + break; + + case 204: +#line 2200 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.BoolVal = false; + ;} + break; + + case 205: +#line 2206 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.InstVal = new MallocInst(*yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; + ;} + break; + + case 206: +#line 2210 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.InstVal = new MallocInst(*yyvsp[-3].TypeVal, getVal(yyvsp[-1].PrimType, yyvsp[0].ValIDVal)); + delete yyvsp[-3].TypeVal; + ;} + break; + + case 207: +#line 2214 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.InstVal = new AllocaInst(*yyvsp[0].TypeVal); + delete yyvsp[0].TypeVal; + ;} + break; + + case 208: +#line 2218 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + yyval.InstVal = new AllocaInst(*yyvsp[-3].TypeVal, getVal(yyvsp[-1].PrimType, yyvsp[0].ValIDVal)); + delete yyvsp[-3].TypeVal; + ;} + break; + + case 209: +#line 2222 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa(yyvsp[0].ValueVal->getType())) + ThrowException("Trying to free nonpointer type " + + yyvsp[0].ValueVal->getType()->getDescription() + "!"); + yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); + ;} + break; + + case 210: +#line 2229 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa(yyvsp[-1].TypeVal->get())) + ThrowException("Can't load from nonpointer type: " + + (*yyvsp[-1].TypeVal)->getDescription()); + if (!cast(yyvsp[-1].TypeVal->get())->getElementType()->isFirstClassType()) + ThrowException("Can't load from pointer of non-first-class type: " + + (*yyvsp[-1].TypeVal)->getDescription()); + yyval.InstVal = new LoadInst(getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal), "", yyvsp[-3].BoolVal); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 211: +#line 2239 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); + if (!PT) + ThrowException("Can't store to a nonpointer type: " + + (*yyvsp[-1].TypeVal)->getDescription()); + const Type *ElTy = PT->getElementType(); + if (ElTy != yyvsp[-3].ValueVal->getType()) + ThrowException("Can't store '" + yyvsp[-3].ValueVal->getType()->getDescription() + + "' into space of type '" + ElTy->getDescription() + "'!"); + + yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal), yyvsp[-5].BoolVal); + delete yyvsp[-1].TypeVal; + ;} + break; + + case 212: +#line 2252 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + { + if (!isa(yyvsp[-2].TypeVal->get())) + ThrowException("getelementptr insn requires pointer operand!"); + + // LLVM 1.2 and earlier used ubyte struct indices. Convert any ubyte struct + // indices to uint struct indices for compatibility. + generic_gep_type_iterator::iterator> + GTI = gep_type_begin(yyvsp[-2].TypeVal->get(), yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end()), + GTE = gep_type_end(yyvsp[-2].TypeVal->get(), yyvsp[0].ValueList->begin(), yyvsp[0].ValueList->end()); + for (unsigned i = 0, e = yyvsp[0].ValueList->size(); i != e && GTI != GTE; ++i, ++GTI) + if (isa(*GTI)) // Only change struct indices + if (ConstantUInt *CUI = dyn_cast((*yyvsp[0].ValueList)[i])) + if (CUI->getType() == Type::UByteTy) + (*yyvsp[0].ValueList)[i] = ConstantExpr::getCast(CUI, Type::UIntTy); + + if (!GetElementPtrInst::getIndexedType(*yyvsp[-2].TypeVal, *yyvsp[0].ValueList, true)) + ThrowException("Invalid getelementptr indices for type '" + + (*yyvsp[-2].TypeVal)->getDescription()+ "'!"); + yyval.InstVal = new GetElementPtrInst(getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal), *yyvsp[0].ValueList); + delete yyvsp[-2].TypeVal; delete yyvsp[0].ValueList; + ;} + break; + + + } + +/* Line 1000 of yacc.c. */ +#line 4352 "llvmAsmParser.tab.c" + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; +#endif + + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + +#line 2275 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" + +int yyerror(const char *ErrorMsg) { + std::string where + = std::string((CurFilename == "-") ? std::string("") : CurFilename) + + ":" + utostr((unsigned) llvmAsmlineno) + ": "; + std::string errMsg = std::string(ErrorMsg) + "\n" + where + " while reading "; + if (yychar == YYEMPTY || yychar == 0) + errMsg += "end-of-file."; + else + errMsg += "token: '" + std::string(llvmAsmtext, llvmAsmleng) + "'"; + ThrowException(errMsg); + return 0; +} + Index: llvm/lib/AsmParser/llvmAsmParser.h diff -u /dev/null llvm/lib/AsmParser/llvmAsmParser.h:1.9 --- /dev/null Sat Aug 27 13:50:52 2005 +++ llvm/lib/AsmParser/llvmAsmParser.h Sat Aug 27 13:50:38 2005 @@ -0,0 +1,271 @@ +/* A Bison parser, made by GNU Bison 1.875c. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + VOLATILE = 289, + TO = 290, + DOTDOTDOT = 291, + NULL_TOK = 292, + UNDEF = 293, + CONST = 294, + INTERNAL = 295, + LINKONCE = 296, + WEAK = 297, + APPENDING = 298, + OPAQUE = 299, + NOT = 300, + EXTERNAL = 301, + TARGET = 302, + TRIPLE = 303, + ENDIAN = 304, + POINTERSIZE = 305, + LITTLE = 306, + BIG = 307, + DEPLIBS = 308, + CALL = 309, + TAIL = 310, + CC_TOK = 311, + CCC_TOK = 312, + FASTCC_TOK = 313, + COLDCC_TOK = 314, + RET = 315, + BR = 316, + SWITCH = 317, + INVOKE = 318, + UNWIND = 319, + UNREACHABLE = 320, + ADD = 321, + SUB = 322, + MUL = 323, + DIV = 324, + REM = 325, + AND = 326, + OR = 327, + XOR = 328, + SETLE = 329, + SETGE = 330, + SETLT = 331, + SETGT = 332, + SETEQ = 333, + SETNE = 334, + MALLOC = 335, + ALLOCA = 336, + FREE = 337, + LOAD = 338, + STORE = 339, + GETELEMENTPTR = 340, + PHI_TOK = 341, + CAST = 342, + SELECT = 343, + SHL = 344, + SHR = 345, + VAARG = 346, + VAARG_old = 347, + VANEXT_old = 348 + }; +#endif +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define VOLATILE 289 +#define TO 290 +#define DOTDOTDOT 291 +#define NULL_TOK 292 +#define UNDEF 293 +#define CONST 294 +#define INTERNAL 295 +#define LINKONCE 296 +#define WEAK 297 +#define APPENDING 298 +#define OPAQUE 299 +#define NOT 300 +#define EXTERNAL 301 +#define TARGET 302 +#define TRIPLE 303 +#define ENDIAN 304 +#define POINTERSIZE 305 +#define LITTLE 306 +#define BIG 307 +#define DEPLIBS 308 +#define CALL 309 +#define TAIL 310 +#define CC_TOK 311 +#define CCC_TOK 312 +#define FASTCC_TOK 313 +#define COLDCC_TOK 314 +#define RET 315 +#define BR 316 +#define SWITCH 317 +#define INVOKE 318 +#define UNWIND 319 +#define UNREACHABLE 320 +#define ADD 321 +#define SUB 322 +#define MUL 323 +#define DIV 324 +#define REM 325 +#define AND 326 +#define OR 327 +#define XOR 328 +#define SETLE 329 +#define SETGE 330 +#define SETLT 331 +#define SETGT 332 +#define SETEQ 333 +#define SETNE 334 +#define MALLOC 335 +#define ALLOCA 336 +#define FREE 337 +#define LOAD 338 +#define STORE 339 +#define GETELEMENTPTR 340 +#define PHI_TOK 341 +#define CAST 342 +#define SELECT 343 +#define SHL 344 +#define SHR 345 +#define VAARG 346 +#define VAARG_old 347 +#define VANEXT_old 348 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 865 "/proj/llvm/build/../llvm/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { + llvm::Module *ModuleVal; + llvm::Function *FunctionVal; + std::pair *ArgVal; + llvm::BasicBlock *BasicBlockVal; + llvm::TerminatorInst *TermInstVal; + llvm::Instruction *InstVal; + llvm::Constant *ConstVal; + + const llvm::Type *PrimType; + llvm::PATypeHolder *TypeVal; + llvm::Value *ValueVal; + + std::vector > *ArgList; + std::vector *ValueList; + std::list *TypeList; + // Represent the RHS of PHI node + std::list > *PHIList; + std::vector > *JumpTable; + std::vector *ConstVector; + + llvm::GlobalValue::LinkageTypes Linkage; + int64_t SInt64Val; + uint64_t UInt64Val; + int SIntVal; + unsigned UIntVal; + double FPVal; + bool BoolVal; + + char *StrVal; // This memory is strdup'd! + llvm::ValID ValIDVal; // strdup'd memory maybe! + + llvm::Instruction::BinaryOps BinaryOpVal; + llvm::Instruction::TermOps TermOpVal; + llvm::Instruction::MemoryOps MemOpVal; + llvm::Instruction::OtherOps OtherOpVal; + llvm::Module::Endianness Endianness; +} YYSTYPE; +/* Line 1275 of yacc.c. */ +#line 263 "llvmAsmParser.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +extern YYSTYPE llvmAsmlval; + + + Index: llvm/lib/AsmParser/.cvsignore diff -u llvm/lib/AsmParser/.cvsignore:1.2 llvm/lib/AsmParser/.cvsignore:1.3 --- llvm/lib/AsmParser/.cvsignore:1.2 Tue Apr 19 10:27:29 2005 +++ llvm/lib/AsmParser/.cvsignore Sat Aug 27 13:50:38 2005 @@ -1,4 +1 @@ -Lexer.cpp -llvmAsmParser.cpp -llvmAsmParser.h llvmAsmParser.output Index: llvm/lib/AsmParser/Makefile diff -u llvm/lib/AsmParser/Makefile:1.7 llvm/lib/AsmParser/Makefile:1.8 --- llvm/lib/AsmParser/Makefile:1.7 Mon Jan 31 19:47:12 2005 +++ llvm/lib/AsmParser/Makefile Sat Aug 27 13:50:38 2005 @@ -9,7 +9,6 @@ LEVEL = ../.. LIBRARYNAME := LLVMAsmParser -BUILT_SOURCES := llvmAsmParser.cpp llvmAsmParser.h Lexer.cpp include $(LEVEL)/Makefile.common @@ -17,4 +16,4 @@ # Make the object code file for the lexer depend upon the header file generated # by the Bison parser. This prevents the Lexer from being compiled before the # header file it needs is built. -$(OBJDIR)/Lexer.o: llvmAsmParser.h +$(ObjDir)/Lexer.o: $(PROJ_SRC_DIR)/llvmAsmParser.h From reid at x10sys.com Sat Aug 27 14:06:16 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 14:06:16 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAGNodes.h Message-ID: <200508271906.OAA20020@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAGNodes.h updated: 1.63 -> 1.64 --- Log message: Fix a typo. --- Diffs of the changes: (+1 -1) SelectionDAGNodes.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/SelectionDAGNodes.h diff -u llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.63 llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.64 --- llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1.63 Fri Aug 26 12:14:27 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGNodes.h Sat Aug 27 14:06:05 2005 @@ -48,7 +48,7 @@ // EntryToken - This is the marker used to indicate the start of the region. EntryToken, - // Token factor - This node is takes multiple tokens as input and produces a + // Token factor - This node takes multiple tokens as input and produces a // single token result. This is used to represent the fact that the operand // operators are independent of each other. TokenFactor, From reid at x10sys.com Sat Aug 27 14:09:14 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 14:09:14 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200508271909.OAA20059@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.22 -> 1.23 --- Log message: Change the names of member variables per Chris' instructions, and document them more clearly. --- Diffs of the changes: (+13 -11) TargetLowering.h | 24 +++++++++++++----------- 1 files changed, 13 insertions(+), 11 deletions(-) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.22 llvm/include/llvm/Target/TargetLowering.h:1.23 --- llvm/include/llvm/Target/TargetLowering.h:1.22 Fri Aug 26 16:06:40 2005 +++ llvm/include/llvm/Target/TargetLowering.h Sat Aug 27 14:09:02 2005 @@ -210,12 +210,14 @@ /// @brief Get maximum # of store operations permitted for llvm.memmove unsigned getMaxStoresPerMemMove() const { return maxStoresPerMemMove; } - /// This function returns true if the target allows unaligned stores. This is - /// used in situations where an array copy/move/set is converted to a sequence - /// of store operations. It ensures that such replacements don't generate - /// code that causes an alignment error (trap) on the target machine. - /// @brief Determine if the target supports unaligned stores. - bool allowsUnalignedStores() const { return allowUnalignedStores; } + /// This function returns true if the target allows unaligned memory accesses. + /// This is used, for example, in situations where an array copy/move/set is + /// converted to a sequence of store operations. It's use helps to ensure that + /// such replacements don't generate code that causes an alignment error + /// (trap) on the target machine. + /// @brief Determine if the target supports unaligned memory accesses. + bool allowsUnalignedMemoryAccesses() const + { return allowUnalignedMemoryAccesses; } //===--------------------------------------------------------------------===// // TargetLowering Configuration Methods - These methods should be invoked by @@ -442,11 +444,11 @@ /// @brief Specify maximum bytes of store instructions per memmove call. unsigned maxStoresPerMemMove; - /// This field specifies whether the target machine permits unaligned stores. - /// This is used to determine the size of store operations for copying - /// small arrays and other similar tasks. - /// @brief Indicate whether the target machine permits unaligned stores. - bool allowUnalignedStores; + /// This field specifies whether the target machine permits unaligned memory + /// accesses. This is used, for example, to determine the size of store + /// operations when copying small arrays and other similar tasks. + /// @brief Indicate whether the target permits unaligned memory accesses. + bool allowUnalignedMemoryAccesses; }; } // end llvm namespace From reid at x10sys.com Sat Aug 27 14:09:14 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 14:09:14 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200508271909.OAA20055@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.10 -> 1.11 --- Log message: Change the names of member variables per Chris' instructions, and document them more clearly. --- Diffs of the changes: (+2 -2) TargetLowering.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.10 llvm/lib/Target/TargetLowering.cpp:1.11 --- llvm/lib/Target/TargetLowering.cpp:1.10 Wed Aug 24 11:34:12 2005 +++ llvm/lib/Target/TargetLowering.cpp Sat Aug 27 14:09:02 2005 @@ -27,8 +27,8 @@ ShiftAmountTy = SetCCResultTy = PointerTy = getValueType(TD.getIntPtrType()); ShiftAmtHandling = Undefined; memset(RegClassForVT, 0,MVT::LAST_VALUETYPE*sizeof(TargetRegisterClass*)); - maxStoresPerMemSet = maxStoresPerMemCpy = maxStoresPerMemMove = 0; - allowUnalignedStores = false; + maxStoresPerMemSet = maxStoresPerMemCpy = maxStoresPerMemMove = 8; + allowUnalignedMemoryAccesses = false; } TargetLowering::~TargetLowering() {} From reid at x10sys.com Sat Aug 27 14:09:59 2005 From: reid at x10sys.com (Reid Spencer) Date: Sat, 27 Aug 2005 14:09:59 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp Message-ID: <200508271909.OAA20074@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelPattern.cpp updated: 1.175 -> 1.176 --- Log message: Adjust to member variable name change. --- Diffs of the changes: (+1 -1) X86ISelPattern.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.175 llvm/lib/Target/X86/X86ISelPattern.cpp:1.176 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.175 Fri Aug 26 12:17:49 2005 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Sat Aug 27 14:09:48 2005 @@ -232,7 +232,7 @@ maxStoresPerMemSet = 8; // For %llvm.memset -> sequence of stores maxStoresPerMemCpy = 8; // For %llvm.memcpy -> sequence of stores maxStoresPerMemMove = 8; // For %llvm.memmove -> sequence of stores - allowUnalignedStores = true; // x86 supports it! + allowUnalignedMemoryAccesses = true; // x86 supports it! } // Return the number of bytes that a function should pop when it returns (in From lattner at persephone.cs.uiuc.edu Sun Aug 28 18:39:46 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 18:39:46 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <20050828233946.21985149E04E@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.45 -> 1.46 --- Log message: fix an assertion failure in treeadd --- Diffs of the changes: (+2 -2) PPC32ISelDAGToDAG.cpp | 4 ++-- 1 files changed, 2 insertions, 2 deletions Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.45 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.46 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.45 Fri Aug 26 16:23:58 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Sun Aug 28 18:39:22 2005 @@ -996,7 +996,7 @@ if (isOprNot(N)) { unsigned Opc; SDOperand Val = Select(N->getOperand(0)); - switch (Val.getTargetOpcode()) { + switch (Val.isTargetOpcode() ? Val.getTargetOpcode() : 0) { default: Opc = 0; break; case PPC::OR: Opc = PPC::NOR; break; case PPC::AND: Opc = PPC::NAND; break; @@ -1094,7 +1094,7 @@ MVT::ValueType Ty = N->getValueType(0); if (Val.Val->hasOneUse()) { unsigned Opc; - switch (Val.getTargetOpcode()) { + switch (Val.isTargetOpcode() ? Val.getTargetOpcode() : 0) { default: Opc = 0; break; case PPC::FABS: Opc = PPC::FNABS; break; case PPC::FMADD: Opc = PPC::FNMADD; break; From lattner at persephone.cs.uiuc.edu Sun Aug 28 18:59:40 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 18:59:40 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <20050828235940.666A8149E259@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.46 -> 1.47 --- Log message: Fix a bug in FP_EXTEND, implement FP_TO_SINT --- Diffs of the changes: (+15 -3) PPC32ISelDAGToDAG.cpp | 18 +++++++++++++++--- 1 files changed, 15 insertions, 3 deletions Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.46 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.47 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.46 Sun Aug 28 18:39:22 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Sun Aug 28 18:59:09 2005 @@ -17,6 +17,7 @@ #include "PPC32ISelLowering.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/SSARegMap.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/SelectionDAGISel.h" @@ -1080,15 +1081,26 @@ case ISD::FP_EXTEND: { assert(MVT::f64 == N->getValueType(0) && MVT::f32 == N->getOperand(0).getValueType() && "Illegal FP_EXTEND"); - SDOperand Tmp = Select(N->getOperand(0)); - CurDAG->ReplaceAllUsesWith(Op, Tmp); // Just use the operand as the result. - return Tmp; + std::vector Tmp; + Tmp.push_back(Select(N->getOperand(0))); + CurDAG->ReplaceAllUsesWith(N, Tmp); // Just use the operand as the result. + return Tmp[0]; } case ISD::FP_ROUND: assert(MVT::f32 == N->getValueType(0) && MVT::f64 == N->getOperand(0).getValueType() && "Illegal FP_ROUND"); CurDAG->SelectNodeTo(N, PPC::FRSP, MVT::f32, Select(N->getOperand(0))); break; + case ISD::FP_TO_SINT: { + SDOperand In = Select(N->getOperand(0)); + In = CurDAG->getTargetNode(PPC::FCTIWZ, MVT::f64, In); + + int FrameIdx = BB->getParent()->getFrameInfo()->CreateStackObject(8, 8); + SDOperand FI = CurDAG->getTargetFrameIndex(FrameIdx, MVT::f64); + SDOperand ST = CurDAG->getTargetNode(PPC::STFD, MVT::Other, In, FI, getI32Imm(0)); + CurDAG->SelectNodeTo(N, PPC::LWZ, MVT::i32, MVT::Other, FI, getI32Imm(4), ST); + break; + } case ISD::FNEG: { SDOperand Val = Select(N->getOperand(0)); MVT::ValueType Ty = N->getValueType(0); From lattner at persephone.cs.uiuc.edu Sun Aug 28 18:59:58 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 18:59:58 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <20050828235958.7F166149E261@persephone.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.172 -> 1.173 --- Log message: Fix a bug in ReplaceAllUsesWith --- Diffs of the changes: (+1 -1) SelectionDAG.cpp | 2 +- 1 files changed, 1 insertion, 1 deletion Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.172 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.173 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.172 Fri Aug 26 16:39:15 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Sun Aug 28 18:59:36 2005 @@ -2084,7 +2084,7 @@ const std::vector &To) { assert(From->getNumValues() == To.size() && "Incorrect number of values to replace with!"); - if (To.size() == 1) { + if (To.size() == 1 && To[0].Val->getNumValues() == 1) { // Degenerate case handled above. ReplaceAllUsesWith(SDOperand(From, 0), To[0]); return; From lattner at persephone.cs.uiuc.edu Sun Aug 28 19:02:24 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 19:02:24 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <20050829000224.10D50149E2EF@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.47 -> 1.48 --- Log message: add operands in the correct order --- Diffs of the changes: (+2 -2) PPC32ISelDAGToDAG.cpp | 4 ++-- 1 files changed, 2 insertions, 2 deletions Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.47 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.48 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.47 Sun Aug 28 18:59:09 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Sun Aug 28 19:02:01 2005 @@ -1097,8 +1097,8 @@ int FrameIdx = BB->getParent()->getFrameInfo()->CreateStackObject(8, 8); SDOperand FI = CurDAG->getTargetFrameIndex(FrameIdx, MVT::f64); - SDOperand ST = CurDAG->getTargetNode(PPC::STFD, MVT::Other, In, FI, getI32Imm(0)); - CurDAG->SelectNodeTo(N, PPC::LWZ, MVT::i32, MVT::Other, FI, getI32Imm(4), ST); + SDOperand ST = CurDAG->getTargetNode(PPC::STFD, MVT::Other, In, getI32Imm(0), FI); + CurDAG->SelectNodeTo(N, PPC::LWZ, MVT::i32, MVT::Other, getI32Imm(4), FI, ST); break; } case ISD::FNEG: { From lattner at persephone.cs.uiuc.edu Sun Aug 28 19:11:19 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 19:11:19 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/CodeGen/PrologEpilogInserter.cpp Message-ID: <20050829001119.F0FBE149E71C@persephone.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: PrologEpilogInserter.cpp updated: 1.45 -> 1.46 --- Log message: Fix a bug in my previous patch that was using the wrong iterator. This fixes Olden/bisort among others. --- Diffs of the changes: (+1 -1) PrologEpilogInserter.cpp | 2 +- 1 files changed, 1 insertion, 1 deletion Index: llvm/lib/CodeGen/PrologEpilogInserter.cpp diff -u llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.45 llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.46 --- llvm/lib/CodeGen/PrologEpilogInserter.cpp:1.45 Fri Aug 26 17:18:32 2005 +++ llvm/lib/CodeGen/PrologEpilogInserter.cpp Sun Aug 28 19:10:46 2005 @@ -217,7 +217,7 @@ while (I2 != MBB->begin() && TII.isTerminatorInstr((--I2)->getOpcode())) I = I2; - bool AtStart = I2 == MBB->begin(); + bool AtStart = I == MBB->begin(); MachineBasicBlock::iterator BeforeI = I; if (!AtStart) --BeforeI; From lattner at persephone.cs.uiuc.edu Sun Aug 28 19:27:23 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 19:27:23 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <20050829002723.65447149E81B@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.48 -> 1.49 --- Log message: Fix order of operands for copytoreg node when emitting calls. This fixes Olden/msFix order of operands for copytoreg node when emitting calls. This fixes Olden/mstt. --- Diffs of the changes: (+1 -1) PPC32ISelDAGToDAG.cpp | 2 +- 1 files changed, 1 insertion, 1 deletion Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.48 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.49 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.48 Sun Aug 28 19:02:01 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Sun Aug 28 19:26:57 2005 @@ -1457,7 +1457,7 @@ // Copy the callee address into R12 on darwin. SDOperand R12 = CurDAG->getRegister(PPC::R12, MVT::i32); - Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, R12, Callee, Chain); + Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, R12, Callee); CallOperands.push_back(getI32Imm(20)); // Information to encode indcall CallOperands.push_back(getI32Imm(0)); // Information to encode indcall From lattner at persephone.cs.uiuc.edu Sun Aug 28 20:01:32 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 20:01:32 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <20050829010132.7A097149E959@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.49 -> 1.50 --- Log message: A hack to fix a problem folding immedaites. This fixes Olden/power. --- Diffs of the changes: (+8 -4) PPC32ISelDAGToDAG.cpp | 12 ++++++++---- 1 files changed, 8 insertions, 4 deletions Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.49 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.50 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.49 Sun Aug 28 19:26:57 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Sun Aug 28 20:01:01 2005 @@ -685,16 +685,20 @@ unsigned v = (unsigned)cast(N)->getValue(); unsigned Hi = HA16(v); unsigned Lo = Lo16(v); + + // NOTE: This doesn't use SelectNodeTo, because doing that will prevent + // folding shared immediates into other the second instruction that + // uses it. if (Hi && Lo) { SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32, getI32Imm(v >> 16)); - CurDAG->SelectNodeTo(N, PPC::ORI, MVT::i32, Top, getI32Imm(v & 0xFFFF)); + return CurDAG->getTargetNode(PPC::ORI, MVT::i32, Top, + getI32Imm(v & 0xFFFF)); } else if (Lo) { - CurDAG->SelectNodeTo(N, PPC::LI, MVT::i32, getI32Imm(v)); + return CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(v)); } else { - CurDAG->SelectNodeTo(N, PPC::LIS, MVT::i32, getI32Imm(v >> 16)); + return CurDAG->getTargetNode(PPC::LIS, MVT::i32, getI32Imm(v >> 16)); } - break; } case ISD::UNDEF: if (N->getValueType(0) == MVT::i32) From lattner at persephone.cs.uiuc.edu Sun Aug 28 20:07:27 2005 From: lattner at persephone.cs.uiuc.edu (Chris Lattner) Date: Sun, 28 Aug 2005 20:07:27 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Message-ID: <20050829010727.EFD43149E9C3@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC32ISelDAGToDAG.cpp updated: 1.50 -> 1.51 --- Log message: Fix a bug the last patch exposed in treeadd among others --- Diffs of the changes: (+1 -1) PPC32ISelDAGToDAG.cpp | 2 +- 1 files changed, 1 insertion, 1 deletion Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.50 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.51 --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.50 Sun Aug 28 20:01:01 2005 +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Sun Aug 28 20:07:02 2005 @@ -87,7 +87,7 @@ virtual void InstructionSelectBasicBlock(SelectionDAG &DAG) { DEBUG(BB->dump()); // Select target instructions for the DAG. - Select(DAG.getRoot()); + DAG.setRoot(Select(DAG.getRoot())); DAG.RemoveDeadNodes(); // Emit machine code to BB.