00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "tls.h"
00028 #include "config.h"
00029
00030 TLS_MODEL TLS_model = TLS_MODEL_UNKNOWN;
00031 TY_IDX TLS_get_addr_ty_idx = 0;
00032 ST *TLS_get_addr_st = NULL;
00033
00034 void TLS_init()
00035 {
00036 static BOOL TLS_initialized = FALSE;
00037 if( TLS_initialized )
00038 return;
00039 TLS_initialized = TRUE;
00040
00041 TLS_model = TLS_MODEL_UNKNOWN;
00042 if( TLS_Model_Name != NULL ) {
00043 if( strcmp("global-dynamic", TLS_Model_Name) == 0 )
00044 TLS_model = TLS_MODEL_GLOBAL_DYNAMIC;
00045 else if( strcmp("local-dynamic", TLS_Model_Name) == 0 )
00046 TLS_model = TLS_MODEL_LOCAL_DYNAMIC;
00047 else if( strcmp("initial-exec", TLS_Model_Name) == 0 )
00048 TLS_model = TLS_MODEL_INITIAL_EXEC;
00049 else if( strcmp("local-exec", TLS_Model_Name) == 0 )
00050 TLS_model = TLS_MODEL_LOCAL_EXEC;
00051 }
00052 if( TLS_model == TLS_MODEL_UNKNOWN ) {
00053
00054 if( Gen_PIC_Shared == TRUE )
00055 TLS_model = TLS_MODEL_GLOBAL_DYNAMIC;
00056 else
00057 TLS_model = TLS_MODEL_INITIAL_EXEC;
00058 }
00059
00060 if( TLS_model == TLS_MODEL_GLOBAL_DYNAMIC ||
00061 TLS_model == TLS_MODEL_LOCAL_DYNAMIC ) {
00062
00063
00064
00065 TY_IDX ty_idx = 0;
00066 TY& ty = New_TY(ty_idx);
00067 TY_Init(ty, 0, KIND_FUNCTION, MTYPE_UNKNOWN, 0);
00068 Set_TY_align(ty_idx, 1);
00069
00070 TYLIST_IDX tylist_idx;
00071
00072 Set_TYLIST_type (New_TYLIST (tylist_idx), MTYPE_To_TY(Pointer_Mtype));
00073 Set_TY_tylist (ty_idx, tylist_idx);
00074 Set_TYLIST_type (New_TYLIST (tylist_idx), MTYPE_To_TY(Pointer_Mtype));
00075 Set_TYLIST_type (New_TYLIST (tylist_idx), MTYPE_To_TY(Pointer_Mtype));
00076 Set_TYLIST_type (New_TYLIST (tylist_idx), 0);
00077
00078 TLS_get_addr_ty_idx = ty_idx;
00079
00080 ST* st = New_ST(GLOBAL_SYMTAB);
00081 PU_IDX pu_idx;
00082 PU& pu = New_PU (pu_idx);
00083 PU_Init (pu, ty_idx, GLOBAL_SYMTAB + 1);
00084
00085
00086 ST_Init(st, Save_Str("__tls_get_addr"), CLASS_FUNC, SCLASS_EXTERN, EXPORT_PREEMPTIBLE, (TY_IDX)pu_idx);
00087 TLS_get_addr_st = st;
00088 }
00089 }
00090
00091 void TLS_fini()
00092 {
00093
00094 }
00095
00096