kbdsmoke created this revision.
kbdsmoke added a subscriber: cfe-commits.
kbdsmoke set the repository for this revision to rL LLVM.
clang does not support this by default. By default, if you want to utilize
__declspec to assign a SectionAttr to a function, you should use __declspec
allocate.
However, this is not valid under MSVC. It works under clang (whether or not
that is acceptable should be the subject of another patch request)
To avoid a lot of headaches for everyone here's my solution. Double __declspec
in Attr.td works fine, it seems, and so the fix was fairly trivial. I also
patch some code to verify code_seg is only ever used on FunctionDecls.
Reason being, without it technically code_seg on variables and so on would be
valid.
Repository:
rL LLVM
https://reviews.llvm.org/D22931
Files:
include/clang/Basic/Attr.td
lib/Sema/SemaDeclAttr.cpp
Index: lib/Sema/SemaDeclAttr.cpp
===
--- lib/Sema/SemaDeclAttr.cpp
+++ lib/Sema/SemaDeclAttr.cpp
@@ -2656,6 +2656,10 @@
return;
}
+ // code_seg only ever applies to functions.
+ if (Attr.getName()->getName() == "code_seg" && !isa(D))
+S.Diag(LiteralLoc, diag::err_attribute_wrong_decl_type) <<
Attr.getName()->getName() << 0;
+
unsigned Index = Attr.getAttributeSpellingListIndex();
SectionAttr *NewAttr = S.mergeSectionAttr(D, Attr.getRange(), Str, Index);
if (NewAttr)
Index: include/clang/Basic/Attr.td
===
--- include/clang/Basic/Attr.td
+++ include/clang/Basic/Attr.td
@@ -1397,7 +1397,7 @@
}
def Section : InheritableAttr {
- let Spellings = [GCC<"section">, Declspec<"allocate">];
+ let Spellings = [GCC<"section">, Declspec<"allocate">, Declspec<"code_seg">];
let Args = [StringArgument<"Name">];
let Subjects = SubjectList<[Function, GlobalVar,
ObjCMethod, ObjCProperty], ErrorDiag,
Index: lib/Sema/SemaDeclAttr.cpp
===
--- lib/Sema/SemaDeclAttr.cpp
+++ lib/Sema/SemaDeclAttr.cpp
@@ -2656,6 +2656,10 @@
return;
}
+ // code_seg only ever applies to functions.
+ if (Attr.getName()->getName() == "code_seg" && !isa(D))
+S.Diag(LiteralLoc, diag::err_attribute_wrong_decl_type) << Attr.getName()->getName() << 0;
+
unsigned Index = Attr.getAttributeSpellingListIndex();
SectionAttr *NewAttr = S.mergeSectionAttr(D, Attr.getRange(), Str, Index);
if (NewAttr)
Index: include/clang/Basic/Attr.td
===
--- include/clang/Basic/Attr.td
+++ include/clang/Basic/Attr.td
@@ -1397,7 +1397,7 @@
}
def Section : InheritableAttr {
- let Spellings = [GCC<"section">, Declspec<"allocate">];
+ let Spellings = [GCC<"section">, Declspec<"allocate">, Declspec<"code_seg">];
let Args = [StringArgument<"Name">];
let Subjects = SubjectList<[Function, GlobalVar,
ObjCMethod, ObjCProperty], ErrorDiag,
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits