[llvm-commits] CVS: llvm/utils/GenLibDeps.pl

2006-07-25 Thread Reid Spencer


Changes in directory llvm/utils:

GenLibDeps.pl updated: 1.8 -> 1.9
---
Log message:

Add a feature for debugging library dependency cycles, -why option. This
implies -flat and will produce a list of all the symbols for each library
that another library depends on. Run the output through c++filt for 
better readability. Also, don't generate a temporary file for storing the
dependent library names. Perl can handle it in a %hash.


---
Diffs of the changes:  (+27 -16)

 GenLibDeps.pl |   43 +++
 1 files changed, 27 insertions(+), 16 deletions(-)


Index: llvm/utils/GenLibDeps.pl
diff -u llvm/utils/GenLibDeps.pl:1.8 llvm/utils/GenLibDeps.pl:1.9
--- llvm/utils/GenLibDeps.pl:1.8Fri May 12 21:48:45 2006
+++ llvm/utils/GenLibDeps.plTue Jul 25 14:12:06 2006
@@ -10,12 +10,15 @@
 #
 
 # Parse arguments... 
+my $FLAT = 0;
+my $WHY = 0;
 while (scalar(@ARGV) and ($_ = $ARGV[0], /^[-+]/)) {
   shift;
   last if /^--$/;  # Stop processing arguments on --
 
   # List command line options here...
   if (/^-flat$/) { $FLAT = 1; next; }
+  if (/^-why/)   { $WHY = 1; $FLAT = 1; next; }
   print "Unknown option: $_ : ignoring!\n";
 }
 
@@ -76,46 +79,54 @@
   $lib_ns =~ s/(.*)\.[oa]/$1/;
   if ($FLAT) {
 print "$lib:";
+if ($WHY) { print "\n"; }
   } else {
 print "  $lib\n";
   }
   open UNDEFS, 
 "$nmPath -g -u $Directory/$lib | sed -e 's/^  *U //' | sort | uniq |";
-  open DEPENDS,
-"| sort | uniq > GenLibDeps.out";
+  my %DepLibs;
   while () {
 chomp;
+my $lib_printed = 0;
 if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) {
-  print DEPENDS "$libdefs{$_}\n";
+  $DepLibs{$libdefs{$_}} = [] unless exists $DepLibs{$libdefs{$_}};
+  push(@{$DepLibs{$libdefs{$_}}}, $_);
 } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) {
   $libroot = $lib;
   $libroot =~ s/lib(.*).a/$1/;
   if ($objdefs{$_} ne "$libroot.o") {
-print DEPENDS "$objdefs{$_}\n";
+$DepLibs{$objdefs{$_}} = [] unless exists $DepLibs{$objdefs{$_}};
+push(@{$DepLibs{$objdefs{$_}}}, $_);
   }
 }
   }
   close UNDEFS;
-  close DEPENDS;
-  open DF, ") {
-chomp;
+  for my $key (sort keys %DepLibs) {
 if ($FLAT) {
-  print " $_";
+  print " $key";
+  if ($WHY) {
+print "\n";
+my @syms = @{$DepLibs{$key}};
+foreach $sym (@syms) {
+  print "  $sym\n";
+}
+  }
 } else {
-  print "$_\n";
+  print "$key\n";
 }
-$suffix = substr($_,length($_)-1,1);
-$_ =~ s/(.*)\.[oa]/$1/;
+$suffix = substr($key,length($key)-1,1);
+$key =~ s/(.*)\.[oa]/$1/;
 if ($suffix eq "a") {
-  if (!$FLAT) { print DOT "$lib_ns -> $_ [ weight=0 ];\n" };
+  if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=0 ];\n" };
 } else {
-  if (!$FLAT) { print DOT "$lib_ns -> $_ [ weight=10];\n" };
+  if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=10];\n" };
 }
   }
-  close DF;
   if ($FLAT) {
-print "\n";
+if (!$WHY) {
+  print "\n";
+}
   } else {
 print "  \n";
   }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp

2006-07-25 Thread Rafael Espindola


Changes in directory llvm/lib/Target/ARM:

ARMISelDAGToDAG.cpp updated: 1.16 -> 1.17
---
Log message:

implement function calling of functions with up to 4 arguments


---
Diffs of the changes:  (+45 -3)

 ARMISelDAGToDAG.cpp |   48 +---
 1 files changed, 45 insertions(+), 3 deletions(-)


Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.16 
llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.17
--- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.16Sat Jul 15 20:02:57 2006
+++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Jul 25 15:17:19 2006
@@ -75,17 +75,38 @@
   assert(isTailCall == false && "tail call not supported");
   SDOperand Callee   = Op.getOperand(4);
   unsigned NumOps= (Op.getNumOperands() - 5) / 2;
-  assert(NumOps == 0);
 
   // Count how many bytes are to be pushed on the stack. Initially
   // only the link register.
   unsigned NumBytes = 4;
 
+  assert(NumOps <= 4); //no args on the stack
+
   // Adjust the stack pointer for the new arguments...
   // These operations are automatically eliminated by the prolog/epilog pass
   Chain = DAG.getCALLSEQ_START(Chain,
DAG.getConstant(NumBytes, MVT::i32));
 
+  static const unsigned regs[] = {
+ARM::R0, ARM::R1, ARM::R2, ARM::R3
+  };
+
+  std::vector > RegsToPass;
+
+  for (unsigned i = 0; i != NumOps; ++i) {
+SDOperand Arg = Op.getOperand(5+2*i);
+RegsToPass.push_back(std::make_pair(regs[i], Arg));
+  }
+
+  // Build a sequence of copy-to-reg nodes chained together with token chain
+  // and flag operands which copy the outgoing args into the appropriate regs.
+  SDOperand InFlag;
+  for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
+Chain = DAG.getCopyToReg(Chain, RegsToPass[i].first, RegsToPass[i].second,
+ InFlag);
+InFlag = Chain.getValue(1);
+  }
+
   std::vector NodeTys;
   NodeTys.push_back(MVT::Other);   // Returns a chain
   NodeTys.push_back(MVT::Flag);// Returns a flag for retval copy to use.
@@ -103,14 +124,35 @@
   Ops.push_back(Callee);
 
   unsigned CallOpc = ARMISD::CALL;
+  if (InFlag.Val)
+Ops.push_back(InFlag);
   Chain = DAG.getNode(CallOpc, NodeTys, Ops);
+  InFlag = Chain.getValue(1);
+
+  std::vector ResultVals;
+  NodeTys.clear();
 
