Skip to content

Commit 0a951b7

Browse files
committedApr 23, 2014
Create MCTargetOptions.
For now it contains a single flag, SanitizeAddress, which enables AddressSanitizer instrumentation of inline assembly. Patch by Yuri Gorshenin. llvm-svn: 206971
1 parent eeb820f commit 0a951b7

File tree

26 files changed

+210
-67
lines changed

26 files changed

+210
-67
lines changed
 

‎llvm/include/llvm/CodeGen/CommandFlags.h

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#ifndef LLVM_CODEGEN_COMMANDFLAGS_H
1717
#define LLVM_CODEGEN_COMMANDFLAGS_H
1818

19+
#include "llvm/MC/MCTargetOptionsCommandFlags.h"
1920
#include "llvm/Support/CodeGen.h"
2021
#include "llvm/Support/CommandLine.h"
2122
#include "llvm/Target/TargetMachine.h"
@@ -225,6 +226,9 @@ static inline TargetOptions InitTargetOptionsFromCodeGenFlags() {
225226
Options.TrapFuncName = TrapFuncName;
226227
Options.PositionIndependentExecutable = EnablePIE;
227228
Options.UseInitArray = UseInitArray;
229+
230+
Options.MCOptions = InitMCTargetOptionsFromFlags();
231+
228232
return Options;
229233
}
230234

‎llvm/include/llvm/MC/MCTargetAsmParser.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@
1212

1313
#include "llvm/MC/MCExpr.h"
1414
#include "llvm/MC/MCParser/MCAsmParserExtension.h"
15+
#include "llvm/MC/MCTargetOptions.h"
1516

