]> granicus.if.org Git - clang/commitdiff
Support __seg_fs and __seg_gs on x86
authorJF Bastien <jfbastien@apple.com>
Sun, 14 Jul 2019 18:33:51 +0000 (18:33 +0000)
committerJF Bastien <jfbastien@apple.com>
Sun, 14 Jul 2019 18:33:51 +0000 (18:33 +0000)
Summary:
GCC supports named address spaces macros:
  https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html

clang does as well with address spaces:
  https://clang.llvm.org/docs/LanguageExtensions.html#memory-references-to-specified-segments

Add the __seg_fs and __seg_gs macros for compatibility with GCC.

<rdar://problem/52944935>

Subscribers: jkorous, dexonsmith, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D64676

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@366028 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LanguageExtensions.rst
lib/Basic/Targets/X86.cpp
test/Preprocessor/x86_seg_fs_gs.c [new file with mode: 0644]

index ecbf04c3c822ac599c54894e10f6fbe5896bacee..266309c6ce248ff6e29cbf0ddde0ab3711d5a68c 100644 (file)
@@ -2465,6 +2465,10 @@ Which compiles to (on X86-32):
           movl    %gs:(%eax), %eax
           ret
 
+You can also use the GCC compatibility macros ``__seg_fs`` and ``__seg_gs`` for
+the same purpose. The preprocessor symbols ``__SEG_FS`` and ``__SEG_GS``
+indicate their support.
+
 PowerPC Language Extensions
 ------------------------------
 
index 76d8ab8146ffbbddd3885781dab2e41b2b021abb..d618c90b05c02fe448329360bb466bdbaedd034b 100644 (file)
@@ -917,6 +917,11 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
     DefineStd(Builder, "i386", Opts);
   }
 
+  Builder.defineMacro("__SEG_GS");
+  Builder.defineMacro("__SEG_FS");
+  Builder.defineMacro("__seg_gs", "__attribute__((address_space(256)))");
+  Builder.defineMacro("__seg_fs", "__attribute__((address_space(257)))");
+
   // Subtarget options.
   // FIXME: We are hard-coding the tune parameters based on the CPU, but they
   // truly should be based on -mtune options.
diff --git a/test/Preprocessor/x86_seg_fs_gs.c b/test/Preprocessor/x86_seg_fs_gs.c
new file mode 100644 (file)
index 0000000..b7a586c
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: %clang -target i386-unknown-unknown -x c -E -dM -o - %s | FileCheck -match-full-lines %s
+// RUN: %clang -target x86_64-unknown-unknown -x c -E -dM -o - %s | FileCheck -match-full-lines %s
+
+// CHECK: #define __SEG_FS 1
+// CHECK: #define __SEG_GS 1
+// CHECK: #define __seg_fs __attribute__((address_space(257)))
+// CHECK: #define __seg_gs __attribute__((address_space(256)))