diff options
author | Logan Chien <loganchien@google.com> | 2012-10-11 16:56:40 +0800 |
---|---|---|
committer | Andrew Hsieh <andrewhsieh@google.com> | 2012-10-15 13:32:17 +0800 |
commit | 9c463c361a62b76e1c752b068cf2cff60cc3c105 (patch) | |
tree | 6c280e3c12d7b2e70b81a3d94d976ca251f566b1 | |
parent | 432a6356fdaa45cbb15f649b8324447f628dcaeb (diff) | |
download | llvm-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.cpp | 7 | ||||
-rw-r--r-- | lib/Target/X86/X86Subtarget.h | 3 |
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. |