<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Apr 1, 2014 at 10:48 PM, Yaron Keren <span dir="ltr"><<a href="mailto:yaron.keren@gmail.com" target="_blank">yaron.keren@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="rtl"><div dir="ltr">Is the <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">UnknownEnvironment</span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"> actually used to produce code, a real target or a default value when the environment was not provided? </span><span style="font-size:12.727272033691406px;font-family:arial,sans-serif">If the later we can make the MSVC environment the default and get rid of </span><span style="font-size:12.727272033691406px;font-family:arial,sans-serif">UnknownEnvironment</span><span style="font-size:12.727272033691406px;font-family:arial,sans-serif"> </span></div>
</div></blockquote><div><br></div><div>UnknownEnvironment is used as a marker to indicate that no environment has been provided.  It should end up getting treated as if MSVC was specified.  We should default to MSVC on Windows unless otherwise specified IMO, and simply remove the use of the UnknownEnvironment for output.  It is just a marker to indicate no environment is specified.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="rtl"><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">Triple::MinGW should not exists anymore, yes. </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">It's a bit tricky since Triple::normalize first parses the string and then normalizes, so in between a MinGW OS does exist.</span></div>
</div></blockquote><div><br></div><div>Fortunately, Reid pushed me to do the right thing with my previous change.  clang no longer directly references llvm::Triple::MinGW.  So, it should now be possible to clean it up without any consequences.  We should be able to handle the user providing mingw32 as part of a triple without having an explicit value for it.  The triple tests should ensure that we dont break that.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div dir="ltr"><br><div class="gmail_quote">2014-04-02 8:34 GMT+03:00 Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>></span>:<div>
<div class="h5"><br>

<blockquote class="gmail_quote" style="margin:0 .8ex;border-left:1px #ccc solid;border-right:1px #ccc solid;padding-left:1ex;padding-right:1ex"><div class="gmail_extra"><div class="gmail_quote"><div>On Tue, Apr 1, 2014 at 9:52 PM, Yaron Keren <span dir="ltr"><<a href="mailto:yaron.keren@gmail.com" target="_blank">yaron.keren@gmail.com</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="rtl"><div dir="ltr">Hi,</div><div dir="ltr"><br></div><div dir="ltr">I had added/modified four functions corresponding exactly to the ones in Triple.h in r205393 to avoid confusion.</div>



<div dir="ltr"><br></div>

<div dir="ltr">However, this is not completely clear. You are highlighting a very important issue here.</div><div dir="ltr"><br></div><div dir="ltr">You listed the four environments </div><div dir="ltr"><br></div><div dir="ltr">





<span style="font-family:arial,sans-serif;font-size:12.727272033691406px">* MSVC: The MS ABI, MSVCRT environment as defined by Microsoft</span><br style="font-family:arial,sans-serif;font-size:12.727272033691406px"><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">* GNU: The MinGW32/MinGW32-W64 environment which uses MSVCRT and auxiliary libraries</span><br style="font-family:arial,sans-serif;font-size:12.727272033691406px">





<span style="font-family:arial,sans-serif;font-size:12.727272033691406px">* Itanium: The MSVCRT environment + libc++ built with Itanium ABI</span><br style="font-family:arial,sans-serif;font-size:12.727272033691406px"><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">* Cygnus: The Cygwin environment which uses custom libraries for everything</span><br style="font-family:arial,sans-serif;font-size:12.727272033691406px">





</div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">but there is a fifth one, the </span><font face="arial, sans-serif">UnknownEnvironment.</font></div>



</div></blockquote><div><br></div></div><div>Correct, the fifth element is tricky.  It is the reason that the original set of changes for the Windows target triples introduced isKnownWindowsMSVCEnvironment() and isWindowsMSVCEnvironment().  The difference is that the unknown environment is the default environment and needed to be handled for the cross-over to the canonicalised triples.  i686-pc-win32 maps to an unknown environment (which is supposed to be handled as if it were the MSVC environment).</div>


<div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="rtl"><div dir="ltr"><div dir="ltr"><span style="font-family:arial,sans-serif">I have no idea what is the UnknownEnvironment on Windows but it's </span><font face="arial, sans-serif">actually being used by isWindowsMSVCEnvironment() called in several places in the code. OTOH, </font><span style="font-family:arial,sans-serif">The Itanium environment is actually used just in one location, </span><font face="arial, sans-serif">InitHeaderSearch.cpp.</font></div>