-  assert(Op.Val->getValueType(0) == MVT::Other);
+  // If the call has results, copy the values out of the ret val registers.
+  switch (Op.Val->getValueType(0)) {
+  default: assert(0 && "Unexpected ret value!");
+  case MVT::Other:
+break;
+  case MVT::i32:
+Chain = DAG.getCopyFromReg(Chain, ARM::R0, MVT::i32, InFlag).getValue(1);
+ResultVals.push_back(Chain.getValue(0));
+NodeTys.push_back(MVT::i32);
+  }
 
   Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain,
   DAG.getConstant(NumBytes, MVT::i32));
+  NodeTys.push_back(MVT::Other);
+
+  if (ResultVals.empty())
+return Chain;
 
-  return Chain;
+  ResultVals.push_back(Chain);
+  SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys, ResultVals);
+  return Res.getValue(Op.ResNo);
 }
 
 static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) {



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/call.ll

2006-07-25 Thread Rafael Espindola


Changes in directory llvm/test/Regression/CodeGen/ARM:

call.ll added (r1.1)
---
Log message:

implement function calling of functions with up to 4 arguments


---
Diffs of the changes:  (+8 -0)

 call.ll |8 
 1 files changed, 8 insertions(+)


Index: llvm/test/Regression/CodeGen/ARM/call.ll
diff -c /dev/null llvm/test/Regression/CodeGen/ARM/call.ll:1.1
*** /dev/null   Tue Jul 25 15:17:30 2006
--- llvm/test/Regression/CodeGen/ARM/call.llTue Jul 25 15:17:20 2006
***
*** 0 
--- 1,8 
+ ; RUN: llvm-as < %s | llc -march=arm
+ void %f() {
+ entry:
+   call void %g( int 1, int 2, int 3, int 4 )
+   ret void
+ }
+ 
+ declare void %g(int, int, int, int)



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.cpp X86InstrSSE.td

2006-07-25 Thread Evan Cheng


Changes in directory llvm/lib/Target/X86:

X86InstrInfo.cpp updated: 1.57 -> 1.58
X86InstrSSE.td updated: 1.129 -> 1.130
---
Log message:

Can't commute shufps. The high / low parts elements come from different vectors.

---
Diffs of the changes:  (+1 -20)

 X86InstrInfo.cpp |   18 --
 X86InstrSSE.td   |3 +--
 2 files changed, 1 insertion(+), 20 deletions(-)


Index: llvm/lib/Target/X86/X86InstrInfo.cpp
diff -u llvm/lib/Target/X86/X86InstrInfo.cpp:1.57 
llvm/lib/Target/X86/X86InstrInfo.cpp:1.58
--- llvm/lib/Target/X86/X86InstrInfo.cpp:1.57   Tue May 30 18:34:30 2006
+++ llvm/lib/Target/X86/X86InstrInfo.cppTue Jul 25 15:25:40 2006
@@ -207,24 +207,6 @@
 ///
 MachineInstr *X86InstrInfo::commuteInstruction(MachineInstr *MI) const {
   switch (MI->getOpcode()) {
-  case X86::SHUFPSrri: { // A = SHUFPSrri B,C, M -> A = SHUFPSrri C,B, 
rotl(M,4)
-unsigned A = MI->getOperand(0).getReg();
-unsigned B = MI->getOperand(1).getReg();
-unsigned C = MI->getOperand(2).getReg();
-unsigned M = MI->getOperand(3).getImmedValue();
-if (B == C) return 0;
-return BuildMI(X86::SHUFPSrri, 3, A).addReg(C).addReg(B).
-  addImm(((M & 0xF) << 4) | ((M & 0xF0) >> 4));
-  }
-  case X86::SHUFPDrri: { // A = SHUFPDrri B,C, M -> A = SHUFPDrri C,B, 
rotl(M,1)
-unsigned A = MI->getOperand(0).getReg();
-unsigned B = MI->getOperand(1).getReg();
-unsigned C = MI->getOperand(2).getReg();
-unsigned M = MI->getOperand(3).getImmedValue();
-if (B == C) return 0;
-return BuildMI(X86::SHUFPDrri, 3, A).addReg(C).addReg(B).
-  addImm(((M & 0x1) << 1) | ((M & 0x2) >> 1));
-  }
   case X86::SHRD16rri8: // A = SHRD16rri8 B, C, I -> A = SHLD16rri8 C, B, 
(16-I)
   case X86::SHLD16rri8: // A = SHLD16rri8 B, C, I -> A = SHRD16rri8 C, B, 
(16-I)
   case X86::SHRD32rri8: // A = SHRD32rri8 B, C, I -> A = SHLD32rri8 C, B, 
(32-I)


Index: llvm/lib/Target/X86/X86InstrSSE.td
diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.129 
llvm/lib/Target/X86/X86InstrSSE.td:1.130
--- llvm/lib/Target/X86/X86InstrSSE.td:1.129Fri Jul  7 03:33:52 2006
+++ llvm/lib/Target/X86/X86InstrSSE.td  Tue Jul 25 15:25:40 2006
@@ -1223,7 +1223,7 @@
 
 // Shuffle and unpack instructions
 let isTwoAddress = 1 in {
-let isCommutable = 1, isConvertibleToThreeAddress = 1 in // Convert to pshufd
+let isConvertibleToThreeAddress = 1 in // Convert to pshufd
 def SHUFPSrri : PSIi8<0xC6, MRMSrcReg, 
  (ops VR128:$dst, VR128:$src1, VR128:$src2, 
i32i8imm:$src3),
  "shufps {$src3, $src2, $dst|$dst, $src2, $src3}",
@@ -1236,7 +1236,6 @@
  [(set VR128:$dst, (v4f32 (vector_shuffle
VR128:$src1, (load addr:$src2),
SHUFP_shuffle_mask:$src3)))]>;
-let isCommutable = 1 in
 def SHUFPDrri : PDIi8<0xC6, MRMSrcReg, 
  (ops VR128:$dst, VR128:$src1, VR128:$src2, i8imm:$src3),
  "shufpd {$src3, $src2, $dst|$dst, $src2, $src3}",



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/include/llvm/Target/TargetJITInfo.h

2006-07-25 Thread Evan Cheng


Changes in directory llvm/include/llvm/Target:

TargetJITInfo.h updated: 1.7 -> 1.8
---
Log message:

- Refactor the code that resolve basic block references to a TargetJITInfo
  method.
- Added synchronizeICache() to TargetJITInfo. It is called after each block
  of code is emitted to flush the icache. This ensures correct execution
  on targets that have separate dcache and icache.
- Added PPC / Mac OS X specific code to do icache flushing.



---
Diffs of the changes:  (+19 -0)

 TargetJITInfo.h |   19 +++
 1 files changed, 19 insertions(+)


Index: llvm/include/llvm/Target/TargetJITInfo.h
diff -u llvm/include/llvm/Target/TargetJITInfo.h:1.7 
llvm/include/llvm/Target/TargetJITInfo.h:1.8
--- llvm/include/llvm/Target/TargetJITInfo.h:1.7Fri Jul 22 15:46:42 2005
+++ llvm/include/llvm/Target/TargetJITInfo.hTue Jul 25 15:40:54 2006
@@ -18,10 +18,12 @@
 #define LLVM_TARGET_TARGETJITINFO_H
 
 #include 
+#include 
 
 namespace llvm {
   class Function;
   class FunctionPassManager;
+  class MachineBasicBlock;
   class MachineCodeEmitter;
   class MachineRelocation;
 
@@ -81,6 +83,20 @@
   assert(NumRelocs == 0 && "This target does not have relocations!");
 }
 
+/// resolveBBRefs - Resolve branches to BasicBlocks for the JIT emitted
+/// function.
+virtual void resolveBBRefs(MachineCodeEmitter &MCE) {}
+
+/// synchronizeICache - On some targets, the JIT emitted code must be
+/// explicitly refetched to ensure correct execution.
+virtual void synchronizeICache(const void *Addr, size_t len) {}
+
+/// addBBRef - Add a BasicBlock reference to be resolved after the function
+/// is emitted.
+void addBBRef(MachineBasicBlock *BB, intptr_t PC) {
+  BBRefs.push_back(std::make_pair(BB, PC));
+}
+
 /// needsGOT - Allows a target to specify that it would like the
 // JIT to manage a GOT for it.
 bool needsGOT() const { return useGOT; }
@@ -88,6 +104,9 @@
   protected:
 bool useGOT;
 
+// Tracks which instruction references which BasicBlock
+std::vector > BBRefs;
+
   };
 } // End llvm namespace
 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/Alpha/Alpha.h AlphaCodeEmitter.cpp AlphaJITInfo.cpp AlphaJITInfo.h AlphaTargetMachine.cpp

2006-07-25 Thread Evan Cheng


Changes in directory llvm/lib/Target/Alpha:

Alpha.h updated: 1.5 -> 1.6
AlphaCodeEmitter.cpp updated: 1.15 -> 1.16
AlphaJITInfo.cpp updated: 1.9 -> 1.10
AlphaJITInfo.h updated: 1.1 -> 1.2
AlphaTargetMachine.cpp updated: 1.26 -> 1.27
---
Log message:

- Refactor the code that resolve basic block references to a TargetJITInfo
  method.
- Added synchronizeICache() to TargetJITInfo. It is called after each block
  of code is emitted to flush the icache. This ensures correct execution
  on targets that have separate dcache and icache.
- Added PPC / Mac OS X specific code to do icache flushing.



---
Diffs of the changes:  (+32 -25)

 Alpha.h|4 +++-
 AlphaCodeEmitter.cpp   |   34 +++---
 AlphaJITInfo.cpp   |   16 
 AlphaJITInfo.h |1 +
 AlphaTargetMachine.cpp |2 +-
 5 files changed, 32 insertions(+), 25 deletions(-)


Index: llvm/lib/Target/Alpha/Alpha.h
diff -u llvm/lib/Target/Alpha/Alpha.h:1.5 llvm/lib/Target/Alpha/Alpha.h:1.6
--- llvm/lib/Target/Alpha/Alpha.h:1.5   Wed Oct 19 19:28:31 2005
+++ llvm/lib/Target/Alpha/Alpha.h   Tue Jul 25 15:40:54 2006
@@ -19,6 +19,7 @@
 
 namespace llvm {
 
+  class AlphaTargetMachine;
   class FunctionPass;
   class TargetMachine;
   class MachineCodeEmitter;
@@ -28,7 +29,8 @@
   FunctionPass *createAlphaCodePrinterPass(std::ostream &OS,
  TargetMachine &TM);
   FunctionPass *createAlphaPatternInstructionSelector(TargetMachine &TM);
-  FunctionPass *createAlphaCodeEmitterPass(MachineCodeEmitter &MCE);
+  FunctionPass *createAlphaCodeEmitterPass(AlphaTargetMachine &TM,
+   MachineCodeEmitter &MCE);
 } // end namespace llvm;
 
 // Defines symbolic names for Alpha registers.  This defines a mapping from


Index: llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp
diff -u llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp:1.15 
llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp:1.16
--- llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp:1.15 Wed May  3 15:30:20 2006
+++ llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp  Tue Jul 25 15:40:54 2006
@@ -34,17 +34,19 @@
 namespace {
   class AlphaCodeEmitter : public MachineFunctionPass {
 const AlphaInstrInfo  *II;
+TargetMachine &TM;
 MachineCodeEmitter  &MCE;
-std::vector > BBRefs;
 
 /// getMachineOpValue - evaluates the MachineOperand of a given 
MachineInstr
 ///
 int getMachineOpValue(MachineInstr &MI, MachineOperand &MO);
 
   public:
-explicit AlphaCodeEmitter(MachineCodeEmitter &mce) : II(0), MCE(mce) {}
-AlphaCodeEmitter(MachineCodeEmitter &mce, const AlphaInstrInfo& ii)
-: II(&ii), MCE(mce) {}
+explicit AlphaCodeEmitter(TargetMachine &tm, MachineCodeEmitter &mce)
+  : II(0), TM(tm), MCE(mce) {}
+AlphaCodeEmitter(TargetMachine &tm, MachineCodeEmitter &mce,
+ const AlphaInstrInfo& ii)
+  : II(&ii), TM(tm), MCE(mce) {}
 
 bool runOnMachineFunction(MachineFunction &MF);
 
@@ -68,34 +70,20 @@
 
 /// createAlphaCodeEmitterPass - Return a pass that emits the collected Alpha 
code
 /// to the specified MCE object.
-FunctionPass *llvm::createAlphaCodeEmitterPass(MachineCodeEmitter &MCE) {
-  return new AlphaCodeEmitter(MCE);
+FunctionPass *llvm::createAlphaCodeEmitterPass(AlphaTargetMachine &TM,
+   MachineCodeEmitter &MCE) {
+  return new AlphaCodeEmitter(TM, MCE);
 }
 
 bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
   II = ((AlphaTargetMachine&)MF.getTarget()).getInstrInfo();
 
   do {
-BBRefs.clear();
-
 MCE.startFunction(MF);
 for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
   emitBasicBlock(*I);
   } while (MCE.finishFunction(MF));
 
-  // Resolve all forward branches now...
-  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
-unsigned* Location =
-  (unsigned*)MCE.getMachineBasicBlockAddress(BBRefs[i].first);
-unsigned* Ref = (unsigned*)BBRefs[i].second;
-intptr_t BranchTargetDisp = 
-  (((unsigned char*)Location  - (unsigned char*)Ref) >> 2) - 1;
-DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location
-  << " Disp " << BranchTargetDisp 
-  << " using " <<  (BranchTargetDisp & ((1 << 22)-1)) << "\n");
-*Ref |= (BranchTargetDisp & ((1 << 21)-1));
-  }
-  BBRefs.clear();
   return false;
 }
 
@@ -227,8 +215,8 @@
   Reloc, MO.getConstantPoolIndex(),
   Offset));
   } else if (MO.isMachineBasicBlock()) {
-unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue();
-BBRefs.push_back(std::make_pair(MO.getMachineBasicBlock(), CurrPC));
+TM.getJITInfo()->addBBRef(MO.getMachineBasicBlock(),
+  MCE.getCurrentPCValue());
   }else {
 std::cerr << "ERROR: Unknown type of MachineOperand: " << MO << "\n";
 abort();



[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp PPCJITInfo.cpp PPCJITInfo.h

2006-07-25 Thread Evan Cheng


Changes in directory llvm/lib/Target/PowerPC:

PPCCodeEmitter.cpp updated: 1.63 -> 1.64
PPCJITInfo.cpp updated: 1.24 -> 1.25
PPCJITInfo.h updated: 1.9 -> 1.10
---
Log message:

- Refactor the code that resolve basic block references to a TargetJITInfo
  method.
- Added synchronizeICache() to TargetJITInfo. It is called after each block
  of code is emitted to flush the icache. This ensures correct execution
  on targets that have separate dcache and icache.
- Added PPC / Mac OS X specific code to do icache flushing.



---
Diffs of the changes:  (+43 -27)

 PPCCodeEmitter.cpp |   32 +---
 PPCJITInfo.cpp |   35 +++
 PPCJITInfo.h   |3 +++
 3 files changed, 43 insertions(+), 27 deletions(-)


Index: llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp
diff -u llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp:1.63 
llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp:1.64
--- llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp:1.63 Wed Jul 12 16:23:20 2006
+++ llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp  Tue Jul 25 15:40:54 2006
@@ -32,9 +32,6 @@
 TargetMachine &TM;
 MachineCodeEmitter &MCE;
 
-// Tracks which instruction references which BasicBlock
-std::vector > BBRefs;
-
 /// getMachineOpValue - evaluates the MachineOperand of a given 
MachineInstr
 ///
 int getMachineOpValue(MachineInstr &MI, MachineOperand &MO);
@@ -80,39 +77,20 @@
   return false;
 }
 
+#ifdef __APPLE__ 
+extern "C" void sys_icache_invalidate(const void *Addr, size_t len);
+#endif
+
 bool PPCCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
   assert((MF.getTarget().getRelocationModel() != Reloc::Default ||
   MF.getTarget().getRelocationModel() != Reloc::Static) &&
  "JIT relocation model must be set to static or default!");
   do {
-BBRefs.clear();
-
 MCE.startFunction(MF);
 for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); BB != E; 
++BB)
   emitBasicBlock(*BB);
   } while (MCE.finishFunction(MF));
 
-  // Resolve branches to BasicBlocks for the entire function
-  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
-intptr_t Location = MCE.getMachineBasicBlockAddress(BBRefs[i].first);
-unsigned *Ref = BBRefs[i].second;
-DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location
-<< "\n");
-unsigned Instr = *Ref;
-intptr_t BranchTargetDisp = (Location - (intptr_t)Ref) >> 2;
-
-switch (Instr >> 26) {
-default: assert(0 && "Unknown branch user!");
-case 18:  // This is B or BL
-  *Ref |= (BranchTargetDisp & ((1 << 24)-1)) << 2;
-  break;
-case 16:  // This is BLT,BLE,BEQ,BGE,BGT,BNE, or other bcx instruction
-  *Ref |= (BranchTargetDisp & ((1 << 14)-1)) << 2;
-  break;
-}
-  }
-  BBRefs.clear();
-
   return false;
 }
 
@@ -203,7 +181,7 @@
   Reloc, MO.getSymbolName(), 0));
   } else if (MO.isMachineBasicBlock()) {
 unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue();
-BBRefs.push_back(std::make_pair(MO.getMachineBasicBlock(), CurrPC));
+TM.getJITInfo()->addBBRef(MO.getMachineBasicBlock(), (intptr_t)CurrPC);
   } else if (MO.isConstantPoolIndex() || MO.isJumpTableIndex()) {
 if (MO.isConstantPoolIndex())
   rv = MCE.getConstantPoolEntryAddress(MO.getConstantPoolIndex());


Index: llvm/lib/Target/PowerPC/PPCJITInfo.cpp
diff -u llvm/lib/Target/PowerPC/PPCJITInfo.cpp:1.24 
llvm/lib/Target/PowerPC/PPCJITInfo.cpp:1.25
--- llvm/lib/Target/PowerPC/PPCJITInfo.cpp:1.24 Wed Jul 12 16:23:20 2006
+++ llvm/lib/Target/PowerPC/PPCJITInfo.cpp  Tue Jul 25 15:40:54 2006
@@ -16,7 +16,9 @@
 #include "PPCRelocations.h"
 #include "llvm/CodeGen/MachineCodeEmitter.h"
 #include "llvm/Config/alloca.h"
+#include "llvm/Support/Debug.h"
 #include 
+#include 
 using namespace llvm;
 
 static TargetJITInfo::JITCompilerFn JITCompilerFunction;
@@ -243,3 +245,36 @@
 void PPCJITInfo::replaceMachineCodeForFunction(void *Old, void *New) {
   EmitBranchToAt(Old, New, false);
 }
+
+void PPCJITInfo::resolveBBRefs(MachineCodeEmitter &MCE) {
+  // Resolve branches to BasicBlocks for the entire function
+  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
+intptr_t Location = MCE.getMachineBasicBlockAddress(BBRefs[i].first);
+unsigned *Ref = (unsigned *)BBRefs[i].second;
+DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location
+<< "\n");
+unsigned Instr = *Ref;
+intptr_t BranchTargetDisp = (Location - (intptr_t)Ref) >> 2;
+
+switch (Instr >> 26) {
+default: assert(0 && "Unknown branch user!");
+case 18:  // This is B or BL
+  *Ref |= (BranchTargetDisp & ((1 << 24)-1)) << 2;
+  break;
+case 16:  // This is BLT,BLE,BEQ,BGE,BGT,BNE, or other bcx instruction
+  *Ref |= (BranchTargetDisp & ((1 << 14)-1)) << 2;
+  break;
+}
+  }
+  BBRefs.clear();
+}
+
+#ifdef __APPLE__ 
+extern "C" void sys_icache_inva

