mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-17 05:40:48 +00:00
[IR] Split Intrinsics.inc into enums and implementations
Implements PR34259 Intrinsics.h is a very popular header. Most LLVM TUs care about things like dbg_value, but they don't care how they are implemented. After I split these out, IntrinsicImpl.inc is 1.7 MB, so this saves each LLVM TU from scanning 1.7 MB of source that gets pre-processed away. It also means we can modify intrinsic properties without triggering a full rebuild, but that's probably less of a win. I think the next best thing to do would be to split out the target intrinsics into their own header. Very, very few TUs care about target-specific intrinsics. It's very hard to split up the target independent intrinsics like llvm.expect, assume, and dbg.value, though. llvm-svn: 335407
This commit is contained in:
parent
5c25346912
commit
f5890e4e43
@ -2,5 +2,6 @@ set(LLVM_TARGET_DEFINITIONS Attributes.td)
|
||||
tablegen(LLVM Attributes.inc -gen-attrs)
|
||||
|
||||
set(LLVM_TARGET_DEFINITIONS Intrinsics.td)
|
||||
tablegen(LLVM Intrinsics.inc -gen-intrinsic)
|
||||
tablegen(LLVM IntrinsicEnums.inc -gen-intrinsic-enums)
|
||||
tablegen(LLVM IntrinsicImpl.inc -gen-intrinsic-impl)
|
||||
add_public_tablegen_target(intrinsics_gen)
|
||||
|
@ -39,7 +39,7 @@ namespace Intrinsic {
|
||||
|
||||
// Get the intrinsic enums generated from Intrinsics.td
|
||||
#define GET_INTRINSIC_ENUM_VALUES
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicEnums.inc"
|
||||
#undef GET_INTRINSIC_ENUM_VALUES
|
||||
, num_intrinsics
|
||||
};
|
||||
|
@ -487,13 +487,13 @@ void Function::copyAttributesFrom(const Function *Src) {
|
||||
static const char * const IntrinsicNameTable[] = {
|
||||
"not_intrinsic",
|
||||
#define GET_INTRINSIC_NAME_TABLE
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_INTRINSIC_NAME_TABLE
|
||||
};
|
||||
|
||||
/// Table of per-target intrinsic name tables.
|
||||
#define GET_INTRINSIC_TARGET_DATA
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_INTRINSIC_TARGET_DATA
|
||||
|
||||
/// Find the segment of \c IntrinsicNameTable for intrinsics with the same
|
||||
@ -840,7 +840,7 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
|
||||
}
|
||||
|
||||
#define GET_INTRINSIC_GENERATOR_GLOBAL
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_INTRINSIC_GENERATOR_GLOBAL
|
||||
|
||||
void Intrinsic::getIntrinsicInfoTableEntries(ID id,
|
||||
@ -977,7 +977,7 @@ FunctionType *Intrinsic::getType(LLVMContext &Context,
|
||||
|
||||
bool Intrinsic::isOverloaded(ID id) {
|
||||
#define GET_INTRINSIC_OVERLOAD_TABLE
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_INTRINSIC_OVERLOAD_TABLE
|
||||
}
|
||||
|
||||
@ -995,7 +995,7 @@ bool Intrinsic::isLeaf(ID id) {
|
||||
|
||||
/// This defines the "Intrinsic::getAttributes(ID id)" method.
|
||||
#define GET_INTRINSIC_ATTRIBUTES
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_INTRINSIC_ATTRIBUTES
|
||||
|
||||
Function *Intrinsic::getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys) {
|
||||
@ -1008,12 +1008,12 @@ Function *Intrinsic::getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys) {
|
||||
|
||||
// This defines the "Intrinsic::getIntrinsicForGCCBuiltin()" method.
|
||||
#define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
|
||||
|
||||
// This defines the "Intrinsic::getIntrinsicForMSBuiltin()" method.
|
||||
#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
|
||||
#include "llvm/IR/Intrinsics.inc"
|
||||
#include "llvm/IR/IntrinsicImpl.inc"
|
||||
#undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN
|
||||
|
||||
bool Intrinsic::matchIntrinsicType(Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos,
|
||||
|
@ -7,7 +7,8 @@ tablegen(LLVM AMDGPUGenDAGISel.inc -gen-dag-isel)
|
||||
tablegen(LLVM AMDGPUGenDFAPacketizer.inc -gen-dfa-packetizer)
|
||||
tablegen(LLVM AMDGPUGenDisassemblerTables.inc -gen-disassembler)
|
||||
tablegen(LLVM AMDGPUGenInstrInfo.inc -gen-instr-info)
|
||||
tablegen(LLVM AMDGPUGenIntrinsics.inc -gen-tgt-intrinsic)
|
||||
tablegen(LLVM AMDGPUGenIntrinsicEnums.inc -gen-tgt-intrinsic-enums)
|
||||
tablegen(LLVM AMDGPUGenIntrinsicImpl.inc -gen-tgt-intrinsic-impl)
|
||||
tablegen(LLVM AMDGPUGenMCCodeEmitter.inc -gen-emitter)
|
||||
tablegen(LLVM AMDGPUGenMCPseudoLowering.inc -gen-pseudo-lowering)
|
||||
tablegen(LLVM AMDGPUGenRegisterBank.inc -gen-register-bank)
|
||||
|
@ -1,4 +1,4 @@
|
||||
// RUN: llvm-tblgen -gen-intrinsic %s | FileCheck %s
|
||||
// RUN: llvm-tblgen -gen-intrinsic-enums %s | FileCheck %s
|
||||
// XFAIL: vg_leak
|
||||
|
||||
class IntrinsicProperty;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// RUN: llvm-tblgen -gen-intrinsic %s | FileCheck %s
|
||||
// RUN: llvm-tblgen -gen-intrinsic-enums %s | FileCheck %s
|
||||
// XFAIL: vg_leak
|
||||
|
||||
class IntrinsicProperty;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// RUN: llvm-tblgen -gen-intrinsic %s | FileCheck %s
|
||||
// RUN: llvm-tblgen -gen-intrinsic-impl %s | FileCheck %s
|
||||
// XFAIL: vg_leak
|
||||
|
||||
class IntrinsicProperty;
|
||||
|
@ -34,7 +34,7 @@ public:
|
||||
IntrinsicEmitter(RecordKeeper &R, bool T)
|
||||
: Records(R), TargetOnly(T) {}
|
||||
|
||||
void run(raw_ostream &OS);
|
||||
void run(raw_ostream &OS, bool Enums);
|
||||
|
||||
void EmitPrefix(raw_ostream &OS);
|
||||
|
||||
@ -56,7 +56,7 @@ public:
|
||||
// IntrinsicEmitter Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void IntrinsicEmitter::run(raw_ostream &OS) {
|
||||
void IntrinsicEmitter::run(raw_ostream &OS, bool Enums) {
|
||||
emitSourceFileHeader("Intrinsic Function Source Fragment", OS);
|
||||
|
||||
CodeGenIntrinsicTable Ints(Records, TargetOnly);
|
||||
@ -66,29 +66,31 @@ void IntrinsicEmitter::run(raw_ostream &OS) {
|
||||
|
||||
EmitPrefix(OS);
|
||||
|
||||
// Emit the enum information.
|
||||
EmitEnumInfo(Ints, OS);
|
||||
if (Enums) {
|
||||
// Emit the enum information.
|
||||
EmitEnumInfo(Ints, OS);
|
||||
} else {
|
||||
// Emit the target metadata.
|
||||
EmitTargetInfo(Ints, OS);
|
||||
|
||||
// Emit the target metadata.
|
||||
EmitTargetInfo(Ints, OS);
|
||||
// Emit the intrinsic ID -> name table.
|
||||
EmitIntrinsicToNameTable(Ints, OS);
|
||||
|
||||
// Emit the intrinsic ID -> name table.
|
||||
EmitIntrinsicToNameTable(Ints, OS);
|
||||
// Emit the intrinsic ID -> overload table.
|
||||
EmitIntrinsicToOverloadTable(Ints, OS);
|
||||
|
||||
// Emit the intrinsic ID -> overload table.
|
||||
EmitIntrinsicToOverloadTable(Ints, OS);
|
||||
// Emit the intrinsic declaration generator.
|
||||
EmitGenerator(Ints, OS);
|
||||
|
||||
// Emit the intrinsic declaration generator.
|
||||
EmitGenerator(Ints, OS);
|
||||
// Emit the intrinsic parameter attributes.
|
||||
EmitAttributes(Ints, OS);
|
||||
|
||||
// Emit the intrinsic parameter attributes.
|
||||
EmitAttributes(Ints, OS);
|
||||
// Emit code to translate GCC builtins into LLVM intrinsics.
|
||||
EmitIntrinsicToBuiltinMap(Ints, true, OS);
|
||||
|
||||
// Emit code to translate GCC builtins into LLVM intrinsics.
|
||||
EmitIntrinsicToBuiltinMap(Ints, true, OS);
|
||||
|
||||
// Emit code to translate MS builtins into LLVM intrinsics.
|
||||
EmitIntrinsicToBuiltinMap(Ints, false, OS);
|
||||
// Emit code to translate MS builtins into LLVM intrinsics.
|
||||
EmitIntrinsicToBuiltinMap(Ints, false, OS);
|
||||
}
|
||||
|
||||
EmitSuffix(OS);
|
||||
}
|
||||
@ -839,6 +841,12 @@ void IntrinsicEmitter::EmitIntrinsicToBuiltinMap(
|
||||
OS << "#endif\n\n";
|
||||
}
|
||||
|
||||
void llvm::EmitIntrinsics(RecordKeeper &RK, raw_ostream &OS, bool TargetOnly) {
|
||||
IntrinsicEmitter(RK, TargetOnly).run(OS);
|
||||
void llvm::EmitIntrinsicEnums(RecordKeeper &RK, raw_ostream &OS,
|
||||
bool TargetOnly) {
|
||||
IntrinsicEmitter(RK, TargetOnly).run(OS, /*Enums=*/true);
|
||||
}
|
||||
|
||||
void llvm::EmitIntrinsicImpl(RecordKeeper &RK, raw_ostream &OS,
|
||||
bool TargetOnly) {
|
||||
IntrinsicEmitter(RK, TargetOnly).run(OS, /*Enums=*/false);
|
||||
}
|
||||
|
@ -38,8 +38,10 @@ enum ActionType {
|
||||
GenDFAPacketizer,
|
||||
GenFastISel,
|
||||
GenSubtarget,
|
||||
GenIntrinsic,
|
||||
GenTgtIntrinsic,
|
||||
GenIntrinsicEnums,
|
||||
GenIntrinsicImpl,
|
||||
GenTgtIntrinsicEnums,
|
||||
GenTgtIntrinsicImpl,
|
||||
PrintEnums,
|
||||
PrintSets,
|
||||
GenOptParserDefs,
|
||||
@ -85,9 +87,13 @@ namespace {
|
||||
"Generate a \"fast\" instruction selector"),
|
||||
clEnumValN(GenSubtarget, "gen-subtarget",
|
||||
"Generate subtarget enumerations"),
|
||||
clEnumValN(GenIntrinsic, "gen-intrinsic",
|
||||
clEnumValN(GenIntrinsicEnums, "gen-intrinsic-enums",
|
||||
"Generate intrinsic enums"),
|
||||
clEnumValN(GenIntrinsicImpl, "gen-intrinsic-impl",
|
||||
"Generate intrinsic information"),
|
||||
clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
|
||||
clEnumValN(GenTgtIntrinsicEnums, "gen-tgt-intrinsic-enums",
|
||||
"Generate target intrinsic enums"),
|
||||
clEnumValN(GenTgtIntrinsicImpl, "gen-tgt-intrinsic-impl",
|
||||
"Generate target intrinsic information"),
|
||||
clEnumValN(PrintEnums, "print-enums",
|
||||
"Print enum values for a class"),
|
||||
@ -162,11 +168,17 @@ bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
|
||||
case GenSubtarget:
|
||||
EmitSubtarget(Records, OS);
|
||||
break;
|
||||
case GenIntrinsic:
|
||||
EmitIntrinsics(Records, OS);
|
||||
case GenIntrinsicEnums:
|
||||
EmitIntrinsicEnums(Records, OS);
|
||||
break;
|
||||
case GenTgtIntrinsic:
|
||||
EmitIntrinsics(Records, OS, true);
|
||||
case GenIntrinsicImpl:
|
||||
EmitIntrinsicImpl(Records, OS);
|
||||
break;
|
||||
case GenTgtIntrinsicEnums:
|
||||
EmitIntrinsicEnums(Records, OS, true);
|
||||
break;
|
||||
case GenTgtIntrinsicImpl:
|
||||
EmitIntrinsicImpl(Records, OS, true);
|
||||
break;
|
||||
case GenOptParserDefs:
|
||||
EmitOptParser(Records, OS);
|
||||
|
@ -62,7 +62,10 @@ namespace llvm {
|
||||
class raw_ostream;
|
||||
class RecordKeeper;
|
||||
|
||||
void EmitIntrinsics(RecordKeeper &RK, raw_ostream &OS, bool TargetOnly = false);
|
||||
void EmitIntrinsicEnums(RecordKeeper &RK, raw_ostream &OS,
|
||||
bool TargetOnly = false);
|
||||
void EmitIntrinsicImpl(RecordKeeper &RK, raw_ostream &OS,
|
||||
bool TargetOnly = false);
|
||||
void EmitAsmMatcher(RecordKeeper &RK, raw_ostream &OS);
|
||||
void EmitAsmWriter(RecordKeeper &RK, raw_ostream &OS);
|
||||
void EmitCallingConv(RecordKeeper &RK, raw_ostream &OS);
|
||||
|
Loading…
x
Reference in New Issue
Block a user