diff options
| author | Jim Grosbach <grosbach@apple.com> | 2012-05-18 19:12:01 +0000 | 
|---|---|---|
| committer | Jim Grosbach <grosbach@apple.com> | 2012-05-18 19:12:01 +0000 | 
| commit | 4b63d2ae1dd1cedbb0b2a61fa0da9559043dfabb (patch) | |
| tree | ec99ff4582dce46aa5e78d56a65913820452bcc0 /llvm/lib/MC/MCParser | |
| parent | 846e6a6121ee1dcf6e672a0d0dcc184daea3e7e3 (diff) | |
| download | bcm5719-llvm-4b63d2ae1dd1cedbb0b2a61fa0da9559043dfabb.tar.gz bcm5719-llvm-4b63d2ae1dd1cedbb0b2a61fa0da9559043dfabb.zip | |
Refactor data-in-code annotations.
Use a dedicated MachO load command to annotate data-in-code regions.
This is the same format the linker produces for final executable images,
allowing consistency of representation and use of introspection tools
for both object and executable files.
Data-in-code regions are annotated via ".data_region"/".end_data_region"
directive pairs, with an optional region type.
data_region_directive := ".data_region" { region_type }
region_type := "jt8" | "jt16" | "jt32" | "jta32"
end_data_region_directive := ".end_data_region"
The previous handling of ARM-style "$d.*" labels was broken and has
been removed. Specifically, it didn't handle ARM vs. Thumb mode when
marking the end of the section.
rdar://11459456
llvm-svn: 157062
Diffstat (limited to 'llvm/lib/MC/MCParser')
| -rw-r--r-- | llvm/lib/MC/MCParser/DarwinAsmParser.cpp | 42 | 
1 files changed, 42 insertions, 0 deletions
| diff --git a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp index 6f450682cbe..5662fea86ce 100644 --- a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp +++ b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp @@ -14,6 +14,7 @@  #include "llvm/MC/MCSymbol.h"  #include "llvm/MC/MCParser/MCAsmLexer.h"  #include "llvm/MC/MCParser/MCAsmParser.h" +#include "llvm/ADT/StringSwitch.h"  #include "llvm/ADT/StringRef.h"  #include "llvm/ADT/Twine.h"  #include "llvm/Support/MemoryBuffer.h" @@ -56,6 +57,9 @@ public:      AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveTBSS>(".tbss");      AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveZerofill>(".zerofill"); +    AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveDataRegion>(".data_region"); +    AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveDataRegionEnd>(".end_data_region"); +      // Special section directives.      AddDirectiveHandler<&DarwinAsmParser::ParseSectionDirectiveConst>(".const");      AddDirectiveHandler<&DarwinAsmParser::ParseSectionDirectiveConstData>(".const_data"); @@ -113,6 +117,8 @@ public:    bool ParseDirectiveSubsectionsViaSymbols(StringRef, SMLoc);    bool ParseDirectiveTBSS(StringRef, SMLoc);    bool ParseDirectiveZerofill(StringRef, SMLoc); +  bool ParseDirectiveDataRegion(StringRef, SMLoc); +  bool ParseDirectiveDataRegionEnd(StringRef, SMLoc);    // Named Section Directive    bool ParseSectionDirectiveConst(StringRef, SMLoc) { @@ -659,6 +665,42 @@ bool DarwinAsmParser::ParseDirectiveZerofill(StringRef, SMLoc) {    return false;  } +/// ParseDirectiveDataRegion +///  ::= .data_region [ ( jt8 | jt16 | jt32 ) ] +bool DarwinAsmParser::ParseDirectiveDataRegion(StringRef, SMLoc) { +  if (getLexer().is(AsmToken::EndOfStatement)) { +    Lex(); +    getStreamer().EmitDataRegion(MCDR_DataRegion); +    return false; +  } +  StringRef RegionType; +  SMLoc Loc = getParser().getTok().getLoc(); +  if (getParser().ParseIdentifier(RegionType)) +    return TokError("expected region type after '.data_region' directive"); +  int Kind = StringSwitch<int>(RegionType) +    .Case("jt8", MCDR_DataRegionJT8) +    .Case("jt16", MCDR_DataRegionJT16) +    .Case("jt32", MCDR_DataRegionJT32) +    .Default(-1); +  if (Kind == -1) +    return Error(Loc, "unknown region type in '.data_region' directive"); +  Lex(); + +  getStreamer().EmitDataRegion((MCDataRegionType)Kind); +  return false; +} + +/// ParseDirectiveDataRegionEnd +///  ::= .end_data_region +bool DarwinAsmParser::ParseDirectiveDataRegionEnd(StringRef, SMLoc) { +  if (getLexer().isNot(AsmToken::EndOfStatement)) +    return TokError("unexpected token in '.end_data_region' directive"); + +  Lex(); +  getStreamer().EmitDataRegion(MCDR_DataRegionEnd); +  return false; +} +  namespace llvm {  MCAsmParserExtension *createDarwinAsmParser() { | 

