X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FCpuId.h;h=5e06513ccad44326d506c2e114d621fa70e79d84;hb=9b2f7afe192834fdc4abc5687abc072bede25cd6;hp=6957d934402f70c8bee93a10201c5594722c461b;hpb=ca86990b30285336063a3785550675484deaef1a;p=folly.git diff --git a/folly/CpuId.h b/folly/CpuId.h index 6957d934..5e06513c 100644 --- a/folly/CpuId.h +++ b/folly/CpuId.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,20 +32,26 @@ namespace folly { */ class CpuId { public: - CpuId() { + // Always inline in order for this to be usable from a __ifunc__. + // In shared library mde, a __ifunc__ runs at relocation time, while the + // PLT hasn't been fully populated yet; thus, ifuncs cannot use symbols + // with potentially external linkage. (This issue is less likely in opt + // mode since inlining happens more likely, and it doesn't happen for + // statically linked binaries which don't depend on the PLT) + FOLLY_ALWAYS_INLINE CpuId() { #ifdef _MSC_VER int reg[4]; __cpuid(static_cast(reg), 0); const int n = reg[0]; if (n >= 1) { __cpuid(static_cast(reg), 1); - f1c_ = reg[2]; - f1d_ = reg[3]; + f1c_ = uint32_t(reg[2]); + f1d_ = uint32_t(reg[3]); } if (n >= 7) { __cpuidex(static_cast(reg), 7, 0); - f7b_ = reg[1]; - f7c_ = reg[2]; + f7b_ = uint32_t(reg[1]); + f7c_ = uint32_t(reg[2]); } #elif defined(__i386__) && defined(__PIC__) && !defined(__clang__) && \ defined(__GNUC__) @@ -91,9 +97,12 @@ class CpuId { #endif } -#define X(name, r, bit) bool name() const { return (r) & (1U << bit); } +#define X(name, r, bit) \ + FOLLY_ALWAYS_INLINE bool name() const { \ + return ((r) & (1U << bit)) != 0; \ + } - // cpuid(1): Processor Info and Feature Bits. +// cpuid(1): Processor Info and Feature Bits. #define C(name, bit) X(name, f1c_, bit) C(sse3, 0) C(pclmuldq, 1)