aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLogan Chien <loganchien@google.com>2012-10-11 16:56:40 +0800
committerAndrew Hsieh <andrewhsieh@google.com>2012-10-15 13:32:17 +0800
commit9c463c361a62b76e1c752b068cf2cff60cc3c105 (patch)
tree6c280e3c12d7b2e70b81a3d94d976ca251f566b1
parent432a6356fdaa45cbb15f649b8324447f628dcaeb (diff)
downloadllvm-9c463c361a62b76e1c752b068cf2cff60cc3c105.tar.gz
Use __stack_chk_guard as the cookie on Android X86
Due to some bug in bionic pthread, we can't use %gs:0x14 to store stack protector cookie. We should put the stack cookie in __stack_chk_guard global variable instead.
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp7
-rw-r--r--lib/Target/X86/X86Subtarget.h3
2 files changed, 10 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index eaebc595147..76ee38c529b 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -1432,6 +1432,13 @@ X86TargetLowering::findRepresentativeClass(EVT VT) const{
bool X86TargetLowering::getStackCookieLocation(unsigned &AddressSpace,
unsigned &Offset) const {
+ if (Subtarget->isTargetEnvAndroid()) {
+ // Workaround for Android bionic pthread: On Android %gs:0x14 will be
+ // altered if pthread_setspecific() is called. Thus, we should use the
+ // global variable __stack_chk_guard instead.
+ return false;
+ }
+
if (!Subtarget->isTargetLinux())
return false;
diff --git a/lib/Target/X86/X86Subtarget.h b/lib/Target/X86/X86Subtarget.h
index 7fd832bf067..a1d46c9cefb 100644
--- a/lib/Target/X86/X86Subtarget.h
+++ b/lib/Target/X86/X86Subtarget.h
@@ -247,6 +247,9 @@ public:
bool isTargetCygMing() const { return TargetTriple.isOSCygMing(); }
bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
bool isTargetEnvMacho() const { return TargetTriple.isEnvironmentMachO(); }
+ bool isTargetEnvAndroid() const {
+ return TargetTriple.getEnvironment() == Triple::ANDROID;
+ }
bool isTargetWin64() const {
// FIXME: x86_64-cygwin has not been released yet.