aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLogan Chien <loganchien@google.com>2011-10-19 11:36:30 +0800
committerLogan Chien <loganchien@google.com>2011-10-19 11:37:40 +0800
commitd2351e5c088147b5d71d5745cf07b5085a7f0073 (patch)
treeb97ce400bb124278e5e8925b5dd11689498430b7
parentd98f643517ec975c59f768d3ea2605b08119bc22 (diff)
downloadexternal_llvm-d2351e5c088147b5d71d5745cf07b5085a7f0073.zip
external_llvm-d2351e5c088147b5d71d5745cf07b5085a7f0073.tar.gz
external_llvm-d2351e5c088147b5d71d5745cf07b5085a7f0073.tar.bz2
Add build rules for llc, opt, and llvm-link on target device.
Change-Id: I42f35da6f5ce77ab8969746131f5e6fdd42e5afa
-rw-r--r--Android.mk74
-rw-r--r--include/llvm/CodeGen/LinkAllAsmWriterComponents.h2
-rw-r--r--lib/Analysis/Android.mk125
-rw-r--r--lib/Target/ARM/AsmParser/Android.mk57
-rw-r--r--lib/Transforms/Instrumentation/Android.mk29
-rw-r--r--tools/llc/Android.mk91
-rw-r--r--tools/llvm-link/Android.mk46
-rw-r--r--tools/opt/Android.mk56
8 files changed, 332 insertions, 148 deletions
diff --git a/Android.mk b/Android.mk
index 19b5c3d..5bd2170 100644
--- a/Android.mk
+++ b/Android.mk
@@ -5,43 +5,43 @@ LLVM_ENABLE_ASSERTION := false
include $(CLEAR_VARS)
subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
- lib/Support \
- utils/TableGen \
- tools/llvm-as \
- tools/llvm-link \
- lib/VMCore \
- lib/Bitcode/Reader \
- lib/Bitcode/Writer \
- lib/Analysis \
- lib/Analysis/IPA \
- lib/AsmParser \
- lib/Transforms/IPO \
- lib/Transforms/Utils \
- lib/Transforms/Scalar \
- lib/Transforms/InstCombine \
- lib/Transforms/Instrumentation \
- lib/CodeGen \
- lib/CodeGen/SelectionDAG \
- lib/CodeGen/AsmPrinter \
- lib/Target \
- lib/Target/ARM \
- lib/Target/ARM/AsmParser \
- lib/Target/ARM/InstPrinter \
- lib/Target/ARM/Disassembler \
- lib/Target/ARM/MCTargetDesc \
- lib/Target/ARM/TargetInfo \
- lib/Target/X86 \
- lib/Target/X86/AsmParser \
- lib/Target/X86/InstPrinter \
- lib/Target/X86/Disassembler \
- lib/Target/X86/MCTargetDesc \
- lib/Target/X86/TargetInfo \
- lib/Target/X86/Utils \
- lib/ExecutionEngine/JIT \
- lib/MC \
- lib/MC/MCParser \
- lib/Linker \
- ))
+ lib/Analysis \
+ lib/Analysis/IPA \
+ lib/AsmParser \
+ lib/Bitcode/Reader \
+ lib/Bitcode/Writer \
+ lib/ExecutionEngine/JIT \
+ lib/CodeGen \
+ lib/CodeGen/AsmPrinter \
+ lib/CodeGen/SelectionDAG \
+ lib/Linker \
+ lib/MC \
+ lib/MC/MCParser \
+ lib/Support \
+ lib/Target \
+ lib/Target/ARM \
+ lib/Target/ARM/AsmParser \
+ lib/Target/ARM/InstPrinter \
+ lib/Target/ARM/Disassembler \
+ lib/Target/ARM/MCTargetDesc \
+ lib/Target/ARM/TargetInfo \
+ lib/Target/X86 \
+ lib/Target/X86/AsmParser \
+ lib/Target/X86/InstPrinter \
+ lib/Target/X86/Disassembler \
+ lib/Target/X86/MCTargetDesc \
+ lib/Target/X86/TargetInfo \
+ lib/Target/X86/Utils \
+ lib/Transforms/IPO \
+ lib/Transforms/InstCombine \
+ lib/Transforms/Instrumentation \
+ lib/Transforms/Scalar \
+ lib/Transforms/Utils \
+ lib/VMCore \
+ utils/TableGen \
+ tools/llvm-as \
+ tools/llvm-link \
+ ))
include $(LOCAL_PATH)/llvm.mk
diff --git a/include/llvm/CodeGen/LinkAllAsmWriterComponents.h b/include/llvm/CodeGen/LinkAllAsmWriterComponents.h
index 7d1b1fe..4b94173 100644
--- a/include/llvm/CodeGen/LinkAllAsmWriterComponents.h
+++ b/include/llvm/CodeGen/LinkAllAsmWriterComponents.h
@@ -18,6 +18,7 @@
#include "llvm/CodeGen/GCs.h"
#include <cstdlib>
+#ifndef ANDROID_TARGET_BUILD
namespace {
struct ForceAsmWriterLinking {
ForceAsmWriterLinking() {
@@ -33,5 +34,6 @@ namespace {
}
} ForceAsmWriterLinking; // Force link by creating a global definition.
}
+#endif
#endif // LLVM_CODEGEN_LINKALLASMWRITERCOMPONENTS_H
diff --git a/lib/Analysis/Android.mk b/lib/Analysis/Android.mk
index aa4dcc0..385ed74 100644
--- a/lib/Analysis/Android.mk
+++ b/lib/Analysis/Android.mk
@@ -1,74 +1,71 @@
LOCAL_PATH:= $(call my-dir)
-analysis_SRC_FILES := \
- AliasAnalysis.cpp \
- AliasAnalysisCounter.cpp \
- AliasAnalysisEvaluator.cpp \
- AliasDebugger.cpp \
- AliasSetTracker.cpp \
- Analysis.cpp \
- BasicAliasAnalysis.cpp \
- BlockFrequency.cpp \
- BranchProbabilityInfo.cpp \
- CFGPrinter.cpp \
- CaptureTracking.cpp \
- ConstantFolding.cpp \
- DIBuilder.cpp \
- DbgInfoPrinter.cpp \
- DebugInfo.cpp \
- DominanceFrontier.cpp \
- DomPrinter.cpp \
- IVUsers.cpp \
- InlineCost.cpp \
- InstCount.cpp \
- InstructionSimplify.cpp \
- Interval.cpp \
- IntervalPartition.cpp \
- LazyValueInfo.cpp \
- LibCallAliasAnalysis.cpp \
- LibCallSemantics.cpp \
- Loads.cpp \
- NoAliasAnalysis.cpp \
- MemDepPrinter.cpp \
- MemoryBuiltins.cpp \
- MemoryDependenceAnalysis.cpp \
- RegionPass.cpp \
- LoopDependenceAnalysis.cpp \
- LoopInfo.cpp \
- LoopPass.cpp \
- PathNumbering.cpp \
- PathProfileInfo.cpp \
- PathProfileVerifier.cpp \
- PHITransAddr.cpp \
- PostDominators.cpp \
- ProfileEstimatorPass.cpp \
- ProfileInfo.cpp \
- ProfileInfoLoader.cpp \
- ProfileInfoLoaderPass.cpp \
- ProfileVerifierPass.cpp \
- ScalarEvolution.cpp \
- ScalarEvolutionAliasAnalysis.cpp \
- ScalarEvolutionExpander.cpp \
- ScalarEvolutionNormalization.cpp \
- SparsePropagation.cpp \
- Trace.cpp \
- TypeBasedAliasAnalysis.cpp \
- ValueTracking.cpp
+analysis_SRC_FILES := \
+ AliasAnalysis.cpp \
+ AliasAnalysisCounter.cpp \
+ AliasAnalysisEvaluator.cpp \
+ AliasDebugger.cpp \
+ AliasSetTracker.cpp \
+ Analysis.cpp \
+ BasicAliasAnalysis.cpp \
+ BlockFrequency.cpp \
+ BranchProbabilityInfo.cpp \
+ CFGPrinter.cpp \
+ CaptureTracking.cpp \
+ ConstantFolding.cpp \
+ DIBuilder.cpp \
+ DbgInfoPrinter.cpp \
+ DebugInfo.cpp \
+ DominanceFrontier.cpp \
+ DomPrinter.cpp \
+ IVUsers.cpp \
+ InlineCost.cpp \
+ InstCount.cpp \
+ InstructionSimplify.cpp \
+ Interval.cpp \
+ IntervalPartition.cpp \
+ LazyValueInfo.cpp \
+ LibCallAliasAnalysis.cpp \
+ LibCallSemantics.cpp \
+ Loads.cpp \
+ NoAliasAnalysis.cpp \
+ MemDepPrinter.cpp \
+ MemoryBuiltins.cpp \
+ MemoryDependenceAnalysis.cpp \
+ RegionInfo.cpp \
+ RegionPass.cpp \
+ RegionPrinter.cpp \
+ Lint.cpp \
+ LoopDependenceAnalysis.cpp \
+ LoopInfo.cpp \
+ LoopPass.cpp \
+ ModuleDebugInfoPrinter.cpp \
+ PathNumbering.cpp \
+ PathProfileInfo.cpp \
+ PathProfileVerifier.cpp \
+ PHITransAddr.cpp \
+ PostDominators.cpp \
+ ProfileEstimatorPass.cpp \
+ ProfileInfo.cpp \
+ ProfileInfoLoader.cpp \
+ ProfileInfoLoaderPass.cpp \
+ ProfileVerifierPass.cpp \
+ ScalarEvolution.cpp \
+ ScalarEvolutionAliasAnalysis.cpp \
+ ScalarEvolutionExpander.cpp \
+ ScalarEvolutionNormalization.cpp \
+ SparsePropagation.cpp \
+ Trace.cpp \
+ TypeBasedAliasAnalysis.cpp \
+ ValueTracking.cpp
# For the host
# =====================================================
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := \
- $(analysis_SRC_FILES) \
- Lint.cpp \
- ModuleDebugInfoPrinter.cpp \
- RegionInfo.cpp \
- RegionPrinter.cpp
-
LOCAL_MODULE:= libLLVMAnalysis
-
LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(analysis_SRC_FILES)
include $(LLVM_HOST_BUILD_MK)
include $(LLVM_GEN_INTRINSICS_MK)
@@ -78,11 +75,9 @@ include $(BUILD_HOST_STATIC_LIBRARY)
# =====================================================
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(analysis_SRC_FILES)
-
LOCAL_MODULE:= libLLVMAnalysis
-
LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(analysis_SRC_FILES)
include $(LLVM_DEVICE_BUILD_MK)
include $(LLVM_GEN_INTRINSICS_MK)
diff --git a/lib/Target/ARM/AsmParser/Android.mk b/lib/Target/ARM/AsmParser/Android.mk
index 57678e0..ad4c213 100644
--- a/lib/Target/ARM/AsmParser/Android.mk
+++ b/lib/Target/ARM/AsmParser/Android.mk
@@ -1,30 +1,55 @@
LOCAL_PATH := $(call my-dir)
-# For the host only
-# =====================================================
-include $(CLEAR_VARS)
-include $(CLEAR_TBLGEN_VARS)
+#===---------------------------------------------------------------===
+# libARMAsmParser (common)
+#===---------------------------------------------------------------===
-TBLGEN_TABLES := \
- ARMGenInstrInfo.inc \
- ARMGenRegisterInfo.inc \
- ARMGenAsmMatcher.inc \
- ARMGenSubtargetInfo.inc
+arm_asm_parser_SRC_FILES := \
+ ARMAsmLexer.cpp \
+ ARMAsmParser.cpp
+arm_asm_parser_TBLGEN_TABLES := \
+ ARMGenInstrInfo.inc \
+ ARMGenRegisterInfo.inc \
+ ARMGenAsmMatcher.inc \
+ ARMGenSubtargetInfo.inc
-TBLGEN_TD_DIR := $(LOCAL_PATH)/..
+arm_asm_parser_TBLGEN_TD_DIR := $(LOCAL_PATH)/..
-LOCAL_SRC_FILES := \
- ARMAsmLexer.cpp \
- ARMAsmParser.cpp
+arm_asm_parser_C_INCLUDES := $(LOCAL_PATH)/..
-LOCAL_C_INCLUDES += \
- $(LOCAL_PATH)/..
-LOCAL_MODULE:= libLLVMARMAsmParser
+#===---------------------------------------------------------------===
+# libARMAsmParser (host)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+LOCAL_MODULE:= libLLVMARMAsmParser
LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(arm_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(arm_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(arm_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(arm_asm_parser_TBLGEN_TD_DIR)
include $(LLVM_HOST_BUILD_MK)
include $(LLVM_TBLGEN_RULES_MK)
include $(BUILD_HOST_STATIC_LIBRARY)
+
+
+#===---------------------------------------------------------------===
+# libARMAsmParser (target)
+#===---------------------------------------------------------------===
+include $(CLEAR_VARS)
+include $(CLEAR_TBLGEN_VARS)
+
+LOCAL_MODULE:= libLLVMARMAsmParser
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(arm_asm_parser_SRC_FILES)
+LOCAL_C_INCLUDES += $(arm_asm_parser_C_INCLUDES)
+TBLGEN_TABLES := $(arm_asm_parser_TBLGEN_TABLES)
+TBLGEN_TD_DIR := $(arm_asm_parser_TBLGEN_TD_DIR)
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_TBLGEN_RULES_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/Transforms/Instrumentation/Android.mk b/lib/Transforms/Instrumentation/Android.mk
index d4ac0da..85482a6 100644
--- a/lib/Transforms/Instrumentation/Android.mk
+++ b/lib/Transforms/Instrumentation/Android.mk
@@ -1,20 +1,31 @@
LOCAL_PATH:= $(call my-dir)
+instrumentation_SRC_FILES := \
+ EdgeProfiling.cpp \
+ GCOVProfiling.cpp \
+ Instrumentation.cpp \
+ ProfilingUtils.cpp \
+ PathProfiling.cpp \
+ OptimalEdgeProfiling.cpp
+
# For the host
# =====================================================
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := \
- EdgeProfiling.cpp \
- GCOVProfiling.cpp \
- Instrumentation.cpp \
- ProfilingUtils.cpp \
- PathProfiling.cpp \
- OptimalEdgeProfiling.cpp
-
LOCAL_MODULE:= libLLVMInstrumentation
-
LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(instrumentation_SRC_FILES)
include $(LLVM_HOST_BUILD_MK)
include $(BUILD_HOST_STATIC_LIBRARY)
+
+# For the target
+# =====================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libLLVMInstrumentation
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(instrumentation_SRC_FILES)
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_STATIC_LIBRARY)
diff --git a/tools/llc/Android.mk b/tools/llc/Android.mk
new file mode 100644
index 0000000..0a693ba
--- /dev/null
+++ b/tools/llc/Android.mk
@@ -0,0 +1,91 @@
+LOCAL_PATH := $(call my-dir)
+
+LLVM_ROOT_PATH := $(LOCAL_PATH)/../..
+
+
+#===---------------------------------------------------------------===
+# llc command line tool (common)
+#===---------------------------------------------------------------===
+
+llvm_llc_SRC_FILES := \
+ llc.cpp
+
+llvm_llc_STATIC_LIBRARIES := \
+ libLLVMARMCodeGen \
+ libLLVMARMDisassembler \
+ libLLVMARMAsmParser \
+ libLLVMARMDesc \
+ libLLVMARMInfo \
+ libLLVMAsmPrinter \
+ libLLVMAsmParser \
+ libLLVMBitReader \
+ libLLVMBitWriter \
+ libLLVMSelectionDAG \
+ libLLVMInstCombine \
+ libLLVMInstrumentation \
+ libLLVMCodeGen \
+ libLLVMipo \
+ libLLVMipa \
+ libLLVMLinker \
+ libLLVMMC \
+ libLLVMMCParser \
+ libLLVMScalarOpts \
+ libLLVMTransformUtils \
+ libLLVMAnalysis \
+ libLLVMCore \
+ libLLVMSupport \
+ libLLVMTarget
+
+
+#===---------------------------------------------------------------===
+# llc command line tool (host)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_IS_HOST_MODULE := true
+
+LOCAL_SRC_FILES := $(llvm_llc_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := \
+ libLLVMX86Info \
+ libLLVMX86AsmParser \
+ libLLVMX86CodeGen \
+ libLLVMX86Disassembler \
+ libLLVMX86AsmPrinter \
+ libLLVMX86Desc \
+ libLLVMX86Utils \
+ $(llvm_llc_STATIC_LIBRARIES)
+LOCAL_LDLIBS += -lpthread -lm -ldl
+LOCAL_C_INCLUDES += external/llvm/include
+
+include $(LLVM_ROOT_PATH)/llvm.mk
+include $(LLVM_HOST_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_HOST_EXECUTABLE)
+
+
+#===---------------------------------------------------------------===
+# llc command line tool (target)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llc
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+
+LOCAL_SRC_FILES := $(llvm_llc_SRC_FILES)
+LOCAL_C_INCLUDES += external/llvm/include
+LOCAL_STATIC_LIBRARIES := $(llvm_llc_STATIC_LIBRARIES)
+LOCAL_SHARED_LIBRARIES := \
+ libdl \
+ libstlport
+
+
+include $(LLVM_ROOT_PATH)/llvm.mk
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_EXECUTABLE)
diff --git a/tools/llvm-link/Android.mk b/tools/llvm-link/Android.mk
index e24d744..bcf70e5 100644
--- a/tools/llvm-link/Android.mk
+++ b/tools/llvm-link/Android.mk
@@ -1,24 +1,44 @@
LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
+llvm_link_SRC_FILES := \
+ llvm-link.cpp
-LOCAL_SRC_FILES := \
- llvm-link.cpp
+llvm_link_STATIC_LIBRARIES := \
+ libLLVMLinker \
+ libLLVMBitReader \
+ libLLVMBitWriter \
+ libLLVMCore \
+ libLLVMSupport \
+ libLLVMAsmParser \
+ libLLVMTransformUtils
-LOCAL_STATIC_LIBRARIES := \
- libLLVMLinker \
- libLLVMBitReader \
- libLLVMBitWriter \
- libLLVMCore \
- libLLVMSupport \
- libLLVMAsmParser \
- libLLVMTransformUtils
+#===---------------------------------------------------------------===
+# llvm-link command line tool (host)
+#===---------------------------------------------------------------===
-LOCAL_MODULE := llvm-link
+include $(CLEAR_VARS)
+LOCAL_MODULE := llvm-link
LOCAL_MODULE_TAGS := optional
-
+LOCAL_SRC_FILES := $(llvm_link_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := $(llvm_link_STATIC_LIBRARIES)
LOCAL_LDLIBS += -lpthread -lm -ldl
include $(LLVM_HOST_BUILD_MK)
include $(BUILD_HOST_EXECUTABLE)
+
+#===---------------------------------------------------------------===
+# llvm-link command line tool (target)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := llvm-link
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(llvm_link_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := $(llvm_link_STATIC_LIBRARIES)
+LOCAL_SHARED_LIBRARIES := \
+ libstlport
+
+include $(LLVM_DEVICE_BUILD_MK)
+include $(BUILD_EXECUTABLE)
diff --git a/tools/opt/Android.mk b/tools/opt/Android.mk
index 7e7455e..77bb2a2 100644
--- a/tools/opt/Android.mk
+++ b/tools/opt/Android.mk
@@ -1,17 +1,19 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
+LOCAL_PATH := $(call my-dir)
-LOCAL_MODULE := opt
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := EXECUTABLES
+LLVM_ROOT_PATH := $(LOCAL_PATH)/../..
-LOCAL_SRC_FILES := \
+
+#===---------------------------------------------------------------===
+# opt command line tool (common)
+#===---------------------------------------------------------------===
+
+llvm_opt_SRC_FILES := \
AnalysisWrappers.cpp \
GraphPrinters.cpp \
PrintSCC.cpp \
opt.cpp
-LOCAL_STATIC_LIBRARIES := \
+llvm_opt_STATIC_LIBRARIES := \
libLLVMipo \
libLLVMScalarOpts \
libLLVMInstCombine \
@@ -27,10 +29,48 @@ LOCAL_STATIC_LIBRARIES := \
libLLVMCore \
libLLVMSupport
-LOCAL_LDLIBS += -lpthread -lm -ldl
+#===---------------------------------------------------------------===
+# opt command line tool (host)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := opt
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_IS_HOST_MODULE := true
+
+LOCAL_SRC_FILES := $(llvm_opt_SRC_FILES)
+LOCAL_STATIC_LIBRARIES := $(llvm_opt_STATIC_LIBRARIES)
+LOCAL_LDLIBS += -lpthread -lm -ldl
LOCAL_C_INCLUDES += external/llvm/include
+include $(LLVM_ROOT_PATH)/llvm.mk
include $(LLVM_HOST_BUILD_MK)
include $(LLVM_GEN_INTRINSICS_MK)
include $(BUILD_HOST_EXECUTABLE)
+
+
+#===---------------------------------------------------------------===
+# opt command line tool (target)
+#===---------------------------------------------------------------===
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := opt
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := EXECUTABLES
+
+LOCAL_SRC_FILES := $(llvm_opt_SRC_FILES)
+LOCAL_C_INCLUDES += external/llvm/include
+LOCAL_STATIC_LIBRARIES := $(llvm_opt_STATIC_LIBRARIES)
+LOCAL_SHARED_LIBRARIES := \
+ libdl \
+ libstlport
+
+
+include $(LLVM_ROOT_PATH)/llvm.mk
+include $(LLVM_DEVICE_BUILD_MK)
+include $(LLVM_GEN_INTRINSICS_MK)
+include $(BUILD_EXECUTABLE)