[llvm-commits] CVS: llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp

2006-07-25 Thread Evan Cheng


Changes in directory llvm/lib/ExecutionEngine/JIT:

JITEmitter.cpp updated: 1.106 -> 1.107
---
Log message:

- Refactor the code that resolve basic block references to a TargetJITInfo
  method.
- Added synchronizeICache() to TargetJITInfo. It is called after each block
  of code is emitted to flush the icache. This ensures correct execution
  on targets that have separate dcache and icache.
- Added PPC / Mac OS X specific code to do icache flushing.



---
Diffs of the changes:  (+16 -1)

 JITEmitter.cpp |   17 -
 1 files changed, 16 insertions(+), 1 deletion(-)


Index: llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp
diff -u llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp:1.106 
llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp:1.107
--- llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp:1.106   Fri Jul  7 12:31:41 2006
+++ llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp Tue Jul 25 15:40:54 2006
@@ -542,6 +542,10 @@
 TheJIT->updateGlobalMapping(F, Stub);
   }
 
+  // Invalidate the icache if necessary.
+  TheJIT->getJITInfo().
+synchronizeICache(Stub, MCE.getCurrentPCValue()-(intptr_t)Stub);
+
   DEBUG(std::cerr << "JIT: Stub emitted at [" << Stub << "] for function '"
   << F->getName() << "'\n");
 