1617
namespace llvm {
17-
class MCStreamer;
18-
class StringRef;
19-
class SMLoc;
2018
class AsmToken;
21-
class MCParsedAsmOperand;
2219
class MCInst;
20+
class MCParsedAsmOperand;
21+
class MCStreamer;
22+
class SMLoc;
23+
class StringRef;
2324
template <typename T> class SmallVectorImpl;
2425

2526
enum AsmRewriteKind {
@@ -97,6 +98,9 @@ class MCTargetAsmParser : public MCAsmParserExtension {
9798
/// ms-style inline assembly.
9899
MCAsmParserSemaCallback *SemaCallback;
99100

101+
/// Set of options which affects instrumentation of inline assembly.
102+
MCTargetOptions MCOptions;
103+
100104
public:
101105
virtual ~MCTargetAsmParser();
102106

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//===- MCTargetOptions.h - MC Target Options -------------------*- C++ -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
#ifndef LLVM_MC_MCTARGETOPTIONS_H
11+
#define LLVM_MC_MCTARGETOPTIONS_H
12+
13+
namespace llvm {
14+
15+
class MCTargetOptions {
16+
public:
17+
enum AsmInstrumentation {
18+
AsmInstrumentationNone,
19+
AsmInstrumentationAddress
20+
};
21+
22+
/// Enables AddressSanitizer instrumentation at machine level.
23+
bool SanitizeAddress : 1;
24+
25+
MCTargetOptions();
26+
};
27+
28+
inline bool operator==(const MCTargetOptions &LHS, const MCTargetOptions &RHS) {
29+
#define ARE_EQUAL(X) LHS.X == RHS.X
30+
return ARE_EQUAL(SanitizeAddress);
31+
#undef ARE_EQUAL
32+
}
33+
34+
inline bool operator!=(const MCTargetOptions &LHS, const MCTargetOptions &RHS) {
35+
return !(LHS == RHS);
36+
}
37+
38+
} // end namespace llvm
39+
40+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//===-- MCTargetOptionsCommandFlags.h --------------------------*- C++ -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
//
10+
// This file contains machine code-specific flags that are shared between
11+
// different command line tools.
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
#ifndef LLVM_MC_MCTARGETOPTIONSCOMMANDFLAGS_H
16+
#define LLVM_MC_MCTARGETOPTIONSCOMMANDFLAGS_H
17+
18+
#include "llvm/Support/CommandLine.h"
19+
#include "llvm/MC/MCTargetOptions.h"
20+
using namespace llvm;
21+
22+
cl::opt<MCTargetOptions::AsmInstrumentation> AsmInstrumentation(
23+
"asm-instrumentation",
24+
cl::desc("Instrumentation of inline assembly and "
25+
"assembly source files"),
26+
cl::init(MCTargetOptions::AsmInstrumentationNone),
27+
cl::values(clEnumValN(MCTargetOptions::AsmInstrumentationNone,
28+
"none",
29+
"no instrumentation at all"),
30+
clEnumValN(MCTargetOptions::AsmInstrumentationAddress,
31+
"address",
32+
"instrument instructions with memory arguments"),
33+
clEnumValEnd));
34+
35+
static inline MCTargetOptions InitMCTargetOptionsFromFlags() {
36+
MCTargetOptions Options;
37+
Options.SanitizeAddress =
38+
(AsmInstrumentation == MCTargetOptions::AsmInstrumentationAddress);
39+
return Options;
40+
}
41+
42+
#endif

‎llvm/include/llvm/Support/TargetRegistry.h

+15-9
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace llvm {
4545
class MCSymbolizer;
4646
class MCRelocationInfo;
4747
class MCTargetAsmParser;
48+
class MCTargetOptions;
4849
class TargetMachine;
4950
class TargetOptions;
5051
class raw_ostream;
@@ -104,9 +105,11 @@ namespace llvm {
104105
const MCRegisterInfo &MRI,
105106
StringRef TT,
106107
StringRef CPU);
107-
typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI,
108-
MCAsmParser &P,
109-
const MCInstrInfo &MII);
108+
typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(
109+
MCSubtargetInfo &STI,
110+
MCAsmParser &P,
111+
const MCInstrInfo &MII,
112+
const MCTargetOptions &Options);
110113
typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T,
111114
const MCSubtargetInfo &STI,
112115
MCContext &Ctx);
@@ -362,12 +365,14 @@ namespace llvm {
362365
///
363366
/// \param Parser The target independent parser implementation to use for
364367
/// parsing and lexing.
365-
MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI,
366-
MCAsmParser &Parser,
367-
const MCInstrInfo &MII) const {
368+
MCTargetAsmParser *createMCAsmParser(
369+
MCSubtargetInfo &STI,
370+
MCAsmParser &Parser,
371+
const MCInstrInfo &MII,
372+
const MCTargetOptions &Options) const {
368373
if (!MCAsmParserCtorFn)
369374
return nullptr;
370-
return MCAsmParserCtorFn(STI, Parser, MII);
375+
return MCAsmParserCtorFn(STI, Parser, MII, Options);
371376
}
372377

373378
/// createAsmPrinter - Create a target specific assembly printer pass. This
@@ -1099,8 +1104,9 @@ namespace llvm {
10991104

11001105
private:
11011106
static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P,
1102-
const MCInstrInfo &MII) {
1103-
return new MCAsmParserImpl(STI, P, MII);
1107+
const MCInstrInfo &MII,
1108+
const MCTargetOptions &Options) {
1109+
return new MCAsmParserImpl(STI, P, MII, Options);
11041110
}
11051111
};
11061112

‎llvm/include/llvm/Target/TargetOptions.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef LLVM_TARGET_TARGETOPTIONS_H
1616
#define LLVM_TARGET_TARGETOPTIONS_H
1717

18+
#include "llvm/MC/MCTargetOptions.h"
1819
#include <string>
1920

2021
namespace llvm {
@@ -197,6 +198,9 @@ namespace llvm {
197198
/// via the llvm.fma.* intrinsic) will always be honored, regardless of
198199
/// the value of this option.
199200
FPOpFusion::FPOpFusionMode AllowFPOpFusion;
201+
202+
/// Machine level options.
203+
MCTargetOptions MCOptions;
200204
};
201205

202206
// Comparison operators:
@@ -223,7 +227,8 @@ inline bool operator==(const TargetOptions &LHS,
223227
ARE_EQUAL(TrapUnreachable) &&
224228
ARE_EQUAL(TrapFuncName) &&
225229
ARE_EQUAL(FloatABIType) &&
226-
ARE_EQUAL(AllowFPOpFusion);
230+
ARE_EQUAL(AllowFPOpFusion) &&
231+
ARE_EQUAL(MCOptions);
227232
#undef ARE_EQUAL
228233
}
229234

‎llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "llvm/ADT/SmallString.h"
1616
#include "llvm/ADT/Twine.h"
1717
#include "llvm/CodeGen/MachineBasicBlock.h"
18+
#include "llvm/CodeGen/MachineFunction.h"
1819
#include "llvm/CodeGen/MachineModuleInfo.h"
1920
#include "llvm/IR/Constants.h"
2021
#include "llvm/IR/DataLayout.h"
@@ -135,8 +136,11 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode,
135136
// emitInlineAsmEnd().
136137
MCSubtargetInfo STIOrig = *STI;
137138

139+
MCTargetOptions MCOptions;
140+
if (MF)
141+
MCOptions = MF->getTarget().Options.MCOptions;
138142
std::unique_ptr<MCTargetAsmParser> TAP(
139-
TM.getTarget().createMCAsmParser(*STI, *Parser, *MII));
143+
TM.getTarget().createMCAsmParser(*STI, *Parser, *MII, MCOptions));
140144
if (!TAP)
141145
report_fatal_error("Inline asm not supported by this streamer because"
142146
" we don't have an asm parser for this target\n");

‎llvm/lib/LTO/LTOModule.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,8 @@ bool LTOModule::addAsmGlobalSymbols(std::string &errMsg) {
739739
_target->getTargetTriple(), _target->getTargetCPU(),
740740
_target->getTargetFeatureString()));
741741
std::unique_ptr<MCTargetAsmParser> TAP(
742-
T.createMCAsmParser(*STI, *Parser.get(), *MCII));
742+
T.createMCAsmParser(*STI, *Parser.get(), *MCII,
743+
_target->Options.MCOptions));
743744
if (!TAP) {
744745
errMsg = "target " + std::string(T.getName()) +
745746
" does not define AsmParser.";

‎llvm/lib/MC/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ add_llvm_library(LLVMMC
4545
MCSubtargetInfo.cpp
4646
MCSymbol.cpp
4747
MCSymbolizer.cpp
48+
MCTargetOptions.cpp
4849
MCValue.cpp
4950
MCWin64EH.cpp
5051
MachObjectWriter.cpp

‎llvm/lib/MC/MCTargetOptions.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//===- lib/MC/MCTargetOptions.cpp - MC Target Options --------------------===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
#include "llvm/MC/MCTargetOptions.h"
11+
12+
namespace llvm {
13+
14+
MCTargetOptions::MCTargetOptions() : SanitizeAddress(false) {}
15+
16+
} // end namespace llvm

‎llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ class AArch64AsmParser : public MCTargetAsmParser {
5555
};
5656

5757
AArch64AsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
58-
const MCInstrInfo &MII)
58+
const MCInstrInfo &MII,
59+
const MCTargetOptions &Options)
5960
: MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
6061
MCAsmParserExtension::Initialize(_Parser);
6162

