--- a/llvm-3.1/tools/clang/lib/Driver/Tools.cpp	2012-09-17 17:55:54.000000000 -0700
+++ b/llvm-3.1/tools/clang/lib/Driver/Tools.cpp	2012-09-17 19:43:56.194269627 -0700
@@ -654,6 +654,7 @@
                              bool KernelOrKext) const {
   const Driver &D = getToolChain().getDriver();
   llvm::Triple Triple = getToolChain().getTriple();
+  const bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROID;
 
   // Select the ABI to use.
   //
@@ -756,7 +757,7 @@
       CmdArgs.push_back("-mno-global-merge");
   }
 
-  if (Args.hasArg(options::OPT_mehabi)) {
+  if (isAndroid || Args.hasArg(options::OPT_mehabi)) {
     CmdArgs.push_back("-backend-option");
     CmdArgs.push_back("-arm-enable-ehabi");
 
@@ -764,7 +765,7 @@
     CmdArgs.push_back("-arm-enable-ehabi-descriptors");
   }
 
-  if (Args.hasArg(options::OPT_mignore_has_ras)) {
+  if (isAndroid || Args.hasArg(options::OPT_mignore_has_ras)) {
     CmdArgs.push_back("-backend-option");
     CmdArgs.push_back("-arm-ignore-has-ras");
   }
@@ -950,6 +951,8 @@
 
 void Clang::AddX86TargetArgs(const ArgList &Args,
                              ArgStringList &CmdArgs) const {
+  const bool isAndroid = getToolChain().getTriple().getEnvironment() ==
+    llvm::Triple::ANDROID;
   if (!Args.hasFlag(options::OPT_mred_zone,
                     options::OPT_mno_red_zone,
                     true) ||
@@ -1026,6 +1029,11 @@
   // attributes here.
   llvm::StringMap<unsigned> PrevFeature;
   std::vector<const char*> Features;
+  if (isAndroid) {
+    // Add -msse3
+    PrevFeature["sse3"] = Features.size() + 1;
+    Features.push_back("+sse3");
+  }
   for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
          ie = Args.filtered_end(); it != ie; ++it) {
     StringRef Name = (*it)->getOption().getName();
@@ -1337,6 +1345,8 @@
   bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
                                   options::OPT_fapple_kext);
   const Driver &D = getToolChain().getDriver();
+  llvm::Triple Triple = getToolChain().getTriple();
+  const bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROID;
   ArgStringList CmdArgs;
 
   assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
@@ -1517,15 +1527,42 @@
                                     options::OPT_fpic, options::OPT_fno_pic,
                                     options::OPT_fPIE, options::OPT_fno_PIE,
                                     options::OPT_fpie, options::OPT_fno_pie);
+  int DefaultPICLevel = 0;
+  bool DefaultStackRealign = false;
+  if (isAndroid) {
+    // add Android-specific default
+    switch(getToolChain().getTriple().getArch()) {
+    default:
+      break;
+
+    case llvm::Triple::arm:
+    case llvm::Triple::thumb:
+    case llvm::Triple::mips:
+    case llvm::Triple::mipsel:
+    case llvm::Triple::mips64:
+    case llvm::Triple::mips64el:
+      DefaultPICLevel = 1; // "-fpic"
+      break;
+
+    case llvm::Triple::x86:
+    case llvm::Triple::x86_64:
+      DefaultPICLevel = 2; // "-fPIC"
+      DefaultStackRealign = true;
+      break;
+    }
+  }
   bool PICDisabled = false;
   bool PICEnabled = false;
   bool PICForPIE = false;
-  if (LastPICArg) {
-    PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
-                 LastPICArg->getOption().matches(options::OPT_fpie));
+  if (LastPICArg || DefaultPICLevel) {
+    PICForPIE = (LastPICArg &&
+                 (LastPICArg->getOption().matches(options::OPT_fPIE) ||
+                  LastPICArg->getOption().matches(options::OPT_fpie)));
     PICEnabled = (PICForPIE ||
-                  LastPICArg->getOption().matches(options::OPT_fPIC) ||
-                  LastPICArg->getOption().matches(options::OPT_fpic));
+                  DefaultPICLevel ||
+                  (LastPICArg &&
+                   (LastPICArg->getOption().matches(options::OPT_fPIC) ||
+                    LastPICArg->getOption().matches(options::OPT_fpic))));
     PICDisabled = !PICEnabled;
   }
   // Note that these flags are trump-cards. Regardless of the order w.r.t. the
@@ -1556,14 +1593,15 @@
 
   // Infer the __PIC__ and __PIE__ values.
   if (ModelStr == "pic" && PICForPIE) {
+    assert(LastPICArg && "-fPIE or -fpie should exist");
     CmdArgs.push_back("-pie-level");
-    CmdArgs.push_back((LastPICArg &&
-                       LastPICArg->getOption().matches(options::OPT_fPIE)) ?
-                      "2" : "1");
+    CmdArgs.push_back(LastPICArg->getOption().matches(options::OPT_fPIE) ? "2":"1");
   } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
+    bool isPIC = DefaultPICLevel == 2 ||
+                  (LastPICArg && 
+                   LastPICArg->getOption().matches(options::OPT_fPIC));
     CmdArgs.push_back("-pic-level");
-    CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
-                        LastPICArg->getOption().matches(options::OPT_fPIC)) ||
+    CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && isPIC) ||
                        getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
   }
 
@@ -2170,13 +2208,13 @@
 
   // Translate -mstackrealign
   if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
-                   false)) {
+                   DefaultStackRealign)) {
     CmdArgs.push_back("-backend-option");
     CmdArgs.push_back("-force-align-stack");
   }
   if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
                    false)) {
-    CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
+    CmdArgs.push_back("-mstackrealign");
   }
 
   if (Args.hasArg(options::OPT_mstack_alignment)) {
@@ -5059,6 +5097,8 @@
                                         const InputInfoList &Inputs,
                                         const ArgList &Args,
                                         const char *LinkingOutput) const {
+  const bool isAndroid = getToolChain().getTriple().getEnvironment() ==
+    llvm::Triple::ANDROID;
   ArgStringList CmdArgs;
 
   // Add --32/--64 to make sure we get the format we want.
@@ -5109,11 +5149,12 @@
                                       options::OPT_fpic, options::OPT_fno_pic,
                                       options::OPT_fPIE, options::OPT_fno_PIE,
                                       options::OPT_fpie, options::OPT_fno_pie);
-    if (LastPICArg &&
-        (LastPICArg->getOption().matches(options::OPT_fPIC) ||
-         LastPICArg->getOption().matches(options::OPT_fpic) ||
-         LastPICArg->getOption().matches(options::OPT_fPIE) ||
-         LastPICArg->getOption().matches(options::OPT_fpie))) {
+    if (isAndroid || 
+        (LastPICArg &&
+         (LastPICArg->getOption().matches(options::OPT_fPIC) ||
+          LastPICArg->getOption().matches(options::OPT_fpic) ||
+          LastPICArg->getOption().matches(options::OPT_fPIE) ||
+          LastPICArg->getOption().matches(options::OPT_fpie)))) {
       CmdArgs.push_back("-KPIC");
     }
   }
@@ -5141,8 +5182,8 @@
 
 static void AddLibgcc(llvm::Triple Triple, const Driver &D,
                       ArgStringList &CmdArgs, const ArgList &Args) {
-  bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROID;
-  bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
+  const bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROID;
+  const bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
                       Args.hasArg(options::OPT_static_libgcc);
   if (!D.CCCIsCXX)
     CmdArgs.push_back("-lgcc");