[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
This revision was automatically updated to reflect the committed changes. Closed by commit rG95e43f84b7b9: [AArch64] Add -mmark-bti-property flag. (authored by danielkiss). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 Files: clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/arm64-markbti.S llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h @@ -33,6 +33,9 @@ /// Emit contents of constant pool for the current section. void emitCurrentConstantPool(); + /// Callback used to implement the .note.gnu.property section. + void emitNoteSection(unsigned Flags); + /// Callback used to implement the .inst directive. virtual void emitInst(uint32_t Inst); Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp @@ -11,12 +11,23 @@ //===--===// #include "AArch64TargetStreamer.h" +#include "AArch64MCAsmInfo.h" +#include "AArch64Subtarget.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/ConstantPools.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCSection.h" +#include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; +static cl::opt MarkBTIProperty( +"aarch64-mark-bti-property", cl::Hidden, +cl::desc("Add .note.gnu.property with BTI to assembly files"), +cl::init(false)); + // // AArch64TargetStreamer Implemenation // @@ -37,8 +48,50 @@ ConstantPools->emitForCurrentSection(Streamer); } -// finish() - write out any non-empty assembler constant pools. -void AArch64TargetStreamer::finish() { ConstantPools->emitAll(Streamer); } +// finish() - write out any non-empty assembler constant pools and +// write out note.gnu.properties if need. +void AArch64TargetStreamer::finish() { + ConstantPools->emitAll(Streamer); + + if (MarkBTIProperty) +emitNoteSection(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_BTI); +} + +void AArch64TargetStreamer::emitNoteSection(unsigned Flags) { + if (Flags == 0) +return; + + MCStreamer = getStreamer(); + MCContext = OutStreamer.getContext(); + // Emit a .note.gnu.property section with the flags. + MCSectionELF *Nt = Context.getELFSection(".note.gnu.property", ELF::SHT_NOTE, + ELF::SHF_ALLOC); + if (Nt->isRegistered()) { +SMLoc Loc; +Context.reportWarning( +Loc, +"The .note.gnu.property is not emitted because it is already present."); +return; + } + MCSection *Cur = OutStreamer.getCurrentSectionOnly(); + OutStreamer.SwitchSection(Nt); + + // Emit the note header. + OutStreamer.emitValueToAlignment(Align(8).value()); + OutStreamer.emitIntValue(4, 4); // data size for "GNU\0" + OutStreamer.emitIntValue(4 * 4, 4); // Elf_Prop size + OutStreamer.emitIntValue(ELF::NT_GNU_PROPERTY_TYPE_0, 4); + OutStreamer.emitBytes(StringRef("GNU", 4)); // note name + + // Emit the PAC/BTI properties. + OutStreamer.emitIntValue(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_AND, 4); + OutStreamer.emitIntValue(4, 4); // data size + OutStreamer.emitIntValue(Flags, 4); // data + OutStreamer.emitIntValue(0, 4); // pad + + OutStreamer.endSection(Nt); + OutStreamer.SwitchSection(Cur); +} void AArch64TargetStreamer::emitInst(uint32_t Inst) { char Buffer[4]; Index: llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp === --- llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -223,26 +223,9 @@ return; // Emit a .note.gnu.property section with the flags. - MCSection *Cur = OutStreamer->getCurrentSectionOnly(); - MCSection *Nt = MMI->getContext().getELFSection( - ".note.gnu.property", ELF::SHT_NOTE, ELF::SHF_ALLOC); - OutStreamer->SwitchSection(Nt); - - // Emit the note header. - emitAlignment(Align(8)); - OutStreamer->emitInt32(4); // data size for "GNU\0" - OutStreamer->emitInt32(4 * 4); // Elf_Prop size - OutStreamer->emitInt32(ELF::NT_GNU_PROPERTY_TYPE_0); - OutStreamer->emitBytes(StringRef("GNU", 4)); // note name - - // Emit the PAC/BTI properties. - OutStreamer->emitInt32(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_AND); - OutStreamer->emitInt32(4); // data
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
danielkiss marked 4 inline comments as done. danielkiss added a comment. @nickdesaulniers Thanks for the review, comments are addressed. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
danielkiss updated this revision to Diff 291922. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 Files: clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/arm64-markbti.S llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h @@ -33,6 +33,9 @@ /// Emit contents of constant pool for the current section. void emitCurrentConstantPool(); + /// Callback used to implement the .note.gnu.property section. + void emitNoteSection(unsigned Flags); + /// Callback used to implement the .inst directive. virtual void emitInst(uint32_t Inst); Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp @@ -11,12 +11,23 @@ //===--===// #include "AArch64TargetStreamer.h" +#include "AArch64MCAsmInfo.h" +#include "AArch64Subtarget.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/ConstantPools.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCSection.h" +#include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; +static cl::opt MarkBTIProperty( +"aarch64-mark-bti-property", cl::Hidden, +cl::desc("Add .note.gnu.property with BTI to assembly files"), +cl::init(false)); + // // AArch64TargetStreamer Implemenation // @@ -37,8 +48,50 @@ ConstantPools->emitForCurrentSection(Streamer); } -// finish() - write out any non-empty assembler constant pools. -void AArch64TargetStreamer::finish() { ConstantPools->emitAll(Streamer); } +// finish() - write out any non-empty assembler constant pools and +// write out note.gnu.properties if need. +void AArch64TargetStreamer::finish() { + ConstantPools->emitAll(Streamer); + + if (MarkBTIProperty) +emitNoteSection(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_BTI); +} + +void AArch64TargetStreamer::emitNoteSection(unsigned Flags) { + if (Flags == 0) +return; + + MCStreamer = getStreamer(); + MCContext = OutStreamer.getContext(); + // Emit a .note.gnu.property section with the flags. + MCSectionELF *Nt = Context.getELFSection(".note.gnu.property", ELF::SHT_NOTE, + ELF::SHF_ALLOC); + if (Nt->isRegistered()) { +SMLoc Loc; +Context.reportWarning( +Loc, +"The .note.gnu.property is not emitted because it is already present."); +return; + } + MCSection *Cur = OutStreamer.getCurrentSectionOnly(); + OutStreamer.SwitchSection(Nt); + + // Emit the note header. + OutStreamer.emitValueToAlignment(Align(8).value()); + OutStreamer.emitIntValue(4, 4); // data size for "GNU\0" + OutStreamer.emitIntValue(4 * 4, 4); // Elf_Prop size + OutStreamer.emitIntValue(ELF::NT_GNU_PROPERTY_TYPE_0, 4); + OutStreamer.emitBytes(StringRef("GNU", 4)); // note name + + // Emit the PAC/BTI properties. + OutStreamer.emitIntValue(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_AND, 4); + OutStreamer.emitIntValue(4, 4); // data size + OutStreamer.emitIntValue(Flags, 4); // data + OutStreamer.emitIntValue(0, 4); // pad + + OutStreamer.endSection(Nt); + OutStreamer.SwitchSection(Cur); +} void AArch64TargetStreamer::emitInst(uint32_t Inst) { char Buffer[4]; Index: llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp === --- llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -223,26 +223,9 @@ return; // Emit a .note.gnu.property section with the flags. - MCSection *Cur = OutStreamer->getCurrentSectionOnly(); - MCSection *Nt = MMI->getContext().getELFSection( - ".note.gnu.property", ELF::SHT_NOTE, ELF::SHF_ALLOC); - OutStreamer->SwitchSection(Nt); - - // Emit the note header. - emitAlignment(Align(8)); - OutStreamer->emitInt32(4); // data size for "GNU\0" - OutStreamer->emitInt32(4 * 4); // Elf_Prop size - OutStreamer->emitInt32(ELF::NT_GNU_PROPERTY_TYPE_0); - OutStreamer->emitBytes(StringRef("GNU", 4)); // note name - - // Emit the PAC/BTI properties. - OutStreamer->emitInt32(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_AND); - OutStreamer->emitInt32(4); // data size - OutStreamer->emitInt32(Flags); // data - OutStreamer->emitInt32(0); // pad - - OutStreamer->endSection(Nt); - OutStreamer->SwitchSection(Cur); + if
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
nickdesaulniers added a comment. I don't have any thoughts on the change per se, so just minor thoughts/generic code review. Comment at: clang/lib/Driver/ToolChains/Clang.cpp:6995 + case llvm::Triple::aarch64_be: +if (Arg *A = Args.getLastArg(options::OPT_mmark_bti_property)) { + CmdArgs.push_back("-mllvm"); it looks like `A` is unused. Should we be using `Args.hasFlag` instead of `Args.getLastArg`? Comment at: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp:56-58 + if (MarkBTIProperty) { +emitNoteSection(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_BTI); + } The coding style allows for the curly braces to be omitted for single statement bodies. Comment at: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp:64 +return; + } + MCStreamer = getStreamer(); ditto Comment at: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp:68 + // Emit a .note.gnu.property section with the flags. + MCSection *Cur = OutStreamer.getCurrentSectionOnly(); + MCSectionELF *Nt = Context.getELFSection(".note.gnu.property", ELF::SHT_NOTE, move this to just before the SwitchSection call below? Comment at: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h:40 + /// Callback used to implement the .note.gnu.property section. + virtual void emitNoteSection(unsigned Flags); + does this need to be virtual? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
chill accepted this revision. chill added a comment. This revision is now accepted and ready to land. LGTM. It'd be nice if we could get someone non-Arm to have a look too. though. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
danielkiss updated this revision to Diff 288765. danielkiss marked an inline comment as done. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 Files: clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/arm64-markbti.S llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h @@ -36,6 +36,9 @@ /// Callback used to implement the .inst directive. virtual void emitInst(uint32_t Inst); + /// Callback used to implement the .note.gnu.property section. + virtual void emitNoteSection(unsigned Flags); + virtual void EmitARM64WinCFIAllocStack(unsigned Size) {} virtual void EmitARM64WinCFISaveFPLR(int Offset) {} virtual void EmitARM64WinCFISaveFPLRX(int Offset) {} Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp @@ -11,12 +11,23 @@ //===--===// #include "AArch64TargetStreamer.h" +#include "AArch64MCAsmInfo.h" +#include "AArch64Subtarget.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/ConstantPools.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCSection.h" +#include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; +static cl::opt MarkBTIProperty( +"aarch64-mark-bti-property", cl::Hidden, +cl::desc("Add .note.gnu.property with BTI to assembly files"), +cl::init(false)); + // // AArch64TargetStreamer Implemenation // @@ -37,8 +48,52 @@ ConstantPools->emitForCurrentSection(Streamer); } -// finish() - write out any non-empty assembler constant pools. -void AArch64TargetStreamer::finish() { ConstantPools->emitAll(Streamer); } +// finish() - write out any non-empty assembler constant pools and +// write out note.gnu.properties if need. +void AArch64TargetStreamer::finish() { + ConstantPools->emitAll(Streamer); + + if (MarkBTIProperty) { +emitNoteSection(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_BTI); + } +} + +void AArch64TargetStreamer::emitNoteSection(unsigned Flags) { + if (Flags == 0) { +return; + } + MCStreamer = getStreamer(); + MCContext = OutStreamer.getContext(); + // Emit a .note.gnu.property section with the flags. + MCSection *Cur = OutStreamer.getCurrentSectionOnly(); + MCSectionELF *Nt = Context.getELFSection(".note.gnu.property", ELF::SHT_NOTE, + ELF::SHF_ALLOC); + if (Nt->isRegistered()) { +SMLoc Loc; +Context.reportWarning( +Loc, +"The .note.gnu.property is not emitted because it is already present."); +return; + } + + OutStreamer.SwitchSection(Nt); + + // Emit the note header. + OutStreamer.emitValueToAlignment(Align(8).value()); + OutStreamer.emitIntValue(4, 4); // data size for "GNU\0" + OutStreamer.emitIntValue(4 * 4, 4); // Elf_Prop size + OutStreamer.emitIntValue(ELF::NT_GNU_PROPERTY_TYPE_0, 4); + OutStreamer.emitBytes(StringRef("GNU", 4)); // note name + + // Emit the PAC/BTI properties. + OutStreamer.emitIntValue(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_AND, 4); + OutStreamer.emitIntValue(4, 4); // data size + OutStreamer.emitIntValue(Flags, 4); // data + OutStreamer.emitIntValue(0, 4); // pad + + OutStreamer.endSection(Nt); + OutStreamer.SwitchSection(Cur); +} void AArch64TargetStreamer::emitInst(uint32_t Inst) { char Buffer[4]; Index: llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp === --- llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -221,26 +221,9 @@ return; // Emit a .note.gnu.property section with the flags. - MCSection *Cur = OutStreamer->getCurrentSectionOnly(); - MCSection *Nt = MMI->getContext().getELFSection( - ".note.gnu.property", ELF::SHT_NOTE, ELF::SHF_ALLOC); - OutStreamer->SwitchSection(Nt); - - // Emit the note header. - emitAlignment(Align(8)); - OutStreamer->emitInt32(4); // data size for "GNU\0" - OutStreamer->emitInt32(4 * 4); // Elf_Prop size - OutStreamer->emitInt32(ELF::NT_GNU_PROPERTY_TYPE_0); - OutStreamer->emitBytes(StringRef("GNU", 4)); // note name - - // Emit the PAC/BTI properties. - OutStreamer->emitInt32(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_AND); - OutStreamer->emitInt32(4); // data size -
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
chill added inline comments. Comment at: llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp:106 + + EmitBTIMarking = MarkBTIProperty.getValue(); } No need to the `.getValue()` part. Comment at: llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h:34 explicit AArch64MCAsmInfoELF(const Triple ); + bool EmitBTIMarking; }; Is there a need for this data member? The option value does not change over time, and the option can be defined in `AArch64TargetStreamer.cpp`. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
danielkiss marked an inline comment as done. danielkiss added inline comments. Comment at: llvm/lib/Target/AArch64/AArch64.td:352 +def FeatureEmitNoteBTIProperty : SubtargetFeature<"markbtiproperty", "MarkBTIProperty", +"true", "Emit .note.gnu.property for Branch Target Identification" >; chill wrote: > No, this is an abuse of subtarget features. Subtarget features represent > characteristics of the chip, they shouldn't be used to pass arbitrary bits of > information. > Possible alternatives - `TargetOptions` (cf. > `BackendUtil.cpp:initTargetOptions()`) or > LLVM command-line arguments (cf. `BackendUtil.cpp:setCommandLineOpts()`. Thanks, now I learned how to pass flags across layers, that was not clear at the first time. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
danielkiss updated this revision to Diff 285492. danielkiss added a comment. Fix review comments. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 Files: clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/arm64-markbti.S llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h @@ -36,6 +36,9 @@ /// Callback used to implement the .inst directive. virtual void emitInst(uint32_t Inst); + /// Callback used to implement the .note.gnu.property section. + virtual void emitNoteSection(unsigned Flags); + virtual void EmitARM64WinCFIAllocStack(unsigned Size) {} virtual void EmitARM64WinCFISaveFPLR(int Offset) {} virtual void EmitARM64WinCFISaveFPLRX(int Offset) {} Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp @@ -11,8 +11,13 @@ //===--===// #include "AArch64TargetStreamer.h" +#include "AArch64MCAsmInfo.h" +#include "AArch64Subtarget.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/ConstantPools.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCSection.h" +#include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCSubtargetInfo.h" using namespace llvm; @@ -37,8 +42,56 @@ ConstantPools->emitForCurrentSection(Streamer); } -// finish() - write out any non-empty assembler constant pools. -void AArch64TargetStreamer::finish() { ConstantPools->emitAll(Streamer); } +// finish() - write out any non-empty assembler constant pools and +// write out note.gnu.properties if need. +void AArch64TargetStreamer::finish() { + ConstantPools->emitAll(Streamer); + + MCContext = getStreamer().getContext(); + const AArch64MCAsmInfoELF *MCAI = + static_cast(Context.getAsmInfo()); + + if (MCAI->EmitBTIMarking) { +emitNoteSection(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_BTI); + } +} + +void AArch64TargetStreamer::emitNoteSection(unsigned Flags) { + if (Flags == 0) { +return; + } + MCStreamer = getStreamer(); + MCContext = OutStreamer.getContext(); + // Emit a .note.gnu.property section with the flags. + MCSection *Cur = OutStreamer.getCurrentSectionOnly(); + MCSectionELF *Nt = Context.getELFSection(".note.gnu.property", ELF::SHT_NOTE, + ELF::SHF_ALLOC); + if (Nt->isRegistered()) { +SMLoc Loc; +Context.reportWarning( +Loc, +"The .note.gnu.property is not emitted because it is already present."); +return; + } + + OutStreamer.SwitchSection(Nt); + + // Emit the note header. + OutStreamer.emitValueToAlignment(Align(8).value()); + OutStreamer.emitIntValue(4, 4); // data size for "GNU\0" + OutStreamer.emitIntValue(4 * 4, 4); // Elf_Prop size + OutStreamer.emitIntValue(ELF::NT_GNU_PROPERTY_TYPE_0, 4); + OutStreamer.emitBytes(StringRef("GNU", 4)); // note name + + // Emit the PAC/BTI properties. + OutStreamer.emitIntValue(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_AND, 4); + OutStreamer.emitIntValue(4, 4); // data size + OutStreamer.emitIntValue(Flags, 4); // data + OutStreamer.emitIntValue(0, 4); // pad + + OutStreamer.endSection(Nt); + OutStreamer.SwitchSection(Cur); +} void AArch64TargetStreamer::emitInst(uint32_t Inst) { char Buffer[4]; Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.h @@ -31,6 +31,7 @@ struct AArch64MCAsmInfoELF : public MCAsmInfoELF { explicit AArch64MCAsmInfoELF(const Triple ); + bool EmitBTIMarking; }; struct AArch64MCAsmInfoMicrosoftCOFF : public MCAsmInfoMicrosoft { Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp @@ -30,6 +30,11 @@ cl::values(clEnumValN(Generic, "generic", "Emit generic NEON assembly"), clEnumValN(Apple, "apple", "Emit Apple-style NEON assembly"))); +static cl::opt MarkBTIProperty( +"aarch64-mark-bti-property", cl::Hidden,
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
chill requested changes to this revision. chill added inline comments. This revision now requires changes to proceed. Herald added a subscriber: dang. Comment at: llvm/lib/Target/AArch64/AArch64.td:352 +def FeatureEmitNoteBTIProperty : SubtargetFeature<"markbtiproperty", "MarkBTIProperty", +"true", "Emit .note.gnu.property for Branch Target Identification" >; No, this is an abuse of subtarget features. Subtarget features represent characteristics of the chip, they shouldn't be used to pass arbitrary bits of information. Possible alternatives - `TargetOptions` (cf. `BackendUtil.cpp:initTargetOptions()`) or LLVM command-line arguments (cf. `BackendUtil.cpp:setCommandLineOpts()`. CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D81930: [AArch64] Add -mmark-bti-property flag.
danielkiss updated this revision to Diff 272024. danielkiss retitled this revision from "[AArch64] Add -mbti flag." to "[AArch64] Add -mmark-bti-property flag.". danielkiss edited the summary of this revision. danielkiss added a comment. Rename the flag to -mmark-bti-property CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81930/new/ https://reviews.llvm.org/D81930 Files: clang/include/clang/Driver/Options.td clang/lib/Driver/ToolChains/Arch/AArch64.cpp clang/test/Driver/arm64-markbti.S llvm/lib/Target/AArch64/AArch64.td llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp llvm/lib/Target/AArch64/AArch64Subtarget.h llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h @@ -20,6 +20,7 @@ class AArch64TargetStreamer : public MCTargetStreamer { public: AArch64TargetStreamer(MCStreamer ); + AArch64TargetStreamer(MCStreamer , const MCSubtargetInfo *STI); ~AArch64TargetStreamer() override; void finish() override; @@ -36,6 +37,9 @@ /// Callback used to implement the .inst directive. virtual void emitInst(uint32_t Inst); + /// Callback used to implement the .note.gnu.property section. + virtual void emitNoteSection(unsigned Flags); + virtual void EmitARM64WinCFIAllocStack(unsigned Size) {} virtual void EmitARM64WinCFISaveFPLR(int Offset) {} virtual void EmitARM64WinCFISaveFPLRX(int Offset) {} @@ -56,6 +60,7 @@ private: std::unique_ptr ConstantPools; + const MCSubtargetInfo *STI; }; class AArch64TargetELFStreamer : public AArch64TargetStreamer { @@ -65,7 +70,8 @@ void emitInst(uint32_t Inst) override; public: - AArch64TargetELFStreamer(MCStreamer ) : AArch64TargetStreamer(S) {} + AArch64TargetELFStreamer(MCStreamer , const MCSubtargetInfo *STI) + : AArch64TargetStreamer(S, STI) {} }; class AArch64TargetWinCOFFStreamer : public llvm::AArch64TargetStreamer { @@ -76,8 +82,8 @@ // Symbol of the current epilog for which we are processing SEH directives. MCSymbol *CurrentEpilog = nullptr; public: - AArch64TargetWinCOFFStreamer(llvm::MCStreamer ) -: AArch64TargetStreamer(S) {} + AArch64TargetWinCOFFStreamer(llvm::MCStreamer , const MCSubtargetInfo *STI) + : AArch64TargetStreamer(S, STI) {} // The unwind codes on ARM64 Windows are documented at // https://docs.microsoft.com/en-us/cpp/build/arm64-exception-handling Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp === --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp @@ -11,8 +11,12 @@ //===--===// #include "AArch64TargetStreamer.h" +#include "AArch64Subtarget.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/ConstantPools.h" +#include "llvm/MC/MCContext.h" #include "llvm/MC/MCSection.h" +#include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCSubtargetInfo.h" using namespace llvm; @@ -21,7 +25,13 @@ // AArch64TargetStreamer Implemenation // AArch64TargetStreamer::AArch64TargetStreamer(MCStreamer ) -: MCTargetStreamer(S), ConstantPools(new AssemblerConstantPools()) {} +: MCTargetStreamer(S), ConstantPools(new AssemblerConstantPools()), + STI(nullptr) {} + +AArch64TargetStreamer::AArch64TargetStreamer(MCStreamer , + const MCSubtargetInfo *STI) +: MCTargetStreamer(S), ConstantPools(new AssemblerConstantPools()), + STI(STI) {} AArch64TargetStreamer::~AArch64TargetStreamer() = default; @@ -37,8 +47,54 @@ ConstantPools->emitForCurrentSection(Streamer); } -// finish() - write out any non-empty assembler constant pools. -void AArch64TargetStreamer::finish() { ConstantPools->emitAll(Streamer); } +// finish() - write out any non-empty assembler constant pools and +// write out note.gnu.properties if need. +void AArch64TargetStreamer::finish() { + ConstantPools->emitAll(Streamer); + if (!STI) +return; + + if (STI->getFeatureBits()[AArch64::FeatureEmitNoteBTIProperty]) { +emitNoteSection(ELF::GNU_PROPERTY_AARCH64_FEATURE_1_BTI); + } +} + +void AArch64TargetStreamer::emitNoteSection(unsigned Flags) { + if (Flags == 0) { +return; + } + MCStreamer = getStreamer(); + MCContext = OutStreamer.getContext(); + // Emit a .note.gnu.property section with the flags. + MCSection *Cur = OutStreamer.getCurrentSectionOnly(); + MCSectionELF *Nt = Context.getELFSection(".note.gnu.property", ELF::SHT_NOTE, +