@@ -559,6 +563,11 @@
   if (Stub) return Stub;
 
   Stub = TheJIT->getJITInfo().emitFunctionStub(FnAddr, MCE);
+
+  // Invalidate the icache if necessary.
+  TheJIT->getJITInfo().
+synchronizeICache(Stub, MCE.getCurrentPCValue()-(intptr_t)Stub);
+
   DEBUG(std::cerr << "JIT: Stub emitted at [" << Stub
 << "] for external function at '" << FnAddr << "'\n");
   return Stub;
@@ -747,7 +756,7 @@
   // About to start emitting the machine code for the function.
   emitAlignment(std::max(F.getFunction()->getAlignment(), 8U));
   TheJIT->updateGlobalMapping(F.getFunction(), CurBufferPtr);
-  
+
   MBBLocations.clear();
 }
 
@@ -825,6 +834,12 @@
 }
   }
 
+  // Resolve BasicaBlock references.
+  TheJIT->getJITInfo().resolveBBRefs(*this);
+
+  // Invalidate the icache if necessary.
+  TheJIT->getJITInfo().synchronizeICache(FnStart, FnEnd-FnStart);
+
   DEBUG(std::cerr << "JIT: Finished CodeGen of [" << (void*)FnStart
   << "] Function: " << F.getFunction()->getName()
   << ": " << (FnEnd-FnStart) << " bytes of text, "



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Target/X86/X86.h X86CodeEmitter.cpp X86ELFWriter.cpp X86JITInfo.cpp X86JITInfo.h X86TargetMachine.cpp

2006-07-25 Thread Evan Cheng


Changes in directory llvm/lib/Target/X86:

X86.h updated: 1.45 -> 1.46
X86CodeEmitter.cpp updated: 1.110 -> 1.111
X86ELFWriter.cpp updated: 1.4 -> 1.5
X86JITInfo.cpp updated: 1.23 -> 1.24
X86JITInfo.h updated: 1.8 -> 1.9
X86TargetMachine.cpp updated: 1.117 -> 1.118
---
Log message:

- Refactor the code that resolve basic block references to a TargetJITInfo
  method.
- Added synchronizeICache() to TargetJITInfo. It is called after each block
  of code is emitted to flush the icache. This ensures correct execution
  on targets that have separate dcache and icache.
- Added PPC / Mac OS X specific code to do icache flushing.



---
Diffs of the changes:  (+26 -19)

 X86.h|3 ++-
 X86CodeEmitter.cpp   |   26 ++
 X86ELFWriter.cpp |2 +-
 X86JITInfo.cpp   |   10 ++
 X86JITInfo.h |2 ++
 X86TargetMachine.cpp |2 +-
 6 files changed, 26 insertions(+), 19 deletions(-)


Index: llvm/lib/Target/X86/X86.h
diff -u llvm/lib/Target/X86/X86.h:1.45 llvm/lib/Target/X86/X86.h:1.46
--- llvm/lib/Target/X86/X86.h:1.45  Mon Mar 13 17:20:37 2006
+++ llvm/lib/Target/X86/X86.h   Tue Jul 25 15:40:54 2006
@@ -44,7 +44,8 @@
 
 /// createX86CodeEmitterPass - Return a pass that emits the collected X86 code
 /// to the specified MCE object.
-FunctionPass *createX86CodeEmitterPass(MachineCodeEmitter &MCE);
+FunctionPass *createX86CodeEmitterPass(X86TargetMachine &TM,
+   MachineCodeEmitter &MCE);
 
 /// addX86ELFObjectWriterPass - Add passes to the FPM that output the generated
 /// code as an ELF object file.


Index: llvm/lib/Target/X86/X86CodeEmitter.cpp
diff -u llvm/lib/Target/X86/X86CodeEmitter.cpp:1.110 
llvm/lib/Target/X86/X86CodeEmitter.cpp:1.111
--- llvm/lib/Target/X86/X86CodeEmitter.cpp:1.110Wed Jun 28 18:27:49 2006
+++ llvm/lib/Target/X86/X86CodeEmitter.cpp  Tue Jul 25 15:40:54 2006
@@ -35,12 +35,14 @@
 namespace {
   class VISIBILITY_HIDDEN Emitter : public MachineFunctionPass {
 const X86InstrInfo  *II;
+TargetMachine &TM;
 MachineCodeEmitter  &MCE;
-std::vector > BBRefs;
   public:
-explicit Emitter(MachineCodeEmitter &mce) : II(0), MCE(mce) {}
-Emitter(MachineCodeEmitter &mce, const X86InstrInfo& ii)
-: II(&ii), MCE(mce) {}
+explicit Emitter(TargetMachine &tm, MachineCodeEmitter &mce)
+  : II(0), TM(tm), MCE(mce) {}
+Emitter(TargetMachine &tm, MachineCodeEmitter &mce,
+const X86InstrInfo& ii)
+  : II(&ii), TM(tm), MCE(mce) {}
 
 bool runOnMachineFunction(MachineFunction &MF);
 
@@ -71,8 +73,9 @@
 
 /// createX86CodeEmitterPass - Return a pass that emits the collected X86 code
 /// to the specified MCE object.
-FunctionPass *llvm::createX86CodeEmitterPass(MachineCodeEmitter &MCE) {
-  return new Emitter(MCE);
+FunctionPass *llvm::createX86CodeEmitterPass(X86TargetMachine &TM,
+ MachineCodeEmitter &MCE) {
+  return new Emitter(TM, MCE);
 }
 
 bool Emitter::runOnMachineFunction(MachineFunction &MF) {
@@ -82,8 +85,6 @@
   II = ((X86TargetMachine&)MF.getTarget()).getInstrInfo();
 
   do {
-BBRefs.clear();
-
 MCE.startFunction(MF);
 for (MachineFunction::iterator MBB = MF.begin(), E = MF.end(); 
  MBB != E; ++MBB) {
@@ -94,13 +95,6 @@
 }
   } while (MCE.finishFunction(MF));
 
-  // Resolve all forward branches now.
-  for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
-unsigned Location = MCE.getMachineBasicBlockAddress(BBRefs[i].first);
-unsigned Ref = BBRefs[i].second;
-*((unsigned*)(intptr_t)Ref) = Location-Ref-4;
-  }
-  BBRefs.clear();
   return false;
 }
 
@@ -117,7 +111,7 @@
 void Emitter::emitPCRelativeBlockAddress(MachineBasicBlock *MBB) {
   // Remember where this reference was and where it is to so we can
   // deal with it later.
-  BBRefs.push_back(std::make_pair(MBB, MCE.getCurrentPCValue()));
+  TM.getJITInfo()->addBBRef(MBB, MCE.getCurrentPCValue());
   MCE.emitWordLE(0);
 }
 


Index: llvm/lib/Target/X86/X86ELFWriter.cpp
diff -u llvm/lib/Target/X86/X86ELFWriter.cpp:1.4 
llvm/lib/Target/X86/X86ELFWriter.cpp:1.5
--- llvm/lib/Target/X86/X86ELFWriter.cpp:1.4Wed Jun 28 18:27:49 2006
+++ llvm/lib/Target/X86/X86ELFWriter.cppTue Jul 25 15:40:54 2006
@@ -35,5 +35,5 @@
  std::ostream &O, X86TargetMachine &TM) {
   X86ELFWriter *EW = new X86ELFWriter(O, TM);
   FPM.add(EW);
-  FPM.add(createX86CodeEmitterPass(EW->getMachineCodeEmitter()));
+  FPM.add(createX86CodeEmitterPass(TM, EW->getMachineCodeEmitter()));
 }


Index: llvm/lib/Target/X86/X86JITInfo.cpp
diff -u llvm/lib/Target/X86/X86JITInfo.cpp:1.23 
llvm/lib/Target/X86/X86JITInfo.cpp:1.24
--- llvm/lib/Target/X86/X86JITInfo.cpp:1.23 Wed Jul  5 02:09:13 2006
+++ llvm/lib/Target/X86/X86JITInfo.cpp  Tue Jul 25 15:40:54 2006
@@ -203,3 +203,13 @@
 }
   }
 }