‎llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,8 @@ class ARMAsmParser : public MCTargetAsmParser {
344344
};
345345

346346
ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
347-
const MCInstrInfo &MII)
347+
const MCInstrInfo &MII,
348+
const MCTargetOptions &Options)
348349
: MCTargetAsmParser(), STI(_STI), Parser(_Parser), MII(MII), UC(_Parser) {
349350
MCAsmParserExtension::Initialize(_Parser);
350351

‎llvm/lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ class ARM64AsmParser : public MCTargetAsmParser {
104104
#include "ARM64GenAsmMatcher.inc"
105105
};
106106
ARM64AsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
107-
const MCInstrInfo &MII)
107+
const MCInstrInfo &MII,
108+
const MCTargetOptions &Options)
108109
: MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
109110
MCAsmParserExtension::Initialize(_Parser);
110111

‎llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ class MipsAsmParser : public MCTargetAsmParser {
229229

230230
public:
231231
MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
232-
const MCInstrInfo &MII)
232+
const MCInstrInfo &MII,
233+
const MCTargetOptions &Options)
233234
: MCTargetAsmParser(), STI(sti), Parser(parser) {
234235
// Initialize the set of available features.
235236
setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));

‎llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,8 @@ class PPCAsmParser : public MCTargetAsmParser {
264264

265265
public:
266266
PPCAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser,
267-
const MCInstrInfo &_MII)
267+
const MCInstrInfo &_MII,
268+
const MCTargetOptions &Options)
268269
: MCTargetAsmParser(), STI(_STI), Parser(_Parser), MII(_MII) {
269270
// Check for 64-bit vs. 32-bit pointer mode.
270271
Triple TheTriple(STI.getTargetTriple());

‎llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ class SparcAsmParser : public MCTargetAsmParser {
8383
bool is64Bit() const { return STI.getTargetTriple().startswith("sparcv9"); }
8484
public:
8585
SparcAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
86-
const MCInstrInfo &MII)
86+
const MCInstrInfo &MII,
87+
const MCTargetOptions &Options)
8788
: MCTargetAsmParser(), STI(sti), Parser(parser) {
8889
// Initialize the set of available features.
8990
setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));

‎llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,8 @@ class SystemZAsmParser : public MCTargetAsmParser {
331331

332332
public:
333333
SystemZAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
334-
const MCInstrInfo &MII)
334+
const MCInstrInfo &MII,
335+
const MCTargetOptions &Options)
335336
: MCTargetAsmParser(), STI(sti), Parser(parser) {
336337
MCAsmParserExtension::Initialize(Parser);
337338

‎llvm/lib/Target/TargetMachine.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "llvm/MC/MCAsmInfo.h"
2222
#include "llvm/MC/MCCodeGenInfo.h"
2323
#include "llvm/MC/MCContext.h"
24+
#include "llvm/MC/MCTargetOptions.h"
2425
#include "llvm/MC/SectionKind.h"
2526
#include "llvm/Support/CommandLine.h"
2627
#include "llvm/Target/TargetLowering.h"
@@ -89,6 +90,8 @@ void TargetMachine::resetTargetOptions(const MachineFunction *MF) const {
8990
RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math");
9091
RESET_OPTION(UseSoftFloat, "use-soft-float");
9192
RESET_OPTION(DisableTailCalls, "disable-tail-calls");
93+
94+
TO.MCOptions.SanitizeAddress = F->hasFnAttribute(Attribute::SanitizeAddress);
9295
}
9396

9497
/// getRelocationModel - Returns the code generation relocation model. The

0 commit comments

Comments
 (0)
Please sign in to comment.