</div></div></blockquote><div><br></div></div><div>The Itanium environment is not fully fleshed out yet (it is meant for use for the Windows on ARM work that is currently ongoing).</div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div dir="rtl"><div dir="ltr"><div><span style="font-family:arial,sans-serif">The </span><span style="font-family:arial,sans-serif">UnknownEnvironment</span><span style="font-family:arial,sans-serif"> </span><span style="font-family:arial,sans-serif">may have been used in the past instead of the generic </span><span style="font-family:arial,sans-serif">Itanium</span><span style="font-family:arial,sans-serif">  environment? </span></div>



</div></div></blockquote><div><br></div></div><div>No, the Itanium environment is recently introduced into the LLVM repositories.</div><div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div dir="rtl"><div dir="ltr"><div><span style="font-family:arial,sans-serif">If so, </span><font face="arial, sans-serif">the usage of Unknown enviroment on WIndows should be replaced with the Itanium enviroment, and the corresponding functions both in Triple.h and X86Subtarget.h</font><span style="font-family:arial,sans-serif"> renamed and modified accordingly?</span></div>





</div><div dir="ltr"><br></div><div dir="ltr"><span style="font-family:arial,sans-serif">What do you think?</span></div></div></blockquote><div><br></div></div><div>If we can find all the locations that the UnknownEnvironment crops up handle it properly, that would certainly be ideal.  If it can be removed at all sites, we would also be able to remove the isKnownWindowsMSVCEnvironment in favour of isWindowsMSVCEnvironment as well.</div>



<div><br></div><div>I believe that the dust has somewhat settled from the triple canonicalisation changes, and I hope to actually get around to cleaning up some of the vestiges of the old triple handling for the various Windows environments (e.g. removal of MinGW32 from OS).  I can try to see if it is possible to now sweep up the unknown environment as well.</div>


<div><div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="rtl"><div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr"><font face="arial, sans-serif">Yaron</font></div>





<div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></span></div><div dir="ltr"><br></div><div dir="ltr"><br></div></div>





<div class="gmail_extra"><div dir="ltr"><br><br><div class="gmail_quote">2014-04-02 4:22 GMT+03:00 Saleem Abdulrasool <span dir="ltr"><<a href="mailto:compnerd@compnerd.org" target="_blank">compnerd@compnerd.org</a>></span>:<div>



<div><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div class="gmail_quote"><div>On Tue, Apr 1, 2014 at 11:15 AM, Yaron Keren <span dir="ltr"><<a href="mailto:yaron.keren@gmail.com" target="_blank">yaron.keren@gmail.com</a>></span> wrote:<br>






<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: yrnkrn<br>
Date: Tue Apr  1 13:15:34 2014<br>
New Revision: 205338<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=205338&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=205338&view=rev</a><br>
Log:<br>
isTargetWindows() renamed to isTargetKnownWindowsMSVC()<br>
to reflect its current functionality.<br></blockquote><div><br></div></div><div>The OS is still Windows.  If you are going to split up the subtarget into the respective environments, then you should have the following at the very least:</div>






<div><br></div><div>isTargetWindowsMSVC</div><div>isTargetWindowsGNU</div><div><font face="arial, sans-serif">isTargetWindowsCygnus</font></div><div>isTargetWindowsItanium</div><div><div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">







Based on Takumi NAKAMURA suggestion.<br>
<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp<br>
    llvm/trunk/lib/Target/X86/X86FastISel.cpp<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.h<br>
    llvm/trunk/lib/Target/X86/X86Subtarget.h<br>
    llvm/trunk/lib/Target/X86/X86TargetMachine.cpp<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=205338&r1=205337&r2=205338&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp?rev=205338&r1=205337&r2=205338&view=diff</a><br>







==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86AsmPrinter.cpp Tue Apr  1 13:15:34 2014<br>
@@ -623,7 +623,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Mod<br>
     OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);<br>
   }<br>