+
+void X86JITInfo::resolveBBRefs(MachineCodeEmitter &MCE) {
+  // Resolve all forward branch

[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

2006-07-25 Thread Reid Spencer


Changes in directory llvm/lib/CodeGen/SelectionDAG:

DAGCombiner.cpp updated: 1.178 -> 1.179
---
Log message:

Initialize some variables the compiler warns about.


---
Diffs of the changes:  (+2 -2)

 DAGCombiner.cpp |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.178 
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.179
--- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.178 Fri Jul 21 03:25:53 2006
+++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp   Tue Jul 25 15:44:41 2006
@@ -2603,7 +2603,7 @@
   bool isUnary = true;
   bool isSplat = true;
   int VecNum = -1;
-  unsigned BaseIdx;
+  unsigned BaseIdx = 0;
   for (unsigned i = 0; i != NumElts; ++i)
 if (ShufMask.getOperand(i).getOpcode() != ISD::UNDEF) {
   unsigned Idx = cast(ShufMask.getOperand(i))->getValue();
@@ -2722,7 +2722,7 @@
   bool isUnary = true;
   bool isSplat = true;
   int VecNum = -1;
-  unsigned BaseIdx;
+  unsigned BaseIdx = 0;
   for (unsigned i = 0; i != NumElts; ++i)
 if (ShufMask.getOperand(i).getOpcode() != ISD::UNDEF) {
   unsigned Idx = cast(ShufMask.getOperand(i))->getValue();



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/VMCore/Type.cpp

2006-07-25 Thread Jim Laskey


Changes in directory llvm/lib/VMCore:

Type.cpp updated: 1.141 -> 1.142
---
Log message:

Moving this function to a permanent home to prevent a dependency cycle created
by the inline heuristic.  Was preventing llvm-gcc4 from building.


---
Diffs of the changes:  (+19 -0)

 Type.cpp |   19 +++
 1 files changed, 19 insertions(+)


Index: llvm/lib/VMCore/Type.cpp
diff -u llvm/lib/VMCore/Type.cpp:1.141 llvm/lib/VMCore/Type.cpp:1.142
--- llvm/lib/VMCore/Type.cpp:1.141  Wed Jun 28 16:38:54 2006
+++ llvm/lib/VMCore/Type.cppTue Jul 25 18:22:00 2006
@@ -33,6 +33,25 @@
 
 AbstractTypeUser::~AbstractTypeUser() {}
 
+
+//===--===//
+// Type PATypeHolder Implementation
+//===--===//
+
+// This routine was moved here to resolve a cyclic dependency caused by
+// inline heuristics.
+
+/// get - This implements the forwarding part of the union-find algorithm for
+/// abstract types.  Before every access to the Type*, we check to see if the
+/// type we are pointing to is forwarding to a new type.  If so, we drop our
+/// reference to the type.
+///
+Type* PATypeHolder::get() const {
+  const Type *NewTy = Ty->getForwardedType();
+  if (!NewTy) return const_cast(Ty);
+  return *const_cast(this) = NewTy;
+}
+
 
//===--===//
 // Type Class Implementation
 
//===--===//



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/include/llvm/Type.h

2006-07-25 Thread Jim Laskey


Changes in directory llvm/include/llvm:

Type.h updated: 1.87 -> 1.88
---
Log message:

Moving this function to a permanent home to prevent a dependency cycle created
by the inline heuristic.  Was preventing llvm-gcc4 from building.


---
Diffs of the changes:  (+0 -12)

 Type.h |   12 
 1 files changed, 12 deletions(-)


Index: llvm/include/llvm/Type.h
diff -u llvm/include/llvm/Type.h:1.87 llvm/include/llvm/Type.h:1.88
--- llvm/include/llvm/Type.h:1.87   Wed May 31 11:03:20 2006
+++ llvm/include/llvm/Type.hTue Jul 25 18:22:00 2006
@@ -401,18 +401,6 @@
 Ty->dropRef();
 }
 
-/// get - This implements the forwarding part of the union-find algorithm for
-/// abstract types.  Before every access to the Type*, we check to see if the
-/// type we are pointing to is forwarding to a new type.  If so, we drop our
-/// reference to the type.
-///
-inline Type* PATypeHolder::get() const {
-  const Type *NewTy = Ty->getForwardedType();
-  if (!NewTy) return const_cast(Ty);
-  return *const_cast(this) = NewTy;
-}
-
-
 
 
//===--===//
 // Provide specializations of GraphTraits to be able to treat a type as a



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: nightlytest-serverside/NightlyTestAccept.cgi

2006-07-25 Thread Patrick Jenkins


Changes in directory nightlytest-serverside:

NightlyTestAccept.cgi updated: 1.29 -> 1.30
---
Log message:

Fixed some syntax errors


---
Diffs of the changes:  (+6 -5)

 NightlyTestAccept.cgi |   11 ++-
 1 files changed, 6 insertions(+), 5 deletions(-)


Index: nightlytest-serverside/NightlyTestAccept.cgi
diff -u nightlytest-serverside/NightlyTestAccept.cgi:1.29 
nightlytest-serverside/NightlyTestAccept.cgi:1.30
--- nightlytest-serverside/NightlyTestAccept.cgi:1.29   Sun Jul 23 18:12:30 2006
+++ nightlytest-serverside/NightlyTestAccept.cgiTue Jul 25 19:15:04 2006
@@ -94,14 +94,16 @@
@ONE = split "\n", $one;
@TWO = split "\n", $two;

+   $value=1;
+   
my %hash_of_diff=();
foreach $x (@TWO){
-   $hash_of_diff{$x}=1;
+   $hash_of_diff{$x}=$value;
}

$result="";
foreach $x (@ONE){
-   if($hash_of_diff{$x}!=1){
+   if($hash_of_diff{$x}!=$value){
$result.="$x\n";
}
}
@@ -381,8 +383,7 @@
 if(%$row && ($row->{'loc'} != $_[1] ||
 $row->{'files'} != $_[2] ||
 $row->{'dirs'} != $_[3])){
-   my $e = $dbh->prepare("insert into code (added, loc, files, dirs) ".
- "values (\"$_[0]\", $_[1], $_[2], $_[3])");
+   my $e = $dbh->prepare("insert into code (added, loc, files, dirs) 
values (\"$_[0]\", \"$_[1]\", \"$_[2]\", \"$_[3]\")");
 $e->execute;
 }
 }
@@ -431,7 +432,7 @@
$olden_tests="" unless $olden_tests;
 my @OLDEN_TESTS = split $spliton, $singlesource_tests;
 
-my $filesincvs = param('cvs_files_count');
+my $filesincvs = param('cvs_file_count');
 my $dirsincvs = param('cvs_dir_count');
 my $loc = param('lines_of_code');
 my $nickname = param('nickname');



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: nightlytest-serverside/NightlyTester.php

2006-07-25 Thread Patrick Jenkins


Changes in directory nightlytest-serverside:

NightlyTester.php updated: 1.2 -> 1.3
---
Log message:

Added support for pulling out .a and .o files


---
Diffs of the changes:  (+65 -2)

 NightlyTester.php |   67 --
 1 files changed, 65 insertions(+), 2 deletions(-)


Index: nightlytest-serverside/NightlyTester.php
diff -u nightlytest-serverside/NightlyTester.php:1.2 
nightlytest-serverside/NightlyTester.php:1.3
--- nightlytest-serverside/NightlyTester.php:1.2Thu Jul  6 13:25:11 2006
+++ nightlytest-serverside/NightlyTester.phpTue Jul 25 20:09:24 2006
@@ -145,16 +145,79 @@
return $time;   
 }
 
+/*
+ *
+ * Purpose: get all the .a file sizes for a specific test
+ * Returns: An array with the name of the file being
+ * the index and the value being an array with the first
+ * element containing code size and the second element
+ * containing [debug|release]
+ *
+ */
+function get_a_files($mysql_link, $night_id){
+   $result = mysql_query("select a_file_size from night WHERE 
id=$night_id") or die (mysql_error());
+   $result=array();
+   $files = array();
+   $files = explode("\n", $result['a_file_size']);
+   foreach ($files as $f){
+   preg_match("/(.+)\s+(.+)\s+(.+)/", $f, $matches)
+   $result["{$matches[0]"] = array( "{$matches[1]", "{$matches[2]" 
);
+   }
+   return $result;
+}
+
+/*
+ *
+ * Purpose: get all the .o file sizes for a specific test
+ * Returns: An array with the name of the file being
+ * the index and the value being an array with the first
+ * element containing code size and the second element
+ * containing [debug|release]
+ *
+ */
+function get_o_files($mysql_link, $night_id){
+   $result = mysql_query("select o_file_size from night WHERE 
id=$night_id") or die (mysql_error());
+   $result=array();
+   $files = array();
+   $files = explode("\n", $result['o_file_size']);
+   foreach ($files as $f){
+   preg_match("/(.+)\s+(.+)\s+(.+)/", $f, $matches)
+   $result["{$matches[0]"] = array( "{$matches[1]", "{$matches[2]" 
);
+   }
+   return $result;
+}
+
+/*
+ *
+ * Purpose: Get a combined list of .a and .o file sizes
+ * Returns: 
+ *
+ */
+function get_file_sizes($mysql_link, $night_id){
+   $result = array();
+   $result = merge(get_a_files($mysql_link, $night_id), 
get_o_files($mysql_link, $night_id));
+   return $result;
+}
+
+
 
 /*
  *
  * Example uses of each function
  *
  */
-/*$mysql_link = mysql_connect("127.0.0.1","llvm","ll2002vm");
+$mysql_link = mysql_connect("127.0.0.1","llvm","ll2002vm");
 mysql_select_db("nightlytestresults");
 
-$machine_info = getMachineInfo(21, $mysql_link);
+$night_id = 534;
+
+$files = get_a_files($mysql_link, $night_id);
+
+foreach (array_keys($files) as $f){
+   print "$f = > {$files['$f'][0]}\n";
+}
+
+/*$machine_info = getMachineInfo(21, $mysql_link);
 foreach (array_keys($machine_info) as $key){
print "$key => {$machine_info["$key"]}\n";
 }



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/include/llvm/ADT/SmallVector.h

2006-07-25 Thread Chris Lattner


Changes in directory llvm/include/llvm/ADT:

SmallVector.h added (r1.1)
---
Log message:

Add a new llvm::SmallVector template, which is similar to the vector class, but
contains optimizations to avoid heap allocation if the vector size is smaller
than some threshold.  This can significantly improve the performance of code
that allocates many small vectors by eliminating tons of small malloc/free's.


---
Diffs of the changes:  (+196 -0)

 SmallVector.h |  196 ++
 1 files changed, 196 insertions(+)


Index: llvm/include/llvm/ADT/SmallVector.h
diff -c /dev/null llvm/include/llvm/ADT/SmallVector.h:1.1
*** /dev/null   Wed Jul 26 01:22:40 2006
--- llvm/include/llvm/ADT/SmallVector.h Wed Jul 26 01:22:30 2006
***
*** 0 
--- 1,196 
+ //===- llvm/ADT/SmallVector.h - 'Normally small' vectors *- C++ 
-*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Chris Lattner and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for 
details.
+ //
+ 
//===--===//
+ //
+ // This file defines the SmallVector class.
+ //
+ 
//===--===//
+ 
+ #ifndef LLVM_ADT_SMALLVECTOR_H
+ #define LLVM_ADT_SMALLVECTOR_H
+ 
+ #include 
+ #include 
+ 
+ namespace llvm {
+ 
+ /// SmallVector - This is a 'vector' (really, a variable-sized array), 
optimized
+ /// for the case when the array is small.  It contains some number of elements
+ /// in-place, which allows it to avoid heap allocation when the actual number 
of
+ /// elements is below that threshold.  This allows normal "small" cases to be
+ /// fast without losing generality for large inputs.
+ ///
+ /// Note that this does not attempt to be exception safe.
+ ///
+ template 
+ class SmallVector {
+   // Allocate raw space for N elements of type T.  If T has a ctor or dtor, we
+   // don't want it to be automatically run, so we need to represent the space 
as
+   // something else.  An array of char would work great, but might not be
+   // aligned sufficiently.  Instead, we either use GCC extensions, or some
+   // number of union instances for the space, which guarantee maximal 
alignment.
+   union U {
+ double D;
+ long double LD;
+ long long L;
+ void *P;
+   };
+   
+   /// InlineElts - These are the 'N' elements that are stored inline in the 
body
+   /// of the vector
+   U InlineElts[(sizeof(T)*N+sizeof(U)-1)/sizeof(U)];
+   T *Begin, *End, *Capacity;
+ public:
+   // Default ctor - Initialize to empty.
+   SmallVector() : Begin((T*)InlineElts), End(Begin), Capacity(Begin+N) {
+   }
+   
+   SmallVector(const SmallVector &RHS) {
+ unsigned RHSSize = RHS.size();
+ Begin = (T*)InlineElts;
+ 
+ // Doesn't fit in the small case?  Allocate space.
+ if (RHSSize > N) {
+   End = Capacity = Begin;
+   grow(RHSSize);
+ }
+ End = Begin+RHSSize;
+ Capacity = Begin+N;
+ std::uninitialized_copy(RHS.begin(), RHS.end(), Begin);
+   }
+   ~SmallVector() {
+ // If this wasn't grown from the inline copy, deallocate the old space.
+ if ((void*)Begin != (void*)InlineElts)
+   delete[] (char*)Begin;
+   }
+   
+   typedef size_t size_type;
+   typedef T* iterator;
+   typedef const T* const_iterator;
+   typedef T& reference;
+   typedef const T& const_reference;
+ 
+   bool empty() const { return Begin == End; }
+   size_type size() const { return End-Begin; }
+   
+   iterator begin() { return Begin; }
+   const_iterator begin() const { return Begin; }
+ 
+   iterator end() { return End; }
+   const_iterator end() const { return End; }
+   
+   reference operator[](unsigned idx) {
+ assert(idx < size() && "out of range reference!");
+ return Begin[idx];
+   }
+   const_reference operator[](unsigned idx) const {
+ assert(idx < size() && "out of range reference!");
+ return Begin[idx];
+   }
+   
+   reference back() {
+ assert(!empty() && "SmallVector is empty!");
+ return end()[-1];
+   }
+   const_reference back() const {
+ assert(!empty() && "SmallVector is empty!");
+ return end()[-1];
+   }
+   
+   void push_back(const_reference Elt) {
+ if (End < Capacity) {
+   Retry:
+   new (End) T(Elt);
+   ++End;
+   return;
+ }
+ grow();
+ goto Retry;
+   }
+   
+   const SmallVector &operator=(const SmallVector &RHS) {
+ // Avoid self-assignment.
+ if (this == &RHS) return *this;
+ 
+ // If we already have sufficient space, assign the common elements, then
+ // destroy any excess.
+ unsigned RHSSize = RHS.size();
+ unsigned CurSize = size();
+ if (CurSize >= RHSSize) {
+   // Assign common elements.
+   for (unsigned i = 0; i != RHSSize; ++i)
+ Begin[i] = RHS.Begin[i];
+   
+   // Destroy excess elements.
+