diff options
| author | Mark Simulacrum <mark.simulacrum@gmail.com> | 2016-12-19 21:41:03 -0700 |
|---|---|---|
| committer | Mark Simulacrum <mark.simulacrum@gmail.com> | 2016-12-20 20:04:46 -0700 |
| commit | c1bc5e51d6cb6ea997da1757e16ddb1b9093d25e (patch) | |
| tree | f12873346dce9082fb1dde00f77dc0404707d916 | |
| parent | a9b5c63d437c71c5ee11581a75e8fdecf8a1794c (diff) | |
Improve cache quality for eh_personality.
| -rw-r--r-- | src/librustc_trans/context.rs | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/librustc_trans/context.rs b/src/librustc_trans/context.rs index 0f56aa70bd9..f292a709650 100644 --- a/src/librustc_trans/context.rs +++ b/src/librustc_trans/context.rs @@ -927,26 +927,26 @@ impl<'b, 'tcx> CrateContext<'b, 'tcx> { // `rust_eh_personality` function, but rather we wired it up to the // CRT's custom personality function, which forces LLVM to consider // landing pads as "landing pads for SEH". + if let Some(llpersonality) = self.local().eh_personality.get() { + return llpersonality + } let tcx = self.tcx(); - match tcx.lang_items.eh_personality() { + let llfn = match tcx.lang_items.eh_personality() { Some(def_id) if !base::wants_msvc_seh(self.sess()) => { Callee::def(self, def_id, tcx.intern_substs(&[])).reify(self) } _ => { - if let Some(llpersonality) = self.local().eh_personality.get() { - return llpersonality - } let name = if base::wants_msvc_seh(self.sess()) { "__CxxFrameHandler3" } else { "rust_eh_personality" }; let fty = Type::variadic_func(&[], &Type::i32(self)); - let f = declare::declare_cfn(self, name, fty); - self.local().eh_personality.set(Some(f)); - f + declare::declare_cfn(self, name, fty) } - } + }; + self.local().eh_personality.set(Some(llfn)); + llfn } // Returns a ValueRef of the "eh_unwind_resume" lang item if one is defined, |