<br>
-  if (Subtarget->isTargetWindows() && !Subtarget->isTargetCygMing() &&<br>
+  if (Subtarget->isTargetKnownWindowsMSVC() && !Subtarget->isTargetCygMing() &&<br>
       MMI->usesVAFloatArgument()) {<br>
     StringRef SymbolName = Subtarget->is64Bit() ? "_fltused" : "__fltused";<br>
     MCSymbol *S = MMI->getContext().GetOrCreateSymbol(SymbolName);<br>
@@ -681,12 +681,12 @@ void X86AsmPrinter::EmitEndOfAsmFile(Mod<br>
       OutStreamer.SwitchSection(TLOFCOFF.getDrectveSection());<br>
       SmallString<128> name;<br>
       for (unsigned i = 0, e = DLLExportedGlobals.size(); i != e; ++i) {<br>
-        if (Subtarget->isTargetWindows())<br>
+        if (Subtarget->isTargetKnownWindowsMSVC())<br>
           name = " /EXPORT:";<br>
         else<br>
           name = " -export:";<br>
         name += DLLExportedGlobals[i]->getName();<br>
-        if (Subtarget->isTargetWindows())<br>
+        if (Subtarget->isTargetKnownWindowsMSVC())<br>
           name += ",DATA";<br>
         else<br>
         name += ",data";<br>
@@ -694,7 +694,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Mod<br>
       }<br>
<br>
       for (unsigned i = 0, e = DLLExportedFns.size(); i != e; ++i) {<br>
-        if (Subtarget->isTargetWindows())<br>
+        if (Subtarget->isTargetKnownWindowsMSVC())<br>
           name = " /EXPORT:";<br>
         else<br>
           name = " -export:";<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86FastISel.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FastISel.cpp?rev=205338&r1=205337&r2=205338&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FastISel.cpp?rev=205338&r1=205337&r2=205338&view=diff</a><br>







==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86FastISel.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86FastISel.cpp Tue Apr  1 13:15:34 2014<br>
@@ -876,7 +876,7 @@ bool X86FastISel::X86SelectRet(const Ins<br>
   // a virtual register in the entry block, so now we copy the value out<br>
   // and into %rax. We also do the same with %eax for Win32.<br>
   if (F.hasStructRetAttr() &&<br>
-      (Subtarget->is64Bit() || Subtarget->isTargetWindows())) {<br>
+      (Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC())) {<br>
     unsigned Reg = X86MFInfo->getSRetReturnReg();<br>
     assert(Reg &&<br>
            "SRetReturnReg should have been set in LowerFormalArguments()!");<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=205338&r1=205337&r2=205338&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=205338&r1=205337&r2=205338&view=diff</a><br>







==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Apr  1 13:15:34 2014<br>
@@ -189,7 +189,7 @@ static TargetLoweringObjectFile *createT<br>
     return new X86LinuxTargetObjectFile();<br>
   if (Subtarget->isTargetELF())<br>
     return new TargetLoweringObjectFileELF();<br>
-  if (Subtarget->isTargetWindows())<br>
+  if (Subtarget->isTargetKnownWindowsMSVC())<br>
     return new X86WindowsTargetObjectFile();<br>
   if (Subtarget->isTargetCOFF())<br>
     return new TargetLoweringObjectFileCOFF();<br>
@@ -250,7 +250,7 @@ void X86TargetLowering::resetOperationAc<br>
       addBypassSlowDiv(64, 16);<br>
   }<br>
<br>
-  if (Subtarget->isTargetWindows() && !Subtarget->isTargetCygMing()) {<br>
+  if (Subtarget->isTargetKnownWindowsMSVC() && !Subtarget->isTargetCygMing()) {<br>
     // Setup Windows compiler runtime calls.<br>
     setLibcallName(RTLIB::SDIV_I64, "_alldiv");<br>
     setLibcallName(RTLIB::UDIV_I64, "_aulldiv");<br>
@@ -1906,7 +1906,7 @@ X86TargetLowering::LowerReturn(SDValue C<br>
   // We saved the argument into a virtual register in the entry block,<br>
   // so now we copy the value out and into %rax/%eax.<br>
   if (DAG.getMachineFunction().getFunction()->hasStructRetAttr() &&<br>
-      (Subtarget->is64Bit() || Subtarget->isTargetWindows())) {<br>
+      (Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC())) {<br>
     MachineFunction &MF = DAG.getMachineFunction();<br>
     X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();<br>
     unsigned Reg = FuncInfo->getSRetReturnReg();<br>
@@ -2291,7 +2291,7 @@ X86TargetLowering::LowerFormalArguments(<br>
   // Save the argument into a virtual register so that we can access it<br>
   // from the return points.<br>
   if (MF.getFunction()->hasStructRetAttr() &&<br>
-      (Subtarget->is64Bit() || Subtarget->isTargetWindows())) {<br>
+      (Subtarget->is64Bit() || Subtarget->isTargetKnownWindowsMSVC())) {<br>
     X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();<br>
     unsigned Reg = FuncInfo->getSRetReturnReg();<br>
     if (!Reg) {<br>
@@ -8494,7 +8494,7 @@ X86TargetLowering::LowerGlobalTLSAddress<br>
                               Chain.getValue(1));<br>
   }<br>
<br>
-  if (Subtarget->isTargetWindows() || Subtarget->isTargetMingw()) {<br>
+  if (Subtarget->isTargetKnownWindowsMSVC() || Subtarget->isTargetMingw()) {<br>
     // Just use the implicit TLS architecture<br>
     // Need to generate someting similar to:<br>
     //   mov     rdx, qword [gs:abs 58H]; Load pointer to ThreadLocalStorage<br>
@@ -15882,7 +15882,7 @@ X86TargetLowering::EmitLoweredWinAlloca(<br>
     }<br>
   } else {<br>
     const char *StackProbeSymbol =<br>
-      Subtarget->isTargetWindows() ? "_chkstk" : "_alloca";<br>
+      Subtarget->isTargetKnownWindowsMSVC() ? "_chkstk" : "_alloca";<br>
<br>
     BuildMI(*BB, MI, DL, TII->get(X86::CALLpcrel32))<br>
       .addExternalSymbol(StackProbeSymbol)<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=205338&r1=205337&r2=205338&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.h?rev=205338&r1=205337&r2=205338&view=diff</a><br>







==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.h (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.h Tue Apr  1 13:15:34 2014<br>
@@ -756,7 +756,7 @@ namespace llvm {<br>
     /// isTargetFTOL - Return true if the target uses the MSVC _ftol2 routine<br>
     /// for fptoui.<br>
     bool isTargetFTOL() const {<br>
-      return Subtarget->isTargetWindows() && !Subtarget->is64Bit();<br>
+      return Subtarget->isTargetKnownWindowsMSVC() && !Subtarget->is64Bit();<br>
     }<br>
<br>
     /// isIntegerTypeFTOL - Return true if the MSVC _ftol2 routine should be<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86Subtarget.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=205338&r1=205337&r2=205338&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=205338&r1=205337&r2=205338&view=diff</a><br>







==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86Subtarget.h (original)<br>
+++ llvm/trunk/lib/Target/X86/X86Subtarget.h Tue Apr  1 13:15:34 2014<br>
@@ -343,7 +343,7 @@ public:<br>
   bool isTargetNaCl() const { return TargetTriple.isOSNaCl(); }<br>
   bool isTargetNaCl32() const { return isTargetNaCl() && !is64Bit(); }<br>
   bool isTargetNaCl64() const { return isTargetNaCl() && is64Bit(); }<br>
-  bool isTargetWindows() const {<br>
+  bool isTargetKnownWindowsMSVC() const {<br>
     return TargetTriple.isKnownWindowsMSVCEnvironment();<br>
   }<br>
   bool isTargetMingw() const { return TargetTriple.isWindowsGNUEnvironment(); }<br>
@@ -359,7 +359,7 @@ public:<br>
   }<br>
<br>
   bool isTargetWin32() const {<br>
-    return !In64BitMode && (isTargetCygMing() || isTargetWindows());<br>
+    return !In64BitMode && (isTargetCygMing() || isTargetKnownWindowsMSVC());<br>
   }<br>
<br>
   bool isPICStyleSet() const { return PICStyle != PICStyles::None; }<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86TargetMachine.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.cpp?rev=205338&r1=205337&r2=205338&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.cpp?rev=205338&r1=205337&r2=205338&view=diff</a><br>







==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86TargetMachine.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86TargetMachine.cpp Tue Apr  1 13:15:34 2014<br>
@@ -39,7 +39,7 @@ static std::string computeDataLayout(con<br>
     Ret += "-p:32:32";<br>
<br>
   // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.<br>
-  if (ST.is64Bit() || ST.isTargetCygMing() || ST.isTargetWindows() ||<br>
+  if (ST.is64Bit() || ST.isTargetCygMing() || ST.isTargetKnownWindowsMSVC() ||<br>
       ST.isTargetNaCl())<br>
     Ret += "-i64:64";<br>
   else<br>
@@ -60,7 +60,7 @@ static std::string computeDataLayout(con<br>
     Ret += "-n8:16:32";<br>
<br>
   // The stack is aligned to 32 bits on some ABIs and 128 bits on others.<br>
-  if (!ST.is64Bit() && (ST.isTargetCygMing() || ST.isTargetWindows()))<br>
+  if (!ST.is64Bit() && (ST.isTargetCygMing() || ST.isTargetKnownWindowsMSVC()))<br>
     Ret += "-S32";<br>
   else<br>
     Ret += "-S128";<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div><span><font color="#888888"><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</font></span></div></blockquote></div></div></div></div></div>
</blockquote></div></div></div><div><div><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</div></div></div></blockquote></div></div></div></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</div></div>