class MicrosoftFunctionState : public CXXABIFunctionState {
public:
MicrosoftFunctionState() : NumGuardedInitsEmitted(0), GuardGV(0) {}
int NumGuardedInitsEmitted;
llvm::GlobalVariable *GuardGV;
};
This is very suspicious. For the Itanium ABI, to get this right, we have
to track it in the AST. (See clang::MangleNumberingContext etc.) A
testcase (which we messed up with the Itanium ABI until quite recently):
int foo();
inline void f() {
if (0) {
static int x = foo();
}
static int x = foo();
}
void g() { f(); }
-Eli
On Thu, Aug 15, 2013 at 4:59 PM, Reid Kleckner <[email protected]> wrote:
> Hi rjmccall,
>
> Static locals requiring initialization are not thread safe on Windows.
> Unfortunately, it's possible to create static locals that are actually
> externally visible with inline functions and templates. As a result, we
> have to implement an initialization guard scheme that is compatible with
> TUs built by MSVC, which makes thread safety prohibitively difficult.
>
> MSVC's scheme is that every function that requires a guard gets an i32
> bitfield. Each static local is assigned a bit that indicates if it has
> been initialized, up to 32 bits, at which point a new bitfield is
> created. MSVC rejects inline functions with more than 32 static locals,
> and the externally visible mangling (?_B) only allows for one guard
> variable per function.
>
> Implements PR16888.
>
> http://llvm-reviews.chandlerc.com/D1416
>
> Files:
> include/clang/AST/Mangle.h
> lib/AST/ItaniumMangle.cpp
> lib/AST/MicrosoftMangle.cpp
> lib/CodeGen/CGCXXABI.cpp
> lib/CodeGen/CGCXXABI.h
> lib/CodeGen/CGDeclCXX.cpp
> lib/CodeGen/CodeGenFunction.cpp
> lib/CodeGen/CodeGenFunction.h
> lib/CodeGen/ItaniumCXXABI.cpp
> lib/CodeGen/MicrosoftCXXABI.cpp
> test/CodeGenCXX/microsoft-abi-static-initializers.cpp
>
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits